@@ -1,9 +1,13 @@ | |||||
#include "Gps.h" | #include "Gps.h" | ||||
#include "Debug.h" | |||||
#define LOGGER_NAME "Gps" | #define LOGGER_NAME "Gps" | ||||
namespace gps { | namespace gps { | ||||
char lastPosition[GPS_POSITION_SIZE]; | |||||
SIM808_GPS_STATUS lastStatus; | |||||
void powerOn() { | void powerOn() { | ||||
} | } | ||||
@@ -23,7 +27,7 @@ namespace gps { | |||||
return currentStatus; | return currentStatus; | ||||
} | } | ||||
Time getTime() { | |||||
time_t getTime() { | |||||
} | } | ||||
} | } |
@@ -1,18 +1,20 @@ | |||||
#pragma once | #pragma once | ||||
#include "Time.h" | |||||
#include <TimeLib.h> | |||||
#include <Time.h> | |||||
#include <SIM808.h> | |||||
#define GPS_POSITION_SIZE 128 | #define GPS_POSITION_SIZE 128 | ||||
namespace gps { | namespace gps { | ||||
char lastPosition[GPS_POSITION_SIZE]; | |||||
SIM808_GPS_STATUS lastStatus; | |||||
extern char lastPosition[GPS_POSITION_SIZE]; | |||||
extern SIM808_GPS_STATUS lastStatus; | |||||
void powerOn(); | void powerOn(); | ||||
void powerOff(); | void powerOff(); | ||||
SIM808_GPS_STATUS acquireCurrentPosition(); | SIM808_GPS_STATUS acquireCurrentPosition(); | ||||
Time getTime(); | |||||
time_t getTime(); | |||||
} | } |
@@ -3,26 +3,20 @@ | |||||
#include <Arduino.h> | #include <Arduino.h> | ||||
#include <SoftwareSerial.h> | #include <SoftwareSerial.h> | ||||
#include <SIM808.h> | #include <SIM808.h> | ||||
#include <TimeLib.h> | |||||
#include <Time.h> | |||||
#include "Debug.h" | #include "Debug.h" | ||||
#include "Core.h" | #include "Core.h" | ||||
#include "posmgr.h" | |||||
#include "Gps.h" | #include "Gps.h" | ||||
#include "posmgr.h" | |||||
#include "MainUnit.h" | |||||
#include "Network.h" | #include "Network.h" | ||||
#include "Rtc.h" | #include "Rtc.h" | ||||
#include "Storage.h" | |||||
#include "Utils.h" | |||||
#include "Pins.h" | |||||
#include "Positions.h" | |||||
#define LOGGER_NAME "GpsTracker" | |||||
#define SIM_RX 5 | |||||
#define SIM_TX 6 | |||||
#define SIM_PWR 9 | |||||
#define SIM_STATUS 8 | |||||
#define RTC_PWR A0 | |||||
#define EEPROM_PWR A0 | |||||
#define SD_SS SS | |||||
#define SIM_RI 2 | |||||
#define RTC_WAKE 3 | |||||
#define LOGGER_NAME "GpsTracker" |
@@ -21,9 +21,17 @@ void loop() { | |||||
gps::powerOff(); | gps::powerOff(); | ||||
if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | ||||
Time time = utils::parseTime(); | |||||
time_t time = gps::getTime(); | |||||
rtc::powerOn(); | rtc::powerOn(); | ||||
rtc::setTime(time); | rtc::setTime(time); | ||||
rtc::powerOff(); | rtc::powerOff(); | ||||
positions::appendLast(); | |||||
} | |||||
if (positions::needsToSend()) { | |||||
positions::send(); | |||||
} | } | ||||
mainunit::deepSleep(10); | |||||
} | } |
@@ -0,0 +1,26 @@ | |||||
#include "MainUnit.h" | |||||
#include "Rtc.h" | |||||
#include "Pins.h" | |||||
namespace mainunit { | |||||
void interrupt() { | |||||
detachInterrupt(digitalPinToInterrupt(RTC_WAKE)); | |||||
} | |||||
void interruptIn(uint16_t seconds) { | |||||
rtc::setAlarm(seconds); | |||||
pinMode(RTC_WAKE, INPUT); | |||||
attachInterrupt(digitalPinToInterrupt(RTC_WAKE), interrupt, FALLING); | |||||
} | |||||
void sleep(period_t period) { | |||||
LowPower.powerDown(period, ADC_OFF, BOD_OFF); | |||||
} | |||||
void deepSleep(uint16_t seconds) { | |||||
interruptIn(seconds); | |||||
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); | |||||
} | |||||
} |
@@ -0,0 +1,9 @@ | |||||
#pragma once | |||||
#include <Arduino.h> | |||||
#include <LowPower.h> | |||||
namespace mainunit { | |||||
void sleep(period_t period); | |||||
void deepSleep(uint16_t seconds); | |||||
} |
@@ -0,0 +1,13 @@ | |||||
#pragma once | |||||
#define SIM_RX 5 | |||||
#define SIM_TX 6 | |||||
#define SIM_PWR 9 | |||||
#define SIM_STATUS 8 | |||||
#define RTC_PWR A0 | |||||
#define EEPROM_PWR A0 | |||||
#define SD_SS SS | |||||
#define SIM_RI 2 | |||||
#define RTC_WAKE 3 |
@@ -0,0 +1,22 @@ | |||||
#include "Positions.h" | |||||
#include "Gps.h" | |||||
#include "Network.h" | |||||
#include "Storage.h" | |||||
#define LOGGER_NAME "Positions" | |||||
namespace positions { | |||||
void appendLast() { | |||||
//write gps::lastPosition to eeprom and eventually to sd card | |||||
} | |||||
bool needsToSend() { | |||||
return false; | |||||
} | |||||
void send() { | |||||
} | |||||
} |
@@ -0,0 +1,8 @@ | |||||
#pragma once | |||||
namespace positions { | |||||
void appendLast(); | |||||
bool needsToSend(); | |||||
void send(); | |||||
} |
@@ -1,4 +1,5 @@ | |||||
#include "Rtc.h" | #include "Rtc.h" | ||||
#include "Pins.h" | |||||
#include <Wire.h> | #include <Wire.h> | ||||
#include <MD_DS3231.h> | #include <MD_DS3231.h> | ||||
@@ -7,6 +8,38 @@ | |||||
namespace rtc { | namespace rtc { | ||||
namespace details { | |||||
time_t readTimeFromRegisters() { | |||||
tmElements_t tmElements = { | |||||
RTC.s, | |||||
RTC.m, | |||||
RTC.h, | |||||
RTC.dow, | |||||
RTC.dd, | |||||
RTC.mm, | |||||
CalendarYrToTm(RTC.yyyy) | |||||
}; | |||||
return makeTime(tmElements); | |||||
} | |||||
void writeTimeToRegisters(time_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 powerOn() { | void powerOn() { | ||||
digitalWrite(RTC_PWR, HIGH); | digitalWrite(RTC_PWR, HIGH); | ||||
pinMode(RTC_PWR, OUTPUT); | pinMode(RTC_PWR, OUTPUT); | ||||
@@ -28,31 +61,32 @@ namespace rtc { | |||||
void setup() { | void setup() { | ||||
RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock | RTC.control(DS3231_12H, DS3231_OFF); //24 hours clock | ||||
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
RTC.control(DS3231_INT_ENABLE, DS3231_OFF); //INTCN OFF | |||||
} | } | ||||
Time getTime() { | |||||
time_t getTime() { | |||||
RTC.readTime(); | RTC.readTime(); | ||||
return details::readTimeFromRegisters(); | |||||
} | |||||
return { | |||||
RTC.yyyy, | |||||
RTC.mm, | |||||
RTC.dd, | |||||
RTC.h, | |||||
RTC.m, | |||||
RTC.s | |||||
}; | |||||
void setTime(time_t &time) { | |||||
details::writeTimeToRegisters(time); | |||||
RTC.writeTime(); | |||||
} | } | ||||
void setTime(Time time) { | |||||
RTC.yyyy = time.yyyy; | |||||
RTC.mm = time.mm; | |||||
RTC.dd = time.dd; | |||||
RTC.h = time.h; | |||||
RTC.m = time.m; | |||||
RTC.s = time.s; | |||||
void setAlarm(uint16_t seconds) { | |||||
time_t t = getTime(); | |||||
t = t + seconds; | |||||
setAlarm(t); | |||||
} | |||||
RTC.writeTime(); | |||||
void setAlarm(time_t &time) { | |||||
details::writeTimeToRegisters(time); | |||||
RTC.writeAlarm1(DS3231_ALM_S); | |||||
RTC.control(DS3231_A1_FLAG, DS3231_OFF); | |||||
RTC.control(DS3231_A1_INT_ENABLE, DS3231_ON); //Alarm 1 ON | |||||
RTC.control(DS3231_INT_ENABLE, DS3231_ON); //INTCN ON | |||||
} | } | ||||
} | } |
@@ -1,11 +1,17 @@ | |||||
#pragma once | #pragma once | ||||
#include <TimeLib.h> | |||||
#include <Time.h> | |||||
namespace rtc { | namespace rtc { | ||||
void powerOn(); | void powerOn(); | ||||
void powerOff(); | void powerOff(); | ||||
void setup(); | void setup(); | ||||
Time getTime(); | |||||
void setTime(Time time); | |||||
time_t getTime(); | |||||
void setTime(time_t &time); | |||||
void setAlarm(uint16_t seconds); | |||||
void setAlarm(time_t &time); | |||||
} | } |
@@ -1,4 +1,5 @@ | |||||
#include "Storage.h" | #include "Storage.h" | ||||
#include "Gps.h" | |||||
#define LOGGER_NAME "Storage" | #define LOGGER_NAME "Storage" | ||||
@@ -1,10 +0,0 @@ | |||||
#pragma once | |||||
struct Time { | |||||
uint16_t yyyy; | |||||
uint8_t mm; | |||||
uint8_t dd; | |||||
uint8_t h; | |||||
uint8_t m; | |||||
uint8_t s; | |||||
}; |
@@ -1,8 +0,0 @@ | |||||
#include "Utils.h" | |||||
#include "Gps.h" | |||||
namespace utils { | |||||
Time parseTime(); | |||||
} |
@@ -1,7 +0,0 @@ | |||||
#pragma once | |||||
#include "Time.h" | |||||
namespace utils { | |||||
Time parseTime(); | |||||
} |