* Code refactoring for GPS to RTC clock
* Enabled GPS adjust RTC option for Horus * Moved sensor ID to the right to allow display of GPS date/time in Telemetry screen
This commit is contained in:
@@ -75,6 +75,7 @@ enum MenuModelTelemetryFrskyItems {
|
|||||||
#define TELEM_COL2 200
|
#define TELEM_COL2 200
|
||||||
#define TELEM_COL3 275
|
#define TELEM_COL3 275
|
||||||
#define TELEM_COL4 350
|
#define TELEM_COL4 350
|
||||||
|
#define TELEM_COL5 425
|
||||||
|
|
||||||
#define IF_FAS_OFFSET(x) x,
|
#define IF_FAS_OFFSET(x) x,
|
||||||
#define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0)
|
#define IS_RANGE_DEFINED(k) (g_model.frsky.channels[k].ratio > 0)
|
||||||
@@ -443,11 +444,11 @@ bool menuModelTelemetryFrsky(event_t event)
|
|||||||
// Spektrum does not (yet?) really support multiple sensor of the same type. But a lot of
|
// Spektrum does not (yet?) really support multiple sensor of the same type. But a lot of
|
||||||
// different sensor display the same information (e.g. voltage, capacity). Show the id
|
// different sensor display the same information (e.g. voltage, capacity). Show the id
|
||||||
// of the sensor in the overview to ease figuring out what sensors belong together
|
// of the sensor in the overview to ease figuring out what sensors belong together
|
||||||
lcdDrawHexNumber(TELEM_COL4, y, sensor->id, LEFT);
|
lcdDrawHexNumber(TELEM_COL5, y, sensor->id, LEFT);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
if (sensor->type == TELEM_TYPE_CUSTOM && !g_model.ignoreSensorIds) {
|
if (sensor->type == TELEM_TYPE_CUSTOM && !g_model.ignoreSensorIds) {
|
||||||
lcdDrawNumber(TELEM_COL4, y, sensor->instance, LEFT);
|
lcdDrawNumber(TELEM_COL5, y, sensor->instance, LEFT);
|
||||||
}
|
}
|
||||||
if (attr) {
|
if (attr) {
|
||||||
s_editMode = 0;
|
s_editMode = 0;
|
||||||
@@ -477,7 +478,7 @@ bool menuModelTelemetryFrsky(event_t event)
|
|||||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TELEMETRY_SENSORS);
|
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TELEMETRY_SENSORS);
|
||||||
lcdDrawText(TELEM_COL2, y, STR_VALUE, 0);
|
lcdDrawText(TELEM_COL2, y, STR_VALUE, 0);
|
||||||
if (!g_model.ignoreSensorIds && !IS_SPEKTRUM_PROTOCOL()) {
|
if (!g_model.ignoreSensorIds && !IS_SPEKTRUM_PROTOCOL()) {
|
||||||
lcdDrawText(TELEM_COL4, y, STR_ID, 0);
|
lcdDrawText(TELEM_COL5, y, STR_ID, 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ enum menuRadioSetupItems {
|
|||||||
// CASE_SPLASH_PARAM(ITEM_SETUP_DISABLE_SPLASH)
|
// CASE_SPLASH_PARAM(ITEM_SETUP_DISABLE_SPLASH)
|
||||||
CASE_GPS(ITEM_SETUP_LABEL_GPS)
|
CASE_GPS(ITEM_SETUP_LABEL_GPS)
|
||||||
CASE_GPS(ITEM_SETUP_TIMEZONE)
|
CASE_GPS(ITEM_SETUP_TIMEZONE)
|
||||||
|
CASE_GPS(ITEM_SETUP_ADJUST_RTC)
|
||||||
CASE_GPS(ITEM_SETUP_GPSFORMAT)
|
CASE_GPS(ITEM_SETUP_GPSFORMAT)
|
||||||
CASE_PXX(ITEM_SETUP_COUNTRYCODE)
|
CASE_PXX(ITEM_SETUP_COUNTRYCODE)
|
||||||
ITEM_SETUP_LANGUAGE,
|
ITEM_SETUP_LANGUAGE,
|
||||||
@@ -417,6 +418,11 @@ bool menuRadioSetup(event_t event)
|
|||||||
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12);
|
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ITEM_SETUP_ADJUST_RTC:
|
||||||
|
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ADJUST_RTC);
|
||||||
|
g_eeGeneral.adjustRTC = editCheckBox(g_eeGeneral.adjustRTC, RADIO_SETUP_2ND_COLUMN, y, attr, event ) ;
|
||||||
|
break;
|
||||||
|
|
||||||
case ITEM_SETUP_GPSFORMAT:
|
case ITEM_SETUP_GPSFORMAT:
|
||||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_GPSCOORD);
|
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_GPSCOORD);
|
||||||
g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event);
|
g_eeGeneral.gpsFormat = editChoice(RADIO_SETUP_2ND_COLUMN, y, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event);
|
||||||
|
|||||||
@@ -486,3 +486,38 @@ void gettime(struct gtm * tm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define RTC_ADJUST_PERIOD 60 // how often RTC is checked for accuracy [seconds]
|
||||||
|
#define RTC_ADJUST_TRESHOLD 20 // how much clock must differ before adjustment is made [seconds]
|
||||||
|
/*
|
||||||
|
Changes RTC date/time to the given date/time if:
|
||||||
|
* RTC_ADJUST_PERIOD seconds have elapsed from the last time this function adjusted the RTC clock
|
||||||
|
* AND if actual RTC clock differs from the given clock by more than RTC_ADJUST_TRESHOLD seconds
|
||||||
|
* Function does nothing for a minute around midnight, where date change could produce erroneous result
|
||||||
|
*/
|
||||||
|
uint8_t rtcAdjust(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec)
|
||||||
|
{
|
||||||
|
static tmr10ms_t lastRtcAdjust = 0;
|
||||||
|
if ((get_tmr10ms()-lastRtcAdjust) > (RTC_ADJUST_PERIOD*100)) {
|
||||||
|
lastRtcAdjust = get_tmr10ms();
|
||||||
|
|
||||||
|
struct gtm t;
|
||||||
|
gettime(&t);
|
||||||
|
if ((hour == 0 && min == 0) || (hour == 23 && min == 59)) return 0;
|
||||||
|
|
||||||
|
if (t.tm_year != (year-1900) || t.tm_mon != (mon-1) || t.tm_mday != day ||
|
||||||
|
(abs((t.tm_hour-hour)*3600 + (t.tm_min-min)*60 + (t.tm_sec-sec)) > RTC_ADJUST_TRESHOLD)) {
|
||||||
|
// we adjust RTC only if difference is > 20 seconds
|
||||||
|
t.tm_year = year - 1900;
|
||||||
|
t.tm_mon = mon - 1;
|
||||||
|
t.tm_mday = day;
|
||||||
|
t.tm_hour = hour;
|
||||||
|
t.tm_min = min;
|
||||||
|
t.tm_sec = sec;
|
||||||
|
g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated
|
||||||
|
rtcSetTime(&t);
|
||||||
|
TRACE("RTC clock adjusted to %04d-%02d-%02d %02d:%02d:%02d", year, mon, day, hour, min, sec);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
+26
-25
@@ -1,25 +1,25 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) OpenTX
|
* Copyright (C) OpenTX
|
||||||
*
|
*
|
||||||
* Based on code named
|
* Based on code named
|
||||||
* th9x - http://code.google.com/p/th9x
|
* th9x - http://code.google.com/p/th9x
|
||||||
* er9x - http://code.google.com/p/er9x
|
* er9x - http://code.google.com/p/er9x
|
||||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||||
*
|
*
|
||||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _RTC_H_
|
#ifndef _RTC_H_
|
||||||
#define _RTC_H_
|
#define _RTC_H_
|
||||||
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
@@ -44,15 +44,16 @@ extern gtime_t g_rtcTime;
|
|||||||
extern uint8_t g_ms100; // global to allow time set function to reset to zero
|
extern uint8_t g_ms100; // global to allow time set function to reset to zero
|
||||||
|
|
||||||
void rtcInit();
|
void rtcInit();
|
||||||
|
void rtcSetTime(const struct gtm * tm);
|
||||||
|
gtime_t gmktime (struct gtm *tm);
|
||||||
|
uint8_t rtcAdjust(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec);
|
||||||
|
|
||||||
#if defined(__cplusplus) && !defined(SIMU)
|
#if defined(__cplusplus) && !defined(SIMU)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void rtcSetTime(struct gtm * tm);
|
|
||||||
void gettime(struct gtm * tm);
|
void gettime(struct gtm * tm);
|
||||||
gtime_t gmktime (struct gtm *tm);
|
|
||||||
#if defined(__cplusplus) && !defined(SIMU)
|
#if defined(__cplusplus) && !defined(SIMU)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // _RTC_H_
|
#endif // _RTC_H_
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
#include "opentx.h"
|
#include "opentx.h"
|
||||||
|
|
||||||
void rtcSetTime(struct gtm * t)
|
void rtcSetTime(const struct gtm * t)
|
||||||
{
|
{
|
||||||
RTC_TimeTypeDef RTC_TimeStruct;
|
RTC_TimeTypeDef RTC_TimeStruct;
|
||||||
RTC_DateTypeDef RTC_DateStruct;
|
RTC_DateTypeDef RTC_DateStruct;
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ void rtcGetTime(struct gtm * utm)
|
|||||||
utm->tm_wday = rtc.wday - 1;
|
utm->tm_wday = rtc.wday - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtcSetTime(struct gtm * t)
|
void rtcSetTime(const struct gtm * t)
|
||||||
{
|
{
|
||||||
g_rtcTime = gmktime(t); // update local timestamp and get wday calculated
|
g_rtcTime = gmktime(t); // update local timestamp and get wday calculated
|
||||||
g_ms100 = 0; // start of next second begins now
|
g_ms100 = 0; // start of next second begins now
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ struct t_i2cTime
|
|||||||
uint8_t Time[7] ;
|
uint8_t Time[7] ;
|
||||||
} I2CTime ;
|
} I2CTime ;
|
||||||
|
|
||||||
void rtcSetTime(struct gtm * t)
|
void rtcSetTime(const struct gtm * t)
|
||||||
{
|
{
|
||||||
g_rtcTime = gmktime(t); // update local timestamp and get wday calculated
|
g_rtcTime = gmktime(t); // update local timestamp and get wday calculated
|
||||||
g_ms100 = 0; // start of next second begins now
|
g_ms100 = 0; // start of next second begins now
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ void writeRtc(gtm* ptr)
|
|||||||
i2cWriteBuffer(DS3231_I2C_ADDR, read_buffer, 1, buffer, 7);
|
i2cWriteBuffer(DS3231_I2C_ADDR, read_buffer, 1, buffer, 7);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtcSetTime(struct gtm * t)
|
void rtcSetTime(const struct gtm * t)
|
||||||
{
|
{
|
||||||
writeRtc(t);
|
writeRtc(t);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,22 +76,12 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
|
|||||||
else if (unit == UNIT_DATETIME) {
|
else if (unit == UNIT_DATETIME) {
|
||||||
uint32_t data = uint32_t(newVal);
|
uint32_t data = uint32_t(newVal);
|
||||||
if (data & 0x000000ff) {
|
if (data & 0x000000ff) {
|
||||||
datetime.year = (uint16_t) ((data & 0xff000000) >> 24);
|
datetime.year = (uint16_t) ((data & 0xff000000) >> 24) + 2000;
|
||||||
datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16);
|
datetime.month = (uint8_t) ((data & 0x00ff0000) >> 16);
|
||||||
datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8);
|
datetime.day = (uint8_t) ((data & 0x0000ff00) >> 8);
|
||||||
if (datetime.year != 0) {
|
if (datetime.year != 0) {
|
||||||
datetime.datestate = 1;
|
datetime.datestate = 1;
|
||||||
}
|
}
|
||||||
#if defined(RTCLOCK)
|
|
||||||
if (g_eeGeneral.adjustRTC && (datetime.datestate == 1)) {
|
|
||||||
struct gtm t;
|
|
||||||
gettime(&t);
|
|
||||||
t.tm_year = datetime.year+4;
|
|
||||||
t.tm_mon = datetime.month-1;
|
|
||||||
t.tm_mday = datetime.day;
|
|
||||||
rtcSetTime(&t);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24;
|
datetime.hour = ((uint8_t) ((data & 0xff000000) >> 24) + g_eeGeneral.timezone + 24) % 24;
|
||||||
@@ -102,16 +92,7 @@ void TelemetryItem::setValue(const TelemetrySensor & sensor, int32_t val, uint32
|
|||||||
}
|
}
|
||||||
#if defined(RTCLOCK)
|
#if defined(RTCLOCK)
|
||||||
if (g_eeGeneral.adjustRTC && datetime.datestate == 1) {
|
if (g_eeGeneral.adjustRTC && datetime.datestate == 1) {
|
||||||
struct gtm t;
|
rtcAdjust(datetime.year, datetime.month, datetime.day, datetime.hour, datetime.min, datetime.sec);
|
||||||
gettime(&t);
|
|
||||||
if (abs((t.tm_hour-datetime.hour)*3600 + (t.tm_min-datetime.min)*60 + (t.tm_sec-datetime.sec)) > 20) {
|
|
||||||
// we adjust RTC only if difference is > 20 seconds
|
|
||||||
t.tm_hour = datetime.hour;
|
|
||||||
t.tm_min = datetime.min;
|
|
||||||
t.tm_sec = datetime.sec;
|
|
||||||
g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated
|
|
||||||
rtcSetTime(&t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user