2 * Copyright (C) 2015, 2016 "IoT.bzh"
3 * Author "Romain Forlot" <romain.forlot@iot.bzh>
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include "can-decoder.hpp"
19 #include "canutil/read.h"
21 float decoder_t::parseSignalBitfield(can_signal_t& signal, const can_message_t& message)
23 return bitfield_parse_float(message.get_data(), CAN_MESSAGE_SIZE,
24 signal.get_bit_position(), signal.get_bit_size(), signal.get_factor(),
28 openxc_DynamicField decoder_t::noopDecoder(can_signal_t& signal,
29 const std::vector<can_signal_t>& signals, float value, bool* send)
31 openxc_DynamicField decoded_value;
32 decoded_value.has_type = true;
33 decoded_value.type = openxc_DynamicField_Type_NUM;
34 decoded_value.has_numeric_value = true;
35 decoded_value.numeric_value = value;
40 openxc_DynamicField decoder_t::booleanDecoder(can_signal_t& signal,
41 const std::vector<can_signal_t>& signals, float value, bool* send)
43 openxc_DynamicField decoded_value;
44 decoded_value.has_type = true;
45 decoded_value.type = openxc_DynamicField_Type_BOOL;
46 decoded_value.has_boolean_value = true;
47 decoded_value.boolean_value = value == 0.0 ? false : true;
52 openxc_DynamicField decoder_t::ignoreDecoder(can_signal_t& signal,
53 const std::vector<can_signal_t>& signals, float value, bool* send)
58 openxc_DynamicField decoded_value = {0, openxc_DynamicField_Type_BOOL, 0, "", 0, 0, 0, 0};
63 openxc_DynamicField decoder_t::stateDecoder(can_signal_t& signal,
64 const std::vector<can_signal_t>& signals, float value, bool* send)
66 openxc_DynamicField decoded_value = {0, openxc_DynamicField_Type_BOOL, 0, "", 0, 0, 0, 0};
67 decoded_value.has_type = true;
68 decoded_value.type = openxc_DynamicField_Type_STRING;
69 decoded_value.has_string_value = true;
71 /* TODO: Handle SignalState
72 const can_signal_tState* signalState = lookupSignalState(value, signal);
73 if(signalState != NULL) {
74 ::strcpy(decoded_value.string_value, signalState->name);
81 openxc_DynamicField decoder_t::translateSignal(can_signal_t& signal, can_message_t& message,
82 const std::vector<can_signal_t>& signals)
84 if(&signal == nullptr || &message == nullptr)
86 openxc_DynamicField ret = {0, openxc_DynamicField_Type_BOOL, 0, "", 0, 0, 0, 0};
90 float value = decoder_t::parseSignalBitfield(signal, message);
91 DEBUG(binder_interface, "translateSignal: Decoded message: %f", value);
94 // Must call the decoders every time, regardless of if we are going to
95 // decide to send the signal or not.
96 openxc_DynamicField decoded_value = decoder_t::decodeSignal(signal,
97 value, signals, &send);
99 signal.set_received(true);
100 signal.set_last_value(value);
101 return decoded_value;
104 openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
105 float value, const std::vector<can_signal_t>& signals, bool* send)
107 SignalDecoder decoder = signal.get_decoder() == NULL ?
108 noopDecoder : signal.get_decoder();
109 openxc_DynamicField decoded_value = decoder(signal, signals,
111 return decoded_value;
114 openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
115 const can_message_t& message, const std::vector<can_signal_t>& signals, bool* send)
117 float value = parseSignalBitfield(signal, message);
118 return decodeSignal(signal, value, signals, send);