@@ -1,22 +1,42 @@ | |||||
#include "Core.h" | #include "Core.h" | ||||
#include "Config.h" | #include "Config.h" | ||||
#include "Flash.h" | |||||
#define LOGGER_NAME "Core" | #define LOGGER_NAME "Core" | ||||
namespace core { | namespace core { | ||||
uint16_t sleepTime = SLEEP_DEFAULT_TIME_SECONDS;; | uint16_t sleepTime = SLEEP_DEFAULT_TIME_SECONDS;; | ||||
namespace details { | |||||
template<typename T, size_t N> size_t getFlashArraySize(T(&)[N]) { return N; } | |||||
template<typename T> void readFromFlash(const T *source, T &dest) { | |||||
memcpy_P(&dest, source, sizeof(T)); | |||||
void main() { | |||||
gps::powerOn(); | |||||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(GPS_DEFAULT_TOTAL_TIMEOUT_MS); | |||||
gps::powerOff(); | |||||
if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | |||||
tmElements_t time; | |||||
gps::getTime(time); | |||||
rtc::powerOn(); | |||||
rtc::setTime(time); | |||||
rtc::powerOff(); | |||||
positions::appendLast(); | |||||
uint8_t velocity; | |||||
gps::getVelocity(velocity); | |||||
core::setSleepTime(velocity); | |||||
} | } | ||||
if (positions::needsToSend()) { | |||||
positions::send(); | |||||
} | |||||
mainunit::deepSleep(core::sleepTime); | |||||
} | } | ||||
void setSleepTime(uint8_t velocity) { | void setSleepTime(uint8_t velocity) { | ||||
for (uint8_t i = 0; i < details::getFlashArraySize(config::defaultSleepTimings); i++) { | |||||
for (uint8_t i = 0; i < flash::getFlashArraySize(config::defaultSleepTimings); i++) { | |||||
sleepTimings_t timing; | sleepTimings_t timing; | ||||
details::readFromFlash(&config::defaultSleepTimings[i], timing); | |||||
flash::readFromFlash(&config::defaultSleepTimings[i], timing); | |||||
if (velocity > timing.speed) continue; | if (velocity > timing.speed) continue; | ||||
@@ -3,9 +3,16 @@ | |||||
#include <Arduino.h> | #include <Arduino.h> | ||||
#include "Debug.h" | #include "Debug.h" | ||||
#include "Gps.h" | |||||
#include "MainUnit.h" | |||||
#include "Network.h" | |||||
#include "Rtc.h" | |||||
#include "Pins.h" | |||||
#include "Positions.h" | |||||
namespace core { | namespace core { | ||||
extern uint16_t sleepTime; | extern uint16_t sleepTime; | ||||
void main(); | |||||
void setSleepTime(uint8_t velocity); | void setSleepTime(uint8_t velocity); | ||||
} | } |
@@ -1,16 +1,110 @@ | |||||
#include "Debug.h" | #include "Debug.h" | ||||
#include "Flash.h" | |||||
#define MENU_ENTRY(name, text) const char MENU_##name[] PROGMEM = text | |||||
MENU_ENTRY(HEADER, "-- Debug Menu --"); | |||||
MENU_ENTRY(SEPARATOR, "----"); | |||||
MENU_ENTRY(RUN, "[0] Run"); | |||||
MENU_ENTRY(RUN_ONCE, "[1] Run once"); | |||||
MENU_ENTRY(RAM, "[2] Read battery"); | |||||
MENU_ENTRY(READ_BATTERY, "[3] Read battery"); | |||||
MENU_ENTRY(GPS_ON, "[4] GPS On"); | |||||
MENU_ENTRY(GPS_OFF, "[5] GPS Off"); | |||||
MENU_ENTRY(GPS_GET, "[6] Get GPS position"); | |||||
MENU_ENTRY(RTC_ON, "[7] RTC On"); | |||||
MENU_ENTRY(RTC_OFF, "[8] RTC Off"); | |||||
MENU_ENTRY(RTC_SET, "[9] Get RTC time"); | |||||
MENU_ENTRY(RTC_GET, "[10] Set RTC time"); | |||||
MENU_ENTRY(QUESTION, "?"); | |||||
const char * const MENU_ENTRIES[] PROGMEM = { | |||||
MENU_HEADER, | |||||
MENU_RUN, | |||||
MENU_RUN_ONCE, | |||||
MENU_SEPARATOR, | |||||
MENU_RAM, | |||||
MENU_READ_BATTERY, | |||||
MENU_SEPARATOR, | |||||
MENU_GPS_ON, | |||||
MENU_GPS_OFF, | |||||
MENU_GPS_GET, | |||||
MENU_SEPARATOR, | |||||
MENU_RTC_ON, | |||||
MENU_RTC_OFF, | |||||
MENU_RTC_SET, | |||||
MENU_RTC_GET, | |||||
MENU_QUESTION | |||||
}; | |||||
int freeRam2() { | |||||
extern int __heap_start, *__brkval; | |||||
int v; | |||||
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval); | |||||
} | |||||
namespace debug { | namespace debug { | ||||
void waitForSerial() { | void waitForSerial() { | ||||
while (!Serial); | while (!Serial); | ||||
Serial.begin(115200); | |||||
Serial.begin(DEBUG_SERIAL_SPEED); | |||||
} | } | ||||
int freeRam() { | int freeRam() { | ||||
extern int __heap_start, *__brkval; | |||||
int v; | |||||
return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval); | |||||
return freeRam2(); | |||||
} | |||||
GPSTRACKER_DEBUG_COMMAND menu() { | |||||
if (!Serial) return GPSTRACKER_DEBUG_COMMAND::NONE; | |||||
uint8_t command; | |||||
while (command > static_cast<uint8_t>(GPSTRACKER_DEBUG_COMMAND::RTC_SET)) { | |||||
for (uint8_t i = 0; i < flash::getFlashArraySize(MENU_ENTRIES); i++) { | |||||
Serial.println(reinterpret_cast<const __FlashStringHelper *>(pgm_read_word(MENU_ENTRIES[i]))); | |||||
} | |||||
while (!Serial.available()); | |||||
command = static_cast<uint8_t>(Serial.parseInt()); | |||||
} | |||||
return static_cast<GPSTRACKER_DEBUG_COMMAND>(command); | |||||
} | } | ||||
void getAndDisplayGpsPosition() { | |||||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(GPS_DEFAULT_TOTAL_TIMEOUT_MS); | |||||
Log.notice(F("%d %s"), gpsStatus, gps::lastPosition); | |||||
} | |||||
void getAndDisplayBattery() { | |||||
SIM808ChargingStatus status = hardware::sim808::device.getChargingState(); | |||||
Log.notice("%d %d%% %dmV", status.state, status.level, status.voltage); | |||||
} | |||||
void getAndDisplayRtcTime() { | |||||
tmElements_t time; | |||||
rtc::getTime(time); | |||||
Log.notice(F("%d/%d/%d %d:%d:%d"), time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second); | |||||
} | |||||
void setRtcTime() { | |||||
tmElements_t time; | |||||
gps::getTime(time); | |||||
rtc::setTime(time); | |||||
Log.notice(F("OK")); | |||||
} | |||||
} | } |
@@ -1,10 +1,14 @@ | |||||
#pragma once | #pragma once | ||||
#include <Arduino.h> | #include <Arduino.h> | ||||
#include <ArduinoLog.h> | |||||
#ifdef _DEBUG | |||||
#include "Config.h" | |||||
#include "Hardware.h" | |||||
#include "Gps.h" | |||||
#include "Rtc.h" | |||||
#include <ArduinoLog.h> | |||||
#ifdef _DEBUG | |||||
#define VERBOSE(f) Log.verbose(F("[" LOGGER_NAME "::" f "]\n")) | #define VERBOSE(f) Log.verbose(F("[" LOGGER_NAME "::" f "]\n")) | ||||
#define VERBOSE_MSG(f, msg) Log.verbose(F("[" LOGGER_NAME "::" f "] " msg "\n")) | #define VERBOSE_MSG(f, msg) Log.verbose(F("[" LOGGER_NAME "::" f "] " msg "\n")) | ||||
@@ -20,9 +24,34 @@ | |||||
#endif | #endif | ||||
#define DEBUG_SERIAL_SPEED 9600 | |||||
namespace debug { | namespace debug { | ||||
enum class GPSTRACKER_DEBUG_COMMAND : uint8_t { | |||||
NONE = 0, | |||||
ONCE = 1, | |||||
RAM = 2, | |||||
BATTERY = 3, | |||||
GPS_ON = 4, | |||||
GPS_OFF = 5, | |||||
GPS_GET = 6, | |||||
RTC_ON = 7, | |||||
RTC_OFF = 8, | |||||
RTC_GET = 9, | |||||
RTC_SET = 10 | |||||
}; | |||||
void waitForSerial(); | void waitForSerial(); | ||||
int freeRam(); | int freeRam(); | ||||
GPSTRACKER_DEBUG_COMMAND menu(); | |||||
void getAndDisplayBattery(); | |||||
void getAndDisplayGpsPosition(); | |||||
void getAndDisplayRtcTime(); | |||||
void setRtcTime(); | |||||
inline void displayFreeRam() { Serial.println(freeRam()); } | |||||
} | } |
@@ -0,0 +1,3 @@ | |||||
#include "Flash.h" | |||||
@@ -0,0 +1,11 @@ | |||||
#pragma once | |||||
#include <Arduino.h> | |||||
namespace flash { | |||||
template<typename T, size_t N> size_t getFlashArraySize(T(&)[N]) { return N; } | |||||
template<typename T> void readFromFlash(const T *source, T &dest) { | |||||
memcpy_P(&dest, source, sizeof(T)); | |||||
} | |||||
} |
@@ -8,12 +8,4 @@ | |||||
#include "Config.h" | #include "Config.h" | ||||
#include "Core.h" | #include "Core.h" | ||||
#include "Gps.h" | |||||
#include "MainUnit.h" | |||||
#include "Network.h" | |||||
#include "Rtc.h" | |||||
#include "Pins.h" | |||||
#include "Positions.h" | |||||
#define LOGGER_NAME "GpsTracker" | #define LOGGER_NAME "GpsTracker" |
@@ -1,39 +1,58 @@ | |||||
#include "GpsTracker.h" | #include "GpsTracker.h" | ||||
bool bypassMenu = false; | |||||
void setup() { | void setup() { | ||||
#ifdef _DEBUG | #ifdef _DEBUG | ||||
debug::waitForSerial(); | debug::waitForSerial(); | ||||
Log.begin(LOG_LEVEL_VERBOSE, &Serial); | Log.begin(LOG_LEVEL_VERBOSE, &Serial); | ||||
#else | |||||
if(Serial) Log.begin(LOG_LEVEL_NOTICE, &Serial); | |||||
#endif | #endif | ||||
rtc::powerOn(); | rtc::powerOn(); | ||||
rtc::setup(); | rtc::setup(); | ||||
rtc::powerOff(); | |||||
rtc::powerOff(); | |||||
} | } | ||||
void loop() { | void loop() { | ||||
gps::powerOn(); | |||||
SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(GPS_DEFAULT_TOTAL_TIMEOUT_MS); | |||||
gps::powerOff(); | |||||
if (gpsStatus > SIM808_GPS_STATUS::NO_FIX) { | |||||
tmElements_t time; | |||||
gps::getTime(time); | |||||
rtc::powerOn(); | |||||
rtc::setTime(time); | |||||
rtc::powerOff(); | |||||
positions::appendLast(); | |||||
uint8_t velocity; | |||||
gps::getVelocity(velocity); | |||||
core::setSleepTime(velocity); | |||||
debug::GPSTRACKER_DEBUG_COMMAND command = debug::GPSTRACKER_DEBUG_COMMAND::NONE; | |||||
if(!bypassMenu) command = debug::menu(); | |||||
bypassMenu = command == debug::GPSTRACKER_DEBUG_COMMAND::NONE; | |||||
switch (command) { | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::NONE: | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::ONCE: | |||||
core::main(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::RAM: | |||||
debug::displayFreeRam(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::BATTERY: | |||||
debug::getAndDisplayBattery(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::GPS_ON: | |||||
gps::powerOn(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::GPS_OFF: | |||||
gps::powerOff(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::GPS_GET: | |||||
debug::getAndDisplayGpsPosition(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::RTC_ON: | |||||
rtc::powerOn(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::RTC_OFF: | |||||
rtc::powerOff(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET: | |||||
debug::getAndDisplayRtcTime(); | |||||
break; | |||||
case debug::GPSTRACKER_DEBUG_COMMAND::RTC_SET: | |||||
debug::setRtcTime(); | |||||
default: | |||||
Serial.println(F("Unsupported command !")); | |||||
} | } | ||||
if (positions::needsToSend()) { | |||||
positions::send(); | |||||
} | |||||
mainunit::deepSleep(core::sleepTime); | |||||
} | } |