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 const std::string signal_state = signal.get_states(value);
67 openxc_DynamicField decoded_value = build_DynamicField(signal_state);
68 if(signal_state.size() <= 0)
71 ERROR(binder_interface, "stateDecoder: No state found with index: %d", (int)value);
76 openxc_DynamicField decoder_t::translateSignal(can_signal_t& signal, can_message_t& message,
77 const std::vector<can_signal_t>& signals)
79 if(&signal == nullptr || &message == nullptr)
81 openxc_DynamicField ret = {0, openxc_DynamicField_Type_BOOL, 0, "", 0, 0, 0, 0};
85 float value = decoder_t::parseSignalBitfield(signal, message);
86 DEBUG(binder_interface, "translateSignal: Decoded message: %f", value);
89 // Must call the decoders every time, regardless of if we are going to
90 // decide to send the signal or not.
91 openxc_DynamicField decoded_value = decoder_t::decodeSignal(signal,
92 value, signals, &send);
94 signal.set_received(true);
95 signal.set_last_value(value);
99 openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
100 float value, const std::vector<can_signal_t>& signals, bool* send)
102 SignalDecoder decoder = signal.get_decoder() == NULL ?
103 noopDecoder : signal.get_decoder();
104 openxc_DynamicField decoded_value = decoder(signal, signals,
106 return decoded_value;
109 openxc_DynamicField decoder_t::decodeSignal( can_signal_t& signal,
110 const can_message_t& message, const std::vector<can_signal_t>& signals, bool* send)
112 float value = parseSignalBitfield(signal, message);
113 return decodeSignal(signal, value, signals, send);