mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-28 21:23:07 +01:00
Compare commits
4 Commits
e89d1ac62e
...
sdcard
| Author | SHA1 | Date | |
|---|---|---|---|
| 779f557d47 | |||
|
|
4a273d2c93 | ||
|
|
9be1b864f4 | ||
|
|
bfc4337417 |
@@ -501,7 +501,7 @@ def prebuild(env):
|
|||||||
genereateUserTasks(os.path.join(outPath(), TASK_INCLUDE))
|
genereateUserTasks(os.path.join(outPath(), TASK_INCLUDE))
|
||||||
generateFile(os.path.join(basePath(),XDR_FILE),os.path.join(outPath(),XDR_INCLUDE),generateXdrMappings)
|
generateFile(os.path.join(basePath(),XDR_FILE),os.path.join(outPath(),XDR_INCLUDE),generateXdrMappings)
|
||||||
generateFile(os.path.join(basePath(),GROVE_CONFIG_IN),os.path.join(outPath(),GROVE_CONFIG),generateGroveDefs,inMode='r')
|
generateFile(os.path.join(basePath(),GROVE_CONFIG_IN),os.path.join(outPath(),GROVE_CONFIG),generateGroveDefs,inMode='r')
|
||||||
version = "dev{}{}".format(datetime.now().strftime("%Y%m%d"), "-ext")
|
version="dev"+datetime.now().strftime("%Y%m%d")
|
||||||
env.Append(CPPDEFINES=[('GWDEVVERSION',version)])
|
env.Append(CPPDEFINES=[('GWDEVVERSION',version)])
|
||||||
|
|
||||||
def cleangenerated(source, target, env):
|
def cleangenerated(source, target, env):
|
||||||
|
|||||||
@@ -1,204 +0,0 @@
|
|||||||
/*
|
|
||||||
Menu system for online configuration
|
|
||||||
*/
|
|
||||||
#include "ConfigMenu.h"
|
|
||||||
|
|
||||||
ConfigMenuItem::ConfigMenuItem(String itemtype, String itemlabel, uint16_t itemval, String itemunit) {
|
|
||||||
if (! (itemtype == "int" or itemtype == "bool")) {
|
|
||||||
valtype = "int";
|
|
||||||
} else {
|
|
||||||
valtype = itemtype;
|
|
||||||
}
|
|
||||||
label = itemlabel;
|
|
||||||
min = 0;
|
|
||||||
max = std::numeric_limits<uint16_t>::max();
|
|
||||||
value = itemval;
|
|
||||||
unit = itemunit;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenuItem::setRange(uint16_t valmin, uint16_t valmax, std::vector<uint16_t> valsteps) {
|
|
||||||
min = valmin;
|
|
||||||
max = valmax;
|
|
||||||
steps = valsteps;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool ConfigMenuItem::checkRange(uint16_t checkval) {
|
|
||||||
return (checkval >= min) and (checkval <= max);
|
|
||||||
}
|
|
||||||
|
|
||||||
String ConfigMenuItem::getLabel() {
|
|
||||||
return label;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint16_t ConfigMenuItem::getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ConfigMenuItem::setValue(uint16_t newval) {
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (newval >= min and newval <= max) {
|
|
||||||
value = newval;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false; // out of range
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = (newval != 0) ? 1 : 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false; // invalid type
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::incValue() {
|
|
||||||
// increase value by step
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (value + step < max) {
|
|
||||||
value += step;
|
|
||||||
} else {
|
|
||||||
value = max;
|
|
||||||
}
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = !value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::decValue() {
|
|
||||||
// decrease value by step
|
|
||||||
if (valtype == "int") {
|
|
||||||
if (value - step > min) {
|
|
||||||
value -= step;
|
|
||||||
} else {
|
|
||||||
value = min;
|
|
||||||
}
|
|
||||||
} else if (valtype == "bool") {
|
|
||||||
value = !value;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
String ConfigMenuItem::getUnit() {
|
|
||||||
return unit;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t ConfigMenuItem::getStep() {
|
|
||||||
return step;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenuItem::setStep(uint16_t newstep) {
|
|
||||||
if (std::find(steps.begin(), steps.end(), newstep) == steps.end()) {
|
|
||||||
return; // invalid step: not in list of possible steps
|
|
||||||
}
|
|
||||||
step = newstep;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t ConfigMenuItem::getPos() {
|
|
||||||
return position;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenuItem::setPos(int8_t newpos) {
|
|
||||||
position = newpos;
|
|
||||||
};
|
|
||||||
|
|
||||||
String ConfigMenuItem::getType() {
|
|
||||||
return valtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigMenu::ConfigMenu(String menutitle, uint16_t menu_x, uint16_t menu_y) {
|
|
||||||
title = menutitle;
|
|
||||||
x = menu_x;
|
|
||||||
y = menu_y;
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::addItem(String key, String label, String valtype, uint16_t val, String valunit) {
|
|
||||||
if (items.find(key) != items.end()) {
|
|
||||||
// duplicate keys not allowed
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
ConfigMenuItem *itm = new ConfigMenuItem(valtype, label, val, valunit);
|
|
||||||
items.insert(std::pair<String, ConfigMenuItem*>(key, itm));
|
|
||||||
// Append key to index, index starting with 0
|
|
||||||
int8_t ix = items.size() - 1;
|
|
||||||
index[ix] = key;
|
|
||||||
itm->setPos(ix);
|
|
||||||
return itm;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::setItemDimension(uint16_t itemwidth, uint16_t itemheight) {
|
|
||||||
w = itemwidth;
|
|
||||||
h = itemheight;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::setItemActive(String key) {
|
|
||||||
if (items.find(key) != items.end()) {
|
|
||||||
activeitem = items[key]->getPos();
|
|
||||||
} else {
|
|
||||||
activeitem = -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int8_t ConfigMenu::getActiveIndex() {
|
|
||||||
return activeitem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getActiveItem() {
|
|
||||||
if (activeitem < 0) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[index[activeitem]];
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getItemByIndex(uint8_t ix) {
|
|
||||||
if (ix > index.size() - 1) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[index[ix]];
|
|
||||||
};
|
|
||||||
|
|
||||||
ConfigMenuItem* ConfigMenu::getItemByKey(String key) {
|
|
||||||
if (items.find(key) == items.end()) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return items[key];
|
|
||||||
};
|
|
||||||
|
|
||||||
uint8_t ConfigMenu::getItemCount() {
|
|
||||||
return items.size();
|
|
||||||
};
|
|
||||||
|
|
||||||
void ConfigMenu::goPrev() {
|
|
||||||
if (activeitem == 0) {
|
|
||||||
activeitem = items.size() - 1;
|
|
||||||
} else {
|
|
||||||
activeitem--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::goNext() {
|
|
||||||
if (activeitem == items.size() - 1) {
|
|
||||||
activeitem = 0;
|
|
||||||
} else {
|
|
||||||
activeitem++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Point ConfigMenu::getXY() {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y)};
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect ConfigMenu::getRect() {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y),
|
|
||||||
static_cast<double>(w), static_cast<double>(h)};
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect ConfigMenu::getItemRect(int8_t index) {
|
|
||||||
return {static_cast<double>(x), static_cast<double>(y + index * h),
|
|
||||||
static_cast<double>(w), static_cast<double>(h)};
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::setCallback(void (*callback)()) {
|
|
||||||
fptrCallback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConfigMenu::storeValues() {
|
|
||||||
if (fptrCallback) {
|
|
||||||
fptrCallback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include "Graphics.h" // for Point and Rect
|
|
||||||
|
|
||||||
class ConfigMenuItem {
|
|
||||||
private:
|
|
||||||
String label;
|
|
||||||
uint16_t value;
|
|
||||||
String unit;
|
|
||||||
String valtype; // "int" | "bool"
|
|
||||||
uint16_t min;
|
|
||||||
uint16_t max;
|
|
||||||
std::vector<uint16_t> steps;
|
|
||||||
uint16_t step;
|
|
||||||
int8_t position; // counted fom 0
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConfigMenuItem(String itemtype, String itemlabel, uint16_t itemval, String itemunit);
|
|
||||||
void setRange(uint16_t valmin, uint16_t valmax, std::vector<uint16_t> steps);
|
|
||||||
bool checkRange(uint16_t checkval);
|
|
||||||
String getLabel();
|
|
||||||
uint16_t getValue();
|
|
||||||
bool setValue(uint16_t newval);
|
|
||||||
void incValue();
|
|
||||||
void decValue();
|
|
||||||
String getUnit();
|
|
||||||
uint16_t getStep();
|
|
||||||
void setStep(uint16_t newstep);
|
|
||||||
int8_t getPos();
|
|
||||||
void setPos(int8_t newpos);
|
|
||||||
String getType();
|
|
||||||
};
|
|
||||||
|
|
||||||
class ConfigMenu {
|
|
||||||
private:
|
|
||||||
String title;
|
|
||||||
std::map <String,ConfigMenuItem*> items;
|
|
||||||
std::map <uint8_t,String> index;
|
|
||||||
int8_t activeitem = -1; // refers to position of item
|
|
||||||
uint16_t x;
|
|
||||||
uint16_t y;
|
|
||||||
uint16_t w;
|
|
||||||
uint16_t h;
|
|
||||||
void (*fptrCallback)();
|
|
||||||
|
|
||||||
public:
|
|
||||||
ConfigMenu(String title, uint16_t menu_x, uint16_t menu_y);
|
|
||||||
ConfigMenuItem* addItem(String key, String label, String valtype, uint16_t val, String valunit);
|
|
||||||
void setItemDimension(uint16_t itemwidth, uint16_t itemheight);
|
|
||||||
int8_t getActiveIndex();
|
|
||||||
void setItemActive(String key);
|
|
||||||
ConfigMenuItem* getActiveItem();
|
|
||||||
ConfigMenuItem* getItemByIndex(uint8_t index);
|
|
||||||
ConfigMenuItem* getItemByKey(String key);
|
|
||||||
uint8_t getItemCount();
|
|
||||||
void goPrev();
|
|
||||||
void goNext();
|
|
||||||
Point getXY();
|
|
||||||
Rect getRect();
|
|
||||||
Rect getItemRect(int8_t index);
|
|
||||||
void setCallback(void (*callback)());
|
|
||||||
void storeValues();
|
|
||||||
};
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
Generic graphics functions
|
|
||||||
|
|
||||||
*/
|
|
||||||
#include <math.h>
|
|
||||||
#include "Graphics.h"
|
|
||||||
|
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
|
||||||
// rotate poind around origin by degrees
|
|
||||||
Point rotated;
|
|
||||||
double phi = angle * M_PI / 180.0;
|
|
||||||
double dx = p.x - origin.x;
|
|
||||||
double dy = p.y - origin.y;
|
|
||||||
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
|
||||||
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
|
||||||
return rotated;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
|
||||||
std::vector<Point> rotatedPoints;
|
|
||||||
for (const auto& p : pts) {
|
|
||||||
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
|
||||||
}
|
|
||||||
return rotatedPoints;
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
struct Point {
|
|
||||||
double x;
|
|
||||||
double y;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Rect {
|
|
||||||
double x;
|
|
||||||
double y;
|
|
||||||
double w;
|
|
||||||
double h;
|
|
||||||
};
|
|
||||||
|
|
||||||
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
|
||||||
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
|
||||||
@@ -14,30 +14,6 @@ https://controllerstech.com/ws2812-leds-using-spi/
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
String Color::toHex() {
|
|
||||||
char hexColor[8];
|
|
||||||
sprintf(hexColor, "#%02X%02X%02X", r, g, b);
|
|
||||||
return String(hexColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
String Color::toName() {
|
|
||||||
static std::map<int, String> const names = {
|
|
||||||
{0xff0000, "Red"},
|
|
||||||
{0x00ff00, "Green"},
|
|
||||||
{0x0000ff, "Blue",},
|
|
||||||
{0xff9900, "Orange"},
|
|
||||||
{0xffff00, "Yellow"},
|
|
||||||
{0x3366ff, "Aqua"},
|
|
||||||
{0xff0066, "Violet"},
|
|
||||||
{0xffffff, "White"}
|
|
||||||
};
|
|
||||||
int color = (r << 16) + (g << 8) + b;
|
|
||||||
auto it = names.find(color);
|
|
||||||
if (it == names.end()) {
|
|
||||||
return toHex();
|
|
||||||
}
|
|
||||||
return it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint8_t mulcolor(uint8_t f1, uint8_t f2){
|
static uint8_t mulcolor(uint8_t f1, uint8_t f2){
|
||||||
uint16_t rt=f1;
|
uint16_t rt=f1;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Color{
|
|||||||
uint8_t g;
|
uint8_t g;
|
||||||
uint8_t b;
|
uint8_t b;
|
||||||
Color():r(0),g(0),b(0){}
|
Color():r(0),g(0),b(0){}
|
||||||
Color(uint8_t cr, uint8_t cg, uint8_t cb):
|
Color(uint8_t cr, uint8_t cg,uint8_t cb):
|
||||||
b(cb),g(cg),r(cr){}
|
b(cb),g(cg),r(cr){}
|
||||||
Color(const Color &o):b(o.b),g(o.g),r(o.r){}
|
Color(const Color &o):b(o.b),g(o.g),r(o.r){}
|
||||||
bool equal(const Color &o) const{
|
bool equal(const Color &o) const{
|
||||||
@@ -22,8 +22,6 @@ class Color{
|
|||||||
bool operator != (const Color &other) const{
|
bool operator != (const Color &other) const{
|
||||||
return ! equal(other);
|
return ! equal(other);
|
||||||
}
|
}
|
||||||
String toHex();
|
|
||||||
String toName();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static Color COLOR_GREEN=Color(0,255,0);
|
static Color COLOR_GREEN=Color(0,255,0);
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
@@ -41,8 +40,7 @@ GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> & getdisplay(){return display;}
|
|||||||
// Set display type and SPI pins for display
|
// Set display type and SPI pins for display
|
||||||
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> display(GxEPD2_420_GDEY042T81(OBP_SPI_CS, OBP_SPI_DC, OBP_SPI_RST, OBP_SPI_BUSY)); // GDEW042T2 400x300, UC8176 (IL0398)
|
||||||
// Export display in new funktion
|
// Export display in new funktion
|
||||||
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay(){return display;} // DEPRECATED
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay(){return display;}
|
||||||
gxepd2display *epd = &display;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GYE042A87
|
#ifdef DISPLAY_GYE042A87
|
||||||
@@ -66,6 +64,12 @@ PCF8574 pcf8574_Out(PCF8574_I2C_ADDR1); // First digital output modul PCF8574 fr
|
|||||||
Adafruit_FRAM_I2C fram;
|
Adafruit_FRAM_I2C fram;
|
||||||
bool hasFRAM = false;
|
bool hasFRAM = false;
|
||||||
|
|
||||||
|
// SD Card
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
bool hasSDCard = false;
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool blinkingLED = false; // Enable / disable blinking flash LED
|
bool blinkingLED = false; // Enable / disable blinking flash LED
|
||||||
bool statusLED = false; // Actual status of flash LED on/off
|
bool statusLED = false; // Actual status of flash LED on/off
|
||||||
@@ -80,6 +84,9 @@ LedTaskData *ledTaskData=nullptr;
|
|||||||
|
|
||||||
void hardwareInit(GwApi *api)
|
void hardwareInit(GwApi *api)
|
||||||
{
|
{
|
||||||
|
GwLog *logger = api->getLogger();
|
||||||
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
Wire.begin();
|
Wire.begin();
|
||||||
// Init PCF8574 digital outputs
|
// Init PCF8574 digital outputs
|
||||||
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
Wire.setClock(I2C_SPEED); // Set I2C clock on 10 kHz
|
||||||
@@ -89,7 +96,7 @@ void hardwareInit(GwApi *api)
|
|||||||
fram = Adafruit_FRAM_I2C();
|
fram = Adafruit_FRAM_I2C();
|
||||||
if (esp_reset_reason() == ESP_RST_POWERON) {
|
if (esp_reset_reason() == ESP_RST_POWERON) {
|
||||||
// help initialize FRAM
|
// help initialize FRAM
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"Delaying I2C init for 250ms due to cold boot");
|
logger->logDebug(GwLog::LOG, "Delaying I2C init for 250ms due to cold boot");
|
||||||
delay(250);
|
delay(250);
|
||||||
}
|
}
|
||||||
// FRAM (e.g. MB85RC256V)
|
// FRAM (e.g. MB85RC256V)
|
||||||
@@ -101,12 +108,68 @@ void hardwareInit(GwApi *api)
|
|||||||
// Boot counter
|
// Boot counter
|
||||||
uint8_t framcounter = fram.read(0x0000);
|
uint8_t framcounter = fram.read(0x0000);
|
||||||
fram.write(0x0000, framcounter+1);
|
fram.write(0x0000, framcounter+1);
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
logger->logDebug(GwLog::LOG, "FRAM detected: 0x%04x/0x%04x (counter=%d)", manufacturerID, productID, framcounter);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hasFRAM = false;
|
hasFRAM = false;
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"NO FRAM detected");
|
logger->logDebug(GwLog::LOG, "NO FRAM detected");
|
||||||
}
|
}
|
||||||
|
// SD Card
|
||||||
|
hasSDCard = false;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
if (config->getBool(config->useSDCard)) {
|
||||||
|
esp_err_t ret;
|
||||||
|
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
|
||||||
|
host.slot = SPI3_HOST;
|
||||||
|
logger->logDebug(GwLog::DEBUG, "SDSPI_HOST: max_freq_khz=%d" , host.max_freq_khz);
|
||||||
|
spi_bus_config_t bus_cfg = {
|
||||||
|
.mosi_io_num = SD_SPI_MOSI,
|
||||||
|
.miso_io_num = SD_SPI_MISO,
|
||||||
|
.sclk_io_num = SD_SPI_CLK,
|
||||||
|
.quadwp_io_num = -1,
|
||||||
|
.quadhd_io_num = -1,
|
||||||
|
.max_transfer_sz = 4000,
|
||||||
|
};
|
||||||
|
ret = spi_bus_initialize((spi_host_device_t) host.slot, &bus_cfg, SDSPI_DEFAULT_DMA);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SPI bus for SD card");
|
||||||
|
} else {
|
||||||
|
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
|
||||||
|
slot_config.gpio_cs = SD_SPI_CS;
|
||||||
|
slot_config.host_id = (spi_host_device_t) host.slot;
|
||||||
|
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
|
||||||
|
.format_if_mount_failed = false,
|
||||||
|
.max_files = 5,
|
||||||
|
.allocation_unit_size = 16 * 1024
|
||||||
|
};
|
||||||
|
ret = esp_vfs_fat_sdspi_mount(MOUNT_POINT, &host, &slot_config, &mount_config, &sdcard);
|
||||||
|
if (ret != ESP_OK) {
|
||||||
|
if (ret == ESP_FAIL) {
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to mount SD card filesystem");
|
||||||
|
} else {
|
||||||
|
// ret == 263 could be not powered up yet
|
||||||
|
logger->logDebug(GwLog::ERROR, "Failed to initialize SD card (error #%d)", ret);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card filesystem mounted at '%s'", MOUNT_POINT);
|
||||||
|
hasSDCard = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasSDCard) {
|
||||||
|
// read some stats
|
||||||
|
String features = "";
|
||||||
|
if (sdcard->is_mem) features += "MEM "; // Memory card
|
||||||
|
if (sdcard->is_sdio) features += "IO "; // IO Card
|
||||||
|
if (sdcard->is_mmc) features += "MMC "; // MMC Card
|
||||||
|
if (sdcard->is_ddr) features += "DDR ";
|
||||||
|
// if (sdcard->is_uhs1) features += "UHS-1 ";
|
||||||
|
// ext_csd. Extended information
|
||||||
|
// uint8_t rev, uint8_t power_class
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card features: %s", features);
|
||||||
|
logger->logDebug(GwLog::LOG, "SD card size: %lluMB", ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void powerInit(String powermode) {
|
void powerInit(String powermode) {
|
||||||
@@ -299,20 +362,30 @@ String xdrDelete(String input){
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle) {
|
||||||
|
// rotate poind around origin by degrees
|
||||||
|
Point rotated;
|
||||||
|
double phi = angle * M_PI / 180.0;
|
||||||
|
double dx = p.x - origin.x;
|
||||||
|
double dy = p.y - origin.y;
|
||||||
|
rotated.x = origin.x + cos(phi) * dx - sin(phi) * dy;
|
||||||
|
rotated.y = origin.y + sin(phi) * dx + cos(phi) * dy;
|
||||||
|
return rotated;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle) {
|
||||||
|
std::vector<Point> rotatedPoints;
|
||||||
|
for (const auto& p : pts) {
|
||||||
|
rotatedPoints.push_back(rotatePoint(origin, p, angle));
|
||||||
|
}
|
||||||
|
return rotatedPoints;
|
||||||
|
}
|
||||||
|
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color) {
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[1].x, p4[1].y, p4[2].x, p4[2].y, color);
|
||||||
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
getdisplay().fillTriangle(p4[0].x, p4[0].y, p4[2].x, p4[2].y, p4[3].x, p4[3].y, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawPoly(const std::vector<Point>& points, uint16_t color) {
|
|
||||||
size_t polysize = points.size();
|
|
||||||
for (size_t i = 0; i < polysize - 1; i++) {
|
|
||||||
getdisplay().drawLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y, color);
|
|
||||||
}
|
|
||||||
// close path
|
|
||||||
getdisplay().drawLine(points[polysize-1].x, points[polysize-1].y, points[0].x, points[0].y, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Split string into words, whitespace separated
|
// Split string into words, whitespace separated
|
||||||
std::vector<String> split(const String &s) {
|
std::vector<String> split(const String &s) {
|
||||||
std::vector<String> words;
|
std::vector<String> words;
|
||||||
@@ -374,24 +447,6 @@ void drawTextRalign(int16_t x, int16_t y, String text) {
|
|||||||
getdisplay().print(text);
|
getdisplay().print(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw text inside box, normal or inverted
|
|
||||||
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border) {
|
|
||||||
if (inverted) {
|
|
||||||
getdisplay().fillRect(box.x, box.y, box.w, box.h, fg);
|
|
||||||
getdisplay().setTextColor(bg);
|
|
||||||
} else {
|
|
||||||
if (border) {
|
|
||||||
getdisplay().fillRect(box.x + 1, box.y + 1, box.w - 2, box.h - 2, bg);
|
|
||||||
getdisplay().drawRect(box.x, box.y, box.w, box.h, fg);
|
|
||||||
}
|
|
||||||
getdisplay().setTextColor(fg);
|
|
||||||
}
|
|
||||||
uint16_t border_offset = box.h / 4; // 25% of box height
|
|
||||||
getdisplay().setCursor(box.x + border_offset, box.y + box.h - border_offset);
|
|
||||||
getdisplay().print(text);
|
|
||||||
getdisplay().setTextColor(fg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show a triangle for trend direction high (x, y is the left edge)
|
// Show a triangle for trend direction high (x, y is the left edge)
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
||||||
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
getdisplay().fillTriangle(x, y, x+size*2, y, x+size, y-size*2, color);
|
||||||
@@ -403,7 +458,7 @@ void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show header informations
|
// Show header informations
|
||||||
void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop){
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop){
|
||||||
|
|
||||||
static bool heartbeat = false;
|
static bool heartbeat = false;
|
||||||
static unsigned long usbRxOld = 0;
|
static unsigned long usbRxOld = 0;
|
||||||
@@ -417,70 +472,31 @@ void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *da
|
|||||||
static unsigned long n2kRxOld = 0;
|
static unsigned long n2kRxOld = 0;
|
||||||
static unsigned long n2kTxOld = 0;
|
static unsigned long n2kTxOld = 0;
|
||||||
|
|
||||||
uint16_t symbol_x = 2;
|
|
||||||
static const uint16_t symbol_offset = 20;
|
|
||||||
|
|
||||||
if(commonData.config->getBool(commonData.config->statusLine) == true){
|
if(commonData.config->getBool(commonData.config->statusLine) == true){
|
||||||
|
|
||||||
if (symbolmode) {
|
|
||||||
commonData.logger->logDebug(GwLog::LOG,"Header: Symbolmode");
|
|
||||||
} else {
|
|
||||||
commonData.logger->logDebug(GwLog::LOG,"Header: Textmode");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Show status info
|
// Show status info
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
getdisplay().setCursor(0, 15);
|
getdisplay().setCursor(0, 15);
|
||||||
if (commonData.status.wifiApOn) {
|
if(commonData.status.wifiApOn){
|
||||||
if (symbolmode) {
|
getdisplay().print(" AP ");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["AP"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print(" AP ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// If receive new telegram data then display bus name
|
// If receive new telegram data then display bus name
|
||||||
if(commonData.status.tcpClRx != tcpClRxOld || commonData.status.tcpClTx != tcpClTxOld || commonData.status.tcpSerRx != tcpSerRxOld || commonData.status.tcpSerTx != tcpSerTxOld){
|
if(commonData.status.tcpClRx != tcpClRxOld || commonData.status.tcpClTx != tcpClTxOld || commonData.status.tcpSerRx != tcpSerRxOld || commonData.status.tcpSerTx != tcpSerTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("TCP ");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["TCP"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print("TCP ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.n2kRx != n2kRxOld || commonData.status.n2kTx != n2kTxOld){
|
if(commonData.status.n2kRx != n2kRxOld || commonData.status.n2kTx != n2kTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("N2K ");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["N2K"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print("N2K ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.serRx != serRxOld || commonData.status.serTx != serTxOld){
|
if(commonData.status.serRx != serRxOld || commonData.status.serTx != serTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("183 ");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["0183"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print("183 ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(commonData.status.usbRx != usbRxOld || commonData.status.usbTx != usbTxOld){
|
if(commonData.status.usbRx != usbRxOld || commonData.status.usbTx != usbTxOld){
|
||||||
if (symbolmode) {
|
getdisplay().print("USB ");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["USB"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print("USB ");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
double gpshdop = formatValue(hdop, commonData).value;
|
double gpshdop = formatValue(hdop, commonData).value;
|
||||||
if(commonData.config->getString(commonData.config->useGPS) != "off" && gpshdop <= commonData.config->getInt(commonData.config->hdopAccuracy) && hdop->valid == true){
|
if(commonData.config->getString(commonData.config->useGPS) != "off" && gpshdop <= commonData.config->getInt(commonData.config->hdopAccuracy) && hdop->valid == true){
|
||||||
if (symbolmode) {
|
getdisplay().print("GPS");
|
||||||
getdisplay().drawXBitmap(symbol_x, 1, iconmap["GPS"], icon_width, icon_height, commonData.fgcolor);
|
|
||||||
symbol_x += symbol_offset;
|
|
||||||
} else {
|
|
||||||
getdisplay().print("GPS");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Save old telegram counter
|
// Save old telegram counter
|
||||||
tcpClRxOld = commonData.status.tcpClRx;
|
tcpClRxOld = commonData.status.tcpClRx;
|
||||||
|
|||||||
@@ -1,14 +1,18 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#ifndef _OBP60EXTENSIONPORT_H
|
#ifndef _OBP60EXTENSIONPORT_H
|
||||||
#define _OBP60EXTENSIONPORT_H
|
#define _OBP60EXTENSIONPORT_H
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "OBP60Hardware.h"
|
#include "OBP60Hardware.h"
|
||||||
#include "LedSpiTask.h"
|
#include "LedSpiTask.h"
|
||||||
#include "Graphics.h"
|
|
||||||
#include <GxEPD2_BW.h> // E-paper lib V2
|
#include <GxEPD2_BW.h> // E-paper lib V2
|
||||||
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
#include <Adafruit_FRAM_I2C.h> // I2C FRAM
|
||||||
|
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
#include "esp_vfs_fat.h"
|
||||||
|
#include "sdmmc_cmd.h"
|
||||||
|
#define MOUNT_POINT "/sdcard"
|
||||||
|
#endif
|
||||||
|
|
||||||
// FRAM address reservations 32kB: 0x0000 - 0x7FFF
|
// FRAM address reservations 32kB: 0x0000 - 0x7FFF
|
||||||
// 0x0000 - 0x03ff: single variables
|
// 0x0000 - 0x03ff: single variables
|
||||||
#define FRAM_PAGE_NO 0x0002
|
#define FRAM_PAGE_NO 0x0002
|
||||||
@@ -17,6 +21,7 @@
|
|||||||
#define FRAM_VOLTAGE_AVG 0x000A
|
#define FRAM_VOLTAGE_AVG 0x000A
|
||||||
#define FRAM_VOLTAGE_TREND 0x000B
|
#define FRAM_VOLTAGE_TREND 0x000B
|
||||||
#define FRAM_VOLTAGE_MODE 0x000C
|
#define FRAM_VOLTAGE_MODE 0x000C
|
||||||
|
// Wind page
|
||||||
#define FRAM_WIND_SIZE 0x000D
|
#define FRAM_WIND_SIZE 0x000D
|
||||||
#define FRAM_WIND_SRC 0x000E
|
#define FRAM_WIND_SRC 0x000E
|
||||||
#define FRAM_WIND_MODE 0x000F
|
#define FRAM_WIND_MODE 0x000F
|
||||||
@@ -26,6 +31,10 @@
|
|||||||
|
|
||||||
extern Adafruit_FRAM_I2C fram;
|
extern Adafruit_FRAM_I2C fram;
|
||||||
extern bool hasFRAM;
|
extern bool hasFRAM;
|
||||||
|
extern bool hasSDCard;
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
extern sdmmc_card_t *sdcard;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
// Fonts declarations for display (#includes see OBP60Extensions.cpp)
|
||||||
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
extern const GFXfont DSEG7Classic_BoldItalic16pt7b;
|
||||||
@@ -48,9 +57,7 @@ GxEPD2_BW<GxEPD2_420, GxEPD2_420::HEIGHT> & getdisplay();
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay(); // DEPRECATED
|
GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> & getdisplay();
|
||||||
typedef GxEPD2_BW<GxEPD2_420_GDEY042T81, GxEPD2_420_GDEY042T81::HEIGHT> gxepd2display;
|
|
||||||
extern gxepd2display *epd;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DISPLAY_GYE042A87
|
#ifdef DISPLAY_GYE042A87
|
||||||
@@ -66,8 +73,13 @@ GxEPD2_BW<GxEPD2_420_SE0420NQ04, GxEPD2_420_SE0420NQ04::HEIGHT> & getdisplay();
|
|||||||
#define PAGE_UPDATE 1 // page wants display to update
|
#define PAGE_UPDATE 1 // page wants display to update
|
||||||
#define PAGE_HIBERNATE 2 // page wants displey to hibernate
|
#define PAGE_HIBERNATE 2 // page wants displey to hibernate
|
||||||
|
|
||||||
|
struct Point {
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
};
|
||||||
|
Point rotatePoint(const Point& origin, const Point& p, double angle);
|
||||||
|
std::vector<Point> rotatePoints(const Point& origin, const std::vector<Point>& pts, double angle);
|
||||||
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
void fillPoly4(const std::vector<Point>& p4, uint16_t color);
|
||||||
void drawPoly(const std::vector<Point>& points, uint16_t color);
|
|
||||||
|
|
||||||
void deepSleep(CommonData &common);
|
void deepSleep(CommonData &common);
|
||||||
|
|
||||||
@@ -96,12 +108,11 @@ String xdrDelete(String input); // Delete xdr prefix from string
|
|||||||
|
|
||||||
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
void drawTextCenter(int16_t cx, int16_t cy, String text);
|
||||||
void drawTextRalign(int16_t x, int16_t y, String text);
|
void drawTextRalign(int16_t x, int16_t y, String text);
|
||||||
void drawTextBoxed(Rect box, String text, uint16_t fg, uint16_t bg, bool inverted, bool border);
|
|
||||||
|
|
||||||
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendHigh(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
void displayTrendLow(int16_t x, int16_t y, uint16_t size, uint16_t color);
|
||||||
|
|
||||||
void displayHeader(CommonData &commonData, bool symbolmode, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatValue *time, GwApi::BoatValue *hdop); // Draw display header
|
||||||
void displayFooter(CommonData &commonData);
|
void displayFooter(CommonData &commonData);
|
||||||
void displayAlarm(CommonData &commonData);
|
void displayAlarm(CommonData &commonData);
|
||||||
|
|
||||||
@@ -149,62 +160,24 @@ static unsigned char fram_bits[] PROGMEM = {
|
|||||||
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
0xff, 0xff, 0xf8, 0x1f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f,
|
||||||
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f };
|
||||||
|
|
||||||
// Header symbols
|
static unsigned char ap_bits[] PROGMEM = {
|
||||||
|
|
||||||
static unsigned char ap_bits[] PROGMEM= {
|
|
||||||
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0xc2, 0x21, 0x30, 0x06, 0x08, 0x08,
|
||||||
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
0xc0, 0x01, 0x20, 0x02, 0x00, 0x00, 0x80, 0x00, 0xc0, 0x01, 0xc0, 0x01,
|
||||||
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00 };
|
||||||
|
|
||||||
static unsigned char gps_bits[] PROGMEM = {
|
static unsigned char dish_bits[] PROGMEM = {
|
||||||
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
0x3c, 0x00, 0x42, 0x18, 0xfa, 0x1b, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x09,
|
||||||
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
0x82, 0x08, 0x06, 0x0a, 0x0e, 0x1b, 0x9c, 0x2b, 0x38, 0x2b, 0x74, 0x20,
|
||||||
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
0xec, 0x1f, 0x1c, 0x00, 0xf4, 0x00, 0xfe, 0x03 };
|
||||||
|
|
||||||
static unsigned char nmea_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x22, 0x21, 0x26, 0x33, 0x26, 0x33, 0x2a, 0x2d, 0x32, 0x2d,
|
|
||||||
0x32, 0x21, 0x22, 0x21, 0x00, 0x00, 0x3c, 0x0c, 0x04, 0x0c, 0x04, 0x12,
|
|
||||||
0x3c, 0x12, 0x04, 0x1e, 0x04, 0x21, 0x3c, 0x21 };
|
|
||||||
|
|
||||||
static unsigned char n2k_bits[] PROGMEM = {
|
|
||||||
0xe0, 0x07, 0x18, 0x18, 0x04, 0x20, 0x02, 0x40, 0x32, 0x4c, 0x31, 0x8c,
|
|
||||||
0x01, 0x80, 0x81, 0x81, 0x81, 0x81, 0x01, 0x80, 0x31, 0x8c, 0x32, 0x4c,
|
|
||||||
0x02, 0x40, 0x04, 0x20, 0x98, 0x19, 0xe0, 0x07 };
|
|
||||||
|
|
||||||
static unsigned char tcp_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0xe0, 0x03, 0x20, 0x02, 0x20, 0x02, 0x20, 0x02, 0xe0, 0x03,
|
|
||||||
0x80, 0x00, 0x80, 0x00, 0xff, 0xff, 0x08, 0x10, 0x08, 0x10, 0x3e, 0x7c,
|
|
||||||
0x22, 0x44, 0x22, 0x44, 0x22, 0x44, 0x3e, 0x7c };
|
|
||||||
|
|
||||||
static unsigned char usb_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x92, 0x39, 0x52, 0x4a, 0x52, 0x48, 0x92, 0x39, 0x12, 0x4a,
|
|
||||||
0x52, 0x4a, 0x8c, 0x39, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x04, 0x20,
|
|
||||||
0xf4, 0x2f, 0x04, 0x20, 0xf8, 0x1f, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char sdcard_bits[] PROGMEM = {
|
|
||||||
0xf8, 0x07, 0x0c, 0x08, 0x04, 0x08, 0xc4, 0x09, 0x24, 0x1a, 0xe4, 0x13,
|
|
||||||
0x04, 0x20, 0x24, 0x21, 0xa4, 0x12, 0x44, 0x12, 0x04, 0x20, 0x04, 0x20,
|
|
||||||
0xc4, 0x23, 0x34, 0x2c, 0xd8, 0x1b, 0x00, 0x00 };
|
|
||||||
|
|
||||||
static unsigned char bluetooth_bits[] PROGMEM = {
|
|
||||||
0x00, 0x00, 0x22, 0x21, 0x26, 0x33, 0x26, 0x33, 0x2a, 0x2d, 0x32, 0x2d,
|
|
||||||
0x32, 0x21, 0x22, 0x21, 0x00, 0x00, 0x3c, 0x0c, 0x04, 0x0c, 0x04, 0x12,
|
|
||||||
0x3c, 0x12, 0x04, 0x1e, 0x04, 0x21, 0x3c, 0x21 };
|
|
||||||
|
|
||||||
static std::map<String, unsigned char *> iconmap = {
|
static std::map<String, unsigned char *> iconmap = {
|
||||||
{"LEFT", left_bits},
|
{"LEFT", left_bits},
|
||||||
{"RIGHT", right_bits},
|
{"RIGHT", right_bits},
|
||||||
{"LOCK", lock_bits},
|
{"LOCK", lock_bits},
|
||||||
{"PLUS", plus_bits},
|
{"PLUS", plus_bits},
|
||||||
{"MINUS", minus_bits},
|
{"MINUS", minus_bits},
|
||||||
{"GPS", gps_bits},
|
{"DISH", dish_bits},
|
||||||
{"AP", ap_bits},
|
{"AP", ap_bits}
|
||||||
{"0183", nmea_bits},
|
|
||||||
{"N2K", n2k_bits},
|
|
||||||
{"TCP", tcp_bits},
|
|
||||||
{"USB", usb_bits},
|
|
||||||
{"SDCARD", sdcard_bits},
|
|
||||||
{"BLUE", bluetooth_bits}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Battery
|
// Battery
|
||||||
|
|||||||
@@ -82,7 +82,7 @@
|
|||||||
// Direction pin for RS485 NMEA0183
|
// Direction pin for RS485 NMEA0183
|
||||||
#define OBP_DIRECTION_PIN 8
|
#define OBP_DIRECTION_PIN 8
|
||||||
// I2C
|
// I2C
|
||||||
#define I2C_SPEED 10000UL // 10kHz clock speed on I2C bus
|
#define I2C_SPEED 100000UL // 100kHz clock speed on I2C bus
|
||||||
#define OBP_I2C_SDA 21
|
#define OBP_I2C_SDA 21
|
||||||
#define OBP_I2C_SCL 38
|
#define OBP_I2C_SCL 38
|
||||||
// DS1388 RTC
|
// DS1388 RTC
|
||||||
@@ -120,10 +120,10 @@
|
|||||||
#define SHOW_TIME 6000 // Show time in [ms] for logo and WiFi QR code
|
#define SHOW_TIME 6000 // Show time in [ms] for logo and WiFi QR code
|
||||||
#define FULL_REFRESH_TIME 600 // Refresh cycle time in [s][600...3600] for full display update (very important healcy function)
|
#define FULL_REFRESH_TIME 600 // Refresh cycle time in [s][600...3600] for full display update (very important healcy function)
|
||||||
// SPI SD-Card
|
// SPI SD-Card
|
||||||
#define SD_SPI_CS 10
|
#define SD_SPI_CS GPIO_NUM_10
|
||||||
#define SD_SPI_MOSI 40
|
#define SD_SPI_MOSI GPIO_NUM_40
|
||||||
#define SD_SPI_CLK 39
|
#define SD_SPI_CLK GPIO_NUM_39
|
||||||
#define SD_SPI_MISO 13
|
#define SD_SPI_MISO GPIO_NUM_13
|
||||||
|
|
||||||
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
// GPS (NEO-6M, NEO-M8N, ATGM336H)
|
||||||
#define OBP_GPS_RX 19
|
#define OBP_GPS_RX 19
|
||||||
|
|||||||
@@ -1,433 +0,0 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
#include "ConfigMenu.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
Anchor overview with additional associated data
|
|
||||||
This page is in experimental stage so be warned!
|
|
||||||
North is up.
|
|
||||||
|
|
||||||
Boatdata used
|
|
||||||
DBS - Water depth
|
|
||||||
HDT - Boat heading
|
|
||||||
AWS - Wind strength; Boat not moving so we assume AWS=TWS and AWD=TWD
|
|
||||||
AWD - Wind direction
|
|
||||||
LAT/LON - Boat position, current
|
|
||||||
HDOP - Position error
|
|
||||||
|
|
||||||
This is the fist page to contain a configuration page with
|
|
||||||
data entry option.
|
|
||||||
Also it will make use of the new alarm function.
|
|
||||||
|
|
||||||
Data
|
|
||||||
Anchor position lat/lon
|
|
||||||
Depth at anchor position
|
|
||||||
Chain length used
|
|
||||||
Boat position current
|
|
||||||
Depth at boat position
|
|
||||||
Boat heading
|
|
||||||
Wind direction
|
|
||||||
Wind strength
|
|
||||||
Alarm j/n
|
|
||||||
Alarm radius
|
|
||||||
GPS position error
|
|
||||||
Timestamp while dropping anchor
|
|
||||||
|
|
||||||
Drop / raise function in device OBP40 has to be done inside
|
|
||||||
config mode because of limited number of buttons.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define anchor_width 16
|
|
||||||
#define anchor_height 16
|
|
||||||
static unsigned char anchor_bits[] = {
|
|
||||||
0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0xf0, 0x0f, 0x80, 0x01,
|
|
||||||
0x80, 0x01, 0x88, 0x11, 0x8c, 0x31, 0x8e, 0x71, 0x84, 0x21, 0x86, 0x61,
|
|
||||||
0x86, 0x61, 0xfc, 0x3f, 0xf8, 0x1f, 0x80, 0x01 };
|
|
||||||
|
|
||||||
class PageAnchor : public Page
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
GwConfigHandler *config;
|
|
||||||
GwLog *logger;
|
|
||||||
bool simulation = false;
|
|
||||||
bool holdvalues = false;
|
|
||||||
String flashLED;
|
|
||||||
String backlightMode;
|
|
||||||
String lengthformat;
|
|
||||||
|
|
||||||
int scale = 50; // Radius of display circle in meter
|
|
||||||
|
|
||||||
bool alarm = false;
|
|
||||||
bool alarm_enabled = false;
|
|
||||||
uint8_t alarm_range;
|
|
||||||
|
|
||||||
uint8_t chain_length;
|
|
||||||
uint8_t chain;
|
|
||||||
|
|
||||||
bool anchor_set = false;
|
|
||||||
double anchor_lat;
|
|
||||||
double anchor_lon;
|
|
||||||
double anchor_depth;
|
|
||||||
int anchor_ts; // time stamp anchor dropped
|
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (C)onfig
|
|
||||||
int8_t editmode = -1; // marker for menu/edit/set function
|
|
||||||
|
|
||||||
ConfigMenu *menu;
|
|
||||||
|
|
||||||
void displayModeNormal(PageData &pageData) {
|
|
||||||
|
|
||||||
// Boatvalues: DBS, HDT, AWS, AWD, LAT, LON, HDOP
|
|
||||||
GwApi::BoatValue *bv_dbs = pageData.values[0]; // DBS
|
|
||||||
String sval_dbs = formatValue(bv_dbs, *commonData).svalue;
|
|
||||||
String sunit_dbs = formatValue(bv_dbs, *commonData).unit;
|
|
||||||
GwApi::BoatValue *bv_hdt = pageData.values[1]; // HDT
|
|
||||||
String sval_hdt = formatValue(bv_hdt, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_aws = pageData.values[2]; // AWS
|
|
||||||
String sval_aws = formatValue(bv_aws, *commonData).svalue;
|
|
||||||
String sunit_aws = formatValue(bv_aws, *commonData).unit;
|
|
||||||
GwApi::BoatValue *bv_awd = pageData.values[3]; // AWD
|
|
||||||
String sval_awd = formatValue(bv_awd, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_lat = pageData.values[4]; // LAT
|
|
||||||
String sval_lat = formatValue(bv_lat, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_lon = pageData.values[5]; // LON
|
|
||||||
String sval_lon = formatValue(bv_lon, *commonData).svalue;
|
|
||||||
GwApi::BoatValue *bv_hdop = pageData.values[6]; // HDOP
|
|
||||||
String sval_hdop = formatValue(bv_hdop, *commonData).svalue;
|
|
||||||
String sunit_hdop = formatValue(bv_hdop, *commonData).unit;
|
|
||||||
|
|
||||||
LOG_DEBUG(GwLog::DEBUG,"Drawing at PageAnchor; DBS=%f, HDT=%f, AWS=%f", bv_dbs->value, bv_hdt->value, bv_aws->value);
|
|
||||||
|
|
||||||
Point c = {200, 150}; // center = anchor position
|
|
||||||
uint16_t r = 125;
|
|
||||||
|
|
||||||
Point b = {200, 180}; // boat position while dropping anchor
|
|
||||||
|
|
||||||
const std::vector<Point> pts_boat = { // polygon lines
|
|
||||||
{b.x - 5, b.y},
|
|
||||||
{b.x - 5, b.y - 10},
|
|
||||||
{b.x, b.y - 16},
|
|
||||||
{b.x + 5, b.y - 10},
|
|
||||||
{b.x + 5, b.y}
|
|
||||||
};
|
|
||||||
//rotatePoints und dann Linien zeichnen
|
|
||||||
// TODO rotate boat according to current heading
|
|
||||||
//drawPoly(rotatePoints(c, pts, RadToDeg(value2)), commonData->fgcolor);
|
|
||||||
drawPoly(pts_boat, commonData->fgcolor);
|
|
||||||
|
|
||||||
// Draw wind arrow
|
|
||||||
const std::vector<Point> pts_wind = {
|
|
||||||
{c.x, c.y - r + 25},
|
|
||||||
{c.x - 12, c.y - r - 4},
|
|
||||||
{c.x, c.y - r + 6},
|
|
||||||
{c.x + 12, c.y - r - 4}
|
|
||||||
};
|
|
||||||
if (bv_awd->valid) {
|
|
||||||
fillPoly4(rotatePoints(c, pts_wind, bv_awd->value), commonData->fgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Title and corner value headings
|
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("Anchor");
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold10pt8b);
|
|
||||||
getdisplay().setCursor(8, 200);
|
|
||||||
getdisplay().print("Depth");
|
|
||||||
drawTextRalign(392, 38, "Chain");
|
|
||||||
drawTextRalign(392, 200, "Wind");
|
|
||||||
|
|
||||||
// Units
|
|
||||||
getdisplay().setCursor(8, 272);
|
|
||||||
getdisplay().print(sunit_dbs);
|
|
||||||
drawTextRalign(392, 272, sunit_aws);
|
|
||||||
drawTextRalign(392, 100, lengthformat); // chain unit not implemented
|
|
||||||
|
|
||||||
// Corner values
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
getdisplay().setCursor(8, 70);
|
|
||||||
getdisplay().print("Alarm: ");
|
|
||||||
getdisplay().print(alarm_enabled ? "On" : "Off");
|
|
||||||
|
|
||||||
getdisplay().setCursor(8, 90);
|
|
||||||
getdisplay().print("HDOP");
|
|
||||||
getdisplay().setCursor(8, 106);
|
|
||||||
if (bv_hdop->valid) {
|
|
||||||
getdisplay().print(round(bv_hdop->value), 0);
|
|
||||||
getdisplay().print(sunit_hdop);
|
|
||||||
} else {
|
|
||||||
getdisplay().print("n/a");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Values
|
|
||||||
getdisplay().setFont(&DSEG7Classic_BoldItalic20pt7b);
|
|
||||||
// Current chain used
|
|
||||||
getdisplay().setCursor(328, 85);
|
|
||||||
getdisplay().print("27");
|
|
||||||
|
|
||||||
// Depth
|
|
||||||
getdisplay().setCursor(8, 250);
|
|
||||||
getdisplay().print(sval_dbs);
|
|
||||||
// Wind
|
|
||||||
getdisplay().setCursor(328, 250);
|
|
||||||
getdisplay().print(sval_aws);
|
|
||||||
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r, commonData->fgcolor);
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
|
|
||||||
|
|
||||||
// zoom scale
|
|
||||||
getdisplay().drawLine(c.x + 10, c.y, c.x + r - 4, c.y, commonData->fgcolor);
|
|
||||||
// arrow left
|
|
||||||
getdisplay().drawLine(c.x + 10, c.y, c.x + 16, c.y - 4, commonData->fgcolor);
|
|
||||||
getdisplay().drawLine(c.x + 10, c.y, c.x + 16, c.y + 4, commonData->fgcolor);
|
|
||||||
// arrow right
|
|
||||||
getdisplay().drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y - 4, commonData->fgcolor);
|
|
||||||
getdisplay().drawLine(c.x + r - 4, c.y, c.x + r - 10, c.y + 4, commonData->fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
drawTextCenter(c.x + r / 2, c.y + 8, String(scale) + "m");
|
|
||||||
|
|
||||||
// alarm range circle
|
|
||||||
if (alarm_enabled) {
|
|
||||||
// alarm range in meter has to be smaller than the scale in meter
|
|
||||||
// r and r_range are pixel values
|
|
||||||
uint16_t r_range = int(alarm_range * r / scale);
|
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageAnchor; Alarm range = %d", r_range);
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r_range, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw anchor symbol (as bitmap)
|
|
||||||
getdisplay().drawXBitmap(c.x - anchor_width / 2, c.y - anchor_height / 2,
|
|
||||||
anchor_bits, anchor_width, anchor_height, commonData->fgcolor);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
|
|
||||||
getdisplay().setTextColor(commonData->fgcolor);
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("Anchor configuration");
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
// show lat/lon for anchor pos
|
|
||||||
// show lat/lon for boat pos
|
|
||||||
// show distance anchor <-> boat
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
for (int i = 0 ; i < menu->getItemCount(); i++) {
|
|
||||||
ConfigMenuItem *itm = menu->getItemByIndex(i);
|
|
||||||
if (!itm) {
|
|
||||||
LOG_DEBUG(GwLog::ERROR, "Menu item not found: %d", i);
|
|
||||||
} else {
|
|
||||||
Rect r = menu->getItemRect(i);
|
|
||||||
bool inverted = (i == menu->getActiveIndex());
|
|
||||||
drawTextBoxed(r, itm->getLabel(), commonData->fgcolor, commonData->bgcolor, inverted, false);
|
|
||||||
if (inverted and editmode > 0) {
|
|
||||||
// triangle as edit marker
|
|
||||||
getdisplay().fillTriangle(r.x + r.w + 20, r.y, r.x + r.w + 30, r.y + r.h / 2, r.x + r.w + 20, r.y + r.h, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
getdisplay().setCursor(r.x + r.w + 40, r.y + r.h - 4);
|
|
||||||
if (itm->getType() == "int") {
|
|
||||||
getdisplay().print(itm->getValue());
|
|
||||||
getdisplay().print(itm->getUnit());
|
|
||||||
} else {
|
|
||||||
getdisplay().print(itm->getValue() == 0 ? "No" : "Yes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
PageAnchor(CommonData &common)
|
|
||||||
{
|
|
||||||
commonData = &common;
|
|
||||||
config = commonData->config;
|
|
||||||
logger = commonData->logger;
|
|
||||||
logger->logDebug(GwLog::LOG,"Instantiate PageAnchor");
|
|
||||||
|
|
||||||
// preload configuration data
|
|
||||||
simulation = config->getBool(config->useSimuData);
|
|
||||||
holdvalues = config->getBool(config->holdvalues);
|
|
||||||
flashLED = config->getString(config->flashLED);
|
|
||||||
backlightMode = config->getString(config->backlight);
|
|
||||||
lengthformat = config->getString(config->lengthFormat);
|
|
||||||
chain_length = config->getInt(config->chainLength);
|
|
||||||
|
|
||||||
chain = 0;
|
|
||||||
anchor_set = false;
|
|
||||||
alarm_range = 30;
|
|
||||||
|
|
||||||
// Initialize config menu
|
|
||||||
menu = new ConfigMenu("Options", 40, 80);
|
|
||||||
menu->setItemDimension(150, 20);
|
|
||||||
|
|
||||||
ConfigMenuItem *newitem;
|
|
||||||
newitem = menu->addItem("chain", "Chain out", "int", 0, "m");
|
|
||||||
if (! newitem) {
|
|
||||||
// Demo: in case of failure exit here, should never be happen
|
|
||||||
logger->logDebug(GwLog::ERROR,"Menu item creation failed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("chainmax", "Chain max", "int", chain_length, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("zoom", "Zoom", "int", 50, "m");
|
|
||||||
newitem->setRange(0, 200, {1, });
|
|
||||||
newitem = menu->addItem("range", "Alarm range", "int", 40, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("alat", "Adjust anchor lat.", "int", 0, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
newitem = menu->addItem("alon", "Adjust anchor lon.", "int", 0, "m");
|
|
||||||
newitem->setRange(0, 200, {1, 5, 10});
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// Intodruced here because of missing keys for OBP40
|
|
||||||
newitem = menu->addItem("anchor", "Anchor down", "bool", 0, "");
|
|
||||||
#endif
|
|
||||||
menu->setItemActive("zoom");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupKeys(){
|
|
||||||
Page::setupKeys();
|
|
||||||
commonData->keydata[0].label = "MODE";
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (key == 2) { // Toggle alarm
|
|
||||||
alarm_enabled = !alarm_enabled;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else { // Config mode
|
|
||||||
if (key == 3) {
|
|
||||||
// menu down
|
|
||||||
menu->goNext();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 4) {
|
|
||||||
// menu up
|
|
||||||
menu->goPrev();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
int handleKey(int key){
|
|
||||||
if (key == 1) { // Switch between normal and config mode
|
|
||||||
if (mode == 'N') {
|
|
||||||
mode = 'C';
|
|
||||||
commonData->keydata[1].label = "EDIT";
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
commonData->keydata[1].label = "ALARM";
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (key == 2) { // Toggle alarm
|
|
||||||
alarm_enabled = !alarm_enabled;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else { // Config mode
|
|
||||||
// TODO different code for OBP40 / OBP60
|
|
||||||
if (key == 9) {
|
|
||||||
// menu down
|
|
||||||
if (editmode > 0) {
|
|
||||||
// decrease item value
|
|
||||||
menu->getActiveItem()->decValue();
|
|
||||||
} else {
|
|
||||||
menu->goNext();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 10) {
|
|
||||||
// menu up or value up
|
|
||||||
if (editmode > 0) {
|
|
||||||
// increase item value
|
|
||||||
menu->getActiveItem()->incValue();
|
|
||||||
} else {
|
|
||||||
menu->goPrev();
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 2) {
|
|
||||||
// enter / leave edit mode for current menu item
|
|
||||||
if (editmode > 0) {
|
|
||||||
commonData->keydata[1].label = "EDIT";
|
|
||||||
editmode = 0;
|
|
||||||
} else {
|
|
||||||
commonData->keydata[1].label = "SET";
|
|
||||||
editmode = 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (key == 11) { // Code for keylock
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void displayNew(PageData &pageData){
|
|
||||||
};
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData){
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageAnchor; Mode=%c", mode);
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
|
|
||||||
if (mode == 'N') {
|
|
||||||
displayModeNormal(pageData);
|
|
||||||
} else if (mode == 'C') {
|
|
||||||
displayModeConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page *createPage(CommonData &common){
|
|
||||||
return new PageAnchor(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 registerPageAnchor(
|
|
||||||
"Anchor", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{"DBS", "HDT", "AWS", "AWD", "LAT", "LON", "HDOP"}, // Names of bus values undepends on selection in Web configuration (refer GwBoatData.h)
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -31,15 +31,6 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
PageClock(CommonData &common){
|
PageClock(CommonData &common){
|
||||||
commonData = &common;
|
commonData = &common;
|
||||||
common.logger->logDebug(GwLog::LOG,"Instantiate PageClock");
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageClock");
|
||||||
|
|
||||||
// WIP time source
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
String use_rtc = common.config->getString(common.config->useRTC);
|
|
||||||
if (use_rtc == "off") {
|
|
||||||
source = 'G';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
simulation = common.config->getBool(common.config->useSimuData);
|
simulation = common.config->getBool(common.config->useSimuData);
|
||||||
timezone = common.config->getString(common.config->timeZone).toDouble();
|
timezone = common.config->getString(common.config->timeZone).toDouble();
|
||||||
homelat = common.config->getString(common.config->homeLAT).toDouble();
|
homelat = common.config->getString(common.config->homeLAT).toDouble();
|
||||||
@@ -109,10 +100,9 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
static String svalue5old = "";
|
static String svalue5old = "";
|
||||||
static String svalue6old = "";
|
static String svalue6old = "";
|
||||||
|
|
||||||
double value1 = 0; // GPS time
|
double value1 = 0;
|
||||||
double value2 = 0; // GPS date FIXME date defined as uint32_t!
|
double value2 = 0;
|
||||||
double value3 = 0; // HDOP
|
double value3 = 0;
|
||||||
bool gpsvalid = false;
|
|
||||||
|
|
||||||
// Get config data
|
// Get config data
|
||||||
String lengthformat = config->getString(config->lengthFormat);
|
String lengthformat = config->getString(config->lengthFormat);
|
||||||
@@ -165,9 +155,6 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
// GPS date and time are valid and can be used
|
|
||||||
gpsvalid = (valid1 && valid2 && valid3);
|
|
||||||
|
|
||||||
// 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);
|
||||||
@@ -176,7 +163,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
|
|
||||||
// Logging boat values
|
// Logging boat values
|
||||||
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
if (bvalue1 == NULL) return PAGE_OK; // WTF why this statement?
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2, name3.c_str(), value3);
|
LOG_DEBUG(GwLog::LOG,"Drawing at PageClock, %s:%f, %s:%f", name1.c_str(), value1, name2.c_str(), value2);
|
||||||
|
|
||||||
// Draw page
|
// Draw page
|
||||||
//***********************************************************
|
//***********************************************************
|
||||||
@@ -244,7 +231,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
|
|
||||||
// Show values sunrise
|
// Show values sunrise
|
||||||
String sunrise = "---";
|
String sunrise = "---";
|
||||||
if (((source == 'G') and gpsvalid) or (homevalid and commonData->data.rtcValid)) {
|
if ((valid1 and valid2 and valid3 == true) or (homevalid and commonData->data.rtcValid)) {
|
||||||
sunrise = String(commonData->sundata.sunriseHour) + ":" + String(commonData->sundata.sunriseMinute + 100).substring(1);
|
sunrise = String(commonData->sundata.sunriseHour) + ":" + String(commonData->sundata.sunriseMinute + 100).substring(1);
|
||||||
svalue5old = sunrise;
|
svalue5old = sunrise;
|
||||||
} else if (simulation) {
|
} else if (simulation) {
|
||||||
@@ -264,7 +251,7 @@ bool homevalid = false; // homelat and homelon are valid
|
|||||||
|
|
||||||
// Show values sunset
|
// Show values sunset
|
||||||
String sunset = "---";
|
String sunset = "---";
|
||||||
if (((source == 'G') and gpsvalid) or (homevalid and commonData->data.rtcValid)) {
|
if ((valid1 and valid2 and valid3 == true) or (homevalid and commonData->data.rtcValid)) {
|
||||||
sunset = String(commonData->sundata.sunsetHour) + ":" + String(commonData->sundata.sunsetMinute + 100).substring(1);
|
sunset = String(commonData->sundata.sunsetHour) + ":" + String(commonData->sundata.sunsetMinute + 100).substring(1);
|
||||||
svalue6old = sunset;
|
svalue6old = sunset;
|
||||||
} else if (simulation) {
|
} else if (simulation) {
|
||||||
|
|||||||
@@ -1,153 +0,0 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
|
||||||
|
|
||||||
#include "Pagedata.h"
|
|
||||||
#include "OBP60Extensions.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SkyView / Satellites
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageSkyView : public Page
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
PageSkyView(CommonData &common){
|
|
||||||
commonData = &common;
|
|
||||||
common.logger->logDebug(GwLog::LOG,"Show PageSkyView");
|
|
||||||
}
|
|
||||||
|
|
||||||
int handleKey(int key){
|
|
||||||
// Code for keylock
|
|
||||||
if(key == 11){
|
|
||||||
commonData->keylock = !commonData->keylock;
|
|
||||||
return 0; // Commit the key
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
int displayPage(PageData &pageData) {
|
|
||||||
GwConfigHandler *config = commonData->config;
|
|
||||||
GwLog *logger = commonData->logger;
|
|
||||||
|
|
||||||
// Get config data
|
|
||||||
String flashLED = config->getString(config->flashLED);
|
|
||||||
String displaycolor = config->getString(config->displaycolor);
|
|
||||||
String backlightMode = config->getString(config->backlight);
|
|
||||||
|
|
||||||
// Optical warning by limit violation (unused)
|
|
||||||
if(String(flashLED) == "Limit Violation"){
|
|
||||||
setBlinkingLED(false);
|
|
||||||
setFlashLED(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Logging boat values
|
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageSkyView");
|
|
||||||
|
|
||||||
// Draw page
|
|
||||||
//***********************************************************
|
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
|
||||||
|
|
||||||
// current position
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_lat = pageData.values[0];
|
|
||||||
String sv_lat = formatValue(bv_lat, *commonData).svalue;
|
|
||||||
//getdisplay().setCursor(300, 40);
|
|
||||||
//getdisplay().print(sv_lat);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_lon = pageData.values[1];
|
|
||||||
String sv_lon = formatValue(bv_lon, *commonData).svalue;
|
|
||||||
//getdisplay().setCursor(300, 60);
|
|
||||||
//getdisplay().print(sv_lon);
|
|
||||||
|
|
||||||
GwApi::BoatValue *bv_hdop = pageData.values[2];
|
|
||||||
String sv_hdop = formatValue(bv_hdop, *commonData).svalue;
|
|
||||||
//getdisplay().setCursor(300, 80);
|
|
||||||
//getdisplay().print(sv_hdop);
|
|
||||||
|
|
||||||
// sky view
|
|
||||||
Point c = {130, 148};
|
|
||||||
uint16_t r = 125;
|
|
||||||
uint16_t r1 = r / 2;
|
|
||||||
|
|
||||||
getdisplay().fillCircle(c.x, c.y, r, commonData->bgcolor);
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r + 1, commonData->fgcolor);
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r + 2, commonData->fgcolor);
|
|
||||||
getdisplay().drawCircle(c.x, c.y, r1, commonData->fgcolor);
|
|
||||||
|
|
||||||
// separation lines
|
|
||||||
getdisplay().drawLine(c.x - r, c.y, c.x + r, c.y, commonData->fgcolor);
|
|
||||||
getdisplay().drawLine(c.x, c.y - r, c.x, c.y + r, commonData->fgcolor);
|
|
||||||
Point p = {c.x, c.y - r};
|
|
||||||
Point p1, p2;
|
|
||||||
p1 = rotatePoint(c, p, 45);
|
|
||||||
p2 = rotatePoint(c, p, 45 + 180);
|
|
||||||
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
|
||||||
p1 = rotatePoint(c, p, -45);
|
|
||||||
p2 = rotatePoint(c, p, -45 + 180);
|
|
||||||
getdisplay().drawLine(p1.x, p1.y, p2.x, p2.y, commonData->fgcolor);
|
|
||||||
|
|
||||||
// directions
|
|
||||||
|
|
||||||
int16_t x1, y1;
|
|
||||||
uint16_t w, h;
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
|
|
||||||
getdisplay().getTextBounds("N", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
getdisplay().setCursor(c.x - w / 2, c.y - r + h + 2);
|
|
||||||
getdisplay().print("N");
|
|
||||||
|
|
||||||
getdisplay().getTextBounds("S", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
getdisplay().setCursor(c.x - w / 2, c.y + r - 2);
|
|
||||||
getdisplay().print("S");
|
|
||||||
|
|
||||||
getdisplay().getTextBounds("E", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
getdisplay().setCursor(c.x + r - w - 2, c.y + h / 2);
|
|
||||||
getdisplay().print("E");
|
|
||||||
|
|
||||||
getdisplay().getTextBounds("W", 0, 150, &x1, &y1, &w, &h);
|
|
||||||
getdisplay().setCursor(c.x - r + 2 , c.y + h / 2);
|
|
||||||
getdisplay().print("W");
|
|
||||||
|
|
||||||
// satellites
|
|
||||||
|
|
||||||
|
|
||||||
// Signal / Noise bars
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
getdisplay().setCursor(325, 34);
|
|
||||||
getdisplay().print("SNR");
|
|
||||||
getdisplay().drawRect(270, 20, 125, 257, commonData->fgcolor);
|
|
||||||
for (int i = 0; i < 12; i++) {
|
|
||||||
uint16_t y = 29 + (i + 1) * 20;
|
|
||||||
getdisplay().setCursor(276, y);
|
|
||||||
char buffer[3];
|
|
||||||
snprintf(buffer, 3, "%02d", i+1);
|
|
||||||
getdisplay().print(String(buffer));
|
|
||||||
getdisplay().drawRect(305, y-12, 85, 14, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
return PAGE_UPDATE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
static Page* createPage(CommonData &common){
|
|
||||||
return new PageSkyView(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 registerPageSkyView(
|
|
||||||
"SkyView", // Page name
|
|
||||||
createPage, // Action
|
|
||||||
0, // Number of bus values depends on selection in Web configuration
|
|
||||||
{"LAT", "LON", "HDOP"}, // Bus values we need in the page
|
|
||||||
true // Show display header on/off
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,15 +1,23 @@
|
|||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special system page, called directly with fast key sequence 5,4
|
||||||
|
* Out of normal page order.
|
||||||
|
* Consists of some sub-pages with following content:
|
||||||
|
* 1. Hard and software information
|
||||||
|
* 2. System settings
|
||||||
|
* 3. NMEA2000 device list
|
||||||
|
* 4. SD Card information if available
|
||||||
|
*/
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
#include "OBP60Extensions.h"
|
#include "OBP60Extensions.h"
|
||||||
#include "ConfigMenu.h"
|
|
||||||
#include "images/logo64.xbm"
|
#include "images/logo64.xbm"
|
||||||
#include <esp32/clk.h>
|
#include <esp32/clk.h>
|
||||||
#include "qrcode.h"
|
#include "qrcode.h"
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
#include <SD.h>
|
#include "dirent.h"
|
||||||
#include <FS.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STRINGIZE_IMPL(x) #x
|
#define STRINGIZE_IMPL(x) #x
|
||||||
@@ -20,42 +28,12 @@
|
|||||||
#define DISPLAYINFO STRINGIZE(EPDTYPE)
|
#define DISPLAYINFO STRINGIZE(EPDTYPE)
|
||||||
#define GXEPD2INFO STRINGIZE(GXEPD2VERS)
|
#define GXEPD2INFO STRINGIZE(GXEPD2VERS)
|
||||||
|
|
||||||
/*
|
|
||||||
* Special system page, called directly with fast key sequence 5,4
|
|
||||||
* Out of normal page order.
|
|
||||||
* Consists of some sub-pages with following content:
|
|
||||||
* 1. Hard and software information
|
|
||||||
* 2. System settings
|
|
||||||
* 3. System configuration: running and NVRAM
|
|
||||||
* 4. NMEA2000 device list
|
|
||||||
* 5. SD Card information if available
|
|
||||||
*
|
|
||||||
* TODO
|
|
||||||
* - setCpuFrequencyMhz(80|160|240);
|
|
||||||
* - Accesspoint / ! Änderung im Gatewaycode erforderlich?
|
|
||||||
* if (! isApActive()) {
|
|
||||||
* wifiSSID = config->getString(config->wifiSSID);
|
|
||||||
* wifiPass = config->getString(config->wifiPass);
|
|
||||||
* wifiSoftAP(wifiSSID, wifiPass);
|
|
||||||
* }
|
|
||||||
* - Power mode
|
|
||||||
* powerInit(powermode);
|
|
||||||
*/
|
|
||||||
|
|
||||||
class PageSystem : public Page
|
class PageSystem : public Page
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
GwConfigHandler *config;
|
|
||||||
GwLog *logger;
|
|
||||||
|
|
||||||
// NVRAM config options
|
|
||||||
String flashLED;
|
|
||||||
|
|
||||||
// Generic data access
|
|
||||||
|
|
||||||
uint64_t chipid;
|
uint64_t chipid;
|
||||||
bool simulation;
|
bool simulation;
|
||||||
bool sdcard;
|
bool use_sdcard;
|
||||||
String buzzer_mode;
|
String buzzer_mode;
|
||||||
uint8_t buzzer_power;
|
uint8_t buzzer_power;
|
||||||
String cpuspeed;
|
String cpuspeed;
|
||||||
@@ -70,337 +48,20 @@ private:
|
|||||||
double homelat;
|
double homelat;
|
||||||
double homelon;
|
double homelon;
|
||||||
|
|
||||||
char mode = 'N'; // (N)ormal, (S)ettings, (C)onfiguration, (D)evice list, c(A)rd
|
char mode = 'N'; // (N)ormal, (S)ettings, (D)evice list, (C)ard
|
||||||
int8_t editmode = -1; // marker for menu/edit/set function
|
|
||||||
|
|
||||||
ConfigMenu *menu;
|
|
||||||
|
|
||||||
void incMode() {
|
|
||||||
if (mode == 'N') { // Normal
|
|
||||||
mode = 'S';
|
|
||||||
} else if (mode == 'S') { // Settings
|
|
||||||
mode = 'C';
|
|
||||||
} else if (mode == 'C') { // Config
|
|
||||||
mode = 'D';
|
|
||||||
} else if (mode == 'D') { // Device list
|
|
||||||
if (sdcard) {
|
|
||||||
mode = 'A'; // SD-Card
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mode = 'N';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void decMode() {
|
|
||||||
if (mode == 'N') {
|
|
||||||
if (sdcard) {
|
|
||||||
mode = 'A';
|
|
||||||
} else {
|
|
||||||
mode = 'D';
|
|
||||||
}
|
|
||||||
} else if (mode == 'S') { // Settings
|
|
||||||
mode = 'N';
|
|
||||||
} else if (mode == 'C') { // Config
|
|
||||||
mode = 'S';
|
|
||||||
} else if (mode == 'D') { // Device list
|
|
||||||
mode = 'C';
|
|
||||||
} else {
|
|
||||||
mode = 'D';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeNormal() {
|
|
||||||
// Default system page view
|
|
||||||
|
|
||||||
uint16_t y0 = 155;
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("System information");
|
|
||||||
|
|
||||||
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
char ssid[13];
|
|
||||||
snprintf(ssid, 13, "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
|
|
||||||
displayBarcode(String(ssid), 320, 200, 2);
|
|
||||||
getdisplay().setCursor(8, 70);
|
|
||||||
getdisplay().print(String("MCUDEVICE-") + String(ssid));
|
|
||||||
|
|
||||||
getdisplay().setCursor(8, 95);
|
|
||||||
getdisplay().print("Firmware version: ");
|
|
||||||
getdisplay().setCursor(150, 95);
|
|
||||||
getdisplay().print(VERSINFO);
|
|
||||||
|
|
||||||
getdisplay().setCursor(8, 113);
|
|
||||||
getdisplay().print("Board version: ");
|
|
||||||
getdisplay().setCursor(150, 113);
|
|
||||||
getdisplay().print(BOARDINFO);
|
|
||||||
getdisplay().print(String(" HW ") + String(PCBINFO));
|
|
||||||
|
|
||||||
getdisplay().setCursor(8, 131);
|
|
||||||
getdisplay().print("Display version: ");
|
|
||||||
getdisplay().setCursor(150, 131);
|
|
||||||
getdisplay().print(DISPLAYINFO);
|
|
||||||
getdisplay().print("; GxEPD2 v");
|
|
||||||
getdisplay().print(GXEPD2INFO);
|
|
||||||
|
|
||||||
getdisplay().setCursor(8, 265);
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
getdisplay().print("Press STBY to enter deep sleep mode");
|
|
||||||
#endif
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
getdisplay().print("Press wheel to enter deep sleep mode");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Flash memory size
|
|
||||||
uint32_t flash_size = ESP.getFlashChipSize();
|
|
||||||
getdisplay().setCursor(8, y0);
|
|
||||||
getdisplay().print("FLASH:");
|
|
||||||
getdisplay().setCursor(90, y0);
|
|
||||||
getdisplay().print(String(flash_size / 1024) + String(" kB"));
|
|
||||||
|
|
||||||
// PSRAM memory size
|
|
||||||
uint32_t psram_size = ESP.getPsramSize();
|
|
||||||
getdisplay().setCursor(8, y0 + 16);
|
|
||||||
getdisplay().print("PSRAM:");
|
|
||||||
getdisplay().setCursor(90, y0 + 16);
|
|
||||||
getdisplay().print(String(psram_size / 1024) + String(" kB"));
|
|
||||||
|
|
||||||
// FRAM available / status
|
|
||||||
getdisplay().setCursor(8, y0 + 32);
|
|
||||||
getdisplay().print("FRAM:");
|
|
||||||
getdisplay().setCursor(90, y0 + 32);
|
|
||||||
getdisplay().print(hasFRAM ? "available" : "not found");
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
// SD-Card
|
|
||||||
getdisplay().setCursor(8, y0 + 48);
|
|
||||||
getdisplay().print("SD-Card:");
|
|
||||||
getdisplay().setCursor(90, y0 + 48);
|
|
||||||
if (sdcard) {
|
|
||||||
uint64_t cardsize = SD.cardSize() / (1024 * 1024);
|
|
||||||
getdisplay().print(String(cardsize) + String(" MB"));
|
|
||||||
} else {
|
|
||||||
getdisplay().print("off");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// CPU speed config / active
|
|
||||||
getdisplay().setCursor(202, y0);
|
|
||||||
getdisplay().print("CPU speed:");
|
|
||||||
getdisplay().setCursor(300, y0);
|
|
||||||
getdisplay().print(cpuspeed);
|
|
||||||
getdisplay().print(" / ");
|
|
||||||
int cpu_freq = esp_clk_cpu_freq() / 1000000;
|
|
||||||
getdisplay().print(String(cpu_freq));
|
|
||||||
|
|
||||||
// total RAM free
|
|
||||||
int Heap_free = esp_get_free_heap_size();
|
|
||||||
getdisplay().setCursor(202, y0 + 16);
|
|
||||||
getdisplay().print("Total free:");
|
|
||||||
getdisplay().setCursor(300, y0 + 16);
|
|
||||||
getdisplay().print(String(Heap_free));
|
|
||||||
|
|
||||||
// RAM free for task
|
|
||||||
int RAM_free = uxTaskGetStackHighWaterMark(NULL);
|
|
||||||
getdisplay().setCursor(202, y0 + 32);
|
|
||||||
getdisplay().print("Task free:");
|
|
||||||
getdisplay().setCursor(300, y0 + 32);
|
|
||||||
getdisplay().print(String(RAM_free));
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeConfig() {
|
|
||||||
// Configuration interface
|
|
||||||
|
|
||||||
uint16_t x0 = 16;
|
|
||||||
uint16_t y0 = 80;
|
|
||||||
uint16_t dy = 20;
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("System configuration");
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
/*getdisplay().setCursor(x0, y0);
|
|
||||||
getdisplay().print("CPU speed: 80 | 160 | 240");
|
|
||||||
getdisplay().setCursor(x0, y0 + 1 * dy);
|
|
||||||
getdisplay().print("Power mode: Max | 5V | Min");
|
|
||||||
getdisplay().setCursor(x0, y0 + 2 * dy);
|
|
||||||
getdisplay().print("Accesspoint: On | Off");
|
|
||||||
|
|
||||||
// TODO Change NVRAM-preferences settings here
|
|
||||||
getdisplay().setCursor(x0, y0 + 4 * dy);
|
|
||||||
getdisplay().print("Simulation: On | Off"); */
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
for (int i = 0 ; i < menu->getItemCount(); i++) {
|
|
||||||
ConfigMenuItem *itm = menu->getItemByIndex(i);
|
|
||||||
if (!itm) {
|
|
||||||
LOG_DEBUG(GwLog::ERROR, "Menu item not found: %d", i);
|
|
||||||
} else {
|
|
||||||
Rect r = menu->getItemRect(i);
|
|
||||||
bool inverted = (i == menu->getActiveIndex());
|
|
||||||
drawTextBoxed(r, itm->getLabel(), commonData->fgcolor, commonData->bgcolor, inverted, false);
|
|
||||||
if (inverted and editmode > 0) {
|
|
||||||
// triangle as edit marker
|
|
||||||
getdisplay().fillTriangle(r.x + r.w + 20, r.y, r.x + r.w + 30, r.y + r.h / 2, r.x + r.w + 20, r.y + r.h, commonData->fgcolor);
|
|
||||||
}
|
|
||||||
getdisplay().setCursor(r.x + r.w + 40, r.y + r.h - 4);
|
|
||||||
if (itm->getType() == "int") {
|
|
||||||
getdisplay().print(itm->getValue());
|
|
||||||
getdisplay().print(itm->getUnit());
|
|
||||||
} else {
|
|
||||||
getdisplay().print(itm->getValue() == 0 ? "No" : "Yes");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeSettings() {
|
|
||||||
// View some of the current settings
|
|
||||||
|
|
||||||
const uint16_t x0 = 8;
|
|
||||||
const uint16_t y0 = 72;
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(x0, 48);
|
|
||||||
getdisplay().print("System settings");
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
|
|
||||||
// left column
|
|
||||||
getdisplay().setCursor(x0, y0);
|
|
||||||
getdisplay().print("Simulation:");
|
|
||||||
getdisplay().setCursor(120, y0);
|
|
||||||
getdisplay().print(simulation ? "on" : "off");
|
|
||||||
|
|
||||||
getdisplay().setCursor(x0, y0 + 16);
|
|
||||||
getdisplay().print("Environment:");
|
|
||||||
getdisplay().setCursor(120, y0 + 16);
|
|
||||||
getdisplay().print(env_module);
|
|
||||||
|
|
||||||
getdisplay().setCursor(x0, y0 + 32);
|
|
||||||
getdisplay().print("Buzzer:");
|
|
||||||
getdisplay().setCursor(120, y0 + 32);
|
|
||||||
getdisplay().print(buzzer_mode);
|
|
||||||
|
|
||||||
getdisplay().setCursor(x0, y0 + 64);
|
|
||||||
getdisplay().print("GPS:");
|
|
||||||
getdisplay().setCursor(120, y0 + 64);
|
|
||||||
getdisplay().print(gps_module);
|
|
||||||
|
|
||||||
getdisplay().setCursor(x0, y0 + 80);
|
|
||||||
getdisplay().print("RTC:");
|
|
||||||
getdisplay().setCursor(120, y0 + 80);
|
|
||||||
getdisplay().print(rtc_module);
|
|
||||||
|
|
||||||
getdisplay().setCursor(x0, y0 + 96);
|
|
||||||
getdisplay().print("Wifi:");
|
|
||||||
getdisplay().setCursor(120, y0 + 96);
|
|
||||||
getdisplay().print(commonData->status.wifiApOn ? "on" : "off");
|
|
||||||
|
|
||||||
// Home location
|
|
||||||
getdisplay().setCursor(x0, y0 + 128);
|
|
||||||
getdisplay().print("Home Lat.:");
|
|
||||||
drawTextRalign(230, y0 + 128, formatLatitude(homelat));
|
|
||||||
getdisplay().setCursor(x0, y0 + 144);
|
|
||||||
getdisplay().print("Home Lon.:");
|
|
||||||
drawTextRalign(230, y0 + 144, formatLongitude(homelon));
|
|
||||||
|
|
||||||
// right column
|
|
||||||
getdisplay().setCursor(202, y0);
|
|
||||||
getdisplay().print("Batt. sensor:");
|
|
||||||
getdisplay().setCursor(320, y0);
|
|
||||||
getdisplay().print(batt_sensor);
|
|
||||||
|
|
||||||
// Solar sensor
|
|
||||||
getdisplay().setCursor(202, y0 + 16);
|
|
||||||
getdisplay().print("Solar sensor:");
|
|
||||||
getdisplay().setCursor(320, y0 + 16);
|
|
||||||
getdisplay().print(solar_sensor);
|
|
||||||
|
|
||||||
// Generator sensor
|
|
||||||
getdisplay().setCursor(202, y0 + 32);
|
|
||||||
getdisplay().print("Gen. sensor:");
|
|
||||||
getdisplay().setCursor(320, y0 + 32);
|
|
||||||
getdisplay().print(gen_sensor);
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP60S3
|
|
||||||
// Backlight infos
|
|
||||||
getdisplay().setCursor(202, y0 + 64);
|
|
||||||
getdisplay().print("Backlight:");
|
|
||||||
getdisplay().setCursor(320, y0 + 64);
|
|
||||||
getdisplay().printf("%d%%", commonData->backlight.brightness);
|
|
||||||
// TODO test function with OBP60 device
|
|
||||||
getdisplay().setCursor(202, y0 + 80);
|
|
||||||
getdisplay().print("Bl color:");
|
|
||||||
getdisplay().setCursor(320, y0 + 80);
|
|
||||||
getdisplay().print(commonData->backlight.color.toName());
|
|
||||||
getdisplay().setCursor(202, y0 + 96);
|
|
||||||
getdisplay().print("Bl mode:");
|
|
||||||
getdisplay().setCursor(320, y0 + 96);
|
|
||||||
getdisplay().print(commonData->backlight.mode);
|
|
||||||
// TODO Buzzer mode and power
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Gyro sensor
|
|
||||||
// WIP / FEATURE
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeSDCard() {
|
|
||||||
// SD card info
|
|
||||||
uint16_t x0 = 20;
|
|
||||||
uint16_t y0 = 72;
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("SD Card info");
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
getdisplay().setCursor(x0, y0);
|
|
||||||
getdisplay().print("Work in progress...");
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayModeDevicelist() {
|
|
||||||
// NMEA2000 device list
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
|
||||||
getdisplay().setCursor(8, 48);
|
|
||||||
getdisplay().print("NMEA2000 device list");
|
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
|
|
||||||
void storeConfig() {
|
|
||||||
menu->storeValues();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageSystem(CommonData &common){
|
PageSystem(CommonData &common){
|
||||||
commonData = &common;
|
commonData = &common;
|
||||||
config = commonData->config;
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
||||||
logger = commonData->logger;
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::LOG,"Instantiate PageSystem");
|
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
mode = fram.read(FRAM_SYSTEM_MODE);
|
mode = fram.read(FRAM_SYSTEM_MODE);
|
||||||
|
common.logger->logDebug(GwLog::DEBUG, "Loaded mode '%c' from FRAM", mode);
|
||||||
}
|
}
|
||||||
flashLED = common.config->getString(common.config->flashLED);
|
|
||||||
|
|
||||||
chipid = ESP.getEfuseMac();
|
chipid = ESP.getEfuseMac();
|
||||||
simulation = common.config->getBool(common.config->useSimuData);
|
simulation = common.config->getBool(common.config->useSimuData);
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
sdcard = common.config->getBool(common.config->useSDCard);
|
use_sdcard = common.config->getBool(common.config->useSDCard);
|
||||||
#endif
|
#endif
|
||||||
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
buzzer_mode = common.config->getString(common.config->buzzerMode);
|
||||||
buzzer_mode.toLowerCase();
|
buzzer_mode.toLowerCase();
|
||||||
@@ -415,27 +76,9 @@ public:
|
|||||||
rot_sensor = common.config->getString(common.config->useRotSensor);
|
rot_sensor = common.config->getString(common.config->useRotSensor);
|
||||||
homelat = common.config->getString(common.config->homeLAT).toDouble();
|
homelat = common.config->getString(common.config->homeLAT).toDouble();
|
||||||
homelon = common.config->getString(common.config->homeLON).toDouble();
|
homelon = common.config->getString(common.config->homeLON).toDouble();
|
||||||
|
|
||||||
// CPU speed: 80 | 160 | 240
|
|
||||||
// Power mode: Max | 5V | Min
|
|
||||||
// Accesspoint: On | Off
|
|
||||||
|
|
||||||
// TODO Change NVRAM-preferences settings here
|
|
||||||
// getdisplay().setCursor(x0, y0 + 4 * dy);
|
|
||||||
// getdisplay().print("Simulation: On | Off");
|
|
||||||
|
|
||||||
// Initialize config menu
|
|
||||||
menu = new ConfigMenu("Options", 40, 80);
|
|
||||||
menu->setItemDimension(150, 20);
|
|
||||||
|
|
||||||
ConfigMenuItem *newitem;
|
|
||||||
newitem = menu->addItem("accesspoint", "Accesspoint", "bool", 0, "");
|
|
||||||
newitem = menu->addItem("simulation", "Simulation", "on/off", 0, "");
|
|
||||||
menu->setItemActive("accesspoint");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setupKeys(){
|
void setupKeys() {
|
||||||
commonData->keydata[0].label = "EXIT";
|
commonData->keydata[0].label = "EXIT";
|
||||||
commonData->keydata[1].label = "MODE";
|
commonData->keydata[1].label = "MODE";
|
||||||
commonData->keydata[2].label = "";
|
commonData->keydata[2].label = "";
|
||||||
@@ -444,12 +87,24 @@ public:
|
|||||||
commonData->keydata[5].label = "ILUM";
|
commonData->keydata[5].label = "ILUM";
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int handleKey(int key){
|
int handleKey(int key) {
|
||||||
// do *NOT* handle key #1 this handled by obp60task as exit
|
// do *NOT* handle key #1 this handled by obp60task as exit
|
||||||
// Switch display mode
|
// Switch display mode
|
||||||
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
commonData->logger->logDebug(GwLog::LOG, "System keyboard handler");
|
||||||
if (key == 2) {
|
if (key == 2) {
|
||||||
incMode();
|
if (mode == 'N') {
|
||||||
|
mode = 'S';
|
||||||
|
} else if (mode == 'S') {
|
||||||
|
mode = 'D';
|
||||||
|
} else if (mode == 'D') {
|
||||||
|
if (hasSDCard) {
|
||||||
|
mode = 'C';
|
||||||
|
} else {
|
||||||
|
mode = 'N';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mode = 'N';
|
||||||
|
}
|
||||||
if (hasFRAM) fram.write(FRAM_SYSTEM_MODE, mode);
|
if (hasFRAM) fram.write(FRAM_SYSTEM_MODE, mode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -464,7 +119,8 @@ public:
|
|||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 5) {
|
if (key == 5) {
|
||||||
deepSleep(*commonData);
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
// Code for keylock
|
// Code for keylock
|
||||||
if (key == 11) {
|
if (key == 11) {
|
||||||
@@ -473,17 +129,13 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
// use cursor keys for local mode navigation
|
// grab cursor keys to disable page navigation
|
||||||
if (key == 9) {
|
if (key == 9 or key == 10) {
|
||||||
incMode();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (key == 10) {
|
|
||||||
decMode();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// standby / deep sleep
|
// standby / deep sleep
|
||||||
if (key == 12) {
|
if (key == 12) {
|
||||||
|
commonData->logger->logDebug(GwLog::LOG, "System going into deep sleep mode...");
|
||||||
deepSleep(*commonData);
|
deepSleep(*commonData);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -520,35 +172,301 @@ public:
|
|||||||
GwConfigHandler *config = commonData->config;
|
GwConfigHandler *config = commonData->config;
|
||||||
GwLog *logger = commonData->logger;
|
GwLog *logger = commonData->logger;
|
||||||
|
|
||||||
|
// Get config data
|
||||||
|
String flashLED = config->getString(config->flashLED);
|
||||||
|
|
||||||
// Optical warning by limit violation (unused)
|
// Optical warning by limit violation (unused)
|
||||||
if(flashLED == "Limit Violation"){
|
if(String(flashLED) == "Limit Violation"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
setFlashLED(false);
|
setFlashLED(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Logging page information
|
// Logging boat values
|
||||||
LOG_DEBUG(GwLog::LOG,"Drawing at PageSystem, Mode=%c", mode);
|
logger->logDebug(GwLog::LOG, "Drawing at PageSystem, Mode=%c", mode);
|
||||||
|
|
||||||
|
// Draw page
|
||||||
|
//***********************************************************
|
||||||
|
|
||||||
|
uint16_t x0 = 8; // left column
|
||||||
|
uint16_t y0 = 48; // data table starts here
|
||||||
|
|
||||||
// Set display in partial refresh mode
|
// Set display in partial refresh mode
|
||||||
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height());
|
getdisplay().setPartialWindow(0, 0, getdisplay().width(), getdisplay().height()); // Set partial update
|
||||||
|
|
||||||
// call current system page
|
if (mode == 'N') {
|
||||||
switch (mode) {
|
|
||||||
case 'N':
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
displayModeNormal();
|
getdisplay().setCursor(8, 48);
|
||||||
break;
|
getdisplay().print("System Information");
|
||||||
case 'S':
|
|
||||||
displayModeSettings();
|
getdisplay().drawXBitmap(320, 25, logo64_bits, logo64_width, logo64_height, commonData->fgcolor);
|
||||||
break;
|
|
||||||
case 'C':
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
displayModeConfig();
|
y0 = 155;
|
||||||
break;
|
|
||||||
case 'A':
|
char ssid[13];
|
||||||
displayModeSDCard();
|
snprintf(ssid, 13, "%04X%08X", (uint16_t)(chipid >> 32), (uint32_t)chipid);
|
||||||
break;
|
displayBarcode(String(ssid), 320, 200, 2);
|
||||||
case 'D':
|
getdisplay().setCursor(8, 70);
|
||||||
displayModeDevicelist();
|
getdisplay().print(String("MCUDEVICE-") + String(ssid));
|
||||||
break;
|
|
||||||
|
getdisplay().setCursor(8, 95);
|
||||||
|
getdisplay().print("Firmware version: ");
|
||||||
|
getdisplay().setCursor(150, 95);
|
||||||
|
getdisplay().print(VERSINFO);
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 113);
|
||||||
|
getdisplay().print("Board version: ");
|
||||||
|
getdisplay().setCursor(150, 113);
|
||||||
|
getdisplay().print(BOARDINFO);
|
||||||
|
getdisplay().print(String(" HW ") + String(PCBINFO));
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 131);
|
||||||
|
getdisplay().print("Display version: ");
|
||||||
|
getdisplay().setCursor(150, 131);
|
||||||
|
getdisplay().print(DISPLAYINFO);
|
||||||
|
getdisplay().print("; GxEPD2 v");
|
||||||
|
getdisplay().print(GXEPD2INFO);
|
||||||
|
|
||||||
|
getdisplay().setCursor(8, 265);
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
getdisplay().print("Press STBY to enter deep sleep mode");
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
getdisplay().print("Press wheel to enter deep sleep mode");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Flash memory size
|
||||||
|
uint32_t flash_size = ESP.getFlashChipSize();
|
||||||
|
getdisplay().setCursor(8, y0);
|
||||||
|
getdisplay().print("FLASH:");
|
||||||
|
getdisplay().setCursor(90, y0);
|
||||||
|
getdisplay().print(String(flash_size / 1024) + String(" kB"));
|
||||||
|
|
||||||
|
// PSRAM memory size
|
||||||
|
uint32_t psram_size = ESP.getPsramSize();
|
||||||
|
getdisplay().setCursor(8, y0 + 16);
|
||||||
|
getdisplay().print("PSRAM:");
|
||||||
|
getdisplay().setCursor(90, y0 + 16);
|
||||||
|
getdisplay().print(String(psram_size / 1024) + String(" kB"));
|
||||||
|
|
||||||
|
// FRAM available / status
|
||||||
|
getdisplay().setCursor(8, y0 + 32);
|
||||||
|
getdisplay().print("FRAM:");
|
||||||
|
getdisplay().setCursor(90, y0 + 32);
|
||||||
|
getdisplay().print(hasFRAM ? "available" : "not found");
|
||||||
|
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
// SD-Card
|
||||||
|
getdisplay().setCursor(8, y0 + 48);
|
||||||
|
getdisplay().print("SD-Card:");
|
||||||
|
getdisplay().setCursor(90, y0 + 48);
|
||||||
|
if (hasSDCard) {
|
||||||
|
uint64_t cardsize = ((uint64_t) sdcard->csd.capacity) * sdcard->csd.sector_size / (1024 * 1024);
|
||||||
|
getdisplay().printf("%llu MB", cardsize);
|
||||||
|
} else {
|
||||||
|
getdisplay().print("off");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Uptime
|
||||||
|
int64_t uptime = esp_timer_get_time() / 1000000;
|
||||||
|
String uptime_unit;
|
||||||
|
if (uptime < 120) {
|
||||||
|
uptime_unit = " seconds";
|
||||||
|
} else {
|
||||||
|
if (uptime < 2 * 3600) {
|
||||||
|
uptime /= 60;
|
||||||
|
uptime_unit = " minutes";
|
||||||
|
} else if (uptime < 2 * 3600 * 24) {
|
||||||
|
uptime /= 3600;
|
||||||
|
uptime_unit = " hours";
|
||||||
|
} else {
|
||||||
|
uptime /= 86400;
|
||||||
|
uptime_unit = " days";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getdisplay().setCursor(8, y0 + 80);
|
||||||
|
getdisplay().print("Uptime:");
|
||||||
|
getdisplay().setCursor(90, y0 + 80);
|
||||||
|
getdisplay().print(uptime);
|
||||||
|
getdisplay().print(uptime_unit);
|
||||||
|
|
||||||
|
// CPU speed config / active
|
||||||
|
getdisplay().setCursor(202, y0);
|
||||||
|
getdisplay().print("CPU speed:");
|
||||||
|
getdisplay().setCursor(300, y0);
|
||||||
|
getdisplay().print(cpuspeed);
|
||||||
|
getdisplay().print(" / ");
|
||||||
|
int cpu_freq = esp_clk_cpu_freq() / 1000000;
|
||||||
|
getdisplay().print(String(cpu_freq));
|
||||||
|
|
||||||
|
// total RAM free
|
||||||
|
int Heap_free = esp_get_free_heap_size();
|
||||||
|
getdisplay().setCursor(202, y0 + 16);
|
||||||
|
getdisplay().print("Total free:");
|
||||||
|
getdisplay().setCursor(300, y0 + 16);
|
||||||
|
getdisplay().print(String(Heap_free));
|
||||||
|
|
||||||
|
// RAM free for task
|
||||||
|
int RAM_free = uxTaskGetStackHighWaterMark(NULL);
|
||||||
|
getdisplay().setCursor(202, y0 + 32);
|
||||||
|
getdisplay().print("Task free:");
|
||||||
|
getdisplay().setCursor(300, y0 + 32);
|
||||||
|
getdisplay().print(String(RAM_free));
|
||||||
|
|
||||||
|
} else if (mode == 'S') {
|
||||||
|
// Settings
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(x0, 48);
|
||||||
|
getdisplay().print("System settings");
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
x0 = 8;
|
||||||
|
y0 = 72;
|
||||||
|
|
||||||
|
// left column
|
||||||
|
getdisplay().setCursor(x0, y0);
|
||||||
|
getdisplay().print("Simulation:");
|
||||||
|
getdisplay().setCursor(120, y0);
|
||||||
|
getdisplay().print(simulation ? "on" : "off");
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 16);
|
||||||
|
getdisplay().print("Environment:");
|
||||||
|
getdisplay().setCursor(120, y0 + 16);
|
||||||
|
getdisplay().print(env_module);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 32);
|
||||||
|
getdisplay().print("Buzzer:");
|
||||||
|
getdisplay().setCursor(120, y0 + 32);
|
||||||
|
getdisplay().print(buzzer_mode);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 64);
|
||||||
|
getdisplay().print("GPS:");
|
||||||
|
getdisplay().setCursor(120, y0 + 64);
|
||||||
|
getdisplay().print(gps_module);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 80);
|
||||||
|
getdisplay().print("RTC:");
|
||||||
|
getdisplay().setCursor(120, y0 + 80);
|
||||||
|
getdisplay().print(rtc_module);
|
||||||
|
|
||||||
|
getdisplay().setCursor(x0, y0 + 96);
|
||||||
|
getdisplay().print("Wifi:");
|
||||||
|
getdisplay().setCursor(120, y0 + 96);
|
||||||
|
getdisplay().print(commonData->status.wifiApOn ? "on" : "off");
|
||||||
|
|
||||||
|
// Home location
|
||||||
|
getdisplay().setCursor(x0, y0 + 128);
|
||||||
|
getdisplay().print("Home Lat.:");
|
||||||
|
getdisplay().setCursor(120, y0 + 128);
|
||||||
|
getdisplay().print(formatLatitude(homelat));
|
||||||
|
getdisplay().setCursor(x0, y0 + 144);
|
||||||
|
getdisplay().print("Home Lon.:");
|
||||||
|
getdisplay().setCursor(120, y0 + 144);
|
||||||
|
getdisplay().print(formatLongitude(homelon));
|
||||||
|
|
||||||
|
// right column
|
||||||
|
getdisplay().setCursor(202, y0);
|
||||||
|
getdisplay().print("Batt. sensor:");
|
||||||
|
getdisplay().setCursor(320, y0);
|
||||||
|
getdisplay().print(batt_sensor);
|
||||||
|
|
||||||
|
// Solar sensor
|
||||||
|
getdisplay().setCursor(202, y0 + 16);
|
||||||
|
getdisplay().print("Solar sensor:");
|
||||||
|
getdisplay().setCursor(320, y0 + 16);
|
||||||
|
getdisplay().print(solar_sensor);
|
||||||
|
|
||||||
|
// Generator sensor
|
||||||
|
getdisplay().setCursor(202, y0 + 32);
|
||||||
|
getdisplay().print("Gen. sensor:");
|
||||||
|
getdisplay().setCursor(320, y0 + 32);
|
||||||
|
getdisplay().print(gen_sensor);
|
||||||
|
|
||||||
|
// Gyro sensor
|
||||||
|
|
||||||
|
} else if (mode == 'C') {
|
||||||
|
// Card info
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(8, 48);
|
||||||
|
getdisplay().print("SD Card info");
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
|
||||||
|
x0 = 20;
|
||||||
|
y0 = 72;
|
||||||
|
getdisplay().setCursor(x0, y0);
|
||||||
|
#ifdef BOARD_OBP60S3
|
||||||
|
// This mode should not be callable by devices without card hardware
|
||||||
|
// In case of accidential reaching this, display a friendly message
|
||||||
|
getdisplay().print("This mode is not indended to be reached!\n");
|
||||||
|
getdisplay().print("There's nothing to see here. Move on.");
|
||||||
|
#endif
|
||||||
|
#ifdef BOARD_OBP40S3
|
||||||
|
getdisplay().print("Work in progress...");
|
||||||
|
|
||||||
|
/* TODO
|
||||||
|
this code should go somewhere else. only for testing purposes here
|
||||||
|
identify card as OBP-Card:
|
||||||
|
magic.dat
|
||||||
|
version.dat
|
||||||
|
readme.txt
|
||||||
|
IMAGES/
|
||||||
|
CHARTS/
|
||||||
|
LOGS/
|
||||||
|
DATA/
|
||||||
|
hint: file access with fopen, fgets, fread, fclose
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Simple test for magic file in root
|
||||||
|
getdisplay().setCursor(x0, y0 + 32);
|
||||||
|
String file_magic = MOUNT_POINT "/magic.dat";
|
||||||
|
logger->logDebug(GwLog::LOG, "Test magicfile: %s", file_magic.c_str());
|
||||||
|
struct stat st;
|
||||||
|
if (stat(file_magic.c_str(), &st) == 0) {
|
||||||
|
getdisplay().printf("File %s exists", file_magic.c_str());
|
||||||
|
} else {
|
||||||
|
getdisplay().printf("File %s not found", file_magic.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root directory check
|
||||||
|
DIR* dir = opendir(MOUNT_POINT);
|
||||||
|
int dy = 0;
|
||||||
|
if (dir != NULL) {
|
||||||
|
logger->logDebug(GwLog::LOG, "Root directory: %s", MOUNT_POINT);
|
||||||
|
struct dirent* entry;
|
||||||
|
while (((entry = readdir(dir)) != NULL) and (dy < 140)) {
|
||||||
|
getdisplay().setCursor(x0, y0 + 64 + dy);
|
||||||
|
getdisplay().print(entry->d_name);
|
||||||
|
// type 1 is file, type 2 is dir
|
||||||
|
if (entry->d_type == 2) {
|
||||||
|
getdisplay().print("/");
|
||||||
|
}
|
||||||
|
dy += 20;
|
||||||
|
logger->logDebug(GwLog::DEBUG, " %s type %d", entry->d_name, entry->d_type);
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
} else {
|
||||||
|
logger->logDebug(GwLog::LOG, "Failed to open root directory");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// NMEA2000 device list
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold12pt8b);
|
||||||
|
getdisplay().setCursor(8, 48);
|
||||||
|
getdisplay().print("NMEA2000 device list");
|
||||||
|
|
||||||
|
getdisplay().setFont(&Ubuntu_Bold8pt8b);
|
||||||
|
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
|
// Update display
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
|
|
||||||
#include "Pagedata.h"
|
#include "Pagedata.h"
|
||||||
@@ -7,20 +6,16 @@
|
|||||||
|
|
||||||
class PageVoltage : public Page
|
class PageVoltage : public Page
|
||||||
{
|
{
|
||||||
private:
|
bool init = false; // Marker for init done
|
||||||
bool init = false; // Marker for init done
|
uint8_t average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
||||||
uint8_t average = 0; // Average type [0...3], 0=off, 1=10s, 2=60s, 3=300s
|
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
||||||
bool trend = true; // Trend indicator [0|1], 0=off, 1=on
|
double raw = 0;
|
||||||
double raw = 0;
|
char mode = 'D'; // display mode (A)nalog | (D)igital
|
||||||
char mode = 'D'; // display mode (A)nalog | (D)igital
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PageVoltage(CommonData &common){
|
PageVoltage(CommonData &common){
|
||||||
commonData = &common;
|
commonData = &common;
|
||||||
config = commonData->config;
|
common.logger->logDebug(GwLog::LOG,"Instantiate PageVoltage");
|
||||||
logger = commonData->logger;
|
|
||||||
|
|
||||||
logger->logDebug(GwLog::LOG,"Instantiate PageVoltage");
|
|
||||||
if (hasFRAM) {
|
if (hasFRAM) {
|
||||||
average = fram.read(FRAM_VOLTAGE_AVG);
|
average = fram.read(FRAM_VOLTAGE_AVG);
|
||||||
trend = fram.read(FRAM_VOLTAGE_TREND);
|
trend = fram.read(FRAM_VOLTAGE_TREND);
|
||||||
@@ -28,10 +23,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~PageVoltage(){
|
|
||||||
logger->logDebug(GwLog::LOG,"Destroy PageVoltage");
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void setupKeys(){
|
virtual void setupKeys(){
|
||||||
Page::setupKeys();
|
Page::setupKeys();
|
||||||
commonData->keydata[0].label = "AVG";
|
commonData->keydata[0].label = "AVG";
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "GwApi.h"
|
#include "GwApi.h"
|
||||||
@@ -100,10 +98,6 @@ typedef struct{
|
|||||||
uint8_t length_sec; // seconds until alarm disappeares without user interaction
|
uint8_t length_sec; // seconds until alarm disappeares without user interaction
|
||||||
} AlarmData;
|
} AlarmData;
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
int voltage = 0;
|
|
||||||
} AvgData;
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
GwApi::Status status;
|
GwApi::Status status;
|
||||||
GwLog *logger=NULL;
|
GwLog *logger=NULL;
|
||||||
@@ -113,7 +107,6 @@ typedef struct{
|
|||||||
TouchKeyData keydata[6];
|
TouchKeyData keydata[6];
|
||||||
BacklightData backlight;
|
BacklightData backlight;
|
||||||
AlarmData alarm;
|
AlarmData alarm;
|
||||||
AvgData avgdata;
|
|
||||||
GwApi::BoatValue *time=NULL;
|
GwApi::BoatValue *time=NULL;
|
||||||
GwApi::BoatValue *date=NULL;
|
GwApi::BoatValue *date=NULL;
|
||||||
uint16_t fgcolor;
|
uint16_t fgcolor;
|
||||||
@@ -124,11 +117,9 @@ typedef struct{
|
|||||||
|
|
||||||
//a base class that all pages must inherit from
|
//a base class that all pages must inherit from
|
||||||
class Page{
|
class Page{
|
||||||
protected:
|
protected:
|
||||||
CommonData *commonData;
|
CommonData *commonData;
|
||||||
GwConfigHandler *config;
|
public:
|
||||||
GwLog *logger;
|
|
||||||
public:
|
|
||||||
int refreshtime = 1000;
|
int refreshtime = 1000;
|
||||||
virtual int displayPage(PageData &pageData)=0;
|
virtual int displayPage(PageData &pageData)=0;
|
||||||
virtual void displayNew(PageData &pageData){}
|
virtual void displayNew(PageData &pageData){}
|
||||||
|
|||||||
@@ -75,20 +75,6 @@
|
|||||||
"obp60":"true"
|
"obp60":"true"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "chainLength",
|
|
||||||
"label": "Anchor Chain Length [m]",
|
|
||||||
"type": "number",
|
|
||||||
"default": "0",
|
|
||||||
"check": "checkMinMax",
|
|
||||||
"min": 0,
|
|
||||||
"max": 255,
|
|
||||||
"description": "The length of the anchor chain [0...255m]",
|
|
||||||
"category": "OBP60 Settings",
|
|
||||||
"capabilities": {
|
|
||||||
"obp60":"true"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "fuelTank",
|
"name": "fuelTank",
|
||||||
"label": "Fuel Tank [l]",
|
"label": "Fuel Tank [l]",
|
||||||
@@ -1146,21 +1132,6 @@
|
|||||||
"obp60":"true"
|
"obp60":"true"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "headerFormat",
|
|
||||||
"label": "Header Format",
|
|
||||||
"type": "list",
|
|
||||||
"default":"TEXT",
|
|
||||||
"description": "Header format: Text or Symbols",
|
|
||||||
"list": [
|
|
||||||
{"l":"Text","v":"TEXT"},
|
|
||||||
{"l":"Symbols","v":"ICON"}
|
|
||||||
],
|
|
||||||
"category":"OBP60 Pages",
|
|
||||||
"capabilities": {
|
|
||||||
"obp60":"true"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "backlight",
|
"name": "backlight",
|
||||||
"label": "Backlight Mode",
|
"label": "Backlight Mode",
|
||||||
@@ -1347,7 +1318,6 @@
|
|||||||
"default": "Voltage",
|
"default": "Voltage",
|
||||||
"description": "Type of page for page 1",
|
"description": "Type of page for page 1",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1363,7 +1333,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -1630,7 +1599,6 @@
|
|||||||
"default": "WindRose",
|
"default": "WindRose",
|
||||||
"description": "Type of page for page 2",
|
"description": "Type of page for page 2",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1646,7 +1614,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -1910,7 +1877,6 @@
|
|||||||
"default": "OneValue",
|
"default": "OneValue",
|
||||||
"description": "Type of page for page 3",
|
"description": "Type of page for page 3",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1926,7 +1892,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2187,7 +2152,6 @@
|
|||||||
"default": "TwoValues",
|
"default": "TwoValues",
|
||||||
"description": "Type of page for page 4",
|
"description": "Type of page for page 4",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2203,7 +2167,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2461,7 +2424,6 @@
|
|||||||
"default": "ThreeValues",
|
"default": "ThreeValues",
|
||||||
"description": "Type of page for page 5",
|
"description": "Type of page for page 5",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2477,7 +2439,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2732,7 +2693,6 @@
|
|||||||
"default": "FourValues",
|
"default": "FourValues",
|
||||||
"description": "Type of page for page 6",
|
"description": "Type of page for page 6",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2748,7 +2708,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3000,7 +2959,6 @@
|
|||||||
"default": "FourValues2",
|
"default": "FourValues2",
|
||||||
"description": "Type of page for page 7",
|
"description": "Type of page for page 7",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3016,7 +2974,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3265,7 +3222,6 @@
|
|||||||
"default": "Clock",
|
"default": "Clock",
|
||||||
"description": "Type of page for page 8",
|
"description": "Type of page for page 8",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3281,7 +3237,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3527,7 +3482,6 @@
|
|||||||
"default": "RollPitch",
|
"default": "RollPitch",
|
||||||
"description": "Type of page for page 9",
|
"description": "Type of page for page 9",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3543,7 +3497,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3786,7 +3739,6 @@
|
|||||||
"default": "Battery2",
|
"default": "Battery2",
|
||||||
"description": "Type of page for page 10",
|
"description": "Type of page for page 10",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3802,7 +3754,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
|
|||||||
@@ -75,20 +75,6 @@
|
|||||||
"obp40": "true"
|
"obp40": "true"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "chainLength",
|
|
||||||
"label": "Anchor Chain Length [m]",
|
|
||||||
"type": "number",
|
|
||||||
"default": "0",
|
|
||||||
"check": "checkMinMax",
|
|
||||||
"min": 0,
|
|
||||||
"max": 255,
|
|
||||||
"description": "The length of the anchor chain [0...255m]",
|
|
||||||
"category": "OBP40 Settings",
|
|
||||||
"capabilities": {
|
|
||||||
"obp40":"true"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "fuelTank",
|
"name": "fuelTank",
|
||||||
"label": "Fuel Tank [l]",
|
"label": "Fuel Tank [l]",
|
||||||
@@ -362,7 +348,7 @@
|
|||||||
"label": "RTC Modul",
|
"label": "RTC Modul",
|
||||||
"type": "list",
|
"type": "list",
|
||||||
"default": "off",
|
"default": "off",
|
||||||
"description": "Use RTC module type [off|DS1388]",
|
"description": "Use internal RTC module type [off|DS1388]",
|
||||||
"list": [
|
"list": [
|
||||||
"off",
|
"off",
|
||||||
"DS1388"
|
"DS1388"
|
||||||
@@ -1158,21 +1144,6 @@
|
|||||||
"obp40":"true"
|
"obp40":"true"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "headerFormat",
|
|
||||||
"label": "Header Format",
|
|
||||||
"type": "list",
|
|
||||||
"default":"TEXT",
|
|
||||||
"description": "Header format: Text or Symbols",
|
|
||||||
"list": [
|
|
||||||
{"l":"Text","v":"TEXT"},
|
|
||||||
{"l":"Symbols","v":"ICON"}
|
|
||||||
],
|
|
||||||
"category":"OBP40 Display",
|
|
||||||
"capabilities": {
|
|
||||||
"obp40":"true"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "backlight",
|
"name": "backlight",
|
||||||
"label": "Backlight Mode",
|
"label": "Backlight Mode",
|
||||||
@@ -1370,7 +1341,6 @@
|
|||||||
"default": "Clock",
|
"default": "Clock",
|
||||||
"description": "Type of page for page 1",
|
"description": "Type of page for page 1",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1386,7 +1356,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -1653,7 +1622,6 @@
|
|||||||
"default": "Wind",
|
"default": "Wind",
|
||||||
"description": "Type of page for page 2",
|
"description": "Type of page for page 2",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1669,7 +1637,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -1933,7 +1900,6 @@
|
|||||||
"default": "OneValue",
|
"default": "OneValue",
|
||||||
"description": "Type of page for page 3",
|
"description": "Type of page for page 3",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -1949,7 +1915,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2210,7 +2175,6 @@
|
|||||||
"default": "TwoValues",
|
"default": "TwoValues",
|
||||||
"description": "Type of page for page 4",
|
"description": "Type of page for page 4",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2226,7 +2190,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2484,7 +2447,6 @@
|
|||||||
"default": "ThreeValues",
|
"default": "ThreeValues",
|
||||||
"description": "Type of page for page 5",
|
"description": "Type of page for page 5",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2500,7 +2462,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -2755,7 +2716,6 @@
|
|||||||
"default": "FourValues",
|
"default": "FourValues",
|
||||||
"description": "Type of page for page 6",
|
"description": "Type of page for page 6",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -2771,7 +2731,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3023,7 +2982,6 @@
|
|||||||
"default": "FourValues2",
|
"default": "FourValues2",
|
||||||
"description": "Type of page for page 7",
|
"description": "Type of page for page 7",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3039,7 +2997,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3288,7 +3245,6 @@
|
|||||||
"default": "Fluid",
|
"default": "Fluid",
|
||||||
"description": "Type of page for page 8",
|
"description": "Type of page for page 8",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3304,7 +3260,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3550,7 +3505,6 @@
|
|||||||
"default": "RollPitch",
|
"default": "RollPitch",
|
||||||
"description": "Type of page for page 9",
|
"description": "Type of page for page 9",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3566,7 +3520,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
@@ -3809,7 +3762,6 @@
|
|||||||
"default": "Battery2",
|
"default": "Battery2",
|
||||||
"description": "Type of page for page 10",
|
"description": "Type of page for page 10",
|
||||||
"list": [
|
"list": [
|
||||||
"Anchor",
|
|
||||||
"BME280",
|
"BME280",
|
||||||
"Battery",
|
"Battery",
|
||||||
"Battery2",
|
"Battery2",
|
||||||
@@ -3825,7 +3777,6 @@
|
|||||||
"RollPitch",
|
"RollPitch",
|
||||||
"RudderPosition",
|
"RudderPosition",
|
||||||
"SixValues",
|
"SixValues",
|
||||||
"SkyView",
|
|
||||||
"Solar",
|
"Solar",
|
||||||
"ThreeValues",
|
"ThreeValues",
|
||||||
"TwoValues",
|
"TwoValues",
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
#if defined BOARD_OBP60S3 || defined BOARD_OBP40S3
|
||||||
#include "obp60task.h"
|
#include "obp60task.h"
|
||||||
#include "Pagedata.h" // Data exchange for pages
|
#include "Pagedata.h" // Data exchange for pages
|
||||||
@@ -19,8 +18,6 @@
|
|||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
#include "driver/rtc_io.h" // Needs for weakup from deep sleep
|
||||||
#include <FS.h> // SD-Card access
|
|
||||||
#include <SD.h>
|
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -35,7 +32,6 @@
|
|||||||
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
#include "OBP60QRWiFi.h" // Functions lib for WiFi QR code
|
||||||
#include "OBPSensorTask.h" // Functions lib for sensor data
|
#include "OBPSensorTask.h" // Functions lib for sensor data
|
||||||
|
|
||||||
|
|
||||||
// Global vars
|
// Global vars
|
||||||
bool initComplete = false; // Initialization complete
|
bool initComplete = false; // Initialization complete
|
||||||
int taskRunCounter = 0; // Task couter for loop section
|
int taskRunCounter = 0; // Task couter for loop section
|
||||||
@@ -48,45 +44,23 @@ void OBP60Init(GwApi *api){
|
|||||||
GwConfigHandler *config = api->getConfig();
|
GwConfigHandler *config = api->getConfig();
|
||||||
|
|
||||||
// Set a new device name and hidden the original name in the main config
|
// Set a new device name and hidden the original name in the main config
|
||||||
String devicename = api->getConfig()->getConfigItem(api->getConfig()->deviceName,true)->asString();
|
String devicename = config->getConfigItem(config->deviceName, true)->asString();
|
||||||
api->getConfig()->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
config->setValue(GwConfigDefinitions::systemName, devicename, GwConfigInterface::ConfigType::HIDDEN);
|
||||||
|
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"obp60init running");
|
logger->prefix = devicename + ":";
|
||||||
|
logger->logDebug(GwLog::LOG,"obp60init running");
|
||||||
|
|
||||||
// Check I2C devices
|
// Check I2C devices
|
||||||
|
|
||||||
|
// Init power
|
||||||
|
String powermode = config->getConfigItem(config->powerMode,true)->asString();
|
||||||
|
logger->logDebug(GwLog::DEBUG, "Power Mode is: %s", powermode.c_str());
|
||||||
|
powerInit(powermode);
|
||||||
|
|
||||||
// Init hardware
|
// Init hardware
|
||||||
hardwareInit(api);
|
hardwareInit(api);
|
||||||
|
|
||||||
// Init power
|
#ifdef BOARD_OBP40S3
|
||||||
String powermode = api->getConfig()->getConfigItem(api->getConfig()->powerMode,true)->asString();
|
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Power Mode is: %s", powermode.c_str());
|
|
||||||
powerInit(powermode);
|
|
||||||
|
|
||||||
#ifdef BOARD_OBP40S3
|
|
||||||
bool sdcard = config->getBool(config->useSDCard);
|
|
||||||
if (sdcard) {
|
|
||||||
SPIClass SD_SPI = SPIClass(HSPI);
|
|
||||||
SD_SPI.begin(SD_SPI_CLK, SD_SPI_MISO, SD_SPI_MOSI);
|
|
||||||
if (SD.begin(SD_SPI_CS, SD_SPI, 80000000)) {
|
|
||||||
String sdtype = "unknown";
|
|
||||||
uint8_t cardType = SD.cardType();
|
|
||||||
switch (cardType) {
|
|
||||||
case CARD_MMC:
|
|
||||||
sdtype = "MMC";
|
|
||||||
break;
|
|
||||||
case CARD_SD:
|
|
||||||
sdtype = "SDSC";
|
|
||||||
break;
|
|
||||||
case CARD_SDHC:
|
|
||||||
sdtype = "SDHC";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
uint64_t cardSize = SD.cardSize() / (1024 * 1024);
|
|
||||||
LOG_DEBUG(GwLog::LOG,"SD card type %s of size %d MB detected", sdtype, cardSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deep sleep wakeup configuration
|
// Deep sleep wakeup configuration
|
||||||
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
esp_sleep_enable_ext0_wakeup(OBP_WAKEWUP_PIN, 0); // 1 = High, 0 = Low
|
||||||
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
rtc_gpio_pullup_en(OBP_WAKEWUP_PIN); // Activate pullup resistor
|
||||||
@@ -95,7 +69,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings for e-paper display
|
// Settings for e-paper display
|
||||||
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Fast Refresh Mode is: %s", fastrefresh.c_str());
|
logger->logDebug(GwLog::DEBUG, "Fast Refresh Mode is: %s", fastrefresh.c_str());
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
if(fastrefresh == "true"){
|
if(fastrefresh == "true"){
|
||||||
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
static const bool useFastFullUpdate = true; // Enable fast full display update only for GDEY042T81
|
||||||
@@ -114,11 +88,11 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Get CPU speed
|
// Get CPU speed
|
||||||
int freq = getCpuFrequencyMhz();
|
int freq = getCpuFrequencyMhz();
|
||||||
api->getLogger()->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
logger->logDebug(GwLog::LOG,"CPU speed at boot: %i MHz", freq);
|
||||||
|
|
||||||
// Settings for backlight
|
// Settings for backlight
|
||||||
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
String backlightMode = api->getConfig()->getConfigItem(api->getConfig()->backlight,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"Backlight Mode is: %s", backlightMode.c_str());
|
||||||
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
uint brightness = uint(api->getConfig()->getConfigItem(api->getConfig()->blBrightness,true)->asInt());
|
||||||
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
String backlightColor = api->getConfig()->getConfigItem(api->getConfig()->blColor,true)->asString();
|
||||||
if(String(backlightMode) == "On"){
|
if(String(backlightMode) == "On"){
|
||||||
@@ -133,7 +107,7 @@ void OBP60Init(GwApi *api){
|
|||||||
|
|
||||||
// Settings flash LED mode
|
// Settings flash LED mode
|
||||||
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
String ledMode = api->getConfig()->getConfigItem(api->getConfig()->flashLED,true)->asString();
|
||||||
api->getLogger()->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
logger->logDebug(GwLog::DEBUG,"LED Mode is: %s", ledMode.c_str());
|
||||||
if(String(ledMode) == "Off"){
|
if(String(ledMode) == "Off"){
|
||||||
setBlinkingLED(false);
|
setBlinkingLED(false);
|
||||||
}
|
}
|
||||||
@@ -265,7 +239,7 @@ void registerAllPages(PageList &list){
|
|||||||
extern PageDescription registerPageWindRose;
|
extern PageDescription registerPageWindRose;
|
||||||
list.add(®isterPageWindRose);
|
list.add(®isterPageWindRose);
|
||||||
extern PageDescription registerPageWindRoseFlex;
|
extern PageDescription registerPageWindRoseFlex;
|
||||||
list.add(®isterPageWindRoseFlex); //
|
list.add(®isterPageWindRoseFlex);
|
||||||
extern PageDescription registerPageVoltage;
|
extern PageDescription registerPageVoltage;
|
||||||
list.add(®isterPageVoltage);
|
list.add(®isterPageVoltage);
|
||||||
extern PageDescription registerPageDST810;
|
extern PageDescription registerPageDST810;
|
||||||
@@ -296,10 +270,6 @@ void registerAllPages(PageList &list){
|
|||||||
list.add(®isterPageXTETrack);
|
list.add(®isterPageXTETrack);
|
||||||
extern PageDescription registerPageFluid;
|
extern PageDescription registerPageFluid;
|
||||||
list.add(®isterPageFluid);
|
list.add(®isterPageFluid);
|
||||||
extern PageDescription registerPageSkyView;
|
|
||||||
list.add(®isterPageSkyView);
|
|
||||||
extern PageDescription registerPageAnchor;
|
|
||||||
list.add(®isterPageAnchor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Undervoltage detection for shutdown display
|
// Undervoltage detection for shutdown display
|
||||||
@@ -523,7 +493,6 @@ void OBP60Task(GwApi *api){
|
|||||||
String systemname = api->getConfig()->getConfigItem(api->getConfig()->systemName,true)->asString();
|
String systemname = api->getConfig()->getConfigItem(api->getConfig()->systemName,true)->asString();
|
||||||
String wifipass = api->getConfig()->getConfigItem(api->getConfig()->apPassword,true)->asString();
|
String wifipass = api->getConfig()->getConfigItem(api->getConfig()->apPassword,true)->asString();
|
||||||
bool refreshmode = api->getConfig()->getConfigItem(api->getConfig()->refresh,true)->asBoolean();
|
bool refreshmode = api->getConfig()->getConfigItem(api->getConfig()->refresh,true)->asBoolean();
|
||||||
bool symbolmode = (config->getString(config->headerFormat) == "ICON");
|
|
||||||
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
String fastrefresh = api->getConfig()->getConfigItem(api->getConfig()->fastRefresh,true)->asString();
|
||||||
uint fullrefreshtime = uint(api->getConfig()->getConfigItem(api->getConfig()->fullRefreshTime,true)->asInt());
|
uint fullrefreshtime = uint(api->getConfig()->getConfigItem(api->getConfig()->fullRefreshTime,true)->asInt());
|
||||||
#ifdef BOARD_OBP40S3
|
#ifdef BOARD_OBP40S3
|
||||||
@@ -879,6 +848,7 @@ void OBP60Task(GwApi *api){
|
|||||||
else{
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
#else
|
#else
|
||||||
getdisplay().init(115200); // Init for normal displays
|
getdisplay().init(115200); // Init for normal displays
|
||||||
@@ -906,6 +876,7 @@ void OBP60Task(GwApi *api){
|
|||||||
else{
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
#else
|
#else
|
||||||
getdisplay().init(115200); // Init for normal displays
|
getdisplay().init(115200); // Init for normal displays
|
||||||
@@ -930,6 +901,7 @@ void OBP60Task(GwApi *api){
|
|||||||
else{
|
else{
|
||||||
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
getdisplay().fillScreen(commonData.fgcolor); // Clear display
|
||||||
#ifdef DISPLAY_GDEY042T81
|
#ifdef DISPLAY_GDEY042T81
|
||||||
|
getdisplay().hibernate(); // Set display in hybenate mode
|
||||||
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
getdisplay().init(115200, true, 2, false); // Init for Waveshare boards with "clever" reset circuit, 2ms reset pulse
|
||||||
#else
|
#else
|
||||||
getdisplay().init(115200); // Init for normal displays
|
getdisplay().init(115200); // Init for normal displays
|
||||||
@@ -971,7 +943,7 @@ void OBP60Task(GwApi *api){
|
|||||||
// Show header if enabled
|
// Show header if enabled
|
||||||
if (pages[pageNumber].description && pages[pageNumber].description->header or systemPage){
|
if (pages[pageNumber].description && pages[pageNumber].description->header or systemPage){
|
||||||
// build header using commonData
|
// build header using commonData
|
||||||
displayHeader(commonData, symbolmode, date, time, hdop); // Show page header
|
displayHeader(commonData, date, time, hdop); // Show page header
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the particular page
|
// Call the particular page
|
||||||
|
|||||||
Reference in New Issue
Block a user