decoder: Add new decoders: ascii, date, time 88/23388/3
authorArthur Guyader <arthur.guyader@iot.bzh>
Fri, 13 Dec 2019 14:23:27 +0000 (15:23 +0100)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 9 Jan 2020 15:25:36 +0000 (16:25 +0100)
Change-Id: I392bff2c1f4062aee186875335786fcda9cc0649
Signed-off-by: Arthur Guyader <arthur.guyader@iot.bzh>
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
low-can-binding/can/can-decoder.cpp
low-can-binding/can/can-decoder.hpp
low-can-binding/utils/converter.cpp
low-can-binding/utils/converter.hpp

index 488fdfb..15341b1 100644 (file)
@@ -195,6 +195,67 @@ openxc_DynamicField decoder_t::decode_bytes(signal_t& signal, std::shared_ptr<me
        return decoded_value;
 }
 
+
+/// @brief Decode and return string bytes (hex) for a CAN signal's.
+///
+/// This is an implementation of the Signal type signature, and can be
+/// used directly in the signal_t.decoder field.
+///
+/// @param[in] signal  - The details of the signal.
+/// @param[in] message - The message with data to decode.
+/// @param[out] send - An output argument that will be set to false if the value should
+///     not be sent for any reason.
+///
+/// @return Returns a DynamicField with a string value of bytes (hex)
+///
+openxc_DynamicField decoder_t::decode_ascii(signal_t& signal, std::shared_ptr<message_t> 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_t> 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_t> 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;
+}
+
+
 /// @brief Wraps a raw CAN signal value in a DynamicField without modification.
 ///
 /// This is an implementation of the Signal type signature, and can be
index 2f7823a..fd246f3 100644 (file)
@@ -32,6 +32,9 @@ public:
        static openxc_DynamicField decode_ignore(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
        static openxc_DynamicField decode_noop(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
        static openxc_DynamicField decode_bytes(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+       static openxc_DynamicField decode_ascii(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+       static openxc_DynamicField decode_date(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
+       static openxc_DynamicField decode_time(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
 
        static openxc_DynamicField translate_signal(signal_t& signal, std::shared_ptr<message_t> message, bool* send);
 
index c6c2f5e..5662574 100644 (file)
 #include <climits>
 
 /**
- * @brief Convert hex data to string
+ * @brief Convert data to hex string
  *
  * @param data An array of data
  * @param length The length of the data
- * @return std::string The string data
+ * @return std::string The hex string
  */
 std::string converter_t::to_hex(const uint8_t data[], const size_t length)
 {
@@ -38,6 +38,21 @@ std::string converter_t::to_hex(const uint8_t data[], const size_t length)
        return stream.str();
 }
 
+/**
+ * @brief Convert data to ascii string
+ *
+ * @param data An array of data
+ * @param length The length of the data
+ * @return std::string The ascii string
+ */
+std::string converter_t::to_ascii(const uint8_t data[], const size_t length)
+{
+       std::stringstream stream;
+       for(int i = 0; i < length; i++)
+               stream << ((char) data[i]);
+       return stream.str();
+}
+
 /**
  * @brief Translate bit_position and bit_size
  *
index 45e29e9..e8a40f5 100644 (file)
@@ -23,6 +23,7 @@ class converter_t
 {
        public:
                static std::string to_hex(const uint8_t data[], const size_t length);
+               static std::string to_ascii(const uint8_t data[], const size_t length);
                static void signal_to_bits_bytes(unsigned int bit_position,
                                                 unsigned int bit_size,
                                                 int &new_start_byte,