better handling if no CAN Pins are configured
This commit is contained in:
parent
1b3840f207
commit
f36dd37b8b
|
@ -9,12 +9,18 @@ static const int TIMEOUT_OFFLINE=256; //# of timeouts to consider offline
|
||||||
Nmea2kTwai::Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin, unsigned long recP, unsigned long logP):
|
Nmea2kTwai::Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin, unsigned long recP, unsigned long logP):
|
||||||
tNMEA2000(),RxPin(_RxPin),TxPin(_TxPin)
|
tNMEA2000(),RxPin(_RxPin),TxPin(_TxPin)
|
||||||
{
|
{
|
||||||
timers.addAction(logP,[this](){logStatus();});
|
if (RxPin < 0 || TxPin < 0){
|
||||||
timers.addAction(recP,[this](){checkRecovery();});
|
disabled=true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
timers.addAction(logP,[this](){logStatus();});
|
||||||
|
timers.addAction(recP,[this](){checkRecovery();});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Nmea2kTwai::CANSendFrame(unsigned long id, unsigned char len, const unsigned char *buf, bool wait_sent)
|
bool Nmea2kTwai::CANSendFrame(unsigned long id, unsigned char len, const unsigned char *buf, bool wait_sent)
|
||||||
{
|
{
|
||||||
|
if (disabled) return true;
|
||||||
twai_message_t message;
|
twai_message_t message;
|
||||||
memset(&message,0,sizeof(message));
|
memset(&message,0,sizeof(message));
|
||||||
message.identifier = id;
|
message.identifier = id;
|
||||||
|
@ -35,6 +41,10 @@ bool Nmea2kTwai::CANSendFrame(unsigned long id, unsigned char len, const unsigne
|
||||||
}
|
}
|
||||||
bool Nmea2kTwai::CANOpen()
|
bool Nmea2kTwai::CANOpen()
|
||||||
{
|
{
|
||||||
|
if (disabled){
|
||||||
|
logDebug(LOG_INFO,"CAN disabled");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
esp_err_t rt=twai_start();
|
esp_err_t rt=twai_start();
|
||||||
if (rt != ESP_OK){
|
if (rt != ESP_OK){
|
||||||
logDebug(LOG_ERR,"CANOpen failed: %x",(int)rt);
|
logDebug(LOG_ERR,"CANOpen failed: %x",(int)rt);
|
||||||
|
@ -47,6 +57,7 @@ bool Nmea2kTwai::CANOpen()
|
||||||
}
|
}
|
||||||
bool Nmea2kTwai::CANGetFrame(unsigned long &id, unsigned char &len, unsigned char *buf)
|
bool Nmea2kTwai::CANGetFrame(unsigned long &id, unsigned char &len, unsigned char *buf)
|
||||||
{
|
{
|
||||||
|
if (disabled) return false;
|
||||||
twai_message_t message;
|
twai_message_t message;
|
||||||
esp_err_t rt=twai_receive(&message,0);
|
esp_err_t rt=twai_receive(&message,0);
|
||||||
if (rt != ESP_OK){
|
if (rt != ESP_OK){
|
||||||
|
@ -68,6 +79,7 @@ bool Nmea2kTwai::CANGetFrame(unsigned long &id, unsigned char &len, unsigned cha
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void Nmea2kTwai::initDriver(){
|
void Nmea2kTwai::initDriver(){
|
||||||
|
if (disabled) return;
|
||||||
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(TxPin,RxPin, TWAI_MODE_NORMAL);
|
twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(TxPin,RxPin, TWAI_MODE_NORMAL);
|
||||||
g_config.tx_queue_len=20;
|
g_config.tx_queue_len=20;
|
||||||
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_250KBITS();
|
twai_timing_config_t t_config = TWAI_TIMING_CONFIG_250KBITS();
|
||||||
|
@ -84,13 +96,22 @@ void Nmea2kTwai::initDriver(){
|
||||||
// and you want to change size of library send frame buffer size. See e.g. NMEA2000_teensy.cpp.
|
// and you want to change size of library send frame buffer size. See e.g. NMEA2000_teensy.cpp.
|
||||||
void Nmea2kTwai::InitCANFrameBuffers()
|
void Nmea2kTwai::InitCANFrameBuffers()
|
||||||
{
|
{
|
||||||
initDriver();
|
if (disabled){
|
||||||
|
logDebug(LOG_INFO,"twai init - disabled");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
initDriver();
|
||||||
|
}
|
||||||
tNMEA2000::InitCANFrameBuffers();
|
tNMEA2000::InitCANFrameBuffers();
|
||||||
|
|
||||||
}
|
}
|
||||||
Nmea2kTwai::Status Nmea2kTwai::getStatus(){
|
Nmea2kTwai::Status Nmea2kTwai::getStatus(){
|
||||||
twai_status_info_t state;
|
twai_status_info_t state;
|
||||||
Status rt;
|
Status rt;
|
||||||
|
if (disabled){
|
||||||
|
rt.state=ST_DISABLED;
|
||||||
|
return rt;
|
||||||
|
}
|
||||||
if (twai_get_status_info(&state) != ESP_OK){
|
if (twai_get_status_info(&state) != ESP_OK){
|
||||||
return rt;
|
return rt;
|
||||||
}
|
}
|
||||||
|
@ -120,6 +141,7 @@ Nmea2kTwai::Status Nmea2kTwai::getStatus(){
|
||||||
return rt;
|
return rt;
|
||||||
}
|
}
|
||||||
bool Nmea2kTwai::checkRecovery(){
|
bool Nmea2kTwai::checkRecovery(){
|
||||||
|
if (disabled) return false;
|
||||||
Status canState=getStatus();
|
Status canState=getStatus();
|
||||||
bool strt=false;
|
bool strt=false;
|
||||||
if (canState.state != Nmea2kTwai::ST_RUNNING)
|
if (canState.state != Nmea2kTwai::ST_RUNNING)
|
||||||
|
@ -140,6 +162,7 @@ bool Nmea2kTwai::checkRecovery(){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Nmea2kTwai::loop(){
|
void Nmea2kTwai::loop(){
|
||||||
|
if (disabled) return;
|
||||||
timers.loop();
|
timers.loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +180,7 @@ Nmea2kTwai::Status Nmea2kTwai::logStatus(){
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Nmea2kTwai::startRecovery(){
|
bool Nmea2kTwai::startRecovery(){
|
||||||
|
if (disabled) return false;
|
||||||
lastRecoveryStart=millis();
|
lastRecoveryStart=millis();
|
||||||
esp_err_t rt=twai_driver_uninstall();
|
esp_err_t rt=twai_driver_uninstall();
|
||||||
if (rt != ESP_OK){
|
if (rt != ESP_OK){
|
||||||
|
@ -174,6 +198,7 @@ const char * Nmea2kTwai::stateStr(const Nmea2kTwai::STATE &st){
|
||||||
case ST_RUNNING: return "RUNNING";
|
case ST_RUNNING: return "RUNNING";
|
||||||
case ST_STOPPED: return "STOPPED";
|
case ST_STOPPED: return "STOPPED";
|
||||||
case ST_OFFLINE: return "OFFLINE";
|
case ST_OFFLINE: return "OFFLINE";
|
||||||
|
case ST_DISABLED: return "DISABLED";
|
||||||
}
|
}
|
||||||
return "ERROR";
|
return "ERROR";
|
||||||
}
|
}
|
|
@ -12,6 +12,7 @@ class Nmea2kTwai : public tNMEA2000{
|
||||||
ST_BUS_OFF,
|
ST_BUS_OFF,
|
||||||
ST_RECOVERING,
|
ST_RECOVERING,
|
||||||
ST_OFFLINE,
|
ST_OFFLINE,
|
||||||
|
ST_DISABLED,
|
||||||
ST_ERROR
|
ST_ERROR
|
||||||
} STATE;
|
} STATE;
|
||||||
typedef struct{
|
typedef struct{
|
||||||
|
@ -55,6 +56,7 @@ class Nmea2kTwai : public tNMEA2000{
|
||||||
gpio_num_t RxPin;
|
gpio_num_t RxPin;
|
||||||
uint32_t txTimeouts=0;
|
uint32_t txTimeouts=0;
|
||||||
GwIntervalRunner timers;
|
GwIntervalRunner timers;
|
||||||
|
bool disabled=false;
|
||||||
unsigned long lastRecoveryStart=0;
|
unsigned long lastRecoveryStart=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue