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=0e64cccd1d4617c416a00ebfb904b9466b808016;hpb=0ff6413b6dc42849f87ce8caa17a91f44ede2f93;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 0e64cccd..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,30 +93,24 @@ 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(); - if(!signal.get_message()->frame_layout_is_little()) - { - bit_position = converter_t::bit_position_swap(message->get_length(), - signal.get_bit_position(), - signal.get_bit_size()); - message->frame_swap(); - } - int new_start_byte = 0; int new_end_byte = 0; uint8_t new_start_bit = 0; uint8_t new_end_bit = 0; + data = message->get_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()); @@ -150,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; @@ -189,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 @@ -211,9 +258,7 @@ openxc_DynamicField decoder_t::decode_noop(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();