From 294f1731c97cbd3e0a4b42999b2a21c174e59db1 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Sun, 1 Mar 2026 11:55:18 +0100 Subject: [PATCH] NMEA2000 status for web status page --- include/main.h | 2 ++ lib/Nmea2kTwai/Nmea2kTwai.cpp | 11 ++++++++++- lib/Nmea2kTwai/Nmea2kTwai.h | 1 + src/main.cpp | 6 +++--- src/webserver.cpp | 6 ++++++ 5 files changed, 22 insertions(+), 4 deletions(-) diff --git a/include/main.h b/include/main.h index f30dc9a..8ac5d4f 100644 --- a/include/main.h +++ b/include/main.h @@ -44,6 +44,8 @@ // WIFI AP #define WIFI_CHANNEL 9 #define WIFI_MAX_STA 2 +#define WIFI_SSID "OBPKP61" +#define WIFI_PASS "keypad61" // NMEA2000 defaults #define N2K_DEFAULT_NODEID 124 diff --git a/lib/Nmea2kTwai/Nmea2kTwai.cpp b/lib/Nmea2kTwai/Nmea2kTwai.cpp index b14d7e1..09aa077 100644 --- a/lib/Nmea2kTwai/Nmea2kTwai.cpp +++ b/lib/Nmea2kTwai/Nmea2kTwai.cpp @@ -37,12 +37,20 @@ bool Nmea2kTwai::CANSendFrame(unsigned long id, unsigned char len, const unsigne if (rt == ESP_ERR_TIMEOUT) { if (txTimeouts < TIMEOUT_OFFLINE) { txTimeouts++; + } else if (!tx_offline) { + tx_offline = true; + LOGW(TAG, "twai tx offline timeout reached"); } } - LOGW(TAG, "twai transmit for %ld failed: %x", LOGID(id), (int)rt); + if (txTimeouts > 0 && !tx_offline) { + LOGW(TAG, "twai transmit for %ld failed: %x", LOGID(id), (int)rt); + } else { + // TODO log every seconds a offline message + } return false; } txTimeouts = 0; + tx_offline = false; LOGV(TAG, "twai transmit id %ld, len %d", LOGID(id), (int)len); return true; } @@ -231,6 +239,7 @@ const char * Nmea2kTwai::stateStr(const Nmea2kTwai::STATE &st) } return "ERROR"; } + const Nmea2kTwai::ManufacturerEntry Nmea2kTwai::ManufacturerTable[] = { {0, "Reserved"}, {69, "ARKS Enterprises, Inc."}, diff --git a/lib/Nmea2kTwai/Nmea2kTwai.h b/lib/Nmea2kTwai/Nmea2kTwai.h index 1dd5ab3..233a6c0 100644 --- a/lib/Nmea2kTwai/Nmea2kTwai.h +++ b/lib/Nmea2kTwai/Nmea2kTwai.h @@ -58,6 +58,7 @@ private: uint32_t txTimeouts = 0; // GwIntervalRunner timers; bool disabled = false; + bool tx_offline = false; unsigned long lastRecoveryStart = 0; }; diff --git a/src/main.cpp b/src/main.cpp index 9d82c9d..dc501ac 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,8 +37,8 @@ static const char* TAG = "MAIN"; uint64_t chipid = ESP.getEfuseMac(); uint8_t loglevel = 5; -const char* wifi_ssid = "OBPKP61"; -const char* wifi_pass = "keypad61"; +const char* wifi_ssid = WIFI_SSID; +const char* wifi_pass = WIFI_PASS; bool ap_hidden = false; bool ap_enabled = true; @@ -347,7 +347,6 @@ void setup() { WiFi.persistent(false); WiFi.mode(WIFI_MODE_AP); - // IPAddress ap_addr(192, 168, 15, 1); IPAddress ap_addr; ap_addr.fromString(apip); @@ -436,6 +435,7 @@ void setup() { NMEA2000.ExtendTransmitMessages(TransmitPGNs); pN2kDeviceList = new tN2kDeviceList(&NMEA2000); // Debug: NMEA2000.EnableForward(true); + NMEA2000.Open(); led_init(); diff --git a/src/webserver.cpp b/src/webserver.cpp index cb24a1b..29647d4 100644 --- a/src/webserver.cpp +++ b/src/webserver.cpp @@ -208,6 +208,12 @@ void webserver_init() { doc["n2kDestA"] = config.getString("n2kDestA"); doc["n2kDestB"] = config.getString("n2kDestB"); doc["n2kDestC"] = config.getString("n2kDestC"); + + Nmea2kTwai::Status n2kState = NMEA2000.getStatus(); + Nmea2kTwai::STATE driverState = n2kState.state; + doc["n2kstate"] = NMEA2000.stateStr(driverState); + doc["n2knode"] = NMEA2000.GetN2kSource(); + doc["status"] = "OK"; String out; serializeJson(doc, out);