diff --git a/GpsTracker/Core.cpp b/GpsTracker/Core.cpp index 3e4e46b..b6cc7d1 100644 --- a/GpsTracker/Core.cpp +++ b/GpsTracker/Core.cpp @@ -14,6 +14,21 @@ namespace core { uint16_t sleepTime = SLEEP_DEFAULT_TIME_SECONDS; uint8_t stoppedInARow = SLEEP_DEFAULT_STOPPED_THRESHOLD - 1; + namespace details { + + void appendToSmsBuffer(char * buffer, const char * fmt, ...) { + va_list args; + va_start(args, fmt); + + size_t bufferLeft = SMS_BUFFER_SIZE - strlen(buffer); + char * p = buffer + strlen(buffer); + vsnprintf_P(p, bufferLeft, fmt, args); + + va_end(args); + } + + } + void main() { bool forceBackup = false; bool acquired = false; @@ -40,7 +55,6 @@ namespace core { uint8_t notifyFailures(PositionEntryMetadata &metadata) { SIM808RegistrationStatus networkStatus; char buffer[SMS_BUFFER_SIZE] = "Alerts !\n"; - size_t bufferLeft = 0; const __FlashStringHelper * backupFailureString = F(" Backup battery failure ?\n"); uint8_t triggered = alerts::getTriggered(metadata); @@ -52,18 +66,15 @@ namespace core { if (!network::isAvailable(networkStatus.stat)) return NO_ALERTS_NOTIFIED; if (bitRead(triggered, ALERT_BATTERY_LEVEL_1) || bitRead(triggered, ALERT_BATTERY_LEVEL_2)) { - bufferLeft = SMS_BUFFER_SIZE - strlen(buffer); - snprintf_P(buffer + strlen(buffer), bufferLeft, PSTR("- Battery at %d%%.\n"), metadata.batteryLevel); + details::appendToSmsBuffer(buffer, PSTR("- Battery at %d%%.\n"), metadata.batteryLevel); } if (bitRead(triggered, ALERT_RTC_CLOCK_FAILURE)) { - bufferLeft = SMS_BUFFER_SIZE - strlen(buffer); - snprintf_P(buffer + strlen(buffer), bufferLeft, PSTR("- RTC was stopped. %S"), backupFailureString); + details::appendToSmsBuffer(buffer, PSTR("-RTC was stopped. %S"), backupFailureString); } if (bitRead(triggered, ALERT_RTC_TEMPERATURE_FAILURE)) { - bufferLeft = SMS_BUFFER_SIZE - strlen(buffer); - snprintf_P(buffer + strlen(buffer), bufferLeft, PSTR("- Temperature is %dC. %S"), static_cast(metadata.temperature * 100), backupFailureString); + details::appendToSmsBuffer(buffer, PSTR("- Temperature is %dC. %S"), static_cast(metadata.temperature * 100), backupFailureString); } config_t* config = &config::main::value;