From 7baa5688efadaf45bebf00c450f36942d056e98c Mon Sep 17 00:00:00 2001 From: andreas Date: Thu, 24 Aug 2023 17:32:13 +0200 Subject: [PATCH] 1st twai version with send/receive --- lib/nmea2ktwai/Nmea2kTwai.cpp | 81 +++++++++++++++++++++++++++++++++++ lib/nmea2ktwai/Nmea2kTwai.h | 27 ++++++++++++ src/main.cpp | 15 +++++-- 3 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 lib/nmea2ktwai/Nmea2kTwai.cpp create mode 100644 lib/nmea2ktwai/Nmea2kTwai.h diff --git a/lib/nmea2ktwai/Nmea2kTwai.cpp b/lib/nmea2ktwai/Nmea2kTwai.cpp new file mode 100644 index 0000000..0dc7ca1 --- /dev/null +++ b/lib/nmea2ktwai/Nmea2kTwai.cpp @@ -0,0 +1,81 @@ +#include "Nmea2kTwai.h" +#include "driver/gpio.h" +#include "driver/twai.h" +#include "GwLog.h" + +#define TWAI_DEBUG 1 +#if TWAI_DEBUG == 1 + #define TWAI_LOG(...) LOG_DEBUG(__VA_ARGS__) + #define TWAI_LDEBUG(...) +#else + #if TWAI_DEBUG == 2 + #define TWAI_LOG(...) LOG_DEBUG(__VA_ARGS__) + #define TWA_LDEBUG(...) LOG_DEBUG(__VA_ARGS__) + #else + #define TWAI_LOG(...) + #define TWAI_LDEBUG(...) + #endif +#endif + +Nmea2kTwai::Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin,GwLog *l): + tNMEA2000(),RxPin(_RxPin),TxPin(_TxPin),logger(l) +{ +} + +bool Nmea2kTwai::CANSendFrame(unsigned long id, unsigned char len, const unsigned char *buf, bool wait_sent) +{ + twai_message_t message; + message.identifier = id; + message.extd = 1; + message.data_length_code = len; + memcpy(message.data,buf,len); + esp_err_t rt=twai_transmit(&message,0); + if (rt != ESP_OK){ + TWAI_LOG(GwLog::DEBUG,"twai transmit for %ld failed: %d",id,(int)rt); + return false; + } + TWAI_LDEBUG(GwLog::DEBUG,"twai transmit id %ld, len %d",id,(int)len); + return true; +} +bool Nmea2kTwai::CANOpen() +{ + esp_err_t rt=twai_start(); + if (rt != ESP_OK){ + LOG_DEBUG(GwLog::ERROR,"CANOpen failed: %d",(int)rt); + return false; + } + else{ + LOG_DEBUG(GwLog::LOG,"CANOpen ok"); + } + return true; +} +bool Nmea2kTwai::CANGetFrame(unsigned long &id, unsigned char &len, unsigned char *buf) +{ + twai_message_t message; + esp_err_t rt=twai_receive(&message,0); + if (rt != ESP_OK){ + return false; + } + id=message.identifier; + len=message.data_length_code; + TWAI_LDEBUG(GwLog::DEBUG,"twai rcv id=%ld,len=%d, ext=%d",message.identifier,message.data_length_code,message.extd); + memcpy(buf,message.data,message.data_length_code); + return true; +} +// 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. +void Nmea2kTwai::InitCANFrameBuffers() +{ + twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(TxPin,RxPin, TWAI_MODE_NORMAL); + twai_timing_config_t t_config = TWAI_TIMING_CONFIG_250KBITS(); + twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL(); + esp_err_t rt=twai_driver_install(&g_config, &t_config, &f_config); + if (rt == ESP_OK) { + LOG_DEBUG(GwLog::LOG,"twai driver initialzed, rx=%d,tx=%d",(int)RxPin,(int)TxPin); + } + else{ + LOG_DEBUG(GwLog::ERROR,"twai driver init failed: %d",(int)rt); + } + tNMEA2000::InitCANFrameBuffers(); + +} \ No newline at end of file diff --git a/lib/nmea2ktwai/Nmea2kTwai.h b/lib/nmea2ktwai/Nmea2kTwai.h new file mode 100644 index 0000000..3d91301 --- /dev/null +++ b/lib/nmea2ktwai/Nmea2kTwai.h @@ -0,0 +1,27 @@ +#ifndef _NMEA2KTWAI_H +#define _NMEA2KTWAI_H +#include "NMEA2000.h" +#include "GwLog.h" + +class Nmea2kTwai : public tNMEA2000{ + public: + Nmea2kTwai(gpio_num_t _TxPin, gpio_num_t _RxPin,GwLog *logger); + 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), + // Teensy FlexCAN (NMEA2000_Teensy), NMEA2000_avr for AVR, NMEA2000_mbed for MBED and NMEA2000_socketCAN for e.g. RPi. + virtual bool CANSendFrame(unsigned long id, unsigned char len, const unsigned char *buf, bool wait_sent=true); + virtual bool CANOpen(); + 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(); + + private: + gpio_num_t TxPin; + gpio_num_t RxPin; + GwLog *logger; + +}; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 557c35a..ddeaf37 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "GwAppInfo.h" +#define USE_TWAI // #define GW_MESSAGE_DEBUG_ENABLED //#define FALLBACK_SERIAL //#define CAN_ESP_DEBUG @@ -65,17 +66,14 @@ const unsigned long HEAP_REPORT_TIME=2000; //set to 0 to disable heap reporting #include "GwTcpClient.h" #include "GwChannel.h" #include "GwChannelList.h" - -#include // forked from https://github.com/ttlappalainen/NMEA2000_esp32 #ifdef FALLBACK_SERIAL #ifdef CAN_ESP_DEBUG #define CDBS &Serial #else #define CDBS NULL #endif - tNMEA2000 &NMEA2000=*(new tNMEA2000_esp32(ESP32_CAN_TX_PIN,ESP32_CAN_RX_PIN,CDBS)); #else - tNMEA2000 &NMEA2000=*(new tNMEA2000_esp32()); + #define CDBS NULL #endif @@ -111,6 +109,15 @@ typedef std::map StringMap; GwLog logger(LOGLEVEL,NULL); GwConfigHandler config(&logger); + +#ifndef USE_TWAI +#include // forked from https://github.com/ttlappalainen/NMEA2000_esp32 +tNMEA2000 &NMEA2000=*(new tNMEA2000_esp32(ESP32_CAN_TX_PIN,ESP32_CAN_RX_PIN,CDBS)); +#else +#include "Nmea2kTwai.h" +tNMEA2000 &NMEA2000=*(new Nmea2kTwai(ESP32_CAN_TX_PIN,ESP32_CAN_RX_PIN,&logger)); +#endif + #ifdef GWBUTTON_PIN bool fixedApPass=false; #else