summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/can/can-message.hpp18
-rw-r--r--src/can/can-signals.hpp39
-rw-r--r--src/configuration.cpp6
-rw-r--r--src/configuration.hpp18
-rw-r--r--src/diagnostic/diagnostic-message.cpp16
-rw-r--r--src/diagnostic/diagnostic-message.hpp10
-rw-r--r--src/low-can-binding.cpp6
7 files changed, 86 insertions, 27 deletions
diff --git a/src/can/can-message.hpp b/src/can/can-message.hpp
index 38a8e598..c5abd7fb 100644
--- a/src/can/can-message.hpp
+++ b/src/can/can-message.hpp
@@ -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
*
diff --git a/src/can/can-signals.hpp b/src/can/can-signals.hpp
index 17b189c6..99f62c74 100644
--- a/src/can/can-signals.hpp
+++ b/src/can/can-signals.hpp
@@ -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);
diff --git a/src/configuration.cpp b/src/configuration.cpp
index de06a65f..0c5e8d08 100644
--- a/src/configuration.cpp
+++ b/src/configuration.cpp
@@ -15,6 +15,10 @@
* 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},
diff --git a/src/configuration.hpp b/src/configuration.hpp
index 2fd59e5f..f20ad505 100644
--- a/src/configuration.hpp
+++ b/src/configuration.hpp
@@ -15,12 +15,17 @@
* 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.
*
@@ -32,18 +37,15 @@
*
* 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();
}
diff --git a/src/diagnostic/diagnostic-message.cpp b/src/diagnostic/diagnostic-message.cpp
index 656a868c..d99541b5 100644
--- a/src/diagnostic/diagnostic-message.cpp
+++ b/src/diagnostic/diagnostic-message.cpp
@@ -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
diff --git a/src/diagnostic/diagnostic-message.hpp b/src/diagnostic/diagnostic-message.hpp
index ac6ca18e..2d9cff65 100644
--- a/src/diagnostic/diagnostic-message.hpp
+++ b/src/diagnostic/diagnostic-message.hpp
@@ -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
diff --git a/src/low-can-binding.cpp b/src/low-can-binding.cpp
index 79b16914..ad73de13 100644
--- a/src/low-can-binding.cpp
+++ b/src/low-can-binding.cpp
@@ -34,11 +34,7 @@
#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;