Added a warning that it is an example code
authorRomain Forlot <romain.forlot@iot.bzh>
Wed, 8 Mar 2017 08:44:53 +0000 (09:44 +0100)
committerRomain Forlot <romain.forlot@iot.bzh>
Thu, 16 Mar 2017 16:10:39 +0000 (17:10 +0100)
Change-Id: Ib66e49960a348896020fba56f7d98910623af83f
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
src/can/can-message.hpp
src/can/can-signals.hpp
src/configuration.cpp
src/configuration.hpp
src/diagnostic/diagnostic-message.cpp
src/diagnostic/diagnostic-message.hpp
src/low-can-binding.cpp

index 38a8e59..c5abd7f 100644 (file)
@@ -112,6 +112,24 @@ struct CanMessageDefinition {
 };
 typedef struct CanMessageDefinition CanMessageDefinition;
 
+class can_message_definition_t
+{
+       private:
+       can_bus_dev_t& bus_; /*!< bus - A pointer to the bus this message is on. */
+       uint32_t id_; /*!<  id - The ID of the message.*/
+       CanMessageFormat format_; /*!< format - the format of the message's ID.*/
+       FrequencyClock clock_; /*!<  clock - an optional frequency clock to control the output of this
+                                                       *       message, if sent raw, or simply to mark the max frequency for custom
+                                                       *       handlers to retriec++ if ? syntaxve.*/
+       bool forceSendChanged_; /*!< forceSendChanged - If true, regardless of the frequency, it will send CAN
+                                                        *      message if it has changed when using raw passthrough.*/
+       uint8_t lastValue_[CAN_MESSAGE_SIZE]; /*!< lastValue - The last received value of the message. Defaults to undefined.
+                                                                                 *     This is required for the forceSendChanged functionality, as the stack
+                                                                                 *     needs to compare an incoming CAN message with the previous frame.*/
+       
+       public:
+};
+
 /**
  * @struct CanMessageSet
  *
index 17b189c..99f62c7 100644 (file)
@@ -122,4 +122,43 @@ struct CanSignal {
 };
 typedef struct CanSignal CanSignal;
 
+class can_signal_t
+{
+       private:
+               struct CanMessageDefinition* message_; /*!< message        - The message this signal is a part of. */
+               const std::string generic_name_; /*!< generic_name - The name of the signal to be output over USB.*/
+               uint8_t bitPosition_; /*!< 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 bitSize_; /*!< bitSize - 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
+                                               *       don't need an offset. */
+               float min_value_; /*!< minValue - The minimum value for the processed signal.*/
+               float max_value_; /*!< maxValue - The maximum value for the processed signal. */
+               FrequencyClock clock_; /*!< clock_ - A FrequencyClock struct to control the maximum frequency to
+                                                               *       process and send this signal. To process every value, set the
+                                                               *       clock's frequency to 0. */
+               bool sendSame_; /*!< sendSame - If true, will re-send even if the value hasn't changed.*/
+               bool forceSendChanged_; /*!< forceSendChanged - If true, regardless of the frequency, it will send the
+                                                                *      value if it has changed. */
+               const std::map<const int, const std::string> states_; /*!< states_ - A map of CAN signal state describing the mapping
+                                                                                                                          * between numerical and string values for valid states. */
+               uint8_t state_count_; /*!< state_count_ - The length of the states array. */
+               bool writable_; /*!< writable - True if the signal is allowed to be written from the USB host
+                                               *       back to CAN. Defaults to false.*/
+               SignalDecoder decoder_; /*!< decoder_ - An optional function to decode a signal from the bus to a human
+                                                                * readable value. If NULL, the default numerical decoder is used. */
+               SignalEncoder encoder_; /*!< encoder_ - An optional function to encode a signal value to be written to
+                                                                * CAN into a byte array. If NULL, the default numerical encoder
+                                                                * is used. */
+               bool received_; /*!< received_ - True if this signal has ever been received.*/
+               float lastValue_; /*!< lastValue_ - The last received value of the signal. If 'received' is false,
+                                                 *     this value is undefined. */
+
+       public:
+
+};
+
 void find_can_signals(const openxc_DynamicField &key, std::vector<CanSignal*>& found_signals);
index de06a65..0c5e8d0 100644 (file)
  * limitations under the License.
  */
 
+/////////////////////////////////////////////////////////////////////////////////////
+//                                                     THIS IS AN EXAMPLE
+/////////////////////////////////////////////////////////////////////////////////////
+
 #include <configuration.hpp>
 
 #define OBD2_FUNCTIONAL_BROADCAST_ID 0x7df
@@ -22,7 +26,7 @@
 /*
 * Pre-defined OBD-II PIDs to query for if supported by the vehicle.
 */
- std::vector<obd2_signals_t> OBD2_PIDS = {
+ std::vector<obd2_signal_t> OBD2_PIDS = {
        { 0x04, "obd2.engine.load", 0, 100, POURCENT, 5, false},
        { 0x05, "obd2.engine.coolant.temperature", -40, 215, DEGREES_CELSIUS, 1, false},
        { 0x0a, "obd2.fuel.pressure", 0, 765, KPA, 1, false},
index 2fd59e5..f20ad50 100644 (file)
  * limitations under the License.
  */
 
+#pragma once
+
 #include <vector>
 
 #include "can/can-bus.hpp"
 #include "can/can-signals.hpp"
+#include "can/can-message.hpp"
 #include "obd2/diagnostic-manager.hpp"
 
+#include "low-can-binding.hpp"
+
 /**
  * @brief Class representing a configuration attached to the binding.
  *
  *
  *  It will be the reference point to needed objects.
  */
-
-#include "low-can-binding.hpp"
-
 class configuration_t
 {
        private:
-               can_bus_t can_bus_manager_(afb_daemon_rootdir_open_locale(binder_interface->daemon, "can_buses.json", O_RDONLY, NULL));
+               can_bus_t can_bus_manager_ = can_bus_t(afb_daemon_rootdir_open_locale(binder_interface->daemon, "can_buses.json", O_RDONLY, NULL));
                diagnostic_manager_t diagnostic_manager_;
                uint8_t active_message_set_ = 0;
 
        public:
-               const std::vector<obd2_signals_t> obd2_signals_;
+               const std::vector<obd2_signal_t> obd2_signals_;
                const std::vector<can_message_set_t> can_message_set_;
                const std::vector<std::vector<can_signal_t>> can_signals_;
                const std::vector<std::vector<can_message_definition_t>> can_message_definition_;
@@ -88,17 +90,17 @@ class configuration_t
                        return can_message_definition_[active_message_set_];
                }
 
-               std::vector<obd2_signals_t>& get_obd2_signals()
+               std::vector<obd2_signal_t>& get_obd2_signals()
                {
                        return obd2_signals_;
                }
 
-               std::vector<obd2_signals_t>& get_obd2_signals()
+               std::vector<obd2_signal_t>& get_obd2_signals()
                {
                        return OBD2_PIDS;
                }
 
-               uint32_t get_signal_id(obd2_signals_t& sig)
+               uint32_t get_signal_id(obd2_signal_t& sig)
                {
                        return sig.get_pid();
                }
index 656a868..d99541b 100644 (file)
@@ -32,12 +32,12 @@ const char *UNIT_NAMES[10] = {
        "NM"
 };
 
-obd2_signals_t::obd2_signals_t(uint8_t pid, const char* generic_name, const int min, const int max, enum UNIT unit, int frequency, bool supported)
+obd2_signal_t::obd2_signal_t(uint8_t pid, const char* generic_name, const int min, const int max, enum UNIT unit, int frequency, bool supported)
        :       pid_{pid}, generic_name_{generic_name}, min_{min}, max_{max}, unit_{unit}, frequency_{frequency}, supported_{supported}
 {
 }
 
-uint32_t obd2_signals_t::get_pid()
+uint32_t obd2_signal_t::get_pid()
 {
        return (uint32_t)pid_;
 }
@@ -51,7 +51,7 @@ uint32_t obd2_signals_t::get_pid()
  *
  * @return std::vector<std::string> Vector of signals name found. 
  */
-void obd2_signals_t::find_obd2_signals(const openxc_DynamicField &key, std::vector<obd2_signals_t*>& found_signals)
+void obd2_signal_t::find_obd2_signals(const openxc_DynamicField &key, std::vector<obd2_signal_t*>& found_signals)
 {
        switch(key.type)
        {
@@ -68,7 +68,7 @@ void obd2_signals_t::find_obd2_signals(const openxc_DynamicField &key, std::vect
        DEBUG(binder_interface, "Found %d signal(s)", (int)found_signals.size());
 }
 
-bool obd2_signals_t::is_obd2_response(can_message_t can_message)
+bool obd2_signal_t::is_obd2_response(can_message_t can_message)
 {
        /*
        if(can_message.get_id() >= 0x7E8 && can_message.get_id() <= 0x7EF)
@@ -111,7 +111,7 @@ bool obd2_signals_t::is_obd2_response(can_message_t can_message)
        */
 }
 
-void obd2_signals_t::add_request(int pid)
+void obd2_signal_t::add_request(int pid)
 {
        DiagnosticRequest request = {
        arbitration_id: OBD2_FUNCTIONAL_BROADCAST_ID,
@@ -123,7 +123,7 @@ void obd2_signals_t::add_request(int pid)
 *
 * @return true if the request is a mode 1 request and it has a 1 byte PID.
 */
-bool obd2_signals_t::is_obd2_request(DiagnosticRequest* request)
+bool obd2_signal_t::is_obd2_request(DiagnosticRequest* request)
 {
        return request->mode == 0x1 && request->has_pid && request->pid < 0xff;
 }
@@ -133,7 +133,7 @@ bool obd2_signals_t::is_obd2_request(DiagnosticRequest* request)
 * 
 * @return true if name began with obd2 else false.
 */
-bool obd2_signals_t::is_obd2_signal(const char *name)
+bool obd2_signal_t::is_obd2_signal(const char *name)
 {
        if(fnmatch("obd2.*", name, FNM_CASEFOLD) == 0)
                return true;
@@ -153,7 +153,7 @@ bool obd2_signals_t::is_obd2_signal(const char *name)
 *  signiticant, i.e. with many OBD-II PID formulas.
 * @param[in] float parsed_payload - the entire payload of the response parsed as an int.
 */
-float obd2_signals_t::decode_obd2_response(const DiagnosticResponse* response, float parsedPayload)
+float obd2_signal_t::decode_obd2_response(const DiagnosticResponse* response, float parsedPayload)
 {
        return diagnostic_decode_obd2_pid(response);
 }
\ No newline at end of file
index ac6ca18..2d9cff6 100644 (file)
@@ -65,7 +65,7 @@ typedef struct _Obd2Pid {
  * @brief - Object to handle obd2 session with pre-scan of supported pid
  * then request them regularly
  */
-class obd2_signals_t {
+class obd2_signal_t {
        private:
                uint8_t pid_; /*!< pid - The 1 byte PID.*/
                const std::string generic_name_; /*!< generic_name_ - A human readable name to use for this PID when published.*/
@@ -77,13 +77,13 @@ class obd2_signals_t {
 
        public:
                const char* generic_name = generic_name_.c_str();
-               obd2_signals_t(uint8_t pid, const char* generic_name, const int min_, const int max_, enum UNIT unit, int frequency, bool supported);
+               obd2_signal_t(uint8_t pid, const char* generic_name, const int min_, const int max_, enum UNIT unit, int frequency, bool supported);
 
                uint32_t get_pid();
 
                void add_request(int pid);
 
-               void find_obd2_signals(const openxc_DynamicField &key, std::vector<obd2_signals_t*>& found_signals);
+               void find_obd2_signals(const openxc_DynamicField &key, std::vector<obd2_signal_t*>& found_signals);
 
                bool is_obd2_response(can_message_t can_message);
                bool is_obd2_request(DiagnosticRequest *request);
@@ -92,5 +92,5 @@ class obd2_signals_t {
                float decode_obd2_response(const DiagnosticResponse* response, float parsedPayload);
 };
 
-uint32_t get_signal_id(obd2_signals_t& sig);
-std::vector<obd2_signals_t>& get_obd2_signals();
\ No newline at end of file
+uint32_t get_signal_id(obd2_signal_t& sig);
+std::vector<obd2_signal_t>& get_obd2_signals();
\ No newline at end of file
index 79b1691..ad73de1 100644 (file)
 #include "utils/timer.hpp"
 #include "utils/signals.hpp"
 #include "utils/openxc-utils.hpp"
-
-extern "C"
-{
-       #include <afb/afb-service-itf.h>
-};
+#include "configuration.hpp"
 
 // Interface between the daemon and the binding
 const struct afb_binding_interface *binder_interface;