1
0
mirror of https://github.com/thooge/esp32-nmea2000-obp60.git synced 2025-12-29 13:33:06 +01:00

Next working version

This commit is contained in:
norbert-walter
2025-11-26 18:57:58 +01:00
parent e02ca265ae
commit f8378c3a2b

View File

@@ -14,6 +14,10 @@ ImageDecoder decoder; // Define image decoder
class PageNavigation : public Page class PageNavigation : public Page
{ {
// Values for buttons
int zoom = 15; // Zoom level 1...17
bool showValues = false; // Show values COG, SOG, DBT in navigation map
public: public:
PageNavigation(CommonData &common){ PageNavigation(CommonData &common){
commonData = &common; commonData = &common;
@@ -26,6 +30,26 @@ public:
commonData->keylock = !commonData->keylock; commonData->keylock = !commonData->keylock;
return 0; // Commit the key return 0; // Commit the key
} }
// Cood for zoom -
if(key == 1){
zoom --; // Zoom -
if(zoom <7){
zoom = 7;
}
return 0; // Commit the key
}
// Cood for zoom -
if(key == 2){
zoom ++; // Zoom +
if(zoom >17){
zoom = 17;
}
return 0; // Commit the key
}
if(key == 5){
showValues = !showValues; // Toggle show values
return 0; // Commit the key
}
return key; return key;
} }
@@ -34,14 +58,27 @@ public:
GwLog *logger = commonData->logger; GwLog *logger = commonData->logger;
// Old values for hold function // Old values for hold function
static double value1old = 0;
static String svalue1old = ""; static String svalue1old = "";
static String unit1old = ""; static String unit1old = "";
static double value2old = 0;
static String svalue2old = ""; static String svalue2old = "";
static String unit2old = ""; static String unit2old = "";
static double value3old = 0;
static String svalue3old = ""; static String svalue3old = "";
static String unit3old = ""; static String unit3old = "";
static double value4old = 0;
static String svalue4old = ""; static String svalue4old = "";
static String unit4old = ""; static String unit4old = "";
static double value5old = 0;
static String svalue5old = "";
static String unit5old = "";
static double latitude = 0;
static double longitude = 0;
static double courseOverGround = 0;
static double speedOverGround = 0;
static double depthBelowTransducer = 0;
// Get config data // Get config data
String lengthformat = config->getString(config->lengthFormat); String lengthformat = config->getString(config->lengthFormat);
@@ -50,7 +87,7 @@ public:
String flashLED = config->getString(config->flashLED); String flashLED = config->getString(config->flashLED);
String backlightMode = config->getString(config->backlight); String backlightMode = config->getString(config->backlight);
// Get boat values #1 // Get boat values #1 Latitude
GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue) GwApi::BoatValue *bvalue1 = pageData.values[0]; // First element in list (only one value by PageOneValue)
String name1 = xdrDelete(bvalue1->getName()); // Value name String name1 = xdrDelete(bvalue1->getName()); // Value name
name1 = name1.substring(0, 6); // String length limit for value name name1 = name1.substring(0, 6); // String length limit for value name
@@ -59,7 +96,7 @@ public:
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
// Get boat values #2 // Get boat values #2 Longitude
GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue) GwApi::BoatValue *bvalue2 = pageData.values[1]; // Second element in list (only one value by PageOneValue)
String name2 = xdrDelete(bvalue2->getName()); // Value name String name2 = xdrDelete(bvalue2->getName()); // Value name
name2 = name2.substring(0, 6); // String length limit for value name name2 = name2.substring(0, 6); // String length limit for value name
@@ -68,7 +105,7 @@ public:
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
// Get boat values #3 // Get boat values #3 COG
GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue) GwApi::BoatValue *bvalue3 = pageData.values[2]; // Second element in list (only one value by PageOneValue)
String name3 = xdrDelete(bvalue3->getName()); // Value name String name3 = xdrDelete(bvalue3->getName()); // Value name
name3 = name3.substring(0, 6); // String length limit for value name name3 = name3.substring(0, 6); // String length limit for value name
@@ -77,7 +114,7 @@ public:
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
// Get boat values #4 // Get boat values #4 SOG
GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue) GwApi::BoatValue *bvalue4 = pageData.values[3]; // Second element in list (only one value by PageOneValue)
String name4 = xdrDelete(bvalue4->getName()); // Value name String name4 = xdrDelete(bvalue4->getName()); // Value name
name4 = name4.substring(0, 6); // String length limit for value name name4 = name4.substring(0, 6); // String length limit for value name
@@ -86,6 +123,15 @@ public:
String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places String svalue4 = formatValue(bvalue4, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value String unit4 = formatValue(bvalue4, *commonData).unit; // Unit of value
// Get boat values #5 DBT
GwApi::BoatValue *bvalue5 = pageData.values[4]; // Second element in list (only one value by PageOneValue)
String name5 = xdrDelete(bvalue5->getName()); // Value name
name5 = name5.substring(0, 6); // String length limit for value name
double value5 = bvalue5->value; // Value as double in SI unit
bool valid5 = bvalue5->valid; // Valid information
String svalue5 = formatValue(bvalue5, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
String unit5 = formatValue(bvalue5, *commonData).unit; // Unit of value
// Optical warning by limit violation (unused) // Optical warning by limit violation (unused)
if(String(flashLED) == "Limit Violation"){ if(String(flashLED) == "Limit Violation"){
setBlinkingLED(false); setBlinkingLED(false);
@@ -98,8 +144,46 @@ public:
// Load navigation map // Load navigation map
//*********************************************************** //***********************************************************
// Rotate the picture in 1° steps // Latitude
int angle = 25; if(valid1){
latitude = value1;
value3old = value1;
}
else{
latitude = value1old;
}
// Longitude
if(valid2){
longitude = value2;
value2old = value2;
}
else{
longitude = value2old;
}
// COG value (Course Over Ground)
if(valid3){
courseOverGround = value3;
value3old = value3;
}
else{
courseOverGround = value3old;
}
// SOG value (Speed Over Ground)
if(valid4){
speedOverGround = value4;
value4old = value4;
}
else{
speedOverGround = value4old;
}
// DBT value (Depth Below Transducer)
if(valid5){
depthBelowTransducer = value5;
value5old = value5;
}
else{
depthBelowTransducer = value5old;
}
// Server settings // Server settings
String server = "norbert-walter.dnshome.de"; String server = "norbert-walter.dnshome.de";
@@ -109,28 +193,33 @@ public:
// For more details see: https://github.com/norbert-walter/maps-converter // For more details see: https://github.com/norbert-walter/maps-converter
String url = String("http://") + server + ":" + port + // OBP Server String url = String("http://") + server + ":" + port + // OBP Server
String("/get_image_json?") + // Service: Output B&W picture as JSON (Base64 + gzip) String("/get_image_json?") + // Service: Output B&W picture as JSON (Base64 + gzip)
"zoom=15" + // Zoom level: 15 "zoom=" + zoom + // Zoom level: 15
"&lat=53.9028" + // Latitude "&lat=" + latitude + // Latitude
"&lon=11.4441" + // Longitude "&lon=" + longitude + // Longitude
"&mrot=" + angle + // Rotation angle navigation map "&mrot=" + int(courseOverGround) + // Rotation angle navigation map
"&mtype=9" + // Free Nautical Charts with depth "&mtype=5" + // Open Topo Map
"&dtype=1" + // Dithering type: Threshold dithering "&dtype=4" + // Dithering type: Atkinson dithering
"&width=400" + // With navigation map "&width=400" + // With navigation map
"&height=250" + // Height navigation map "&height=250" + // Height navigation map
"&cutout=0" + // No picture cutouts "&cutout=0" + // No picture cutouts
"&tab=0" + // No tab size "&tab=0" + // No tab size
"&border=2" + // Border line size: 2 pixel "&border=2" + // Border line size: 2 pixel
"&symbol=2" + // Symbol: Triangle "&symbol=2" + // Symbol: Triangle
"&srot=" + angle + // Symbol rotation angle "&srot=" + int(courseOverGround) + // Symbol rotation angle
"&ssize=15" + // Symbole size: 15 pixel "&ssize=15" + // Symbole size: 15 pixel
"&grid=1" // Show grid: On "&grid=0" // Show grid: On
; ;
// Draw page
//***********************************************************
// ############### Draw Navigation Map ################
// Set display in partial refresh mode // Set display in partial refresh mode
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
getdisplay().setTextColor(commonData->fgcolor); getdisplay().setTextColor(commonData->fgcolor);
// If a network connection to URL // If a network connection to URL then load the navigation map
if (net.fetchAndDecompressJson(url)) { if (net.fetchAndDecompressJson(url)) {
auto& json = net.json(); // Extract JSON content auto& json = net.json(); // Extract JSON content
@@ -143,7 +232,7 @@ public:
// Copy Base64 content in PSRAM // Copy Base64 content in PSRAM
char* b64 = (char*) heap_caps_malloc(b64len + 1, MALLOC_CAP_SPIRAM); // Allcate PSRAM for Base64 content char* b64 = (char*) heap_caps_malloc(b64len + 1, MALLOC_CAP_SPIRAM); // Allcate PSRAM for Base64 content
if (!b64) { if (!b64) {
Serial.println("ERROR: PSRAM alloc base64 failed"); LOG_DEBUG(GwLog::ERROR,"Error PageNavigation: PSRAM alloc base64 failed");
return PAGE_UPDATE; return PAGE_UPDATE;
} }
memcpy(b64, b64src, b64len + 1); // Copy Base64 content in PSRAM memcpy(b64, b64src, b64len + 1); // Copy Base64 content in PSRAM
@@ -153,7 +242,7 @@ public:
size_t imgSize = numPix; // Calculate image size size_t imgSize = numPix; // Calculate image size
uint8_t* imageData = (uint8_t*) heap_caps_malloc(imgSize, MALLOC_CAP_SPIRAM); // Allocate PSRAM for image uint8_t* imageData = (uint8_t*) heap_caps_malloc(imgSize, MALLOC_CAP_SPIRAM); // Allocate PSRAM for image
if (!imageData) { if (!imageData) {
Serial.println("ERROR: PSRAM alloc image buffer failed"); LOG_DEBUG(GwLog::ERROR,"Error PageNavigation: PPSRAM alloc image buffer failed");
free(b64); free(b64);
return PAGE_UPDATE; return PAGE_UPDATE;
} }
@@ -169,34 +258,42 @@ public:
free(b64); free(b64);
free(imageData); free(imageData);
} }
// Draw page
//***********************************************************
// ############### Draw Navigation Map ################ // ############### Draw Values ################
getdisplay().setFont(&Ubuntu_Bold12pt8b); getdisplay().setFont(&Ubuntu_Bold12pt8b);
getdisplay().setCursor(20, 60); // Show zoom level
getdisplay().print(name1); getdisplay().fillRect(355, 25 , 45, 25, commonData->fgcolor); // Black rect
getdisplay().setCursor(80, 60); getdisplay().fillRect(357, 27 , 41, 21, commonData->bgcolor); // White rect
getdisplay().print(svalue1); getdisplay().setCursor(364, 45);
getdisplay().print(zoom);
getdisplay().setCursor(20, 80); if(showValues == true){
getdisplay().print(name2); // Frame
getdisplay().setCursor(80, 80); getdisplay().fillRect(0, 25 , 130, 70, commonData->fgcolor); // Black rect
getdisplay().print(svalue2); getdisplay().fillRect(2, 27 , 126, 66, commonData->bgcolor); // White rect
// COG
getdisplay().setCursor(10, 45);
getdisplay().print(name3);
getdisplay().setCursor(70, 45);
getdisplay().print(svalue3);
// SOG
getdisplay().setCursor(10, 65);
getdisplay().print(name4);
getdisplay().setCursor(70, 65);
getdisplay().print(svalue4);
// DBT
getdisplay().setCursor(10, 85);
getdisplay().print(name5);
getdisplay().setCursor(70, 85);
getdisplay().print(svalue5);
}
getdisplay().setCursor(20, 100); // Set botton labels
getdisplay().print(name3); commonData->keydata[0].label = "ZOOM -";
getdisplay().setCursor(80, 100); commonData->keydata[1].label = "ZOOM +";
getdisplay().print(svalue3); commonData->keydata[4].label = "VALUES";
getdisplay().setCursor(20, 120);
getdisplay().print(name4);
getdisplay().setCursor(80, 120);
getdisplay().print(svalue4);
return PAGE_UPDATE; return PAGE_UPDATE;
}; };
@@ -215,7 +312,7 @@ PageDescription registerPageNavigation(
"Navigation", // Page name "Navigation", // Page name
createPage, // Action createPage, // Action
0, // Number of bus values depends on selection in Web configuration 0, // Number of bus values depends on selection in Web configuration
{"LAT","LON","HDT","SOG"}, // Bus values we need in the page {"LAT","LON","COG","SOG","DBT"}, // Bus values we need in the page
true // Show display header on/off true // Show display header on/off
); );