Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

106 рядки
3.0 KiB

  1. #pragma once
  2. #include "Config.h"
  3. #if BACKUP_ENABLE_NETWORK
  4. #include "NetworkPositionsBackup.h"
  5. #include "Debug.h"
  6. #include "Hardware.h"
  7. #include "Network.h"
  8. #define LOGGER_NAME "Positions::backup::network"
  9. #define BUFFER_SIZE 170
  10. namespace positions {
  11. namespace backup {
  12. namespace net {
  13. bool NetworkPositionsBackup::isBackupNeeded(bool forPrepare) {
  14. config_t *config = &config::main::value;
  15. return (config->network.lastSavedEntry == 0xFFFF && config->lastEntry != 0xFFFF) ||
  16. positions::count(config->network.lastSavedEntry) > config->network.saveThreshold - (forPrepare ? 1 : 0);
  17. }
  18. bool NetworkPositionsBackup::appendPosition(PositionEntry &entry) {
  19. char buffer[BUFFER_SIZE];
  20. snprintf(buffer, BUFFER_SIZE, "%d,%d,%d,%d,%d,%d,%d,",
  21. debug::freeRam(),
  22. hardware::sim808::device.getSignalQuality().attenuation,
  23. entry.metadata.batteryLevel,
  24. entry.metadata.batteryVoltage,
  25. static_cast<uint16_t>(entry.metadata.temperature * 100),
  26. static_cast<uint8_t>(entry.metadata.status),
  27. entry.metadata.timeToFix);
  28. strcat(buffer, entry.position);
  29. NOTICE_FORMAT("appendPosition", "Sending : %s", buffer);
  30. uint16_t responseCode = hardware::sim808::device.httpPost(
  31. config::main::value.network.url,
  32. F("text/gpstracker"),
  33. buffer,
  34. buffer,
  35. BUFFER_SIZE
  36. ) == POSITIONS_CONFIG_NET_DEFAULT_EXPECTED_RESPONSE;
  37. NOTICE_FORMAT("appendPosition", "Response : %d", responseCode);
  38. return responseCode;
  39. }
  40. //__attribute__((__optimize__("O2")))
  41. void NetworkPositionsBackup::appendPositions() {
  42. uint16_t currentEntryIndex = config::main::value.network.lastSavedEntry + 1;
  43. uint32_t networkTimeout = 0;
  44. PositionEntry currentEntry;
  45. SIM808RegistrationStatus networkStatus;
  46. network::powerOn();
  47. networkTimeout = NETWORK_DEFAULT_TOTAL_TIMEOUT_MS;
  48. if (_prepareTime > 0) networkTimeout -= (rtc::getTime() - _prepareTime) * 1000;
  49. networkStatus = network::waitForRegistered(networkTimeout);
  50. if (!network::isAvailable(networkStatus.stat)) NOTICE_MSG("appendPositions", "network unavailable");
  51. else if (!network::enableGprs()) NOTICE_MSG("appendPositions", "gprs unavailable");
  52. else {
  53. hardware::i2c::powerOn();
  54. do {
  55. if (!positions::get(currentEntryIndex, currentEntry)) break;
  56. if (!appendPosition(currentEntry)) break;
  57. config::main::value.network.lastSavedEntry = currentEntryIndex;
  58. config::main::save();
  59. } while (positions::moveNext(currentEntryIndex));
  60. hardware::i2c::powerOff();
  61. }
  62. network::powerOff();
  63. }
  64. void NetworkPositionsBackup::setup() {
  65. NOTICE("setup");
  66. }
  67. void NetworkPositionsBackup::prepare() {
  68. NOTICE("prepare");
  69. if (!isBackupNeeded(true)) {
  70. _prepareTime = 0;
  71. return;
  72. }
  73. network::powerOn();
  74. _prepareTime = rtc::getTime();
  75. }
  76. void NetworkPositionsBackup::backup() {
  77. NOTICE("backup");
  78. if (!isBackupNeeded(false)) return;
  79. appendPositions();
  80. }
  81. }
  82. }
  83. }
  84. #endif