From 57e194e39d87e4c94bf2f775e8166e9535ed8fec Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Sat, 7 Dec 2024 11:11:07 +0100 Subject: [PATCH 1/3] Add new system page --- lib/obp60task/OBP60Keypad.h | 9 +++ lib/obp60task/PageSystem.cpp | 104 +++++++++++++++++++++++++++++++++++ lib/obp60task/obp60task.cpp | 56 +++++++++++++------ 3 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 lib/obp60task/PageSystem.cpp diff --git a/lib/obp60task/OBP60Keypad.h b/lib/obp60task/OBP60Keypad.h index e51fe9d..c3a11d2 100644 --- a/lib/obp60task/OBP60Keypad.h +++ b/lib/obp60task/OBP60Keypad.h @@ -128,6 +128,15 @@ int readKeypad(uint thSensitivity) { } } + // System page with key 5 and 4 in fast series + if (keycode2 == 5 && keycodeold2 == 4) { + keycode = 0; + keycodeold = 0; + keycode2 = 0; + keycodeold2 = 0; + keystatus = 12; + } + // Key lock with key 1 and 6 or 6 and 1 in fast series if((keycode2 == 1 && keycodeold2 == 6) || (keycode2 == 6 && keycodeold2 == 1)) { keycode = 0; diff --git a/lib/obp60task/PageSystem.cpp b/lib/obp60task/PageSystem.cpp new file mode 100644 index 0000000..fa70a78 --- /dev/null +++ b/lib/obp60task/PageSystem.cpp @@ -0,0 +1,104 @@ +#ifdef BOARD_OBP60S3 + +#include "Pagedata.h" +#include "OBP60Extensions.h" + +/* + * Special system page, called directly with fast key sequence 5,4 + * Out of normal page order. + */ + +class PageSystem : public Page{ + bool keylock = false; + + public: + PageSystem(CommonData &common){ + common.logger->logDebug(GwLog::LOG,"Show PageSystem"); + } + + virtual int handleKey(int key){ + // Code for keylock + if (key == 11) { + keylock = !keylock; + return 0; + } + return key; + } + + virtual void displayPage(CommonData &commonData, PageData &pageData){ + GwConfigHandler *config = commonData.config; + GwLog *logger=commonData.logger; + + // Get config data + String displaycolor = config->getString(config->displaycolor); + String backlightMode = config->getString(config->backlight); + String flashLED = config->getString(config->flashLED); + + // Optical warning by limit violation (unused) + if(String(flashLED) == "Limit Violation"){ + setBlinkingLED(false); + setFlashLED(false); + } + + // Logging boat values + LOG_DEBUG(GwLog::LOG,"Drawing at PageSystem"); + + // Draw page + //*********************************************************** + + // Set colors + int fgcolor = GxEPD_BLACK; + int bgcolor = GxEPD_WHITE; + if (displaycolor != "Normal") { + fgcolor = GxEPD_WHITE; + bgcolor = GxEPD_BLACK; + } + + // Set display in partial refresh mode + getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update + + getdisplay().setFont(&Ubuntu_Bold12pt7b); + getdisplay().setCursor(20, 60); + getdisplay().print("System Information and Settings"); + + // Key Layout + getdisplay().setTextColor(fgcolor); + getdisplay().setFont(&Ubuntu_Bold8pt7b); + if (keylock == false) { + getdisplay().setCursor(10, 290); + getdisplay().print("[STBY]"); + if (String(backlightMode) == "Control by Key") { + getdisplay().setCursor(343, 290); + getdisplay().print("[ILUM]"); + } + } + else { + getdisplay().setCursor(130, 290); + getdisplay().print(" [ Keylock active ]"); + } + + // Update display + getdisplay().nextPage(); // Partial update (fast) + + }; +}; + +static Page* createPage(CommonData &common){ + return new PageSystem(common); +} + +/** + * with the code below we make this page known to the PageTask + * we give it a type (name) that can be selected in the config + * we define which function is to be called + * and we provide the number of user parameters we expect + * this will be number of BoatValue pointers in pageData.values + */ +PageDescription registerPageSystem( + "System", // Page name + createPage, // Action + 0, // No bus values + true // Headers are anabled so far +); + +#endif diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 3e1dacf..2e7ae83 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -201,8 +201,10 @@ void registerAllPages(PageList &list){ //this way this separate source file can be compiled by it's own //and has no access to any of our data except the one that we //give as a parameter to the page function - extern PageDescription registerPageOneValue; + extern PageDescription registerPageSystem; //we add the variable to our list + list.add(®isterPageSystem); + extern PageDescription registerPageOneValue; list.add(®isterPageOneValue); extern PageDescription registerPageTwoValues; list.add(®isterPageTwoValues); @@ -470,11 +472,11 @@ void OBP60Task(GwApi *api){ // Main loop runs with 100ms //#################################################################################### - + + bool systemPage = false; while (true){ delay(100); // Delay 100ms (loop time) - // Undervoltage detection if(uvoltage == true){ underVoltageDetection(api); @@ -515,9 +517,19 @@ void OBP60Task(GwApi *api){ int keyboardMessage=0; while (xQueueReceive(allParameters.queue,&keyboardMessage,0)){ LOG_DEBUG(GwLog::LOG,"new key from keyboard %d",keyboardMessage); - - Page *currentPage=pages[pageNumber].page; - if (currentPage ){ + + Page *currentPage; + if (keyboardMessage == 12) { + LOG_DEBUG(GwLog::LOG, "Calling system page"); + systemPage = true; // System page is out of band + currentPage = allPages.pages[0]->creator(commonData); + } + else { + systemPage = false; + currentPage = pages[pageNumber].page; + } + + if (currentPage) { keyboardMessage=currentPage->handleKey(keyboardMessage); } if (keyboardMessage > 0) @@ -641,19 +653,27 @@ void OBP60Task(GwApi *api){ } // Call the particular page - Page *currentPage=pages[pageNumber].page; - if (currentPage == NULL){ - LOG_DEBUG(GwLog::ERROR,"page number %d not found",pageNumber); - // Error handling for missing page + Page *currentPage; + if (systemPage) { + currentPage = allPages.pages[0]->creator(commonData); + PageData sysparams; + currentPage->displayPage(commonData, sysparams); } - else{ - if (lastPage != pageNumber){ - currentPage->displayNew(commonData,pages[pageNumber].parameters); - lastPage=pageNumber; + else { + currentPage = pages[pageNumber].page; + if (currentPage == NULL){ + LOG_DEBUG(GwLog::ERROR,"page number %d not found",pageNumber); + // Error handling for missing page + } + else{ + if (lastPage != pageNumber){ + currentPage->displayNew(commonData,pages[pageNumber].parameters); + lastPage=pageNumber; + } + //call the page code + LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber); + currentPage->displayPage(commonData,pages[pageNumber].parameters); } - //call the page code - LOG_DEBUG(GwLog::DEBUG,"calling page %d",pageNumber); - currentPage->displayPage(commonData,pages[pageNumber].parameters); } } } @@ -662,4 +682,4 @@ void OBP60Task(GwApi *api){ } -#endif \ No newline at end of file +#endif From 9d395c719a1a9eaaf35f056154959c55ce7dafdb Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Mon, 20 Jan 2025 06:33:51 +0100 Subject: [PATCH 2/3] More work on system page --- lib/obp60task/OBP60Keypad.h | 33 +++++--- lib/obp60task/PageSystem.cpp | 130 +++++++++++++++++++++++--------- lib/obp60task/images/logo64.xbm | 46 +++++++++++ lib/obp60task/obp60task.cpp | 26 ++++--- 4 files changed, 179 insertions(+), 56 deletions(-) create mode 100644 lib/obp60task/images/logo64.xbm diff --git a/lib/obp60task/OBP60Keypad.h b/lib/obp60task/OBP60Keypad.h index 887015f..c509956 100644 --- a/lib/obp60task/OBP60Keypad.h +++ b/lib/obp60task/OBP60Keypad.h @@ -60,7 +60,7 @@ void initKeys(CommonData &commonData) { #ifdef HARDWARE_V21 // Keypad functions for original OBP60 hardware - int readKeypad(uint thSensitivity) { + int readKeypad(GwLog* logger, uint thSensitivity) { // Touch sensor values // 35000 - Not touched @@ -110,14 +110,14 @@ void initKeys(CommonData &commonData) { keypad[6] = 0; } // Nothing touched - if(keypad[1] == 0 && keypad[2] == 0 && keypad[3] == 0 && keypad[4] == 0 && keypad[5] == 0 && keypad[6] == 0){ +/* if(keypad[1] == 0 && keypad[2] == 0 && keypad[3] == 0 && keypad[4] == 0 && keypad[5] == 0 && keypad[6] == 0){ keypad[0] = 1; } else{ keypad[0] = 0; - } + } */ - for (int i = 0; i < 9; i++) { + for (int i = 1; i <= 6; i++) { if(i > 0){ // Convert keypad to keycode if(keypad[i] == 1){ @@ -141,15 +141,17 @@ void initKeys(CommonData &commonData) { } // Detect a very short keynumber (10ms) if (millis() > starttime + 10 && keycode == keycodeold && keylock == true) { + logger->logDebug(GwLog::LOG,"Very short 20ms key touch: %d", keycode); + // Process only valid keys - if(keycode == 1 || keycode == 6){ + //if(keycode == 1 || keycode == 6){ keycode2 = keycode; - } - // Clear by unvalid keys - else{ - keycode2 = 0; - keycodeold2 = 0; - } + //} + // Clear by invalid keys + //else{ + // keycode2 = 0; + // keycodeold2 = 0; + //} } // Timeout for very short pressed key if(millis() > starttime + 200){ @@ -157,6 +159,7 @@ void initKeys(CommonData &commonData) { } // Detect a short keynumber (200ms) if (keyoff == false && millis() > starttime + 200 && keycode == keycodeold && keylock == true) { + logger->logDebug(GwLog::LOG,"Short 200ms key touch: %d", keycode); keystatus = keycode; keycode = 0; keycodeold = 0; @@ -170,11 +173,17 @@ void initKeys(CommonData &commonData) { // System page with key 5 and 4 in fast series if (keycode2 == 5 && keycodeold2 == 4) { + logger->logDebug(GwLog::LOG,"Keycode for system page"); keycode = 0; keycodeold = 0; keycode2 = 0; keycodeold2 = 0; keystatus = 12; + buzzer(TONE4, 50); + delay(30); + buzzer(TONE4, 50); + delay(30); + buzzer(TONE4, 50); } // Key lock with key 1 and 6 or 6 and 1 in fast series @@ -252,7 +261,7 @@ void initKeys(CommonData &commonData) { } // Keypad functions for OBP60 clone (thSensitivity is inactiv) - int readKeypad(uint thSensitivity) { + int readKeypad(GwLog* logger, uint thSensitivity) { pinMode(UP, INPUT); pinMode(DOWN, INPUT); pinMode(CONF, INPUT); diff --git a/lib/obp60task/PageSystem.cpp b/lib/obp60task/PageSystem.cpp index fa70a78..7c9d35a 100644 --- a/lib/obp60task/PageSystem.cpp +++ b/lib/obp60task/PageSystem.cpp @@ -2,36 +2,74 @@ #include "Pagedata.h" #include "OBP60Extensions.h" +#include "images/logo64.xbm" +#include /* * Special system page, called directly with fast key sequence 5,4 * Out of normal page order. */ -class PageSystem : public Page{ - bool keylock = false; +class PageSystem : public Page +{ +uint64_t chipid; +bool simulation; +String env_sensor; +String buzzer_mode; +uint8_t buzzer_power; +String cpuspeed; - public: +char mode = 'N'; // (N)ormal, (D)evice list + +public: PageSystem(CommonData &common){ - common.logger->logDebug(GwLog::LOG,"Show PageSystem"); + commonData = &common; + common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem"); + chipid = ESP.getEfuseMac(); + simulation = common.config->getBool(common.config->useSimuData); + env_sensor = common.config->getString(common.config->useEnvSensor); + buzzer_mode = common.config->getString(common.config->buzzerMode); + buzzer_power = common.config->getInt(common.config->buzzerPower); + cpuspeed = common.config->getString(common.config->cpuSpeed); + // useRTC off oder typ + // useGPS off oder typ + } + + virtual void setupKeys(){ + commonData->keydata[0].label = "EXIT"; + commonData->keydata[1].label = "MODE"; + commonData->keydata[2].label = ""; + commonData->keydata[3].label = ""; + commonData->keydata[4].label = "STBY"; + commonData->keydata[5].label = "ILUM"; } virtual int handleKey(int key){ + // do *NOT* handle key #1 this handled by obp60task as exit + + // Switch display mode + if (key == 2) { + if (mode == 'N') { + mode = 'D'; + } else { + mode = 'N'; + } + if (hasFRAM) fram.write(FRAM_VOLTAGE_MODE, mode); + return 0; + } // Code for keylock if (key == 11) { - keylock = !keylock; + commonData->keylock = !commonData->keylock; return 0; } return key; } - virtual void displayPage(CommonData &commonData, PageData &pageData){ - GwConfigHandler *config = commonData.config; - GwLog *logger=commonData.logger; + virtual void displayPage(PageData &pageData){ + GwConfigHandler *config = commonData->config; + GwLog *logger = commonData->logger; // Get config data - String displaycolor = config->getString(config->displaycolor); - String backlightMode = config->getString(config->backlight); String flashLED = config->getString(config->flashLED); // Optical warning by limit violation (unused) @@ -46,35 +84,59 @@ class PageSystem : public Page{ // Draw page //*********************************************************** - // Set colors - int fgcolor = GxEPD_BLACK; - int bgcolor = GxEPD_WHITE; - if (displaycolor != "Normal") { - fgcolor = GxEPD_WHITE; - bgcolor = GxEPD_BLACK; - } + const uint16_t y0 = 120; // data table starts here // Set display in partial refresh mode getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update - getdisplay().setFont(&Ubuntu_Bold12pt7b); - getdisplay().setCursor(20, 60); - getdisplay().print("System Information and Settings"); + if (mode == 'N') { + getdisplay().setFont(&Ubuntu_Bold12pt7b); + getdisplay().setCursor(20, 50); + getdisplay().print("System Information"); - // Key Layout - getdisplay().setTextColor(fgcolor); - getdisplay().setFont(&Ubuntu_Bold8pt7b); - if (keylock == false) { - getdisplay().setCursor(10, 290); - getdisplay().print("[STBY]"); - if (String(backlightMode) == "Control by Key") { - getdisplay().setCursor(343, 290); - getdisplay().print("[ILUM]"); - } - } - else { - getdisplay().setCursor(130, 290); - getdisplay().print(" [ Keylock active ]"); + getdisplay().setFont(&Ubuntu_Bold8pt7b); + + char ssid[23]; + snprintf(ssid, 23, "MCUDEVICE-%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid); + getdisplay().setCursor(20, 70); + getdisplay().print(ssid); + getdisplay().setCursor(20, 100); + getdisplay().print("Press STBY for white page and standby"); + + getdisplay().setCursor(2, y0); + getdisplay().print("Simulation:"); + getdisplay().setCursor(140, y0); + getdisplay().print(simulation ? "on" : "off"); + + getdisplay().setCursor(202, y0); + getdisplay().print("Wifi:"); + getdisplay().setCursor(340, y0); + getdisplay().print("on"); + + getdisplay().setCursor(2, y0 + 16); + getdisplay().print("Environment:"); + getdisplay().setCursor(140, y0 + 16); + getdisplay().print(env_sensor); + + getdisplay().setCursor(2, y0 + 32); + getdisplay().print("Buzzer:"); + getdisplay().setCursor(140, y0 + 32); + getdisplay().print(buzzer_mode); + + getdisplay().setCursor(2, y0 + 48); + getdisplay().print("CPU speed:"); + getdisplay().setCursor(140, y0 + 48); + getdisplay().print(cpuspeed); + getdisplay().print(" "); + int cpu_freq = esp_clk_cpu_freq(); + getdisplay().print(String(cpu_freq)); + + getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor); + } else { + // NMEA2000 device list + getdisplay().setFont(&Ubuntu_Bold12pt7b); + getdisplay().setCursor(20, 50); + getdisplay().print("NMEA2000 device list"); } // Update display diff --git a/lib/obp60task/images/logo64.xbm b/lib/obp60task/images/logo64.xbm new file mode 100644 index 0000000..1055db5 --- /dev/null +++ b/lib/obp60task/images/logo64.xbm @@ -0,0 +1,46 @@ +#define logo64_width 64 +#define logo64_height 64 +static unsigned char logo64_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, 0xc1, 0x7f, 0xf8, 0x01, 0xfe, + 0x00, 0x00, 0xc0, 0xc1, 0x1f, 0xe0, 0x01, 0xfc, 0x00, 0x00, 0xe0, 0xc1, + 0x0f, 0xc3, 0xf1, 0xf8, 0x00, 0x00, 0xf0, 0xc1, 0xc7, 0x8f, 0xf1, 0xf9, + 0x00, 0x00, 0xf8, 0xc1, 0xc7, 0x8f, 0xf1, 0xf9, 0x00, 0x00, 0xf8, 0xc1, + 0xe7, 0x9f, 0xf1, 0xf8, 0x00, 0x00, 0xfc, 0xc1, 0xe7, 0x9f, 0x01, 0xfc, + 0x00, 0x00, 0xfe, 0xc1, 0xe7, 0x9f, 0x01, 0xfe, 0x00, 0x00, 0xfe, 0xc1, + 0xc7, 0x8f, 0xf1, 0xff, 0x00, 0x00, 0xff, 0xc1, 0xc7, 0x8f, 0xf1, 0xff, + 0x00, 0x80, 0xff, 0xc1, 0x8f, 0xc7, 0xf1, 0xff, 0x00, 0x80, 0xff, 0xc1, + 0x1f, 0xe0, 0xf1, 0xff, 0x00, 0xc0, 0xff, 0xc1, 0x7f, 0xf8, 0xf1, 0xff, + 0x00, 0xe0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xc1, 0x0f, 0xe0, 0xf8, 0xfc, 0x00, 0xfc, 0xff, 0xc1, + 0x0f, 0xe0, 0xf8, 0xfc, 0x00, 0xfc, 0xff, 0xc1, 0xcf, 0xff, 0xf0, 0xfc, + 0x00, 0xfe, 0xff, 0xc1, 0xcf, 0xff, 0xe0, 0xfc, 0x00, 0xff, 0xff, 0xc1, + 0xcf, 0xff, 0xe4, 0xfc, 0x00, 0xff, 0xff, 0xc1, 0x0f, 0xe0, 0xc4, 0xfc, + 0x80, 0xff, 0xff, 0xc1, 0x0f, 0xe0, 0xcc, 0xfc, 0xc0, 0xff, 0xff, 0xc1, + 0xcf, 0xff, 0x8c, 0xfc, 0xe0, 0xff, 0xff, 0xc1, 0xcf, 0xff, 0x9c, 0xfc, + 0xe0, 0xff, 0xff, 0xc1, 0xcf, 0xff, 0x1c, 0xfc, 0xf0, 0xff, 0xff, 0xc1, + 0xcf, 0xff, 0x3c, 0xfc, 0xf8, 0xff, 0xff, 0xc1, 0x0f, 0xe0, 0x7c, 0xfc, + 0xf8, 0xff, 0xff, 0xc1, 0x0f, 0xe0, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xc1, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x38, 0x00, 0x04, 0x00, 0x00, 0x44, 0x00, 0x10, 0x48, + 0x00, 0x00, 0x00, 0x01, 0x44, 0x86, 0x7b, 0x48, 0x67, 0xc4, 0xf0, 0x77, + 0x3c, 0x09, 0x12, 0x38, 0x91, 0x24, 0x09, 0x11, 0x44, 0xc9, 0x13, 0x08, + 0x91, 0xe4, 0x09, 0x61, 0x44, 0x49, 0x12, 0x08, 0x91, 0x24, 0x08, 0x41, + 0x3c, 0xc6, 0x73, 0x08, 0x61, 0xc4, 0x71, 0x77, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 3e2bd69..4abc9ef 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -127,7 +127,7 @@ void keyboardTask(void *param){ // Loop for keyboard task while (true){ - keycode = readKeypad(data->sensitivity); + keycode = readKeypad(data->logger, data->sensitivity); //send a key event if(keycode != 0){ xQueueSend(data->queue, &keycode, 0); @@ -471,6 +471,9 @@ void OBP60Task(GwApi *api){ //#################################################################################### bool systemPage = false; + //PageDescription *description = allPages.find("System"); + // PageStruct syspagestruct; + Page *syspage = allPages.pages[0]->creator(commonData); while (true){ delay(100); // Delay 100ms (loop time) @@ -519,11 +522,15 @@ void OBP60Task(GwApi *api){ if (keyboardMessage == 12) { LOG_DEBUG(GwLog::LOG, "Calling system page"); systemPage = true; // System page is out of band - currentPage = allPages.pages[0]->creator(commonData); + currentPage = syspage; + syspage->setupKeys(); } else { - systemPage = false; - currentPage = pages[pageNumber].page; + if (systemPage && keyboardMessage == 1) { + // exit system mode with exit key number 1 + systemPage = false; + currentPage = pages[pageNumber].page; + } } if (currentPage) { @@ -585,8 +592,7 @@ void OBP60Task(GwApi *api){ } else{ setBacklightLED(0, COLOR_BLUE); // Backlight LEDs off (blue without britghness) - } - + } } } } @@ -652,14 +658,14 @@ void OBP60Task(GwApi *api){ } // Call the particular page - Page *currentPage; + //Page *currentPage; if (systemPage) { - currentPage = allPages.pages[0]->creator(commonData); + displayFooter(commonData); PageData sysparams; - currentPage->displayPage(commonData, sysparams); + syspage->displayPage(sysparams); } else { - currentPage = pages[pageNumber].page; + Page *currentPage = pages[pageNumber].page; if (currentPage == NULL){ LOG_DEBUG(GwLog::ERROR,"page number %d not found",pageNumber); // Error handling for missing page From a73f50ba749109d126548e99569e31205e6a23b1 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Mon, 20 Jan 2025 19:20:37 +0100 Subject: [PATCH 3/3] First working system page --- lib/obp60task/OBP60Extensions.h | 1 + lib/obp60task/OBP60Keypad.h | 12 +-- lib/obp60task/PageSystem.cpp | 69 ++++++++++--- lib/obp60task/images/logo64.xbm | 7 +- lib/obp60task/images/unknown.xbm | 171 +++++++++++++++++++++++++++++++ lib/obp60task/obp60task.cpp | 42 +++++--- 6 files changed, 263 insertions(+), 39 deletions(-) create mode 100644 lib/obp60task/images/unknown.xbm diff --git a/lib/obp60task/OBP60Extensions.h b/lib/obp60task/OBP60Extensions.h index a529da7..972d148 100644 --- a/lib/obp60task/OBP60Extensions.h +++ b/lib/obp60task/OBP60Extensions.h @@ -36,6 +36,7 @@ extern const GFXfont DSEG7Classic_BoldItalic20pt7b; extern const GFXfont DSEG7Classic_BoldItalic30pt7b; extern const GFXfont DSEG7Classic_BoldItalic42pt7b; extern const GFXfont DSEG7Classic_BoldItalic60pt7b; +extern const GFXfont Atari16px; // Global functions #ifdef DISPLAY_GDEW042T2 diff --git a/lib/obp60task/OBP60Keypad.h b/lib/obp60task/OBP60Keypad.h index c509956..d251e09 100644 --- a/lib/obp60task/OBP60Keypad.h +++ b/lib/obp60task/OBP60Keypad.h @@ -144,14 +144,14 @@ void initKeys(CommonData &commonData) { logger->logDebug(GwLog::LOG,"Very short 20ms key touch: %d", keycode); // Process only valid keys - //if(keycode == 1 || keycode == 6){ + if(keycode == 1 || keycode == 4 || keycode == 5 || keycode == 6){ keycode2 = keycode; - //} + } // Clear by invalid keys - //else{ - // keycode2 = 0; - // keycodeold2 = 0; - //} + else{ + keycode2 = 0; + keycodeold2 = 0; + } } // Timeout for very short pressed key if(millis() > starttime + 200){ diff --git a/lib/obp60task/PageSystem.cpp b/lib/obp60task/PageSystem.cpp index 7c9d35a..2156196 100644 --- a/lib/obp60task/PageSystem.cpp +++ b/lib/obp60task/PageSystem.cpp @@ -5,6 +5,10 @@ #include "images/logo64.xbm" #include +#define STRINGIZE_IMPL(x) #x +#define STRINGIZE(x) STRINGIZE_IMPL(x) +#define VERSINFO STRINGIZE(GWDEVVERSION) + /* * Special system page, called directly with fast key sequence 5,4 * Out of normal page order. @@ -14,10 +18,12 @@ class PageSystem : public Page { uint64_t chipid; bool simulation; -String env_sensor; String buzzer_mode; uint8_t buzzer_power; String cpuspeed; +String rtc_module; +String gps_module; +String env_module; char mode = 'N'; // (N)ormal, (D)evice list @@ -27,12 +33,12 @@ public: common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem"); chipid = ESP.getEfuseMac(); simulation = common.config->getBool(common.config->useSimuData); - env_sensor = common.config->getString(common.config->useEnvSensor); buzzer_mode = common.config->getString(common.config->buzzerMode); buzzer_power = common.config->getInt(common.config->buzzerPower); cpuspeed = common.config->getString(common.config->cpuSpeed); - // useRTC off oder typ - // useGPS off oder typ + env_module = common.config->getString(common.config->useEnvSensor); + rtc_module = common.config->getString(common.config->useRTC); + gps_module = common.config->getString(common.config->useGPS); } virtual void setupKeys(){ @@ -46,8 +52,8 @@ public: virtual int handleKey(int key){ // do *NOT* handle key #1 this handled by obp60task as exit - // Switch display mode + commonData->logger->logDebug(GwLog::LOG, "System keyboard handler"); if (key == 2) { if (mode == 'N') { mode = 'D'; @@ -57,6 +63,10 @@ public: if (hasFRAM) fram.write(FRAM_VOLTAGE_MODE, mode); return 0; } + // grab cursor keys to disable page navigation + if (key == 3 or key == 4) { + return 0; + } // Code for keylock if (key == 11) { commonData->keylock = !commonData->keylock; @@ -94,6 +104,8 @@ public: getdisplay().setCursor(20, 50); getdisplay().print("System Information"); + getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor); + getdisplay().setFont(&Ubuntu_Bold8pt7b); char ssid[23]; @@ -105,38 +117,65 @@ public: getdisplay().setCursor(2, y0); getdisplay().print("Simulation:"); - getdisplay().setCursor(140, y0); + getdisplay().setCursor(120, y0); getdisplay().print(simulation ? "on" : "off"); getdisplay().setCursor(202, y0); getdisplay().print("Wifi:"); - getdisplay().setCursor(340, y0); - getdisplay().print("on"); + getdisplay().setCursor(300, y0); + getdisplay().print(commonData->status.wifiApOn ? "On" : "Off"); getdisplay().setCursor(2, y0 + 16); getdisplay().print("Environment:"); - getdisplay().setCursor(140, y0 + 16); - getdisplay().print(env_sensor); + getdisplay().setCursor(120, y0 + 16); + getdisplay().print(env_module); getdisplay().setCursor(2, y0 + 32); getdisplay().print("Buzzer:"); - getdisplay().setCursor(140, y0 + 32); + getdisplay().setCursor(120, y0 + 32); getdisplay().print(buzzer_mode); getdisplay().setCursor(2, y0 + 48); getdisplay().print("CPU speed:"); - getdisplay().setCursor(140, y0 + 48); + getdisplay().setCursor(120, y0 + 48); getdisplay().print(cpuspeed); - getdisplay().print(" "); - int cpu_freq = esp_clk_cpu_freq(); + getdisplay().print(" / "); + int cpu_freq = esp_clk_cpu_freq() / 1000000; getdisplay().print(String(cpu_freq)); - getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor); + getdisplay().setCursor(2, y0 + 64); + getdisplay().print("RTC:"); + getdisplay().setCursor(120, y0 + 64); + getdisplay().print(rtc_module); + + getdisplay().setCursor(202, y0 + 64); + getdisplay().print("GPS:"); + getdisplay().setCursor(300, y0 + 64); + getdisplay().print(gps_module); + + getdisplay().setCursor(2, y0 + 80); + getdisplay().print("FRAM:"); + getdisplay().setCursor(120, y0 + 80); + getdisplay().print(hasFRAM ? "available" : "not found"); + + getdisplay().setCursor(2, y0 + 120); + getdisplay().print("Firmware Version: "); + getdisplay().print(VERSINFO); + + } else { // NMEA2000 device list getdisplay().setFont(&Ubuntu_Bold12pt7b); getdisplay().setCursor(20, 50); getdisplay().print("NMEA2000 device list"); + + getdisplay().setFont(&Ubuntu_Bold8pt7b); + getdisplay().setCursor(20, 80); + getdisplay().print("RxD: "); + getdisplay().print(String(commonData->status.n2kRx)); + getdisplay().setCursor(20, 100); + getdisplay().print("TxD: "); + getdisplay().print(String(commonData->status.n2kTx)); } // Update display diff --git a/lib/obp60task/images/logo64.xbm b/lib/obp60task/images/logo64.xbm index 1055db5..c99b09d 100644 --- a/lib/obp60task/images/logo64.xbm +++ b/lib/obp60task/images/logo64.xbm @@ -1,6 +1,9 @@ +#ifndef _LOGO64_XBM_ +#define _LOGO64_XBM_ 1 + #define logo64_width 64 #define logo64_height 64 -static unsigned char logo64_bits[] = { +static unsigned char logo64_bits[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -44,3 +47,5 @@ static unsigned char logo64_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#endif diff --git a/lib/obp60task/images/unknown.xbm b/lib/obp60task/images/unknown.xbm new file mode 100644 index 0000000..b73c922 --- /dev/null +++ b/lib/obp60task/images/unknown.xbm @@ -0,0 +1,171 @@ +#ifndef _UNKNOWN_XBM_ +#define _UNKNOWN_XBM_ 1 + +#define unknown_width 120 +#define unknown_height 130 +static unsigned char unknown_bits[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xe0, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x70, 0x80, 0xcf, 0x01, 0x00, 0x00, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xf7, 0xc0, 0x7f, + 0x00, 0x00, 0xc0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x80, + 0xff, 0xfb, 0x7b, 0x00, 0x00, 0xf8, 0x7f, 0xe0, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x07, 0xb8, 0xff, 0xfb, 0x7f, 0x00, 0xff, 0x3f, 0xf8, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x9c, 0x0f, 0xd0, 0xff, 0xfd, 0x19, 0xe0, 0xff, + 0x0d, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xf0, 0xf9, 0x3f, + 0x0d, 0xfc, 0x7f, 0x86, 0xff, 0x07, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x07, + 0xfe, 0xc1, 0xdf, 0x07, 0xff, 0xc1, 0xe3, 0x3d, 0x03, 0x00, 0x00, 0x3f, + 0x00, 0x00, 0x07, 0x7e, 0x81, 0xff, 0x84, 0x7f, 0xf3, 0x7b, 0x07, 0x03, + 0x00, 0x00, 0x7e, 0x80, 0x3f, 0x0f, 0xf0, 0xc3, 0x3b, 0xe4, 0xdd, 0x9d, + 0xcf, 0x80, 0x01, 0x00, 0x00, 0x6c, 0x00, 0xff, 0x3f, 0xe0, 0x17, 0x9c, + 0x7f, 0xf7, 0xc3, 0x63, 0x80, 0x01, 0x00, 0x00, 0xfe, 0x0c, 0xf0, 0xfd, + 0xc3, 0x3c, 0xde, 0xfd, 0xef, 0xf8, 0x18, 0x80, 0x01, 0x00, 0x00, 0xfe, + 0x0e, 0xf0, 0x9f, 0x8f, 0x78, 0xcf, 0xfe, 0x1b, 0x3f, 0x0e, 0xc0, 0x00, + 0x00, 0x00, 0xfe, 0x1d, 0xf0, 0xff, 0x9f, 0x21, 0xcc, 0xfb, 0xe7, 0x8f, + 0x03, 0xc0, 0x00, 0x00, 0x00, 0xcc, 0x1f, 0xb0, 0xff, 0x1f, 0x00, 0xc0, + 0xbf, 0xb9, 0xc7, 0x01, 0xc0, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x3c, 0x1f, + 0xfe, 0x00, 0xfe, 0x6f, 0xfe, 0xf1, 0x01, 0xc0, 0x00, 0x00, 0xf8, 0xfb, + 0x1f, 0xbc, 0xfe, 0xff, 0xc0, 0xff, 0x9d, 0x7f, 0x7c, 0x00, 0x60, 0x00, + 0x00, 0xfc, 0xef, 0x1d, 0xfc, 0xc3, 0xff, 0xe9, 0xcf, 0xed, 0x1f, 0x1f, + 0x00, 0x60, 0x00, 0x00, 0xfe, 0xef, 0x1d, 0x00, 0x97, 0xf0, 0xf9, 0xcf, + 0xfd, 0x87, 0x07, 0x03, 0x60, 0x00, 0x00, 0xfe, 0xcc, 0x0c, 0x00, 0xfc, + 0x81, 0xff, 0xdf, 0xfd, 0xc0, 0xf9, 0x03, 0x60, 0x00, 0x00, 0xe4, 0xdc, + 0x0f, 0x00, 0xf8, 0x9f, 0xff, 0xdf, 0x3d, 0xe0, 0x0f, 0x00, 0x60, 0x00, + 0x00, 0xc0, 0xdf, 0x03, 0x00, 0xe0, 0xf1, 0xfe, 0xdf, 0x0c, 0xfe, 0xff, + 0x01, 0x60, 0x00, 0x00, 0xc0, 0xcf, 0x01, 0x00, 0x60, 0xf3, 0xff, 0xdb, + 0x06, 0xff, 0x01, 0x00, 0x70, 0x00, 0x00, 0x00, 0x8f, 0x01, 0x00, 0x78, + 0xff, 0x1f, 0x9b, 0x87, 0xff, 0xff, 0x0f, 0x30, 0x00, 0x00, 0x00, 0x66, + 0x03, 0x00, 0xfc, 0x7f, 0xfb, 0x99, 0xc7, 0xff, 0xff, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x06, 0x03, 0x00, 0xc6, 0xff, 0xff, 0xd9, 0x67, 0xff, 0xc1, + 0x01, 0x70, 0x00, 0x00, 0x00, 0xc7, 0x03, 0x00, 0x07, 0x7c, 0xe3, 0xf9, + 0xe3, 0xff, 0x7f, 0x00, 0x70, 0x00, 0x00, 0x80, 0xf3, 0x07, 0x00, 0x1f, + 0x6c, 0xe0, 0x7b, 0xe3, 0xff, 0xff, 0x01, 0x70, 0x00, 0x00, 0x80, 0xd9, + 0x06, 0x80, 0xff, 0x0f, 0xce, 0xef, 0xe3, 0xff, 0xf7, 0x01, 0x70, 0x00, + 0x00, 0xe0, 0xbf, 0x0d, 0xc0, 0xff, 0x43, 0xe4, 0xef, 0xe3, 0x3f, 0x7f, + 0x07, 0x60, 0x00, 0x00, 0xe0, 0xbf, 0x1d, 0xe0, 0x78, 0x43, 0x70, 0xec, + 0xe1, 0xff, 0xf8, 0x1d, 0x60, 0x00, 0x00, 0xe0, 0xff, 0x19, 0x70, 0x00, + 0x03, 0x37, 0xfc, 0xf1, 0xbf, 0xc3, 0x07, 0x60, 0x00, 0x00, 0xc0, 0xff, + 0x19, 0x70, 0x80, 0x01, 0x3b, 0xd6, 0xf9, 0xef, 0x1c, 0x3e, 0x60, 0x00, + 0x00, 0x80, 0x63, 0x1b, 0xf0, 0xc6, 0x39, 0x19, 0xfe, 0xf8, 0xbf, 0x31, + 0xf8, 0x60, 0x00, 0x00, 0x00, 0x60, 0x3b, 0xf8, 0xfe, 0x98, 0x1f, 0xfe, + 0xf8, 0x7f, 0x67, 0xe0, 0x61, 0x00, 0x00, 0x00, 0x60, 0x33, 0xfc, 0x7f, + 0x80, 0x0f, 0xeb, 0xfc, 0xff, 0x0d, 0x80, 0xc7, 0x00, 0x00, 0x00, 0x60, + 0x33, 0x0c, 0x7f, 0x06, 0x0c, 0x7f, 0xec, 0x6f, 0x0b, 0x00, 0xfe, 0x00, + 0x00, 0x00, 0x60, 0x76, 0x0e, 0xf8, 0xbf, 0x87, 0x7f, 0xee, 0xdf, 0x00, + 0x00, 0xf8, 0x01, 0x00, 0x00, 0xc0, 0x76, 0x0e, 0xb8, 0xa0, 0x87, 0x3f, + 0xde, 0x3f, 0x01, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xc0, 0xf6, 0x0f, 0x3c, + 0x80, 0xdf, 0x3f, 0xdf, 0x77, 0x02, 0x00, 0xc0, 0x03, 0x00, 0x00, 0xc0, + 0xdd, 0xef, 0x1f, 0x80, 0xfe, 0x9f, 0xdf, 0xe7, 0x06, 0x00, 0xe0, 0x03, + 0x00, 0x00, 0x80, 0xfd, 0xfe, 0x1f, 0xcc, 0xff, 0xdf, 0xdf, 0xee, 0x18, + 0x00, 0xf0, 0x03, 0x00, 0x00, 0x80, 0xfd, 0xff, 0x1b, 0xdc, 0xf6, 0xcf, + 0xdf, 0xc0, 0x19, 0x00, 0x70, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x03, 0x98, + 0x01, 0xb6, 0xcf, 0x93, 0x80, 0x33, 0x00, 0x30, 0x00, 0x00, 0x00, 0x80, + 0x7f, 0x01, 0x1c, 0xc0, 0xfe, 0xff, 0x9f, 0x00, 0x03, 0x00, 0x30, 0x00, + 0x00, 0x00, 0x80, 0x9f, 0x01, 0x0c, 0xc0, 0xff, 0xe7, 0x9b, 0x01, 0x06, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0e, 0xcc, 0xff, 0xe3, + 0xbb, 0x01, 0x0c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xcf, 0x07, + 0x8c, 0xff, 0xf9, 0xbb, 0x01, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x80, + 0xbf, 0xff, 0xcf, 0x1f, 0xdf, 0xfd, 0xbb, 0x09, 0x38, 0x00, 0x1c, 0x00, + 0x00, 0x00, 0x80, 0xfb, 0xff, 0x8d, 0xdf, 0x6f, 0xfc, 0xbb, 0x01, 0x70, + 0x00, 0x0c, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x8f, 0xff, 0x3f, 0xff, + 0xbb, 0x01, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xef, 0xe0, 0x8f, + 0xbf, 0x1f, 0xbf, 0xab, 0x09, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xf0, 0x8d, 0xd6, 0xc3, 0xbb, 0xab, 0x01, 0xc0, 0x01, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x7f, 0x31, 0x00, 0x7e, 0xe0, 0x39, 0xab, 0x19, 0x80, + 0x03, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x66, 0x19, 0x80, 0x79, 0x7c, 0x3c, + 0xa9, 0x01, 0x00, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0xe6, 0x19, 0x80, + 0x6d, 0x7e, 0x1c, 0xb1, 0x01, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x1f, 0x80, 0x0d, 0x1c, 0x10, 0xb1, 0x01, 0x00, 0x06, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x10, 0x00, 0x38, 0x00, 0xb1, 0x01, 0x00, + 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3d, 0xb3, 0x00, 0x3b, 0x00, + 0xa1, 0x01, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0xe7, 0xf1, + 0xd8, 0x7f, 0x03, 0xb1, 0x01, 0x00, 0x1c, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc3, 0xfb, 0xf0, 0x7f, 0x01, 0xb1, 0x01, 0x00, 0x18, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x83, 0xfb, 0xf0, 0x7f, 0x01, 0xb1, 0x01, 0x00, + 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x01, 0x7f, 0x00, + 0x80, 0x01, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x3f, + 0x01, 0xff, 0x07, 0x80, 0x01, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xfd, 0x1d, 0x01, 0xfb, 0x3f, 0x80, 0x01, 0x00, 0x70, 0x06, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xde, 0x67, 0x18, 0x7f, 0x80, 0x01, 0x00, + 0x60, 0x07, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x78, 0xcf, 0x0f, 0x86, 0xfd, + 0x81, 0x01, 0x00, 0x65, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xaf, 0xbf, + 0x3d, 0x80, 0xf9, 0x81, 0x01, 0xf8, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xaf, 0xff, 0x78, 0x00, 0xe0, 0x83, 0x01, 0x7f, 0xf8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x70, 0xfe, 0x7f, 0x70, 0x20, 0x6c, 0x87, 0xe0, 0x07, + 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf8, 0x0f, 0xf0, 0x30, 0x06, + 0xcf, 0xf8, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xdb, 0x0e, + 0xd8, 0x00, 0x30, 0xcf, 0x3c, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0xfb, 0x38, 0xfc, 0x01, 0x20, 0xcc, 0x0f, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x3e, 0xf8, 0xbf, 0x03, 0x06, 0xfd, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x1e, 0xf8, 0xdf, 0x0f, 0x02, + 0xff, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x0f, 0xf0, + 0x07, 0x3e, 0x30, 0xfa, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x07, 0x00, 0x03, 0x78, 0x30, 0xfb, 0x03, 0x00, 0x80, 0x03, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0xc3, 0xff, 0x00, 0xff, 0x1f, 0x00, + 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x03, 0x00, 0xbf, 0xdf, 0x01, + 0xfe, 0x1f, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x01, 0x00, + 0xfe, 0x8f, 0x83, 0xef, 0x0f, 0x00, 0xe0, 0x03, 0x00, 0x00, 0x00, 0x80, + 0xef, 0x00, 0x00, 0xf8, 0x03, 0x83, 0xb1, 0x03, 0x00, 0x60, 0x03, 0x00, + 0x00, 0xe0, 0x80, 0x61, 0x00, 0x00, 0x80, 0x01, 0x04, 0xb0, 0x03, 0x03, + 0x30, 0x03, 0x00, 0x00, 0xfc, 0xc1, 0x30, 0x06, 0x00, 0x80, 0x01, 0x1e, + 0xa0, 0x87, 0x03, 0x30, 0x03, 0x00, 0x00, 0x7e, 0xff, 0xb8, 0x0f, 0x00, + 0x80, 0x8b, 0x1f, 0x04, 0x86, 0x03, 0x18, 0x03, 0x00, 0x00, 0xf6, 0x7f, + 0xf8, 0x3f, 0x00, 0x80, 0xff, 0x77, 0xfe, 0x86, 0x07, 0x0e, 0x01, 0x00, + 0x00, 0xfe, 0x19, 0x00, 0x76, 0x00, 0x00, 0xff, 0x63, 0xf6, 0x86, 0xfd, + 0x87, 0x01, 0x00, 0x00, 0xf6, 0x0f, 0x00, 0x7e, 0x00, 0x00, 0xfc, 0x60, + 0x00, 0x8c, 0xf3, 0x81, 0x01, 0x00, 0x00, 0x06, 0x06, 0xfe, 0x7c, 0x00, + 0x00, 0x70, 0xc0, 0x00, 0x8e, 0x07, 0x83, 0x01, 0x00, 0x00, 0xf8, 0xb3, + 0xff, 0x7f, 0x00, 0x00, 0x60, 0xc0, 0x9c, 0x0f, 0xff, 0xc1, 0x00, 0x00, + 0x00, 0xfc, 0xd9, 0x03, 0x3f, 0x00, 0x00, 0xe0, 0xc0, 0x80, 0x0d, 0x7e, + 0xc0, 0x00, 0x00, 0x00, 0x0e, 0xde, 0x00, 0x1c, 0x00, 0x00, 0xe0, 0xff, + 0x01, 0xfc, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0xde, 0xdf, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xbf, 0x03, 0xfc, 0x00, 0x66, 0x00, 0x00, 0x00, 0xda, 0xcc, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0x62, 0x1f, 0x00, 0x67, 0x00, 0x00, + 0x00, 0x7e, 0xcc, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, 0xe3, 0x5f, 0xc1, + 0x33, 0x00, 0x00, 0x00, 0x3e, 0x8e, 0x01, 0x00, 0x00, 0xf8, 0xf1, 0x03, + 0x06, 0xfc, 0x7f, 0x33, 0x00, 0x00, 0x00, 0x0e, 0xde, 0x00, 0x00, 0x00, + 0x6e, 0xc0, 0x07, 0x0e, 0xfc, 0x1f, 0x13, 0x00, 0x00, 0x00, 0x1e, 0x7c, + 0x00, 0x00, 0x00, 0x1f, 0xe2, 0x3f, 0xef, 0x7f, 0x00, 0x1b, 0x00, 0x00, + 0x00, 0x1c, 0x6c, 0x02, 0x00, 0x80, 0x07, 0xf8, 0xff, 0x47, 0x0c, 0x80, + 0x19, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x03, 0x00, 0xc0, 0x03, 0xfb, 0xff, + 0x0d, 0x0c, 0x80, 0x19, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x60, + 0x40, 0x3f, 0x18, 0x4c, 0x3d, 0x80, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xf0, + 0x01, 0x00, 0x70, 0x40, 0x1f, 0x18, 0xfc, 0x37, 0x80, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0xb0, 0x1f, 0x18, 0x0c, 0x3e, 0x80, + 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc8, 0x08, 0x78, + 0x2c, 0x06, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, + 0x60, 0x00, 0xf8, 0xcf, 0x06, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0c, 0x35, 0x00, 0xf8, 0x9f, 0x06, 0x00, 0xfe, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x36, 0x00, 0xf8, 0x77, 0x03, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x31, 0x00, 0xd8, + 0xdd, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x1a, 0x00, 0x08, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xce, 0x1e, 0x00, 0x0c, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0x18, 0x00, 0x0c, 0x8c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x1f, 0x00, 0x7c, + 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, + 0x1e, 0x00, 0xf8, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xce, 0xf0, 0x03, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xfb, 0x01, 0x0c, 0x5f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0xef, 0x01, 0x06, + 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, + 0xd7, 0x81, 0x87, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0xdf, 0xc3, 0xc7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xfe, 0xff, 0xff, 0x3b, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xfc, 0x7f, 0xfe, + 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xfd, 0x7f, 0xfc, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x37, 0xe6, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf7, 0xe3, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#endif diff --git a/lib/obp60task/obp60task.cpp b/lib/obp60task/obp60task.cpp index 4abc9ef..d1d92a3 100644 --- a/lib/obp60task/obp60task.cpp +++ b/lib/obp60task/obp60task.cpp @@ -20,10 +20,10 @@ //#include GxEPD_BitmapExamples // Example picture #include "MFD_OBP60_400x300_sw.h" // MFD with logo #include "Logo_OBP_400x300_sw.h" // OBP Logo +#include "images/unknown.xbm" // unknown page indicator #include "OBP60QRWiFi.h" // Functions lib for WiFi QR code #include "OBPSensorTask.h" // Functions lib for sensor data -#include "LedSpiTask.h" // Global vars bool initComplete = false; // Initialization complete @@ -408,6 +408,8 @@ void OBP60Task(GwApi *api){ pages[i].parameters.values.push_back(value); } } + // add out of band system page (always available) + Page *syspage = allPages.pages[0]->creator(commonData); // Display screenshot handler for HTTP request // http://192.168.15.1/api/user/OBP60Task/screenshot @@ -471,9 +473,6 @@ void OBP60Task(GwApi *api){ //#################################################################################### bool systemPage = false; - //PageDescription *description = allPages.find("System"); - // PageStruct syspagestruct; - Page *syspage = allPages.pages[0]->creator(commonData); while (true){ delay(100); // Delay 100ms (loop time) @@ -522,21 +521,22 @@ void OBP60Task(GwApi *api){ if (keyboardMessage == 12) { LOG_DEBUG(GwLog::LOG, "Calling system page"); systemPage = true; // System page is out of band - currentPage = syspage; syspage->setupKeys(); } else { + currentPage = pages[pageNumber].page; if (systemPage && keyboardMessage == 1) { // exit system mode with exit key number 1 systemPage = false; - currentPage = pages[pageNumber].page; + currentPage->setupKeys(); } } - - if (currentPage) { - keyboardMessage=currentPage->handleKey(keyboardMessage); + if (systemPage) { + keyboardMessage = syspage->handleKey(keyboardMessage); + } else if (currentPage) { + keyboardMessage = currentPage->handleKey(keyboardMessage); } - if (keyboardMessage > 0) + if (keyboardMessage > 0) // not handled by page { // Decoding all key codes // #6 Backlight on if key controled @@ -649,26 +649,34 @@ void OBP60Task(GwApi *api){ api->getBoatDataValues(boatValues.numValues,boatValues.allBoatValues); api->getStatus(commonData.status); + // Clear display + // getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor); + getdisplay().fillScreen(commonData.bgcolor); // Clear display + // Show header if enabled - getdisplay().fillRect(0, 0, getdisplay().width(), getdisplay().height(), commonData.bgcolor); // Clear display - if (pages[pageNumber].description && pages[pageNumber].description->header){ + if (pages[pageNumber].description && pages[pageNumber].description->header or systemPage){ // build header using commonData - getdisplay().fillScreen(commonData.bgcolor); // Clear display displayHeader(commonData, date, time, hdop); // Show page header } // Call the particular page - //Page *currentPage; if (systemPage) { displayFooter(commonData); - PageData sysparams; + PageData sysparams; // empty syspage->displayPage(sysparams); } else { Page *currentPage = pages[pageNumber].page; if (currentPage == NULL){ - LOG_DEBUG(GwLog::ERROR,"page number %d not found",pageNumber); + LOG_DEBUG(GwLog::ERROR,"page number %d not found", pageNumber); // Error handling for missing page + getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update + getdisplay().fillScreen(commonData.bgcolor); // Clear display + getdisplay().drawXBitmap(200 - unknown_width / 2, 150 - unknown_height / 2, unknown_bits, unknown_width, unknown_height, commonData.fgcolor); + getdisplay().setCursor(140, 250); + getdisplay().setFont(&Atari16px); + getdisplay().print("Here be dragons!"); + getdisplay().nextPage(); // Partial update (fast) } else{ if (lastPage != pageNumber){ @@ -687,7 +695,7 @@ void OBP60Task(GwApi *api){ } } - } + } // refresh display all 1s } } vTaskDelete(NULL);