Files
OBPkp61/lib/Nmea2kTwai/Nmea2kTwai.h

64 lines
2.0 KiB
C++

#pragma once
#include "NMEA2000.h"
// #include "GwTimer.h"
class Nmea2kTwai : public tNMEA2000 {
public:
Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin, unsigned long recP=0, unsigned long logPeriod=0);
typedef enum {
ST_STOPPED,
ST_RUNNING,
ST_BUS_OFF,
ST_RECOVERING,
ST_OFFLINE,
ST_DISABLED,
ST_ERROR
} STATE;
typedef struct {
//see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/twai.html#_CPPv418twai_status_info_t
uint32_t rx_errors = 0;
uint32_t tx_errors = 0;
uint32_t tx_failed = 0;
uint32_t rx_missed = 0;
uint32_t rx_overrun = 0;
uint32_t tx_timeouts = 0;
STATE state = ST_ERROR;
} Status;
Status getStatus();
unsigned long getLastRecoveryStart() { return lastRecoveryStart; }
void loop();
static const char *stateStr(const STATE &st);
virtual bool CANOpen();
virtual ~Nmea2kTwai() {};
struct ManufacturerEntry {
uint16_t code;
const char* name;
};
const char* GetManufacturerName(uint16_t code);
protected:
virtual bool CANSendFrame(unsigned long id, unsigned char len, const unsigned char *buf, bool wait_sent=true);
virtual bool CANGetFrame(unsigned long &id, unsigned char &len, unsigned char *buf);
/* This will be called on Open() before any other initialization.
Inherit this, if buffers can be set for the driver and you want
to change size of library send frame buffer size.
See e.g. NMEA2000_teensy.cpp. */
virtual void InitCANFrameBuffers();
// virtual void logDebug(int level,const char *fmt,...){}
static const ManufacturerEntry ManufacturerTable[];
private:
void initDriver();
bool startRecovery();
bool checkRecovery();
Status logStatus();
gpio_num_t TxPin;
gpio_num_t RxPin;
uint32_t txTimeouts = 0;
// GwIntervalRunner timers;
bool disabled = false;
unsigned long lastRecoveryStart = 0;
};