diff --git a/GpsTracker/Config.h b/GpsTracker/Config.h index c3bc7b7..a9946d8 100644 --- a/GpsTracker/Config.h +++ b/GpsTracker/Config.h @@ -28,11 +28,11 @@ #define SLEEP_DEFAULT_INCREASE_THRESHOLD 3 #define GPS_DEFAULT_INTERMEDIATE_TIMEOUT_MS 10000 -#define GPS_DEFAULT_TOTAL_TIMEOUT_MS 180000 +#define GPS_DEFAULT_TOTAL_TIMEOUT_MS 80000 #define NETWORK_DEFAULT_INTERMEDIATE_TIMEOUT_MS 6000 -#define NETWORK_DEFAULT_TOTAL_TIMEOUT_MS 180000 -#define NETWORK_DEFAULT_NO_NETWORK_QUALIRY_THRESHOLD 8 +#define NETWORK_DEFAULT_TOTAL_TIMEOUT_MS 80000 +#define NETWORK_DEFAULT_NO_NETWORK_QUALITY_THRESHOLD 8 #define NETWORK_DEFAULT_NO_NETWORK_TRIES 5 #pragma endregion diff --git a/GpsTracker/Core.cpp b/GpsTracker/Core.cpp index 61c8670..5d98ebf 100644 --- a/GpsTracker/Core.cpp +++ b/GpsTracker/Core.cpp @@ -12,6 +12,7 @@ namespace core { void main() { + positions::prepareBackup(); PositionEntryMetadata metadata; if (positions::acquire(metadata)) { positions::appendLast(metadata); diff --git a/GpsTracker/Gps.cpp b/GpsTracker/Gps.cpp index e0173ba..adcea68 100644 --- a/GpsTracker/Gps.cpp +++ b/GpsTracker/Gps.cpp @@ -25,7 +25,7 @@ namespace gps { char lastPosition[GPS_POSITION_SIZE]; SIM808_GPS_STATUS lastStatus; - SIM808_GPS_STATUS acquireCurrentPosition(uint32_t timeout) { + SIM808_GPS_STATUS acquireCurrentPosition(int32_t timeout) { SIM808_GPS_STATUS currentStatus = SIM808_GPS_STATUS::OFF; do { diff --git a/GpsTracker/Gps.h b/GpsTracker/Gps.h index f698af8..2ca0e76 100644 --- a/GpsTracker/Gps.h +++ b/GpsTracker/Gps.h @@ -15,7 +15,7 @@ namespace gps { inline void powerOn() { hardware::sim808::gpsPowerOn(); } inline void powerOff() { hardware::sim808::gpsPowerOff(); } - SIM808_GPS_STATUS acquireCurrentPosition(uint32_t timeout); + SIM808_GPS_STATUS acquireCurrentPosition(int32_t timeout); uint8_t getVelocity(); void getTime(tmElements_t &time); diff --git a/GpsTracker/Hardware.cpp b/GpsTracker/Hardware.cpp index a5fb4a9..c12dd39 100644 --- a/GpsTracker/Hardware.cpp +++ b/GpsTracker/Hardware.cpp @@ -55,7 +55,7 @@ namespace hardware { } void gpsPowerOff() { - NOTICE("gpsPowerOff"); + VERBOSE("gpsPowerOff"); device.disableGps(); powerOffIfUnused(); } diff --git a/GpsTracker/Network.cpp b/GpsTracker/Network.cpp index 878c470..d586e98 100644 --- a/GpsTracker/Network.cpp +++ b/GpsTracker/Network.cpp @@ -10,20 +10,21 @@ namespace network { - SIM808RegistrationStatus waitForRegistered(uint32_t timeout) { - VERBOSE("waitForRegistered"); + SIM808RegistrationStatus waitForRegistered(int32_t timeout) { + NOTICE_FORMAT("waitForRegistered", "Timeout : %d", timeout); SIM808RegistrationStatus currentStatus; + SIM808SignalQualityReport report; uint8_t noReliableNetwork = 0; do { currentStatus = hardware::sim808::device.getNetworkRegistrationStatus(); if (isAvailable(currentStatus.stat)) break; - SIM808SignalQualityReport report = hardware::sim808::device.getSignalQuality(); + report = hardware::sim808::device.getSignalQuality(); NOTICE_FORMAT("waitForRegistered", "%d, [%d %ddBm]", currentStatus.stat, report.ssri, report.attenuation); - if (report.ssri < NETWORK_DEFAULT_NO_NETWORK_QUALIRY_THRESHOLD) noReliableNetwork++; + if (report.ssri < NETWORK_DEFAULT_NO_NETWORK_QUALITY_THRESHOLD) noReliableNetwork++; else noReliableNetwork = 0; if (noReliableNetwork > NETWORK_DEFAULT_NO_NETWORK_TRIES) { NOTICE_MSG("waitForRegistered", "No reliable signal"); @@ -34,6 +35,7 @@ namespace network { timeout -= NETWORK_DEFAULT_INTERMEDIATE_TIMEOUT_MS; } while (timeout > 1); + report = hardware::sim808::device.getSignalQuality(); NOTICE_FORMAT("waitForRegistered", "%d, [%d %ddBm]", currentStatus.stat, report.ssri, report.attenuation); return currentStatus; } diff --git a/GpsTracker/Network.h b/GpsTracker/Network.h index 33ee41e..49ad1d7 100644 --- a/GpsTracker/Network.h +++ b/GpsTracker/Network.h @@ -7,7 +7,7 @@ namespace network { inline void powerOn() { hardware::sim808::networkPowerOn(); } inline void powerOff() { hardware::sim808::networkPowerOff(); } - SIM808RegistrationStatus waitForRegistered(uint32_t timeout); + SIM808RegistrationStatus waitForRegistered(int32_t timeout); bool isAvailable(SIM808_NETWORK_REGISTRATION_STATE state); bool enableGprs(); } \ No newline at end of file diff --git a/GpsTracker/NetworkPositionsBackup.cpp b/GpsTracker/NetworkPositionsBackup.cpp index 215cd76..b3135f5 100644 --- a/GpsTracker/NetworkPositionsBackup.cpp +++ b/GpsTracker/NetworkPositionsBackup.cpp @@ -5,7 +5,6 @@ #if BACKUP_ENABLE_NETWORK #include "NetworkPositionsBackup.h" #include "Debug.h" -#include "Positions.h" #include "Hardware.h" #include "Network.h" @@ -16,76 +15,90 @@ namespace positions { namespace backup { namespace net { - namespace details { + bool NetworkPositionsBackup::isBackupNeeded(bool forPrepare) { + config_t *config = &config::main::value; + return (config->network.lastSavedEntry == 0xFFFF && config->lastEntry != 0xFFFF) || + positions::count(config->network.lastSavedEntry) > config->network.saveThreshold - (forPrepare ? 1 : 0); + } - bool isBackupNeeded() { - config_t *config = &config::main::value; - return (config->network.lastSavedEntry == 0xFFFF && config ->lastEntry != 0xFFFF) || - positions::count(config->network.lastSavedEntry) > config->network.saveThreshold; - } + bool NetworkPositionsBackup::appendPosition(PositionEntry &entry) { + char buffer[BUFFER_SIZE]; + snprintf(buffer, BUFFER_SIZE, "%d,%d,%d,%d,%d,%d,", + debug::freeRam(), + hardware::sim808::device.getSignalQuality().attenuation, + entry.metadata.batteryLevel, + entry.metadata.batteryVoltage, + static_cast(entry.metadata.temperature * 100), + static_cast(entry.metadata.status)); + + strcat(buffer, entry.position); + + NOTICE_FORMAT("appendPosition", "Sending : %s", buffer); + uint16_t responseCode = hardware::sim808::device.httpPost( + config::main::value.network.url, + F("text/csv"), + buffer, + buffer, + BUFFER_SIZE + ) == POSITIONS_CONFIG_NET_DEFAULT_EXPECTED_RESPONSE; + + NOTICE_FORMAT("appendPosition", "Response : %d", responseCode); + return responseCode; + } - bool appendPosition(PositionEntry &entry) { - char buffer[BUFFER_SIZE]; - snprintf(buffer, BUFFER_SIZE, "%d,%d,%d,%d,%d,%d,", - debug::freeRam(), - hardware::sim808::device.getSignalQuality().attenuation, - entry.metadata.batteryLevel, - entry.metadata.batteryVoltage, - static_cast(entry.metadata.temperature * 100), - static_cast(entry.metadata.status)); - - strcat(buffer, entry.position); - - NOTICE_FORMAT("appendPosition", "Sending : %s", buffer); - uint16_t responseCode = hardware::sim808::device.httpPost( - config::main::value.network.url, - F("text/csv"), - buffer, - buffer, - BUFFER_SIZE - ) == POSITIONS_CONFIG_NET_DEFAULT_EXPECTED_RESPONSE; - - NOTICE_FORMAT("appendPosition", "Response : %d", responseCode); - return responseCode; + __attribute__((__optimize__("O2"))) + void NetworkPositionsBackup::appendPositions() { + uint16_t currentEntryIndex = config::main::value.network.lastSavedEntry + 1; + int32_t networkTimeout = 0; + PositionEntry currentEntry; + SIM808RegistrationStatus networkStatus; + + network::powerOn(); + networkTimeout = _prepareTime > 0 ? + NETWORK_DEFAULT_TOTAL_TIMEOUT_MS - (rtc::getTime() - _prepareTime) * 1000 : + NETWORK_DEFAULT_TOTAL_TIMEOUT_MS; + + networkStatus = network::waitForRegistered(networkTimeout); + + if (!network::isAvailable(networkStatus.stat)) NOTICE_MSG("appendPositions", "network unavailable"); + else if (!network::enableGprs()) NOTICE_MSG("appendPositions", "gprs unavailable"); + else { + hardware::i2c::powerOn(); + do { + if (!positions::get(currentEntryIndex, currentEntry)) break; + if (!appendPosition(currentEntry)) break; + + config::main::value.network.lastSavedEntry = currentEntryIndex; + config::main::save(); + + } while (positions::moveNext(currentEntryIndex)); + hardware::i2c::powerOff(); } - void appendPositions() { - uint16_t currentEntryIndex = config::main::value.network.lastSavedEntry + 1; - PositionEntry currentEntry; - SIM808RegistrationStatus networkStatus; - - network::powerOn(); - networkStatus = network::waitForRegistered(NETWORK_DEFAULT_TOTAL_TIMEOUT_MS); - - if (!network::isAvailable(networkStatus.stat)) NOTICE_MSG("appendPositions", "network unavailable"); - else if (!network::enableGprs()) NOTICE_MSG("appendPositions", "gprs unavailable"); - else { - hardware::i2c::powerOn(); - do { - if (!positions::get(currentEntryIndex, currentEntry)) break; - if (!appendPosition(currentEntry)) break; + network::powerOff(); + } - config::main::value.network.lastSavedEntry = currentEntryIndex; - config::main::save(); + void NetworkPositionsBackup::setup() { + NOTICE("setup"); + } - } while (positions::moveNext(currentEntryIndex)); - hardware::i2c::powerOff(); - } + void NetworkPositionsBackup::prepare() { + NOTICE("prepare"); - network::powerOff(); + if (!isBackupNeeded(true)) { + _prepareTime = 0; + return; } - } - - void NetworkPositionsBackup::setup() { - NOTICE("setup"); + network::powerOn(); + _prepareTime = rtc::getTime(); } void NetworkPositionsBackup::backup() { NOTICE("backup"); - if (!details::isBackupNeeded()) return; - details::appendPositions(); + if (!isBackupNeeded(false)) return; + appendPositions(); } } } diff --git a/GpsTracker/NetworkPositionsBackup.h b/GpsTracker/NetworkPositionsBackup.h index da79400..dd6fe4b 100644 --- a/GpsTracker/NetworkPositionsBackup.h +++ b/GpsTracker/NetworkPositionsBackup.h @@ -1,6 +1,8 @@ #pragma once #include "PositionsBackup.h" +#include "Time2.h" +#include "Positions.h" namespace positions { namespace backup { @@ -8,8 +10,16 @@ namespace positions { class NetworkPositionsBackup : public PositionsBackup { private: + timestamp_t _prepareTime; + + bool isBackupNeeded(bool forPrepare); + bool appendPosition(PositionEntry &entry); + void appendPositions(); + public: void setup(); + + void prepare(); void backup(); }; diff --git a/GpsTracker/Positions.cpp b/GpsTracker/Positions.cpp index 707cc9a..683652f 100644 --- a/GpsTracker/Positions.cpp +++ b/GpsTracker/Positions.cpp @@ -144,6 +144,14 @@ namespace positions { return config->lastEntry - fromIndex; } + void prepareBackup() { +#ifdef BACKUPS_ENABLED + for (int i = 0; i < BACKUPS_ENABLED; i++) { + _backups[i]->prepare(); + } +#endif + } + void doBackup() { #ifdef BACKUPS_ENABLED for (int i = 0; i < BACKUPS_ENABLED; i++) { diff --git a/GpsTracker/Positions.h b/GpsTracker/Positions.h index df9b29d..5709423 100644 --- a/GpsTracker/Positions.h +++ b/GpsTracker/Positions.h @@ -27,5 +27,6 @@ namespace positions { bool moveNext(uint16_t &index); uint16_t count(uint16_t fromIndex); + void prepareBackup(); void doBackup(); } \ No newline at end of file diff --git a/GpsTracker/PositionsBackup.h b/GpsTracker/PositionsBackup.h index 0cd6f77..0e12dfa 100644 --- a/GpsTracker/PositionsBackup.h +++ b/GpsTracker/PositionsBackup.h @@ -6,8 +6,10 @@ namespace positions { class PositionsBackup { public: ~PositionsBackup(); - virtual void setup()=0; - virtual void backup()=0; + virtual void setup() = 0; + + virtual void prepare() = 0; + virtual void backup() = 0; }; }