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:
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -171,32 +260,40 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Draw page
|
// ############### Draw Values ################
|
||||||
//***********************************************************
|
|
||||||
|
|
||||||
|
|
||||||
// ############### Draw Navigation Map ################
|
|
||||||
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(20, 100);
|
getdisplay().setCursor(10, 45);
|
||||||
getdisplay().print(name3);
|
getdisplay().print(name3);
|
||||||
getdisplay().setCursor(80, 100);
|
getdisplay().setCursor(70, 45);
|
||||||
getdisplay().print(svalue3);
|
getdisplay().print(svalue3);
|
||||||
|
// SOG
|
||||||
getdisplay().setCursor(20, 120);
|
getdisplay().setCursor(10, 65);
|
||||||
getdisplay().print(name4);
|
getdisplay().print(name4);
|
||||||
getdisplay().setCursor(80, 120);
|
getdisplay().setCursor(70, 65);
|
||||||
getdisplay().print(svalue4);
|
getdisplay().print(svalue4);
|
||||||
|
// DBT
|
||||||
|
getdisplay().setCursor(10, 85);
|
||||||
|
getdisplay().print(name5);
|
||||||
|
getdisplay().setCursor(70, 85);
|
||||||
|
getdisplay().print(svalue5);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set botton labels
|
||||||
|
commonData->keydata[0].label = "ZOOM -";
|
||||||
|
commonData->keydata[1].label = "ZOOM +";
|
||||||
|
commonData->keydata[4].label = "VALUES";
|
||||||
|
|
||||||
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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user