From c7c7652d1fb47d28e7ffeca6a83629a3938e2810 Mon Sep 17 00:00:00 2001 From: Bertrand Lemasle Date: Wed, 14 Mar 2018 14:53:35 +1300 Subject: [PATCH] Fixed main unit being woke up by SoftwareSerial interrupts --- GpsTracker/Config.h | 2 ++ GpsTracker/Hardware.cpp | 2 +- GpsTracker/Hardware.h | 2 ++ GpsTracker/MainUnit.cpp | 25 +++++++++++++++++++++---- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/GpsTracker/Config.h b/GpsTracker/Config.h index fee1d3e..bd468a4 100644 --- a/GpsTracker/Config.h +++ b/GpsTracker/Config.h @@ -14,6 +14,8 @@ #define CONFIG_SEED 13 #define VERSION "1.00" +#define SIM808_BAUDRATE 4800 + #define SLEEP_DEFAULT_TIME_SECONDS 1800 #define GPS_DEFAULT_INTERMEDIATE_TIMEOUT_MS 10000 diff --git a/GpsTracker/Hardware.cpp b/GpsTracker/Hardware.cpp index 660f55f..d62d15f 100644 --- a/GpsTracker/Hardware.cpp +++ b/GpsTracker/Hardware.cpp @@ -43,7 +43,7 @@ namespace hardware { void setup() { VERBOSE("setup"); - simSerial.begin(4800); + simSerial.begin(SIM808_BAUDRATE); device.begin(simSerial); } diff --git a/GpsTracker/Hardware.h b/GpsTracker/Hardware.h index df67034..4e1353a 100644 --- a/GpsTracker/Hardware.h +++ b/GpsTracker/Hardware.h @@ -1,11 +1,13 @@ #pragma once +#include #include #include namespace hardware { namespace sim808 { + extern SoftwareSerial simSerial; extern SIM808 device; void powerOn(); diff --git a/GpsTracker/MainUnit.cpp b/GpsTracker/MainUnit.cpp index eebcc74..b665c04 100644 --- a/GpsTracker/MainUnit.cpp +++ b/GpsTracker/MainUnit.cpp @@ -7,6 +7,23 @@ namespace mainunit { + namespace details { + + void prepareSleep() { + hardware::sim808::simSerial.end(); //avoid woke up by SoftwareSerial interrupt + delay(5); //ensure message have been printed out + } + + void wokeUp() { + tmElements_t wokeUpTime; + rtc::getTime(wokeUpTime); + NOTICE_FORMAT("wokeUp", "%d:%d:%d", wokeUpTime.Hour, wokeUpTime.Minute, wokeUpTime.Second); + + hardware::sim808::simSerial.listen(); + } + + } + void interrupt() { detachInterrupt(digitalPinToInterrupt(RTC_WAKE)); } @@ -20,17 +37,17 @@ namespace mainunit { void sleep(period_t period) { NOTICE_FORMAT("sleep", "Sleeping for period : %d", period); - delay(5); + details::prepareSleep(); LowPower.powerDown(period, ADC_OFF, BOD_OFF); - NOTICE_MSG("sleep", "Woke up"); + details::wokeUp(); } void deepSleep(uint16_t seconds) { NOTICE_FORMAT("deepSleep", "Deep sleeping for %d seconds", seconds); interruptIn(seconds); - delay(5); + details::prepareSleep(); LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); - NOTICE_MSG("deepSleep", "Woke up"); + details::wokeUp(); } } \ No newline at end of file