@@ -1,26 +1,55 @@ | |||
#include "Gps.h" | |||
#include "Debug.h" | |||
#include "Hardware.h" | |||
#include "MainUnit.h" | |||
#define LOGGER_NAME "Gps" | |||
#define WAIT_FOR_FIX_DELAY 10000 | |||
#define TIME_YEAR_OFFSET 0 | |||
#define TIME_MONTH_OFFSET 4 | |||
#define TIME_DAY_OFFSET 6 | |||
#define TIME_HOUR_OFFSET 8 | |||
#define TIME_MINUTE_OFFSET 10 | |||
#define TIME_SECOND_OFFSET 12 | |||
#define STRTOUL_SUBSTRING(dst, src, size) strtoul(strncpy(dst, src , size), NULL, 2); | |||
namespace gps { | |||
char lastPosition[GPS_POSITION_SIZE]; | |||
SIM808_GPS_STATUS lastStatus; | |||
SIM808_GPS_STATUS acquireCurrentPosition() { | |||
SIM808_GPS_STATUS acquireCurrentPosition(uint16_t timeout) { | |||
SIM808_GPS_STATUS currentStatus = SIM808_GPS_STATUS::OFF; | |||
//TODO : do while (!timeout && < accurate_fix) | |||
do { | |||
currentStatus = hardware::sim808::device.getGpsStatus(); | |||
if (currentStatus > SIM808_GPS_STATUS::NO_FIX) break; | |||
mainunit::deepSleep(WAIT_FOR_FIX_DELAY); | |||
timeout -= WAIT_FOR_FIX_DELAY; | |||
} while (timeout > 1); | |||
if (currentStatus > SIM808_GPS_STATUS::NO_FIX) { | |||
lastStatus = currentStatus; | |||
hardware::sim808::device.getGpsPosition(lastPosition); | |||
} | |||
return currentStatus; | |||
} | |||
timestamp_t getTime() { | |||
void getTime(tmElements_t &time) { | |||
char *timeStr; | |||
char buffer[4]; | |||
hardware::sim808::device.getGpsField(lastPosition, SIM808_GPS_FIELD::UTC, timeStr); | |||
time.Year = STRTOUL_SUBSTRING(buffer, timeStr + TIME_YEAR_OFFSET, 4); | |||
time.Month = STRTOUL_SUBSTRING(buffer, timeStr + TIME_MONTH_OFFSET, 2); | |||
time.Day = STRTOUL_SUBSTRING(buffer, timeStr + TIME_DAY_OFFSET, 2); | |||
time.Hour = STRTOUL_SUBSTRING(buffer, timeStr + TIME_HOUR_OFFSET, 2); | |||
time.Minute = STRTOUL_SUBSTRING(buffer, timeStr + TIME_MINUTE_OFFSET, 2); | |||
time.Second = STRTOUL_SUBSTRING(buffer, timeStr + TIME_SECOND_OFFSET, 2); | |||
} | |||
} |
@@ -15,7 +15,7 @@ namespace gps { | |||
inline void powerOn() { hardware::sim808::gpsPowerOn(); } | |||
inline void powerOff() { hardware::sim808::gpsPowerOff(); } | |||
SIM808_GPS_STATUS acquireCurrentPosition(); | |||
timestamp_t getTime(); | |||
SIM808_GPS_STATUS acquireCurrentPosition(uint16_t timeout); | |||
void getTime(tmElements_t &time); | |||
} |
@@ -17,13 +17,12 @@ void setup() { | |||
void loop() { | |||
gps::powerOn(); | |||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(); | |||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(30000); | |||
gps::powerOff(); | |||
if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | |||
timestamp_t time = gps::getTime(); | |||
tmElements_t t; | |||
breakTime(time, t); | |||
tmElements_t time; | |||
gps::getTime(time); | |||
rtc::powerOn(); | |||
rtc::setTime(time); | |||
rtc::powerOff(); | |||
@@ -10,31 +10,24 @@ namespace rtc { | |||
namespace details { | |||
timestamp_t readTimeFromRegisters() { | |||
tmElements_t tmElements = { | |||
RTC.s, | |||
RTC.m, | |||
RTC.h, | |||
RTC.dow, | |||
RTC.dd, | |||
RTC.mm, | |||
CalendarYrToTm(RTC.yyyy) | |||
}; | |||
return makeTime(tmElements); | |||
void readTimeFromRegisters(tmElements_t &time) { | |||
time.Second = RTC.s; | |||
time.Minute = RTC.m; | |||
time.Hour = RTC.h; | |||
time.Wday = RTC.dow; | |||
time.Day = RTC.dd; | |||
time.Month = RTC.mm; | |||
time.Year = CalendarYrToTm(RTC.yyyy); | |||
} | |||
void writeTimeToRegisters(timestamp_t &time) { | |||
tmElements_t tmElements; | |||
breakTime(time, tmElements); | |||
RTC.s = tmElements.Second; | |||
RTC.m = tmElements.Minute; | |||
RTC.h = tmElements.Hour; | |||
RTC.dow = tmElements.Wday; | |||
RTC.dd = tmElements.Day; | |||
RTC.mm = tmElements.Month; | |||
RTC.yyyy = tmYearToCalendar(tmElements.Year); | |||
void writeTimeToRegisters(tmElements_t &time) { | |||
RTC.s = time.Second; | |||
RTC.m = time.Minute; | |||
RTC.h = time.Hour; | |||
RTC.dow = time.Wday; | |||
RTC.dd = time.Day; | |||
RTC.mm = time.Month; | |||
RTC.yyyy = tmYearToCalendar(time.Year); | |||
} | |||
} | |||
@@ -44,17 +37,17 @@ namespace rtc { | |||
RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF | |||
} | |||
timestamp_t getTime() { | |||
void getTime(tmElements_t &time) { | |||
RTC.readTime(); | |||
return details::readTimeFromRegisters(); | |||
details::readTimeFromRegisters(time); | |||
} | |||
void setTime(timestamp_t &time) { | |||
void setTime(tmElements_t &time) { | |||
details::writeTimeToRegisters(time); | |||
RTC.writeTime(); | |||
} | |||
void setAlarm(timestamp_t &time) { | |||
void setAlarm(tmElements_t &time) { | |||
details::writeTimeToRegisters(time); | |||
RTC.writeAlarm1(DS3231_ALM_S); | |||
@@ -14,12 +14,14 @@ namespace rtc { | |||
void setup(); | |||
timestamp_t getTime(); | |||
void setTime(timestamp_t &time); | |||
void getTime(tmElements_t &time); | |||
void setTime(tmElements_t &time); | |||
inline void setAlarm(uint16_t seconds) { | |||
setAlarm(getTime() + seconds); | |||
tmElements_t time; | |||
getTime(time); | |||
setAlarm(makeTime(time) + seconds); //TODO : use operator | |||
} | |||
void setAlarm(timestamp_t &time); | |||
void setAlarm(tmElements_t &time); | |||
} |
@@ -128,3 +128,5 @@ timestamp_t makeTime(tmElements_t &tm) { | |||
} | |||
/*=====================================================*/ | |||
/* Low level system time functions */ | |||
//TODO : + and - operator between tmElements_t and timestamp_t |