@@ -1,22 +1,23 @@ | |||||
{ | |||||
"configurations": [ | |||||
{ | |||||
"name": "Win32", | |||||
"includePath": [ | |||||
"${workspaceFolder}/src/**", | |||||
"${workspaceFolder}/../libraries/SIM808", | |||||
"${workspaceFolder}/../libraries/uDS3231", | |||||
"${workspaceFolder}/../libraries/E24", | |||||
"${workspaceFolder}/../libraries/Low-Power", | |||||
"${workspaceFolder}/../libraries/ArduinoLog", | |||||
"${config:arduino.path}/tools/**", | |||||
"${config:arduino.path}/hardware/arduino/avr/**", | |||||
"${config:arduino.path}/hardware/tools/avr/avr/include/**" | |||||
], | |||||
"intelliSenseMode": "clang-x64", | |||||
"cStandard": "c11", | |||||
"cppStandard": "c++11" | |||||
} | |||||
], | |||||
"version": 4 | |||||
{ | |||||
"configurations": [ | |||||
{ | |||||
"name": "Win32", | |||||
"includePath": [ | |||||
"${workspaceFolder}/src/**", | |||||
"${workspaceFolder}/../libraries/SIM808", | |||||
"${workspaceFolder}/../libraries/MD_DS3231", | |||||
"${workspaceFolder}/../libraries/uDS3231", | |||||
"${workspaceFolder}/../libraries/E24", | |||||
"${workspaceFolder}/../libraries/Low-Power", | |||||
"${workspaceFolder}/../libraries/ArduinoLog", | |||||
"${config:arduino.path}/tools/**", | |||||
"${config:arduino.path}/hardware/arduino/avr/**", | |||||
"${config:arduino.path}/hardware/tools/avr/avr/include/**" | |||||
], | |||||
"intelliSenseMode": "clang-x64", | |||||
"cStandard": "c11", | |||||
"cppStandard": "c++11" | |||||
} | |||||
], | |||||
"version": 4 | |||||
} | } |
@@ -6,9 +6,6 @@ | |||||
{ | { | ||||
"path": "../libraries/SIM808" | "path": "../libraries/SIM808" | ||||
}, | }, | ||||
{ | |||||
"path": "../libraries/uDS3231" | |||||
}, | |||||
{ | { | ||||
"path": "../libraries/E24" | "path": "../libraries/E24" | ||||
}, | }, | ||||
@@ -17,6 +14,12 @@ | |||||
}, | }, | ||||
{ | { | ||||
"path": "../libraries/ArduinoLog" | "path": "../libraries/ArduinoLog" | ||||
}, | |||||
{ | |||||
"path": "C:/Users/bertr/Documents/Projects/Development/Arduino/libraries/MD_DS3231" | |||||
}, | |||||
{ | |||||
"path": "C:/Users/bertr/Documents/Projects/Development/Arduino/libraries/uDS3231" | |||||
} | } | ||||
], | ], | ||||
"settings": { | "settings": { | ||||
@@ -139,7 +139,7 @@ namespace core { | |||||
tmElements_t time; | tmElements_t time; | ||||
rtc::getTime(time); | rtc::getTime(time); | ||||
currentTime = SLEEP_TIMING_TIME(time.Hour, time.Minute); | |||||
currentTime = SLEEP_TIMING_TIME(time.hour, time.minute); | |||||
} | } | ||||
for (uint8_t i = flash::getArraySize(config::defaultSleepTimings); i--;) { | for (uint8_t i = flash::getArraySize(config::defaultSleepTimings); i--;) { | ||||
@@ -197,7 +197,7 @@ namespace debug { | |||||
tmElements_t time; | tmElements_t time; | ||||
rtc::getTime(time); | rtc::getTime(time); | ||||
NOTICE_FORMAT("getAndDisplayRtcTime", "%d/%d/%d %d:%d:%d %t %d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second, rtc::isAccurate(), rtc::getTemperature()); | |||||
NOTICE_FORMAT("getAndDisplayRtcTime", "%d/%d/%d %d:%d:%d %t %d", time.year, time.month, time.day, time.hour, time.minute, time.second, rtc::isAccurate(), rtc::getTemperature()); | |||||
} | } | ||||
void setRtcTime() { | void setRtcTime() { | ||||
@@ -19,9 +19,9 @@ | |||||
namespace gps { | namespace gps { | ||||
namespace details { | namespace details { | ||||
uint8_t parseSubstring(char *buffer, char *start, uint8_t size) { | |||||
uint16_t parseSubstring(char *buffer, char *start, uint8_t size) { | |||||
strlcpy(buffer, start, size + 1); | strlcpy(buffer, start, size + 1); | ||||
return static_cast<uint8_t>(strtoul(buffer, NULL, 10)); | |||||
return static_cast<uint16_t>(strtoul(buffer, NULL, 10)); | |||||
} | } | ||||
} | } | ||||
@@ -105,13 +105,13 @@ namespace gps { | |||||
VERBOSE_FORMAT("getTime", "%s", timeStr); | VERBOSE_FORMAT("getTime", "%s", timeStr); | ||||
time.Year = CalendarYrToTm(details::parseSubstring(buffer, timeStr + TIME_YEAR_OFFSET, 4)); | |||||
time.Month = details::parseSubstring(buffer, timeStr + TIME_MONTH_OFFSET, 2); | |||||
time.Day = details::parseSubstring(buffer, timeStr + TIME_DAY_OFFSET, 2); | |||||
time.Hour = details::parseSubstring(buffer, timeStr + TIME_HOUR_OFFSET, 2); | |||||
time.Minute = details::parseSubstring(buffer, timeStr + TIME_MINUTE_OFFSET, 2); | |||||
time.Second = details::parseSubstring(buffer, timeStr + TIME_SECOND_OFFSET, 2); | |||||
time.year = details::parseSubstring(buffer, timeStr + TIME_YEAR_OFFSET, 4); | |||||
time.month = details::parseSubstring(buffer, timeStr + TIME_MONTH_OFFSET, 2); | |||||
time.day = details::parseSubstring(buffer, timeStr + TIME_DAY_OFFSET, 2); | |||||
time.hour = details::parseSubstring(buffer, timeStr + TIME_HOUR_OFFSET, 2); | |||||
time.minute = details::parseSubstring(buffer, timeStr + TIME_MINUTE_OFFSET, 2); | |||||
time.second = details::parseSubstring(buffer, timeStr + TIME_SECOND_OFFSET, 2); | |||||
NOTICE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); | |||||
NOTICE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", time.year, time.month, time.day, time.hour, time.minute, time.second); | |||||
} | } | ||||
} | } |
@@ -20,7 +20,7 @@ namespace mainunit { | |||||
void wokeUp() { | void wokeUp() { | ||||
tmElements_t wokeUpTime; | tmElements_t wokeUpTime; | ||||
rtc::getTime(wokeUpTime); | rtc::getTime(wokeUpTime); | ||||
VERBOSE_FORMAT("wokeUp", "%d:%d:%d", wokeUpTime.Hour, wokeUpTime.Minute, wokeUpTime.Second); | |||||
VERBOSE_FORMAT("wokeUp", "%d:%d:%d", wokeUpTime.hour, wokeUpTime.minute, wokeUpTime.second); | |||||
hardware::sim808::simSerial.listen(); | hardware::sim808::simSerial.listen(); | ||||
} | } | ||||
@@ -4,26 +4,26 @@ | |||||
#include "Logging.h" | #include "Logging.h" | ||||
#include <Wire.h> | #include <Wire.h> | ||||
#include <uDS3231.h> | |||||
#define LOGGER_NAME "Rtc" | #define LOGGER_NAME "Rtc" | ||||
using namespace utils; | using namespace utils; | ||||
namespace rtc { | namespace rtc { | ||||
RTC_A_CLASS RTC_A; | |||||
void setup() { | void setup() { | ||||
VERBOSE("setup"); | VERBOSE("setup"); | ||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock | |||||
RTC.control(DS3231_A1_INT_ENABLE, DS3231_OFF); //Alarm 1 OFF | |||||
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
RTC_A.control(DS3231_12H, DS3231_OFF); //24 hours clock | |||||
RTC_A.control(DS3231_A1_INT_ENABLE, DS3231_OFF); //Alarm 1 OFF | |||||
RTC_A.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
} | } | ||||
int16_t getTemperature() { | int16_t getTemperature() { | ||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
float temperature = RTC.readTempRegister(); | |||||
float temperature = RTC_A.readTempRegister(); | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
return static_cast<int16_t>(temperature * 100); | return static_cast<int16_t>(temperature * 100); | ||||
@@ -31,7 +31,7 @@ namespace rtc { | |||||
bool isAccurate() { | bool isAccurate() { | ||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
bool accurate = RTC.status(DS3231_HALTED_FLAG) == DS3231_OFF; | |||||
bool accurate = RTC_A.status(DS3231_HALTED_FLAG) == DS3231_OFF; | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
return accurate; | return accurate; | ||||
@@ -45,18 +45,18 @@ namespace rtc { | |||||
void getTime(tmElements_t &time) { | void getTime(tmElements_t &time) { | ||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
RTC.readTime(time); | |||||
RTC_A.readTime(time); | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); | |||||
VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", time.year, time.month, time.day, time.hour, time.minute, time.second); | |||||
} | } | ||||
void setTime(const tmElements_t &time) { | void setTime(const tmElements_t &time) { | ||||
VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second); | |||||
VERBOSE_FORMAT("setTime", "%d/%d/%d %d:%d:%d", time.year, time.month, time.day, time.hour, time.minute, time.second); | |||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
RTC.writeTime(time); | |||||
RTC.control(DS3231_HALTED_FLAG, DS3231_OFF); | |||||
RTC_A.writeTime(time); | |||||
RTC_A.control(DS3231_HALTED_FLAG, DS3231_OFF); | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
} | } | ||||
@@ -72,13 +72,13 @@ namespace rtc { | |||||
void setAlarm(const tmElements_t &time) { | void setAlarm(const tmElements_t &time) { | ||||
hardware::i2c::powerOn(); | hardware::i2c::powerOn(); | ||||
RTC.writeAlarm1(DS3231_ALM_HMS, time); | |||||
WRITE_ALARM_1(time); | |||||
RTC.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag | |||||
RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON | |||||
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
RTC_A.control(DS3231_A1_FLAG, DS3231_OFF); //reset Alarm 1 flag | |||||
RTC_A.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON | |||||
RTC_A.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
NOTICE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.Hour, time.Minute, time.Second); | |||||
NOTICE_FORMAT("setAlarm", "Next alarm : %d:%d:%d", time.hour, time.minute, time.second); | |||||
hardware::i2c::powerOff(); | hardware::i2c::powerOff(); | ||||
} | } | ||||
@@ -0,0 +1,47 @@ | |||||
#include "RtcAbstraction.h" | |||||
#ifndef USE_UDS3231 | |||||
void MD_DS3231_Ext::unpack(tmElements_t &time) { | |||||
time.second = MD_DS3231::s; | |||||
time.minute = MD_DS3231::m; | |||||
time.hour = MD_DS3231::h; | |||||
time.day = MD_DS3231::dd; | |||||
time.month = MD_DS3231::mm; | |||||
time.year = MD_DS3231::yyyy; | |||||
} | |||||
void MD_DS3231_Ext::pack(const tmElements_t &time) { | |||||
MD_DS3231::s = time.second; | |||||
MD_DS3231::m = time.minute; | |||||
MD_DS3231::h = time.hour; | |||||
MD_DS3231::dd = time.day; | |||||
MD_DS3231::mm = time.month; | |||||
MD_DS3231::yyyy = time.year; | |||||
} | |||||
boolean MD_DS3231_Ext::readTime(tmElements_t &time) { | |||||
bool result = MD_DS3231::readTime(); | |||||
unpack(time); | |||||
return result; | |||||
} | |||||
boolean MD_DS3231_Ext::writeTime(const tmElements_t &time) { | |||||
pack(time); | |||||
return MD_DS3231::writeTime(); | |||||
} | |||||
boolean MD_DS3231_Ext::readAlarm1(almType_t &almType, tmElements_t &time) { | |||||
almType = MD_DS3231::getAlarm1Type(); | |||||
bool result = MD_DS3231::readAlarm1(); | |||||
return result; | |||||
} | |||||
boolean MD_DS3231_Ext::writeAlarm1(almType_t almType, const tmElements_t &time) { | |||||
pack(time); | |||||
return MD_DS3231::writeAlarm1(almType); | |||||
} | |||||
#endif |
@@ -0,0 +1,42 @@ | |||||
#pragma once | |||||
/** | |||||
* \def USE_UDS3231 | |||||
* When defined, use the modified uDS3231 library instead of | |||||
* the stock MD_DS3231 one. | |||||
*/ | |||||
// #define USE_UDS3231 | |||||
#ifdef USE_UDS3231 | |||||
#include <uDS3231.h> | |||||
#define RTC_A_CLASS uDS3231 | |||||
#define WRITE_ALARM_1(t) RTC_A.writeAlarm1(DS3231_ALM_HMS, t) | |||||
#else | |||||
#include <MD_DS3231.h> | |||||
typedef struct tmElements_t { | |||||
uint8_t second = 0; | |||||
uint8_t minute = 0; | |||||
uint8_t hour = 0; | |||||
uint8_t day = 0; | |||||
uint8_t month = 0; | |||||
uint16_t year = 0; // year from 2000 | |||||
}; | |||||
class MD_DS3231_Ext : public MD_DS3231 | |||||
{ | |||||
private: | |||||
void unpack(tmElements_t &time); | |||||
void pack(const tmElements_t &time); | |||||
public: | |||||
boolean readTime(tmElements_t &time); | |||||
boolean writeTime(const tmElements_t &time); | |||||
boolean readAlarm1(almType_t &almType, tmElements_t &time); | |||||
boolean writeAlarm1(almType_t almType, const tmElements_t &time); | |||||
}; | |||||
#define RTC_A_CLASS MD_DS3231_Ext | |||||
#define WRITE_ALARM_1(t) RTC_A.writeAlarm1(DS3231_ALM_HMS, t) | |||||
#endif |
@@ -1,47 +1,47 @@ | |||||
#include "Time2.h" | |||||
/*==============================================================================*/ | |||||
/* Useful Constants */ | |||||
#define SECS_PER_MIN (60UL) | |||||
#define SECS_PER_HOUR (3600UL) | |||||
#define SECS_PER_DAY (SECS_PER_HOUR * 24UL) | |||||
#define DAYS_PER_WEEK (7UL) | |||||
#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK) | |||||
#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) | |||||
#define SECS_YR_2000 (946684800UL) // the time at the start of y2k | |||||
/*==============================================================================*/ | |||||
/* Utility functions */ | |||||
namespace utils { | |||||
namespace time { | |||||
__attribute__((__optimize__("O2"))) | |||||
timestamp_t makeTimestamp(const tmElements_t &time) { | |||||
timestamp_t timestamp; | |||||
timestamp += (time.Day - 1) * SECS_PER_DAY; | |||||
timestamp += time.Hour * SECS_PER_HOUR; | |||||
timestamp += time.Minute * SECS_PER_MIN; | |||||
timestamp += time.Second; | |||||
return timestamp; | |||||
} | |||||
__attribute__((__optimize__("O2"))) | |||||
void breakTime(timestamp_t timestamp, tmElements_t &time) { | |||||
time.Year = 0; | |||||
time.Month = 0; | |||||
time.Day = 0; | |||||
time.Second = timestamp % 60; | |||||
timestamp /= 60; // now it is minutes | |||||
time.Minute = timestamp % 60; | |||||
timestamp /= 60; // now it is hours | |||||
time.Hour = timestamp % 24; | |||||
timestamp /= 24; // now it is days | |||||
time.Day = timestamp; //this is purely for indication / computation only as it might get over the number of days in a month | |||||
} | |||||
} | |||||
#include "Time2.h" | |||||
/*==============================================================================*/ | |||||
/* Useful Constants */ | |||||
#define SECS_PER_MIN (60UL) | |||||
#define SECS_PER_HOUR (3600UL) | |||||
#define SECS_PER_DAY (SECS_PER_HOUR * 24UL) | |||||
#define DAYS_PER_WEEK (7UL) | |||||
#define SECS_PER_WEEK (SECS_PER_DAY * DAYS_PER_WEEK) | |||||
#define SECS_PER_YEAR (SECS_PER_WEEK * 52UL) | |||||
#define SECS_YR_2000 (946684800UL) // the time at the start of y2k | |||||
/*==============================================================================*/ | |||||
/* Utility functions */ | |||||
namespace utils { | |||||
namespace time { | |||||
__attribute__((__optimize__("O2"))) | |||||
timestamp_t makeTimestamp(const tmElements_t &time) { | |||||
timestamp_t timestamp; | |||||
timestamp += (time.day - 1) * SECS_PER_DAY; | |||||
timestamp += time.hour * SECS_PER_HOUR; | |||||
timestamp += time.minute * SECS_PER_MIN; | |||||
timestamp += time.second; | |||||
return timestamp; | |||||
} | |||||
__attribute__((__optimize__("O2"))) | |||||
void breakTime(timestamp_t timestamp, tmElements_t &time) { | |||||
time.year = 0; | |||||
time.month = 0; | |||||
time.day = 0; | |||||
time.second = timestamp % 60; | |||||
timestamp /= 60; // now it is minutes | |||||
time.minute = timestamp % 60; | |||||
timestamp /= 60; // now it is hours | |||||
time.hour = timestamp % 24; | |||||
timestamp /= 24; // now it is days | |||||
time.day = timestamp; //this is purely for indication / computation only as it might get over the number of days in a month | |||||
} | |||||
} | |||||
} | } |
@@ -1,7 +1,9 @@ | |||||
#pragma once | #pragma once | ||||
#include <Arduino.h> | #include <Arduino.h> | ||||
#include <uDS3231.h> | |||||
#include "RtcAbstraction.h" | |||||
typedef unsigned long timestamp_t; | |||||
namespace utils { | namespace utils { | ||||
namespace time { | namespace time { | ||||
@@ -20,7 +20,7 @@ | |||||
\def VERSION | \def VERSION | ||||
Version string, only used for indicative purpose | Version string, only used for indicative purpose | ||||
*/ | */ | ||||
#define VERSION "1.22" | |||||
#define VERSION "1.30" | |||||
/** | /** | ||||