#pragma once #include "NetworkPositionsBackup.h" #include "Debug.h" #include "Positions.h" #include "Config.h" #include "Hardware.h" #define LOGGER_NAME "Positions::backup::network" #define BUFFER_SIZE 160 #define EXPECTED_HTTP_RESPONSE_CODE 201 namespace positions { namespace backup { namespace network { namespace details { bool isBackupNeeded(config_t &config) { config = config::main::get(); return config.network.lastSavedEntry == 0xFFFF || positions::count(config.network.lastSavedEntry) > config.network.saveThreshold; } bool appendPosition(config_t &config, PositionEntry &entry) { char buffer[BUFFER_SIZE]; snprintf_P(buffer, BUFFER_SIZE, PSTR("%d,%d,%.2f,%d,%s,%d"), entry.metadata.batteryLevel, entry.metadata.batteryVoltage, entry.metadata.temperature, static_cast(entry.metadata.status), entry.position); return hardware::sim808::device.httpPost( config.network.url, PSTR("text/csv"), buffer, buffer, BUFFER_SIZE ) == EXPECTED_HTTP_RESPONSE_CODE; } void appendPositions(config_t &config) { VERBOSE("appendPositions"); uint16_t currentEntryIndex = config.network.lastSavedEntry + 1; PositionEntry currentEntry; hardware::i2c::powerOn(); hardware::sim808::networkPowerOn(); do { if (!positions::get(currentEntryIndex, currentEntry)) break; if (!appendPosition(config, currentEntry)) break; config.network.lastSavedEntry = currentEntryIndex; config::main::set(config); } while (positions::moveNext(currentEntryIndex)); hardware::sim808::networkPowerOff(); hardware::i2c::powerOff(); } } void NetworkPositionsBackup::setup() { VERBOSE("backup"); } void NetworkPositionsBackup::backup() { VERBOSE("backup"); config_t config; if (!details::isBackupNeeded(config)) return; details::appendPositions(config); } } } }