X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=low-can-binding%2Fcan%2Fsignals.hpp;h=bf7799811233cf202cffca51458ef70ba78114ce;hb=0ff6413b6dc42849f87ce8caa17a91f44ede2f93;hp=2507fd2a6b295616df51705d737537e7e508843e;hpb=2f60d294b3fa4e243fa67a738f9b82a0b428a7fc;p=apps%2Fagl-service-can-low-level.git diff --git a/low-can-binding/can/signals.hpp b/low-can-binding/can/signals.hpp old mode 100644 new mode 100755 index 2507fd2a..bf779981 --- a/low-can-binding/can/signals.hpp +++ b/low-can-binding/can/signals.hpp @@ -26,8 +26,6 @@ #include "openxc.pb.h" #include "message-definition.hpp" #include "../utils/timer.hpp" -#include "../utils/socketcan-bcm.hpp" -#include "message/can-message.hpp" #include "../diagnostic/diagnostic-message.hpp" #define MESSAGE_SET_ID 0 @@ -40,15 +38,13 @@ class signal_t; /// string or boolean. /// /// @param[in] signal - The CAN signal that we are decoding. -/// @param[in] signalCount - The length of the signals array. -/// @param[in] value - The CAN signal parsed from the message as a raw floating point -/// value. +/// @param[in] message - The message with data to decode. /// @param[out] send - An output parameter. If decoding fails or CAN signal is /// not sending, this should be flipped to false. /// /// @return a decoded value in an openxc_DynamicField struct. /// -typedef openxc_DynamicField (*signal_decoder)(signal_t& signal, float value, bool* send); +typedef openxc_DynamicField (*signal_decoder)(signal_t& signal, std::shared_ptr message, bool* send); /// /// @brief: The type signature for a CAN signal encoder. @@ -64,17 +60,26 @@ typedef openxc_DynamicField (*signal_decoder)(signal_t& signal, float value, boo typedef uint64_t (*signal_encoder)(signal_t& signal, const openxc_DynamicField& field, bool* send); +enum sign_t +{ + UNSIGNED = 0, + SIGN_BIT = 1, + ONES_COMPLEMENT = 2, + TWOS_COMPLEMENT = 3, + SIGN_BIT_EXTERN = 4 +}; + class signal_t { private: std::shared_ptr parent_; /*!< parent_ - pointer to the parent message definition holding this signal*/ std::string generic_name_; /*!< generic_name_ - The name of the signal to be output.*/ static std::string prefix_; /*!< prefix_ - generic_name_ will be prefixed with it. It has to reflect the used protocol. - * which make easier to sort message when the come in.*/ - uint8_t bit_position_; /*!< bitPosition_ - The starting bit of the signal in its CAN message (assuming + * which make easier to sort message when the come in.*/ + uint32_t bit_position_; /*!< bitPosition_ - The starting bit of the signal in its CAN message (assuming * non-inverted bit numbering, i.e. the most significant bit of * each byte is 0) */ - uint8_t bit_size_; /*!< bit_size_ - The width of the bit field in the CAN message. */ + uint32_t bit_size_; /*!< bit_size_ - The width of the bit field in the CAN message. */ float factor_; /*!< factor_ - The final value will be multiplied by this factor. Use 1 if you * don't need a factor. */ float offset_; /*!< offset_ - The final value will be added to this offset. Use 0 if you @@ -82,8 +87,8 @@ private: float min_value_; /*!< min_value_ - The minimum value for the processed signal.*/ float max_value_; /*!< max_value_ - The maximum value for the processed signal. */ frequency_clock_t frequency_; /*!< frequency_ - A frequency_clock_t struct to control the maximum frequency to - * process and send this signal. To process every value, set the - * clock's frequency to 0. */ + * process and send this signal. To process every value, set the + * clock's frequency to 0. */ bool send_same_; /*!< send_same_ - If true, will re-send even if the value hasn't changed.*/ bool force_send_changed_; /*!< force_send_changed_ - If true, regardless of the frequency, it will send the * value if it has changed. */ @@ -98,20 +103,21 @@ private: * is used. */ bool received_; /*!< received_ - True if this signal has ever been received.*/ float last_value_; /*!< lastValue_ - The last received value of the signal. If 'received' is false, - * this value is undefined. */ - std::pair multiplex_; /*!< multiplex_ - If bool is false and int is 0 is not a multiplex signal + * this value is undefined. */ + std::pair multiplex_; /*!< multiplex_ - If bool is false and int is 0 is not a multiplex signal If bool is true, that indicate that is a multiplexor If int is different of 0, that indicate the link with a multiplexor */ bool is_big_endian_; /*!< is_big_endian - True if the signal's data are meant to be read as a big_endian */ - bool is_signed_; /* !< is_signed_ - True if the data is signed */ + sign_t sign_; /* !< sign_ - if the data is signed it indicates the encode */ + int32_t bit_sign_position_; /*!< bit_sign_position_ - The bit that indicates the sign of the signal in its CAN message*/ std::string unit_; /* !< unit_ - The unit of the data */ public: signal_t( std::string generic_name, - uint8_t bit_position, - uint8_t bit_size, + uint32_t bit_position, + uint32_t bit_size, float factor, float offset, float min_value, @@ -124,16 +130,17 @@ public: signal_decoder decoder, signal_encoder encoder, bool received, - std::pair multiplex, + std::pair multiplex, bool is_big_endian, - bool is_signed, + sign_t sign, + int32_t bit_sign_position, std::string unit); signal_t( std::string generic_name, - uint8_t bit_position, - uint8_t bit_size, + uint32_t bit_position, + uint32_t bit_size, float factor, float offset, float min_value, @@ -151,8 +158,8 @@ public: std::shared_ptr get_message() const; const std::string get_generic_name() const; const std::string get_name() const; - uint8_t get_bit_position() const; - uint8_t get_bit_size() const; + uint32_t get_bit_position() const; + uint32_t get_bit_size() const; float get_factor() const; float get_offset() const; frequency_clock_t& get_frequency(); @@ -165,13 +172,15 @@ public: bool get_received() const; float get_last_value() const; std::pair get_last_value_with_timestamp() const; - std::pair get_multiplex() const; + std::pair get_multiplex() const; bool get_is_big_endian() const; - bool get_is_signed() const; + sign_t get_sign() const; + int32_t get_bit_sign_position() const; const std::string get_unit() const; void set_parent(std::shared_ptr parent); void set_received(bool r); void set_last_value(float val); void set_timestamp(uint64_t timestamp); + void set_bit_position(uint32_t bit_position); };