diff --git a/firmware/controllers/can/can.h b/firmware/controllers/can/can.h index e942468e82..8203a5ad57 100644 --- a/firmware/controllers/can/can.h +++ b/firmware/controllers/can/can.h @@ -17,12 +17,14 @@ #define CAN_TIMEOUT MS2NT(100) class Logging; +class CanListener; class CanSensorBase; #if EFI_CAN_SUPPORT void processCanRxMessage(const CANRxFrame& msg, Logging* logger, efitick_t nowNt); #endif // EFI_CAN_SUPPORT +void registerCanListener(CanListener& listener); void registerCanSensor(CanSensorBase& sensor); // Indicate that an ack response was received from the wideband bootloader diff --git a/firmware/controllers/can/can_listener.h b/firmware/controllers/can/can_listener.h new file mode 100644 index 0000000000..21fe403e5e --- /dev/null +++ b/firmware/controllers/can/can_listener.h @@ -0,0 +1,45 @@ +/** + * @file can_listener.h + * + * @date March 31, 2021 + * @author Matthew Kennedy, (c) 2021 + */ + +#pragma once + +#include "can.h" + +class CanListener { +public: + CanListener(uint32_t eid) + : m_eid(eid) + { + } + + CanListener* processFrame(const CANRxFrame& frame, efitick_t nowNt) { + if (CAN_EID(frame) == m_eid) { + decodeFrame(frame, nowNt); + } + + return m_next; + } + + uint32_t getEid() { + return m_eid; + } + + void setNext(CanListener* next) { + m_next = next; + } + + virtual CanListener* request() { + return m_next; + } + +protected: + virtual void decodeFrame(const CANRxFrame& frame, efitick_t nowNt) = 0; + CanListener* m_next = nullptr; + +private: + const uint32_t m_eid; +}; diff --git a/firmware/controllers/can/can_rx.cpp b/firmware/controllers/can/can_rx.cpp index 28312e64df..81cec5a4f5 100644 --- a/firmware/controllers/can/can_rx.cpp +++ b/firmware/controllers/can/can_rx.cpp @@ -80,19 +80,23 @@ static void printPacket(const CANRxFrame &rx, Logging *logger) { volatile float canMap = 0; -CanSensorBase *cansensors_head = nullptr; +CanListener *canListeners_head = nullptr; void serviceCanSubscribers(const CANRxFrame &frame, efitick_t nowNt) { - CanSensorBase *current = cansensors_head; + CanListener *current = canListeners_head; while (current) { current = current->processFrame(frame, nowNt); } } -void registerCanSensor(CanSensorBase &sensor) { - sensor.setNext(cansensors_head); - cansensors_head = &sensor; +void registerCanListener(CanListener& listener) { + listener.setNext(canListeners_head); + canListeners_head = &listener; +} + +void registerCanSensor(CanSensorBase& sensor) { + registerCanListener(sensor); sensor.Register(); } diff --git a/firmware/controllers/can/can_tx.cpp b/firmware/controllers/can/can_tx.cpp index b08004797e..9a6b88707a 100644 --- a/firmware/controllers/can/can_tx.cpp +++ b/firmware/controllers/can/can_tx.cpp @@ -20,7 +20,7 @@ EXTERN_ENGINE; -extern CanSensorBase* cansensors_head; +extern CanListener* canListeners_head; CanWrite::CanWrite() : PeriodicController("CAN TX", PRIO_CAN_TX, 50) @@ -35,7 +35,7 @@ void CanWrite::PeriodicTask(efitime_t nowNt) { sendCanVerbose(); } - CanSensorBase* current = cansensors_head; + CanListener* current = canListeners_head; while (current) { current = current->request(); diff --git a/firmware/controllers/sensors/can_sensor.h b/firmware/controllers/sensors/can_sensor.h index d328c2db49..2d640bce61 100644 --- a/firmware/controllers/sensors/can_sensor.h +++ b/firmware/controllers/sensors/can_sensor.h @@ -13,46 +13,20 @@ #include "can_msg_tx.h" #include "obd2.h" #include "can.h" +#include "can_listener.h" /** * Sensor which reads it's value from CAN */ -class CanSensorBase : public StoredValueSensor { +class CanSensorBase : public StoredValueSensor, public CanListener { public: CanSensorBase(uint32_t eid, SensorType type, efitick_t timeout) : StoredValueSensor(type, timeout) - , m_eid(eid) + , CanListener(eid) { } - virtual CanSensorBase* request() { - return m_next; - } - void showInfo(Logging* logger, const char* sensorName) const override; - - CanSensorBase* processFrame(const CANRxFrame& frame, efitick_t nowNt) { - if (CAN_EID(frame) == m_eid) { - decodeFrame(frame, nowNt); - } - - return m_next; - } - - uint32_t getEid() { - return m_eid; - } - - void setNext(CanSensorBase* next) { - m_next = next; - } - -protected: - virtual void decodeFrame(const CANRxFrame& frame, efitick_t nowNt) = 0; - CanSensorBase* m_next = nullptr; - -private: - const uint32_t m_eid; }; template @@ -105,7 +79,7 @@ public: setValidValue(fValue, nowNt); } - CanSensorBase* request() override { + CanListener* request() override { { CanTxMessage msg(OBD_TEST_REQUEST); msg[0] = _OBD_2; @@ -115,7 +89,7 @@ public: // let's sleep on write update after each OBD request, this would give read thread a chance to read response // todo: smarter logic of all this with with semaphore not just sleep chThdSleepMilliseconds(300); - return m_next; + return CanListener::request(); } int PID;