not all listeners are sensors (#2514)
Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
This commit is contained in:
parent
e2b1195b56
commit
c637307238
|
@ -17,12 +17,14 @@
|
||||||
#define CAN_TIMEOUT MS2NT(100)
|
#define CAN_TIMEOUT MS2NT(100)
|
||||||
|
|
||||||
class Logging;
|
class Logging;
|
||||||
|
class CanListener;
|
||||||
class CanSensorBase;
|
class CanSensorBase;
|
||||||
|
|
||||||
#if EFI_CAN_SUPPORT
|
#if EFI_CAN_SUPPORT
|
||||||
void processCanRxMessage(const CANRxFrame& msg, Logging* logger, efitick_t nowNt);
|
void processCanRxMessage(const CANRxFrame& msg, Logging* logger, efitick_t nowNt);
|
||||||
#endif // EFI_CAN_SUPPORT
|
#endif // EFI_CAN_SUPPORT
|
||||||
|
|
||||||
|
void registerCanListener(CanListener& listener);
|
||||||
void registerCanSensor(CanSensorBase& sensor);
|
void registerCanSensor(CanSensorBase& sensor);
|
||||||
|
|
||||||
// Indicate that an ack response was received from the wideband bootloader
|
// Indicate that an ack response was received from the wideband bootloader
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
|
@ -80,19 +80,23 @@ static void printPacket(const CANRxFrame &rx, Logging *logger) {
|
||||||
|
|
||||||
volatile float canMap = 0;
|
volatile float canMap = 0;
|
||||||
|
|
||||||
CanSensorBase *cansensors_head = nullptr;
|
CanListener *canListeners_head = nullptr;
|
||||||
|
|
||||||
void serviceCanSubscribers(const CANRxFrame &frame, efitick_t nowNt) {
|
void serviceCanSubscribers(const CANRxFrame &frame, efitick_t nowNt) {
|
||||||
CanSensorBase *current = cansensors_head;
|
CanListener *current = canListeners_head;
|
||||||
|
|
||||||
while (current) {
|
while (current) {
|
||||||
current = current->processFrame(frame, nowNt);
|
current = current->processFrame(frame, nowNt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void registerCanListener(CanListener& listener) {
|
||||||
|
listener.setNext(canListeners_head);
|
||||||
|
canListeners_head = &listener;
|
||||||
|
}
|
||||||
|
|
||||||
void registerCanSensor(CanSensorBase& sensor) {
|
void registerCanSensor(CanSensorBase& sensor) {
|
||||||
sensor.setNext(cansensors_head);
|
registerCanListener(sensor);
|
||||||
cansensors_head = &sensor;
|
|
||||||
sensor.Register();
|
sensor.Register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
EXTERN_ENGINE;
|
EXTERN_ENGINE;
|
||||||
|
|
||||||
extern CanSensorBase* cansensors_head;
|
extern CanListener* canListeners_head;
|
||||||
|
|
||||||
CanWrite::CanWrite()
|
CanWrite::CanWrite()
|
||||||
: PeriodicController("CAN TX", PRIO_CAN_TX, 50)
|
: PeriodicController("CAN TX", PRIO_CAN_TX, 50)
|
||||||
|
@ -35,7 +35,7 @@ void CanWrite::PeriodicTask(efitime_t nowNt) {
|
||||||
sendCanVerbose();
|
sendCanVerbose();
|
||||||
}
|
}
|
||||||
|
|
||||||
CanSensorBase* current = cansensors_head;
|
CanListener* current = canListeners_head;
|
||||||
|
|
||||||
while (current) {
|
while (current) {
|
||||||
current = current->request();
|
current = current->request();
|
||||||
|
|
|
@ -13,46 +13,20 @@
|
||||||
#include "can_msg_tx.h"
|
#include "can_msg_tx.h"
|
||||||
#include "obd2.h"
|
#include "obd2.h"
|
||||||
#include "can.h"
|
#include "can.h"
|
||||||
|
#include "can_listener.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sensor which reads it's value from CAN
|
* Sensor which reads it's value from CAN
|
||||||
*/
|
*/
|
||||||
class CanSensorBase : public StoredValueSensor {
|
class CanSensorBase : public StoredValueSensor, public CanListener {
|
||||||
public:
|
public:
|
||||||
CanSensorBase(uint32_t eid, SensorType type, efitick_t timeout)
|
CanSensorBase(uint32_t eid, SensorType type, efitick_t timeout)
|
||||||
: StoredValueSensor(type, timeout)
|
: StoredValueSensor(type, timeout)
|
||||||
, m_eid(eid)
|
, CanListener(eid)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual CanSensorBase* request() {
|
|
||||||
return m_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
void showInfo(Logging* logger, const char* sensorName) const override;
|
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 <typename TStorage, int TScale>
|
template <typename TStorage, int TScale>
|
||||||
|
@ -105,7 +79,7 @@ public:
|
||||||
setValidValue(fValue, nowNt);
|
setValidValue(fValue, nowNt);
|
||||||
}
|
}
|
||||||
|
|
||||||
CanSensorBase* request() override {
|
CanListener* request() override {
|
||||||
{
|
{
|
||||||
CanTxMessage msg(OBD_TEST_REQUEST);
|
CanTxMessage msg(OBD_TEST_REQUEST);
|
||||||
msg[0] = _OBD_2;
|
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
|
// 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
|
// todo: smarter logic of all this with with semaphore not just sleep
|
||||||
chThdSleepMilliseconds(300);
|
chThdSleepMilliseconds(300);
|
||||||
return m_next;
|
return CanListener::request();
|
||||||
}
|
}
|
||||||
|
|
||||||
int PID;
|
int PID;
|
||||||
|
|
Loading…
Reference in New Issue