X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=low-can-binding%2Fcan%2Fcan-decoder.cpp;h=7221d716da8635fbffe5a51dfb8cedcae6da6703;hb=744d95cffe1241c97d922b18f6e3723fff7d64fe;hp=ae10cd980ae8c2b678e5c48155d45835148d7f94;hpb=fe780799e8117ac30f9c05bcd43616638f35e66a;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 ae10cd98..7221d716 100644 --- a/low-can-binding/can/can-decoder.cpp +++ b/low-can-binding/can/can-decoder.cpp @@ -65,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; @@ -106,14 +104,6 @@ float decoder_t::parse_signal_bitfield(signal_t& signal, std::shared_ptrframe_layout_is_bigendian()) - { - bit_position = converter_t::bit_position_swap(message->get_length(), - signal.get_bit_position(), - bit_size); - message->frame_swap(); - } - 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); @@ -192,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 @@ -214,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();