@@ -1,26 +1,55 @@ | |||||
#include "Gps.h" | #include "Gps.h" | ||||
#include "Debug.h" | #include "Debug.h" | ||||
#include "Hardware.h" | #include "Hardware.h" | ||||
#include "MainUnit.h" | |||||
#define LOGGER_NAME "Gps" | #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 { | namespace gps { | ||||
char lastPosition[GPS_POSITION_SIZE]; | char lastPosition[GPS_POSITION_SIZE]; | ||||
SIM808_GPS_STATUS lastStatus; | SIM808_GPS_STATUS lastStatus; | ||||
SIM808_GPS_STATUS acquireCurrentPosition() { | |||||
SIM808_GPS_STATUS acquireCurrentPosition(uint16_t timeout) { | |||||
SIM808_GPS_STATUS currentStatus = SIM808_GPS_STATUS::OFF; | 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) { | if (currentStatus > SIM808_GPS_STATUS::NO_FIX) { | ||||
lastStatus = currentStatus; | lastStatus = currentStatus; | ||||
hardware::sim808::device.getGpsPosition(lastPosition); | |||||
} | } | ||||
return currentStatus; | 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 powerOn() { hardware::sim808::gpsPowerOn(); } | ||||
inline void powerOff() { hardware::sim808::gpsPowerOff(); } | 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() { | void loop() { | ||||
gps::powerOn(); | gps::powerOn(); | ||||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(); | |||||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(30000); | |||||
gps::powerOff(); | gps::powerOff(); | ||||
if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | 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::powerOn(); | ||||
rtc::setTime(time); | rtc::setTime(time); | ||||
rtc::powerOff(); | rtc::powerOff(); | ||||
@@ -10,31 +10,24 @@ namespace rtc { | |||||
namespace details { | 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 | RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF | ||||
} | } | ||||
timestamp_t getTime() { | |||||
void getTime(tmElements_t &time) { | |||||
RTC.readTime(); | RTC.readTime(); | ||||
return details::readTimeFromRegisters(); | |||||
details::readTimeFromRegisters(time); | |||||
} | } | ||||
void setTime(timestamp_t &time) { | |||||
void setTime(tmElements_t &time) { | |||||
details::writeTimeToRegisters(time); | details::writeTimeToRegisters(time); | ||||
RTC.writeTime(); | RTC.writeTime(); | ||||
} | } | ||||
void setAlarm(timestamp_t &time) { | |||||
void setAlarm(tmElements_t &time) { | |||||
details::writeTimeToRegisters(time); | details::writeTimeToRegisters(time); | ||||
RTC.writeAlarm1(DS3231_ALM_S); | RTC.writeAlarm1(DS3231_ALM_S); | ||||
@@ -14,12 +14,14 @@ namespace rtc { | |||||
void setup(); | 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) { | 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 */ | /* Low level system time functions */ | ||||
//TODO : + and - operator between tmElements_t and timestamp_t |