Skip to content

Commit

Permalink
add bus off recovery
Browse files Browse the repository at this point in the history
  • Loading branch information
andreas committed Aug 24, 2023
1 parent 3be08a0 commit 41d8578
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
28 changes: 27 additions & 1 deletion lib/nmea2ktwai/Nmea2kTwai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include "driver/twai.h"
#include "GwLog.h"

#define TWAI_DEBUG 1
#define TWAI_DEBUG 0
#if TWAI_DEBUG == 1
#define TWAI_LOG(...) LOG_DEBUG(__VA_ARGS__)
#define TWAI_LDEBUG(...)
Expand Down Expand Up @@ -89,4 +89,30 @@ void Nmea2kTwai::InitCANFrameBuffers()
}
tNMEA2000::InitCANFrameBuffers();

}
Nmea2kTwai::STATE Nmea2kTwai::getState(){
twai_status_info_t state;
if (twai_get_status_info(&state) != ESP_OK){
return ST_ERROR;
}
switch(state.state){
case TWAI_STATE_STOPPED:
return ST_STOPPED;
case TWAI_STATE_RUNNING:
return ST_RUNNING;
case TWAI_STATE_BUS_OFF:
return ST_BUS_OFF;
case TWAI_STATE_RECOVERING:
return ST_RECOVERING;
}
return ST_ERROR;
}
bool Nmea2kTwai::startRecovery(){
esp_err_t rt=twai_initiate_recovery();
if (rt != ESP_OK){
LOG_DEBUG(GwLog::ERROR,"twai: initiate recovery failed with error %x",(int)rt);
return false;
}
LOG_DEBUG(GwLog::LOG,"twai: bus recovery started");
return true;
}
11 changes: 11 additions & 0 deletions lib/nmea2ktwai/Nmea2kTwai.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@
class Nmea2kTwai : public tNMEA2000{
public:
Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin,GwLog *logger);
typedef enum{
ST_STOPPED,
ST_RUNNING,
ST_BUS_OFF,
ST_RECOVERING,
ST_ERROR
} STATE;
STATE getState();
bool startRecovery();
protected:
// Virtual functions for different interfaces. Currently there are own classes
// for Arduino due internal CAN (NMEA2000_due), external MCP2515 SPI CAN bus controller (NMEA2000_mcp),
Expand All @@ -17,6 +26,8 @@ class Nmea2kTwai : public tNMEA2000{
// and you want to change size of library send frame buffer size. See e.g. NMEA2000_teensy.cpp.
virtual void InitCANFrameBuffers();



private:
gpio_num_t TxPin;
gpio_num_t RxPin;
Expand Down
15 changes: 14 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ GwLog logger(LOGLEVEL,NULL);
GwConfigHandler config(&logger);

#include "Nmea2kTwai.h"
tNMEA2000 &NMEA2000=*(new Nmea2kTwai(ESP32_CAN_TX_PIN,ESP32_CAN_RX_PIN,&logger));
Nmea2kTwai &NMEA2000=*(new Nmea2kTwai(ESP32_CAN_TX_PIN,ESP32_CAN_RX_PIN,&logger));

#ifdef GWBUTTON_PIN
bool fixedApPass=false;
Expand Down Expand Up @@ -821,6 +821,8 @@ void handleSendAndRead(bool handleRead){

TimeMonitor monitor(20,0.2);
unsigned long lastHeapReport=0;
unsigned long lastCanRecovery=0;
static const unsigned long CAN_RECOVERY_PERIOD=3000; //ms
void loop() {
monitor.reset();
GWSYNCHRONIZED(&mainLock);
Expand All @@ -839,6 +841,17 @@ void loop() {
logger.logDebug(GwLog::DEBUG,"Main loop %s",monitor.getLog().c_str());
}
}
if (now > (lastCanRecovery + CAN_RECOVERY_PERIOD)){
lastCanRecovery=now;
Nmea2kTwai::STATE canState=NMEA2000.getState();
if (canState != Nmea2kTwai::ST_RUNNING){
logger.logDebug(GwLog::DEBUG,"can state: %d",canState);
if (canState == Nmea2kTwai::ST_BUS_OFF){
bool rt=NMEA2000.startRecovery();
logger.logDebug(GwLog::LOG,"start can recovery - result %d",(int)rt);
}
}
}
monitor.setTime(3);
channels.allChannels([](GwChannel *c){
c->loop(true,false);
Expand Down

0 comments on commit 41d8578

Please sign in to comment.