Files
OBPkp61/lib/Nmea2kTwai/Nmea2kTwai.h
2025-11-29 09:58:10 +01:00

63 lines
2.0 KiB
C++

#ifndef _NMEA2KTWAI_H
#define _NMEA2KTWAI_H
#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(){};
static const int LOG_ERR = 0;
static const int LOG_INFO = 1;
static const int LOG_DEBUG = 2;
static const int LOG_MSG = 3;
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,...){}
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;
};
#endif