From 68eb995909646d040c29642ddfa06cbf4ad9ff78 Mon Sep 17 00:00:00 2001 From: Norbert Walter Date: Tue, 11 Jan 2022 16:41:58 +0100 Subject: [PATCH] QR code modifyed, insert all bus data --- lib/obp60task/GwOBP60Task.cpp | 155 +++++++++++++++++++++++++--------- lib/obp60task/OBP60Data.h | 97 +++++++++++---------- lib/obp60task/OBP60QRWiFi.h | 16 ++-- lib/obp60task/config.json | 2 +- 4 files changed, 180 insertions(+), 90 deletions(-) diff --git a/lib/obp60task/GwOBP60Task.cpp b/lib/obp60task/GwOBP60Task.cpp index faa6d0c..f68449f 100644 --- a/lib/obp60task/GwOBP60Task.cpp +++ b/lib/obp60task/GwOBP60Task.cpp @@ -30,8 +30,8 @@ #include "MFD_OBP60_400x300_sw.h" // MFD with logo #include "Logo_OBP_400x300_sw.h" // OBP Logo -#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code #include "OBP60Data.h" // Data stucture +#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code #include "Page_0.h" // Page 0 Depth #include "Page_1.h" // Page 1 Speed #include "Page_2.h" // Page 2 VBat @@ -221,6 +221,17 @@ void OBP60Task(void *param){ bool hasPosition = false; // Get configuration data from webside + // System Settings + api->getConfig()->getConfigItem(api->getConfig()->systemName,true)->asString().toCharArray(busInfo.systemname, 32); + api->getConfig()->getConfigItem(api->getConfig()->systemName,true)->asString().toCharArray(busInfo.wifissid, 32); + api->getConfig()->getConfigItem(api->getConfig()->apPassword,true)->asString().toCharArray(busInfo.wifipass, 32); + busInfo.useadminpass = api->getConfig()->getConfigItem(api->getConfig()->useAdminPass,true)->asBoolean(); + api->getConfig()->getConfigItem(api->getConfig()->adminPassword,true)->asString().toCharArray(busInfo.adminpassword, 32); + api->getConfig()->getConfigItem(api->getConfig()->logLevel,true)->asString().toCharArray(busInfo.loglevel, 16); + // WiFi client settings + busInfo.wificlienton = api->getConfig()->getConfigItem(api->getConfig()->wifiClient,true)->asBoolean(); + api->getConfig()->getConfigItem(api->getConfig()->wifiSSID,true)->asString().toCharArray(busInfo.wificlientssid, 32); + api->getConfig()->getConfigItem(api->getConfig()->wifiPass,true)->asString().toCharArray(busInfo.wificlientpass, 32); // OBP60 Settings bool exampleSwitch = api->getConfig()->getConfigItem(api->getConfig()->obp60Config,true)->asBoolean(); LOG_DEBUG(GwLog::DEBUG,"example switch ist %s",exampleSwitch?"true":"false"); @@ -238,14 +249,14 @@ void OBP60Task(void *param){ busInfo.gps = api->getConfig()->getConfigItem(api->getConfig()->useGPS,true)->asBoolean(); busInfo.bme280 = api->getConfig()->getConfigItem(api->getConfig()->useBME280,true)->asBoolean(); busInfo.onewire = api->getConfig()->getConfigItem(api->getConfig()->use1Wire,true)->asBoolean(); - String powerMode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString(); + api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString().toCharArray(busInfo.powermode, 16); busInfo.simulation = api->getConfig()->getConfigItem(api->getConfig()->useSimuData,true)->asBoolean(); // OBP60 Display - String displayMode = api->getConfig()->getConfigItem(api->getConfig()->display,true)->asString(); + api->getConfig()->getConfigItem(api->getConfig()->display,true)->asString().toCharArray(busInfo.displaymode, 16); busInfo.statusline = api->getConfig()->getConfigItem(api->getConfig()->statusLine,true)->asBoolean(); busInfo.refresh = api->getConfig()->getConfigItem(api->getConfig()->refresh,true)->asBoolean(); - String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString(); - api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString().toCharArray(busInfo.flashled, 16); + api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString().toCharArray(busInfo.backlight, 16); + api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString().toCharArray(busInfo.powermode, 16); // OBP60 Buzzer busInfo.buzerror = api->getConfig()->getConfigItem(api->getConfig()->buzzerError,true)->asBoolean(); busInfo.buzgps = api->getConfig()->getConfigItem(api->getConfig()->buzzerGps,true)->asBoolean(); @@ -270,17 +281,31 @@ void OBP60Task(void *param){ GwApi::BoatValue *mheading=new GwApi::BoatValue(F("MagneticHeading")); GwApi::BoatValue *rot=new GwApi::BoatValue(F("ROT")); GwApi::BoatValue *variation=new GwApi::BoatValue(F("Variation")); + GwApi::BoatValue *hdop=new GwApi::BoatValue(F("HDOP")); + GwApi::BoatValue *pdop=new GwApi::BoatValue(F("PDOP")); + GwApi::BoatValue *vdop=new GwApi::BoatValue(F("VDOP")); + GwApi::BoatValue *rudderpos=new GwApi::BoatValue(F("RudderPosition")); + GwApi::BoatValue *latitude=new GwApi::BoatValue(F("Latitude")); + GwApi::BoatValue *longitude=new GwApi::BoatValue(F("Longitude")); + GwApi::BoatValue *altitude=new GwApi::BoatValue(F("Altitude")); + GwApi::BoatValue *waterdepth=new GwApi::BoatValue(F("WaterDepth")); + GwApi::BoatValue *depthtransducer=new GwApi::BoatValue(F("DepthTransducer")); + GwApi::BoatValue *time=new GwApi::BoatValue(F("GpsTime")); + GwApi::BoatValue *date=new GwApi::BoatValue(F("GpsDate")); + GwApi::BoatValue *timezone=new GwApi::BoatValue(F("Timezone")); + GwApi::BoatValue *satinfo=new GwApi::BoatValue(F("SatInfo")); + GwApi::BoatValue *watertemp=new GwApi::BoatValue(F("WaterTemperature")); + GwApi::BoatValue *xte=new GwApi::BoatValue(F("XTE")); + GwApi::BoatValue *dtw=new GwApi::BoatValue(F("DTW")); + GwApi::BoatValue *btw=new GwApi::BoatValue(F("BTW")); + GwApi::BoatValue *wplatitude=new GwApi::BoatValue(F("WPLatitude")); + GwApi::BoatValue *wplongitude=new GwApi::BoatValue(F("WPLongitude")); + GwApi::BoatValue *log=new GwApi::BoatValue(F("Log")); + GwApi::BoatValue *triplog=new GwApi::BoatValue(F("TripLog")); //################################################################# - GwApi::BoatValue *date=new GwApi::BoatValue(F("GpsDate")); - GwApi::BoatValue *time=new GwApi::BoatValue(F("GpsTime")); - GwApi::BoatValue *longitude=new GwApi::BoatValue(F("Longitude")); - GwApi::BoatValue *latitude=new GwApi::BoatValue(F("Latitude")); - GwApi::BoatValue *waterdepth=new GwApi::BoatValue(F("WaterDepth")); - GwApi::BoatValue *hdop=new GwApi::BoatValue(F("HDOP")); - GwApi::BoatValue *pdop=new GwApi::BoatValue(F("PDOP")); - GwApi::BoatValue *valueList[]={cog, twd, awd, sog, stw, tws, aws, maxtws, maxaws, awa, heading, mheading, rot, variation, date, time, longitude, latitude, waterdepth, hdop, pdop}; + GwApi::BoatValue *valueList[]={cog, twd, awd, sog, stw, tws, aws, maxtws, maxaws, awa, heading, mheading, rot, variation, hdop, pdop, vdop, rudderpos, latitude, longitude, altitude, waterdepth, depthtransducer, time, date, timezone, satinfo, watertemp, xte, dtw, btw, wplatitude, wplongitude, log, triplog}; //Init E-Ink display display.init(); // Initialize and clear display @@ -289,15 +314,15 @@ void OBP60Task(void *param){ display.fillRect(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, GxEPD_WHITE); // Draw white sreen display.update(); // Full update (slow) - if(displayMode == "Logo + QR Code" || displayMode == "Logo"){ + if(String(busInfo.displaymode) == "Logo + QR Code" || String(busInfo.displaymode) == "Logo"){ display.drawExampleBitmap(gImage_Logo_OBP_400x300_sw, 0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, GxEPD_WHITE); // Draw start logo // display.drawExampleBitmap(gImage_MFD_OBP60_400x300_sw, 0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, GxEPD_WHITE); // Draw start logo display.updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, true); // Partial update (fast) delay(SHOW_TIME); // Logo show time display.fillRect(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, GxEPD_WHITE); // Draw white sreen display.updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, true); // Partial update (fast) - if(displayMode == "Logo + QR Code"){ - qrWiFi(); // Show QR code for WiFi connection + if(String(busInfo.displaymode) == "Logo + QR Code"){ + qrWiFi(busInfo); // Show QR code for WiFi connection delay(SHOW_TIME); // Logo show time display.fillRect(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, GxEPD_WHITE); // Draw white sreen } @@ -312,7 +337,7 @@ void OBP60Task(void *param){ // Backlight On/Off Subtask 100ms if((taskRunCounter % 10) == 0){ // If key controled - if(backlightMode == "Control by Key"){ + if(String(busInfo.backlight) == "Control by Key"){ if(keystatus == "6s"){ LOG_DEBUG(GwLog::DEBUG,"Toggle Backlight LED"); togglePortPin(OBP_BACKLIGHT_LED); @@ -357,16 +382,12 @@ void OBP60Task(void *param){ } } + //###################################################################### + // Read the status values from gateway api->getStatus(status); busInfo.wifiApOn = status.wifiApOn; - busInfo.wifiClientOn = status.wifiClientOn; busInfo.wifiClientConnected = status.wifiClientConnected; - busInfo.wifiApIp = status.wifiApIp; - busInfo.systemName = status.systemName; - busInfo.wifiApPass = status.wifiApPass; - busInfo.wifiClientIp = status.wifiClientIp; - busInfo.wifiClientSSID = status.wifiClientSSID; busInfo.usbRx = status.usbRx; busInfo.usbTx = status.usbTx; busInfo.serRx = status.serRx; @@ -380,8 +401,10 @@ void OBP60Task(void *param){ busInfo.n2kRx = status.n2kRx; busInfo.n2kTx = status.n2kTx; + //###################################################################### + // Read the current bus data and copy to stucture - api->getBoatDataValues(20, valueList); + api->getBoatDataValues(35, valueList); busInfo.COG.fvalue = cog->value; cog->getFormat().toCharArray(busInfo.COG.unit, 8, 0); @@ -439,31 +462,87 @@ void OBP60Task(void *param){ variation->getFormat().toCharArray(busInfo.Variation.unit, 8, 0); busInfo.Variation.valid = int(variation->valid); - - //###################################################################### - - busInfo.WaterDepth.fvalue = waterdepth->value; - waterdepth->getFormat().toCharArray(busInfo.WaterDepth.unit, 8, 0); - busInfo.WaterDepth.valid = int(waterdepth->valid); - - formatValue(date).toCharArray(busInfo.Date.svalue, 16, 0); - busInfo.Date.valid = date->valid; - - formatValue(time).toCharArray(busInfo.Time.svalue, 16, 0); - busInfo.Time.valid = time->valid; - busInfo.HDOP.fvalue = hdop->value; busInfo.HDOP.valid = hdop->valid; busInfo.PDOP.fvalue = pdop->value; busInfo.PDOP.valid = pdop->valid; + busInfo.VDOP.fvalue = vdop->value; + busInfo.VDOP.valid = vdop->valid; + + busInfo.RudderPosition.fvalue = rudderpos->value; + rudderpos->getFormat().toCharArray(busInfo.RudderPosition.unit, 8, 0); + busInfo.RudderPosition.valid = int(rudderpos->valid); + + formatValue(latitude).toCharArray(busInfo.Latitude.svalue, 16, 0); + busInfo.Latitude.valid = latitude->valid; + + formatValue(longitude).toCharArray(busInfo.Longitude.svalue, 16, 0); + busInfo.Longitude.valid = longitude->valid; + + busInfo.Altitude.fvalue = altitude->value; + altitude->getFormat().toCharArray(busInfo.Altitude.unit, 8, 0); + busInfo.Altitude.valid = int(altitude->valid); + + busInfo.WaterDepth.fvalue = waterdepth->value; + waterdepth->getFormat().toCharArray(busInfo.WaterDepth.unit, 8, 0); + busInfo.WaterDepth.valid = int(waterdepth->valid); + + busInfo.DepthTransducer.fvalue = depthtransducer->value; + depthtransducer->getFormat().toCharArray(busInfo.DepthTransducer.unit, 8, 0); + busInfo.DepthTransducer.valid = int(depthtransducer->valid); + + formatValue(time).toCharArray(busInfo.Time.svalue, 16, 0); + busInfo.Time.valid = time->valid; + + formatValue(date).toCharArray(busInfo.Date.svalue, 16, 0); + busInfo.Date.valid = date->valid; + + busInfo.Timezone.fvalue = timezone->value; + busInfo.Timezone.valid = timezone->valid; + + busInfo.SatInfo.fvalue = satinfo->value; + busInfo.SatInfo.valid = satinfo->valid; + + busInfo.WaterTemperature.fvalue = watertemp->value; + watertemp->getFormat().toCharArray(busInfo.WaterTemperature.unit, 8, 0); + busInfo.WaterTemperature.valid = int(watertemp->valid); + + busInfo.XTE.fvalue = xte->value; + xte->getFormat().toCharArray(busInfo.XTE.unit, 8, 0); + busInfo.XTE.valid = int(xte->valid); + + busInfo.DTW.fvalue = dtw->value; + dtw->getFormat().toCharArray(busInfo.DTW.unit, 8, 0); + busInfo.DTW.valid = int(dtw->valid); + + busInfo.BTW.fvalue = btw->value; + btw->getFormat().toCharArray(busInfo.BTW.unit, 8, 0); + busInfo.BTW.valid = int(btw->valid); + + formatValue(wplatitude).toCharArray(busInfo.WPLatitude.svalue, 16, 0); + busInfo.WPLatitude.valid = wplatitude->valid; + + formatValue(wplongitude).toCharArray(busInfo.WPLongitude.svalue, 16, 0); + busInfo.WPLongitude.valid = wplongitude->valid; + + busInfo.Log.fvalue = log->value; + log->getFormat().toCharArray(busInfo.Log.unit, 8, 0); + busInfo.Log.valid = int(log->valid); + + busInfo.TripLog.fvalue = triplog->value; + triplog->getFormat().toCharArray(busInfo.TripLog.unit, 8, 0); + busInfo.TripLog.valid = int(triplog->valid); + + //###################################################################### + // Subtask all 500ms show pages if((taskRunCounter % 50) == 0 || first_view == true){ LOG_DEBUG(GwLog::DEBUG,"Keystatus: %s", keystatus); LOG_DEBUG(GwLog::DEBUG,"Pagenumber: %d", pageNumber); - if(displayMode == "Logo + QR Code" || displayMode == "Logo" || displayMode == "White Screen"){ + if(String(busInfo.displaymode) == "Logo + QR Code" || String(busInfo.displaymode) == "Logo" || String(busInfo.displaymode) == "White Screen"){ showPage(busInfo); } } diff --git a/lib/obp60task/OBP60Data.h b/lib/obp60task/OBP60Data.h index ec2940c..0e7308e 100644 --- a/lib/obp60task/OBP60Data.h +++ b/lib/obp60task/OBP60Data.h @@ -12,57 +12,62 @@ typedef struct{ // Sub structure for bus data typedef struct{ // Gateway status infos - bool wifiApOn = false; - bool wifiClientOn = false; - bool wifiClientConnected = false; - String wifiApIp = ""; - String systemName = ""; // is also AP SSID - String wifiApPass = ""; - String wifiClientIp = ""; - String wifiClientSSID = ""; - unsigned long usbRx = 0; - unsigned long usbTx = 0; - unsigned long serRx = 0; - unsigned long serTx = 0; - unsigned long tcpSerRx = 0; - unsigned long tcpSerTx = 0; - int tcpClients = 0; - unsigned long tcpClRx = 0; - unsigned long tcpClTx = 0; - bool tcpClientConnected = false; - unsigned long n2kRx = 0; - unsigned long n2kTx = 0; + bool wifiApOn = false; // Status access point [on|off] + bool wifiClientConnected = false; // Client connected [yes|no] + unsigned long usbRx = 0; // USB receive traffic + unsigned long usbTx = 0; // USB send traffic + unsigned long serRx = 0; // MNEA0183 serial receive traffic + unsigned long serTx = 0; // NMEA0183 serial send traffic + unsigned long tcpSerRx = 0; // MNEA0183 TCP server receive traffic + unsigned long tcpSerTx = 0; // MNEA0183 TCP server send traffic + int tcpClients = 0; // Number of connected TCP clients + unsigned long tcpClRx = 0; // MNEA0183 TCP client receive traffic + unsigned long tcpClTx = 0; // MNEA0183 TCP client send traffic + bool tcpClientConnected = false; // Connected TCP clients + unsigned long n2kRx = 0; // NMEA2000 CAN receive traffic + unsigned long n2kTx = 0; // NMEA2000 CAN send traffic + // System Settings + char systemname[32] = ""; // System name show on web page and mDNS name + char wifissid[32] = ""; // WiFi access point SSID + char wifipass[32] = ""; // WiFi access point password + bool useadminpass = false; // Use admin password [on|off] + char adminpassword[32] = ""; // Admin password + char loglevel[16] = ""; // Loglevel [off|error|log|debug] + // WiFi client settings + bool wificlienton = false; // Is WiFi client on [on|off] + char wificlientssid[32] = ""; // Wifi client SSID + char wificlientpass[32] = ""; // Wifi client password // OBP60 Settings - char dateformat[3] = "GB"; - int timezone = 0; - float draft = 0; - float fueltank = 0; - float fuelconsumption = 0; - float watertank = 0; - float wastetank = 0; - float batvoltage = 0; - char battype[16] = "Pb"; - float batcapacity = 0; + char dateformat[3] = "GB"; // Date format for status line [DE|GB|US] + int timezone = 0; // Time zone [-12...+12] + float draft = 0; // Boat draft up to keel [m] + float fueltank = 0; // Fuel tank capacity [0...10m] + float fuelconsumption = 0; // Fuel consumption [0...1000l/min] + float watertank = 0; // Water tank kapacity [0...5000l] + float wastetank = 0; // Waste tank kapacity [0...5000l] + float batvoltage = 0; // Battery voltage [0...1000V] + char battype[16] = "Pb"; // Battery type [Pb|Gel|AGM|LiFePo4] + float batcapacity = 0; // Battery capacity [0...10000Ah] // OBP60 Hardware - bool gps = false; - bool bme280 = false; - bool onewire = false; - char powermode[16] = "Max Power"; - bool simulation = false; + bool gps = false; // Internal GPS [on|off] + bool bme280 = false; // Internat BME280 [on|off] + bool onewire = false; // Internal 1Wire bus [on|off] + char powermode[16] = "Max Power"; // Power mode [Max Power|Only 3.3V|Only 5.0V|Min Power] + bool simulation = false; // Simulation data [on|off] // OBP60 Display - char displaymode[16] = "Logo + QR Code"; - bool statusline = true; - bool refresh = false; - char backlight[16] = "Control by Key"; - char flashled[16] = "Off"; + char displaymode[16] = "Logo + QR Code"; // Dislpay mode [White Screen|Logo|Logo + QR Code|Off] + bool statusline = true; // Show status line [on|off] + bool refresh = false; // Refresh display after select a new page [on|off] + char backlight[16] = "Control by Key"; // Backlight mode [Off|Control by Sun|Control by Bus|Control by Time|Control by Key|On] + char flashled[16] = "Off"; // Flash LED mode [Off|Bus Data|GPX Fix|Limits Overrun] // OBP60 Buzzer - bool buzerror = false; - bool buzgps = false; - bool buzlimits = false; - char buzmode[16] = "Off"; - int buzpower = 0; + bool buzerror = false; // Buzzer error [on|off] + bool buzgps = false; // Buzzer by GPS error [on|off] + bool buzlimits = false; // Buzzer by limit underruns and overruns [on|off] + char buzmode[16] = "Off"; // Buzzer mode [Off|Short Single Beep|Lond Single Beep|Beep until Confirmation] + int buzpower = 0; // Buzzer power [0...100%] // OBP60 Pages - int numpages = 1; + int numpages = 1; // Numper of listed pages // Bus data dataContainer AWA; dataContainer AWD; diff --git a/lib/obp60task/OBP60QRWiFi.h b/lib/obp60task/OBP60QRWiFi.h index ed33c02..dd820b3 100644 --- a/lib/obp60task/OBP60QRWiFi.h +++ b/lib/obp60task/OBP60QRWiFi.h @@ -4,7 +4,7 @@ #include #include "qrcode.h" -void qrWiFi(){ +void qrWiFi(busData values){ // Set start point and pixel size int16_t box_x = 100; // X offset int16_t box_y = 30; // Y offset @@ -14,8 +14,10 @@ void qrWiFi(){ // Create the QR code QRCode qrcode; uint8_t qrcodeData[qrcode_getBufferSize(4)]; - - qrcode_initText(&qrcode, qrcodeData, 4, 0, "WIFI:S:OBP60;T:WPA;P:esp32nmea2k;;"); + // Content for QR code: "WIFI:S:mySSID;T:WPA;P:myPASSWORD;;" + String text = "WIFI:S:" + String(values.systemname) + ";T:WPA;P:" + String(values.wifipass) + ";;"; + const char *qrcodecontent = text.c_str(); + qrcode_initText(&qrcode, qrcodeData, 4, 0, qrcodecontent); // Top quiet zone for (uint8_t y = 0; y < qrcode.size; y++) { @@ -35,8 +37,12 @@ void qrWiFi(){ display.setTextColor(GxEPD_BLACK); display.setCursor(140, 285); display.print("WiFi"); - display.updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, true); // Partial update (fast) -// display.update(); // Full update (slow) + if(values.refresh == true){ + display.update(); // Full update (slow) + } + else{ + display.updateWindow(0, 0, GxEPD_WIDTH, GxEPD_HEIGHT, true); // Partial update (fast) + } } #endif \ No newline at end of file diff --git a/lib/obp60task/config.json b/lib/obp60task/config.json index 8349c33..1216cce 100644 --- a/lib/obp60task/config.json +++ b/lib/obp60task/config.json @@ -282,7 +282,7 @@ "description": "Settings for flash LED", "list": [ "Off", - "TCP/UDP Data", + "Bus Data", "GPS Fix", "Limits Overrun" ],