Add support for internal RTC and NTP for OBP40
This commit is contained in:
parent
e398c7bdce
commit
2a4c351c58
|
@ -423,19 +423,25 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
||||||
// Date and time
|
// Date and time
|
||||||
String fmttype = commonData.config->getString(commonData.config->dateFormat);
|
String fmttype = commonData.config->getString(commonData.config->dateFormat);
|
||||||
String timesource = commonData.config->getString(commonData.config->timeSource);
|
String timesource = commonData.config->getString(commonData.config->timeSource);
|
||||||
int tz = commonData.config->getInt(commonData.config->timeZone);
|
double tz = commonData.config->getString(commonData.config->timeZone).toDouble();
|
||||||
getdisplay().setTextColor(commonData.fgcolor);
|
getdisplay().setTextColor(commonData.fgcolor);
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
getdisplay().setCursor(230, 15);
|
getdisplay().setCursor(230, 15);
|
||||||
if (timesource == "RTC") {
|
if (timesource == "RTC" or timesource == "iRTC") {
|
||||||
time_t tv = mktime(&commonData.data.rtcTime) + tz * 3600;
|
// TODO take DST into account
|
||||||
struct tm *local_tm = localtime(&tv);
|
if (commonData.data.rtcValid) {
|
||||||
getdisplay().print(formatTime('m', local_tm->tm_hour, local_tm->tm_min, 0));
|
time_t tv = mktime(&commonData.data.rtcTime) + (int)(tz * 3600);
|
||||||
getdisplay().print(" ");
|
struct tm *local_tm = localtime(&tv);
|
||||||
getdisplay().print(formatDate(fmttype, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
getdisplay().print(formatTime('m', local_tm->tm_hour, local_tm->tm_min, 0));
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
|
getdisplay().print(formatDate(fmttype, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
||||||
|
getdisplay().print(" ");
|
||||||
|
getdisplay().print(tz == 0 ? "UTC" : "LOT");
|
||||||
|
} else {
|
||||||
|
getdisplay().print("RTC invalid");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else { // timesource == "GPS"
|
else if (timesource == "GPS") {
|
||||||
// Show date and time if date present
|
// Show date and time if date present
|
||||||
if(date->valid == true){
|
if(date->valid == true){
|
||||||
String acttime = formatValue(time, commonData).svalue;
|
String acttime = formatValue(time, commonData).svalue;
|
||||||
|
@ -445,6 +451,7 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
getdisplay().print(actdate);
|
getdisplay().print(actdate);
|
||||||
getdisplay().print(" ");
|
getdisplay().print(" ");
|
||||||
|
getdisplay().print(tz == 0 ? "UTC" : "LOT");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(commonData.config->getBool(commonData.config->useSimuData) == true){
|
if(commonData.config->getBool(commonData.config->useSimuData) == true){
|
||||||
|
@ -455,11 +462,8 @@ void displayHeader(CommonData &commonData, GwApi::BoatValue *date, GwApi::BoatVa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // timesource == "GPS"
|
} // timesource == "GPS"
|
||||||
if (tz == 0) {
|
|
||||||
getdisplay().print("UTC");
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
getdisplay().print("LOT");
|
getdisplay().print("No time source");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include "ObpNmea0183.h" // Check NMEA0183 sentence for uncorrect content
|
#include "ObpNmea0183.h" // Check NMEA0183 sentence for uncorrect content
|
||||||
#include "OBP60Extensions.h" // Lib for hardware extensions
|
#include "OBP60Extensions.h" // Lib for hardware extensions
|
||||||
#include "movingAvg.h" // Lib for moving average building
|
#include "movingAvg.h" // Lib for moving average building
|
||||||
|
#include "time.h" // For getting NTP time
|
||||||
|
#include <ESP32Time.h> // Internal ESP32 RTC clock
|
||||||
|
|
||||||
// Timer for hardware functions
|
// Timer for hardware functions
|
||||||
Ticker Timer1(blinkingFlashLED, 500); // Start Timer1 for flash LED all 500ms
|
Ticker Timer1(blinkingFlashLED, 500); // Start Timer1 for flash LED all 500ms
|
||||||
|
@ -150,6 +152,7 @@ void sensorTask(void *param){
|
||||||
// ds1388.adjust(DateTime(__DATE__, __TIME__)); // Set date and time from PC file time
|
// ds1388.adjust(DateTime(__DATE__, __TIME__)); // Set date and time from PC file time
|
||||||
}
|
}
|
||||||
RTC_ready = true;
|
RTC_ready = true;
|
||||||
|
sensors.rtcValid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,6 +369,28 @@ void sensorTask(void *param){
|
||||||
GwApi::BoatValue *hdop=new GwApi::BoatValue(GwBoatData::_HDOP);
|
GwApi::BoatValue *hdop=new GwApi::BoatValue(GwBoatData::_HDOP);
|
||||||
GwApi::BoatValue *valueList[]={gpsdays, gpsseconds, hdop};
|
GwApi::BoatValue *valueList[]={gpsdays, gpsseconds, hdop};
|
||||||
|
|
||||||
|
// Internal RTC with NTP init
|
||||||
|
ESP32Time rtc(0);
|
||||||
|
if (api->getConfig()->getString(api->getConfig()->timeSource) == "iRTC") {
|
||||||
|
GwApi::Status status;
|
||||||
|
api->getStatus(status);
|
||||||
|
if (status.wifiClientConnected) {
|
||||||
|
const char *ntpServer = api->getConfig()->getCString(api->getConfig()->timeServer);
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Fetching date and time from NTP server '%s'.", ntpServer);
|
||||||
|
configTime(0, 0, ntpServer); // get time in UTC
|
||||||
|
struct tm timeinfo;
|
||||||
|
if (getLocalTime(&timeinfo)) {
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"NTP time: %04d-%02d-%02d %02d:%02d:%02d UTC", timeinfo.tm_year+1900, timeinfo.tm_mon+1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
|
||||||
|
rtc.setTimeStruct(timeinfo);
|
||||||
|
sensors.rtcValid = true;
|
||||||
|
} else {
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"NTP time fetch failed!");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
api->getLogger()->logDebug(GwLog::LOG,"Wifi client not connected, NTP not available.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Sensor task loop runs with 100ms
|
// Sensor task loop runs with 100ms
|
||||||
//####################################################################################
|
//####################################################################################
|
||||||
|
|
||||||
|
@ -464,6 +489,9 @@ void sensorTask(void *param){
|
||||||
api->sendN2kMessage(N2kMsg);
|
api->sendN2kMessage(N2kMsg);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
} else if (sensors.rtcValid) {
|
||||||
|
// use internal rtc feature
|
||||||
|
sensors.rtcTime = rtc.getTimeStruct();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue1 = formatValue(bvalue1, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
String unit1 = formatValue(bvalue1, *commonData).unit; // Unit of value
|
||||||
if(valid1 == true){
|
if(valid1 == true){
|
||||||
svalue1old = svalue1; // Save old value
|
svalue1old = svalue1; // Save old value
|
||||||
unit1old = unit1; // Save old unit
|
unit1old = unit1; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue2 = formatValue(bvalue2, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
String unit2 = formatValue(bvalue2, *commonData).unit; // Unit of value
|
||||||
if(valid2 == true){
|
if(valid2 == true){
|
||||||
svalue2old = svalue2; // Save old value
|
svalue2old = svalue2; // Save old value
|
||||||
unit2old = unit2; // Save old unit
|
unit2old = unit2; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
String svalue3 = formatValue(bvalue3, *commonData).svalue; // Formatted value as string including unit conversion and switching decimal places
|
||||||
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
String unit3 = formatValue(bvalue3, *commonData).unit; // Unit of value
|
||||||
if(valid3 == true){
|
if(valid3 == true){
|
||||||
svalue3old = svalue3; // Save old value
|
svalue3old = svalue3; // Save old value
|
||||||
unit3old = unit3; // Save old unit
|
unit3old = unit3; // Save old unit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
// GPS value
|
// GPS value
|
||||||
getdisplay().print(svalue2);
|
getdisplay().print(svalue2);
|
||||||
} else {
|
} else if (commonData->data.rtcValid) {
|
||||||
// RTC value
|
// RTC value
|
||||||
if (tz == 'L') {
|
if (tz == 'L') {
|
||||||
getdisplay().print(formatDate(dateformat, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
getdisplay().print(formatDate(dateformat, local_tm->tm_year + 1900, local_tm->tm_mon + 1, local_tm->tm_mday));
|
||||||
|
@ -185,6 +185,8 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
else {
|
else {
|
||||||
getdisplay().print(formatDate(dateformat, commonData->data.rtcTime.tm_year + 1900, commonData->data.rtcTime.tm_mon + 1, commonData->data.rtcTime.tm_mday));
|
getdisplay().print(formatDate(dateformat, commonData->data.rtcTime.tm_year + 1900, commonData->data.rtcTime.tm_mon + 1, commonData->data.rtcTime.tm_mday));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
getdisplay().print("---");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
getdisplay().print(svalue2old);
|
getdisplay().print(svalue2old);
|
||||||
|
@ -203,13 +205,15 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
if (source == 'G') {
|
if (source == 'G') {
|
||||||
getdisplay().print(svalue1); // Value
|
getdisplay().print(svalue1); // Value
|
||||||
}
|
}
|
||||||
else {
|
else if (commonData->data.rtcValid) {
|
||||||
if (tz == 'L') {
|
if (tz == 'L') {
|
||||||
getdisplay().print(formatTime('s', local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec));
|
getdisplay().print(formatTime('s', local_tm->tm_hour, local_tm->tm_min, local_tm->tm_sec));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
getdisplay().print(formatTime('s', commonData->data.rtcTime.tm_hour, commonData->data.rtcTime.tm_min, commonData->data.rtcTime.tm_sec));
|
getdisplay().print(formatTime('s', commonData->data.rtcTime.tm_hour, commonData->data.rtcTime.tm_min, commonData->data.rtcTime.tm_sec));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
getdisplay().print("---");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -329,14 +333,10 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
getdisplay().setFont(&Ubuntu_Bold12pt7b);
|
||||||
getdisplay().setCursor(175, 110);
|
getdisplay().setCursor(175, 110);
|
||||||
if(holdvalues == false){
|
if(holdvalues == false){
|
||||||
if (tz == 'L') {
|
getdisplay().print(tz == 'L' ? "LOT" : "UTC");
|
||||||
getdisplay().print(unit2); // Unit
|
|
||||||
} else {
|
|
||||||
getdisplay().print("UTC");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
getdisplay().print(unit2old); // Unit
|
getdisplay().print(unit2old); // date unit
|
||||||
}
|
}
|
||||||
|
|
||||||
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
getdisplay().setFont(&Ubuntu_Bold8pt7b);
|
||||||
|
@ -378,7 +378,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
|
|
||||||
// Draw hour pointer
|
// Draw hour pointer
|
||||||
float startwidth = 8; // Start width of pointer
|
float startwidth = 8; // Start width of pointer
|
||||||
if(valid1 == true || holdvalues == true || simulation == true){
|
if(valid1 == true || commonData->data.rtcValid || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(hour * 30.0 * pi / 180); // Hour
|
float sinx=sin(hour * 30.0 * pi / 180); // Hour
|
||||||
float cosx=cos(hour * 30.0 * pi / 180);
|
float cosx=cos(hour * 30.0 * pi / 180);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
|
@ -404,7 +404,7 @@ double timezone = 0; // there are timezones with non int offsets, e.g. 5.5 or 5.
|
||||||
|
|
||||||
// Draw minute pointer
|
// Draw minute pointer
|
||||||
startwidth = 8; // Start width of pointer
|
startwidth = 8; // Start width of pointer
|
||||||
if(valid1 == true || holdvalues == true || simulation == true){
|
if(valid1 == true || commonData->data.rtcValid || holdvalues == true || simulation == true){
|
||||||
float sinx=sin(minute * 6.0 * pi / 180); // Minute
|
float sinx=sin(minute * 6.0 * pi / 180); // Minute
|
||||||
float cosx=cos(minute * 6.0 * pi / 180);
|
float cosx=cos(minute * 6.0 * pi / 180);
|
||||||
// Normal pointer
|
// Normal pointer
|
||||||
|
|
|
@ -46,6 +46,7 @@ typedef struct{
|
||||||
double rotationAngle = 0; // Rotation angle in radiant
|
double rotationAngle = 0; // Rotation angle in radiant
|
||||||
bool validRotAngle = false; // Valid flag magnet present for rotation sensor
|
bool validRotAngle = false; // Valid flag magnet present for rotation sensor
|
||||||
struct tm rtcTime; // UTC time from internal RTC
|
struct tm rtcTime; // UTC time from internal RTC
|
||||||
|
bool rtcValid = false;
|
||||||
int sunsetHour = 0;
|
int sunsetHour = 0;
|
||||||
int sunsetMinute = 0;
|
int sunsetMinute = 0;
|
||||||
int sunriseHour = 0;
|
int sunriseHour = 0;
|
||||||
|
|
|
@ -697,8 +697,8 @@
|
||||||
"default": "GPS",
|
"default": "GPS",
|
||||||
"description": "Data source for date and time display in status line [RTC|GPS]",
|
"description": "Data source for date and time display in status line [RTC|GPS]",
|
||||||
"list": [
|
"list": [
|
||||||
{"l":"Internal real time clock (RTC)","v":"RTC"},
|
{"l":"Real time clock (RTC)","v":"RTC"},
|
||||||
{"l":"External time via bus (GPS)","v":"GPS"}
|
{"l":"Time via bus (GPS)","v":"GPS"}
|
||||||
],
|
],
|
||||||
"category": "OBP60 Display",
|
"category": "OBP60 Display",
|
||||||
"capabilities": {
|
"capabilities": {
|
||||||
|
|
|
@ -8,6 +8,17 @@
|
||||||
"description": "system name, used for the access point and for services",
|
"description": "system name, used for the access point and for services",
|
||||||
"category": "system"
|
"category": "system"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "timeServer",
|
||||||
|
"label": "time server",
|
||||||
|
"type": "string",
|
||||||
|
"default": "pool.ntp.org",
|
||||||
|
"description": "NTP time server. Use only one hostname or IP address",
|
||||||
|
"category": "wifi client",
|
||||||
|
"capabilities": {
|
||||||
|
"obp40": "true"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "timeZone",
|
"name": "timeZone",
|
||||||
"label": "Time Zone",
|
"label": "Time Zone",
|
||||||
|
@ -710,9 +721,10 @@
|
||||||
"label": "Status Time Source",
|
"label": "Status Time Source",
|
||||||
"type": "list",
|
"type": "list",
|
||||||
"default": "GPS",
|
"default": "GPS",
|
||||||
"description": "Data source for date and time display in status line [RTC|GPS]",
|
"description": "Data source for date and time display in status line [RTC|iRTC|GPS]",
|
||||||
"list": [
|
"list": [
|
||||||
{"l":"Internal real time clock (RTC)","v":"RTC"},
|
{"l":"Internal real time clock (iRTC)","v":"iRTC"},
|
||||||
|
{"l":"External real time clock (RTC)","v":"RTC"},
|
||||||
{"l":"External time via bus (GPS)","v":"GPS"}
|
{"l":"External time via bus (GPS)","v":"GPS"}
|
||||||
],
|
],
|
||||||
"category": "OBP40 Display",
|
"category": "OBP40 Display",
|
||||||
|
|
|
@ -71,6 +71,7 @@ lib_deps =
|
||||||
Wire
|
Wire
|
||||||
SPI
|
SPI
|
||||||
SD
|
SD
|
||||||
|
ESP32time
|
||||||
esphome/AsyncTCP-esphome@2.0.1
|
esphome/AsyncTCP-esphome@2.0.1
|
||||||
robtillaart/PCF8574@0.3.9
|
robtillaart/PCF8574@0.3.9
|
||||||
adafruit/Adafruit Unified Sensor @ 1.1.13
|
adafruit/Adafruit Unified Sensor @ 1.1.13
|
||||||
|
|
Loading…
Reference in New Issue