X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fcan-decoder.cpp;h=7221d716da8635fbffe5a51dfb8cedcae6da6703;hb=744d95cffe1241c97d922b18f6e3723fff7d64fe;hp=d70f125239825a1d91ab73e1ee5f40e7a0397cc8;hpb=d76433ade0b75c8cc2b45fdae52a21d7fb28f526;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/can/can-decoder.cpp b/low-can-binding/can/can-decoder.cpp index d70f1252..7221d716 100644 --- a/low-can-binding/can/can-decoder.cpp +++ b/low-can-binding/can/can-decoder.cpp @@ -16,6 +16,7 @@ */ #include "can-decoder.hpp" +#include #include "canutil/read.h" #include "../utils/openxc-utils.hpp" @@ -41,9 +42,9 @@ int decoder_t::handle_sign(const signal_t& signal, std::vector& data_si if(signal.get_sign() == sign_t::UNSIGNED) return 1; else if(signal.get_sign() == sign_t::SIGN_BIT_EXTERN) { - end_bit = signal.get_bit_sign_position()%8; + end_bit = signal.get_bit_sign_position() % CHAR_BIT; mask = static_cast((1 << (end_bit + 1)) - 1); - data_byte = can_data[signal.get_bit_sign_position()/8] & mask; + data_byte = can_data[signal.get_bit_sign_position() / CHAR_BIT] & mask; } else { end_bit = new_end_bit; @@ -64,11 +65,9 @@ int decoder_t::handle_sign(const signal_t& signal, std::vector& data_si case sign_t::TWOS_COMPLEMENT: //complement only until end_bit data_signal[0] = ((data_signal[0] ^ mask) & mask); - if(data_signal.size() > 1) { - for(int i=1; i < data_signal.size(); i++) { + if(data_signal.size() > 1) + for(int i=1; i < data_signal.size(); i++) data_signal[i] = data_signal[i] ^ 0xFF; - } - } if(signal.get_sign() == sign_t::TWOS_COMPLEMENT) data_signal[data_signal.size() - 1] = static_cast(data_signal[data_signal.size() - 1] + 1); break; @@ -94,7 +93,8 @@ int decoder_t::handle_sign(const signal_t& signal, std::vector& data_si /// float decoder_t::parse_signal_bitfield(signal_t& signal, std::shared_ptr message) { - const std::vector data = message->get_data_vector(); + int sign; + std::vector data; std::vector data_signal; uint8_t bit_size = (uint8_t) signal.get_bit_size(); uint32_t bit_position = signal.get_bit_position(); @@ -104,12 +104,13 @@ float decoder_t::parse_signal_bitfield(signal_t& signal, std::shared_ptrget_data_vector(); converter_t::signal_to_bits_bytes(bit_position, bit_size, new_start_byte, new_end_byte, new_start_bit, new_end_bit); for(int i=new_start_byte;i<=new_end_byte;i++) data_signal.push_back(data[i]); - int sign = decoder_t::handle_sign(signal, data_signal, new_end_bit, data); + sign = handle_sign(signal, data_signal, new_end_bit, data); if(data_signal.size() > 65535) AFB_ERROR("Too long data signal %s", signal.get_name().c_str()); @@ -142,7 +143,7 @@ openxc_DynamicField decoder_t::decode_bytes(signal_t& signal, std::shared_ptr new_data = std::vector(); - new_data.reserve((bit_size / 8) + 1); + new_data.reserve((bit_size / CHAR_BIT) + 1); int new_start_byte = 0; int new_end_byte = 0; @@ -156,7 +157,7 @@ openxc_DynamicField decoder_t::decode_bytes(signal_t& signal, std::shared_ptr= length) { - AFB_ERROR("Error in description of signals"); + AFB_ERROR("Error in signal's description"); return decoded_value; } @@ -181,6 +182,60 @@ openxc_DynamicField decoder_t::decode_bytes(signal_t& signal, std::shared_ptr message, bool* send) +{ + std::string ret_s = ""; + openxc_DynamicField openxc_bytes = decode_bytes(signal,message,send); + if(!openxc_bytes.has_bytes_value) + AFB_ERROR("Error no bytes value to translate to ascii"); + ret_s = converter_t::to_ascii(openxc_bytes.bytes_value,openxc_bytes.length_array); + openxc_DynamicField ret = build_DynamicField(ret_s); + return ret; +} + +//edit +openxc_DynamicField decoder_t::decode_date(signal_t& signal, std::shared_ptr message, bool* send) +{ + float value = decoder_t::parse_signal_bitfield(signal, message); + AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value); + openxc_DynamicField decoded_value = build_DynamicField(value); + + // Don't send if they is no changes + if ((signal.get_last_value() == value && !signal.get_send_same()) || !*send ) + *send = false; + signal.set_last_value(value); + + return decoded_value; +} + +//edit +openxc_DynamicField decoder_t::decode_time(signal_t& signal, std::shared_ptr message, bool* send) +{ + float value = decoder_t::parse_signal_bitfield(signal, message); + AFB_DEBUG("Decoded message from parse_signal_bitfield: %f", value); + openxc_DynamicField decoded_value = build_DynamicField(value); + + // Don't send if they is no changes + *send = (signal.get_last_value() == value && !signal.get_send_same()) || !*send ? false : true; + signal.set_last_value(value); + + return decoded_value; +} + + /// @brief Wraps a raw CAN signal value in a DynamicField without modification. /// /// This is an implementation of the Signal type signature, and can be @@ -203,9 +258,7 @@ openxc_DynamicField decoder_t::decode_noop(signal_t& signal, std::shared_ptr message, bool* send) { - if(!signal.get_message()->frame_layout_is_little() && !signal.bit_position_is_swapped()) - { - signal.set_bit_position(converter_t::bit_position_swap(signal.get_bit_position(),signal.get_bit_size())); - signal.bit_position_is_swapped_reverse(); - } // Must call the decoders every time, regardless of if we are going to // decide to send the signal or not. openxc_DynamicField decoded_value = decoder_t::decode_signal(signal, @@ -352,6 +398,17 @@ openxc_DynamicField decoder_t::translate_signal(signal_t& signal, std::shared_pt /// openxc_DynamicField decoder_t::decode_signal( signal_t& signal, std::shared_ptr message, bool* send) { + + + if(signal.get_message()->get_flags() & CONTINENTAL_BIT_POSITION) + signal.set_bit_position(converter_t::continental_bit_position_mess(message->get_length(), + signal.get_bit_position(), + signal.get_bit_size())); + if(signal.get_message()->get_flags() & BIT_POSITION_REVERSED) + signal.set_bit_position(converter_t::bit_position_swap(message->get_length(), + signal.get_bit_position(), + signal.get_bit_size())); + signal_decoder decoder = signal.get_decoder() == nullptr ? decode_noop : signal.get_decoder();