Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

286 lignes
8.7 KiB

  1. #include "Debug.h"
  2. #include "MainUnit.h"
  3. #include "Hardware.h"
  4. #include "Gps.h"
  5. #include "Rtc.h"
  6. #include "Flash.h"
  7. #include "Positions.h"
  8. #include "Core.h"
  9. #include "Alerts.h"
  10. #include "Logging.h"
  11. #define MENU_ENTRY(name, text) const char MENU_##name[] PROGMEM = text
  12. const char FAKE_GPS_ENTRY[] PROGMEM = "1,1,20170924184842.000,49.454862,1.144537,71.900,2.70,172.6,1,,1.3,2.2,1.8,,11,7,,,37,,";
  13. MENU_ENTRY(HEADER, "========================\n-- Menu --");
  14. MENU_ENTRY(SEPARATOR, "----");
  15. MENU_ENTRY(RUN, "[R] Run");
  16. MENU_ENTRY(RUN_ONCE, "[r] Run once");
  17. MENU_ENTRY(RAM, "[f] Free RAM");
  18. MENU_ENTRY(READ_BATTERY, "[b] Read battery");
  19. MENU_ENTRY(GPS_ON, "[G] GPS On");
  20. MENU_ENTRY(GPS_OFF, "[g] GPS Off");
  21. MENU_ENTRY(GPS_GET, "[L] Get GPS position");
  22. MENU_ENTRY(GPS_SET, "[l] Set last GPS position");
  23. MENU_ENTRY(RTC_SET, "[T] Get RTC time");
  24. MENU_ENTRY(RTC_GET, "[t] Set RTC time");
  25. MENU_ENTRY(EEPROM_GET_CONFIG, "[C] Get EEPROM config");
  26. MENU_ENTRY(EEPROM_RESET_CONFIG, "[c] Reset EEPROM config");
  27. MENU_ENTRY(EEPROM_GET_CONTENT, "[E] Get EEPROM content");
  28. MENU_ENTRY(EEPROM_GET_ENTRIES, "[P] Get EEPROM entries");
  29. MENU_ENTRY(EEPROM_GET_LAST_ENTRY, "[p] Get EEPROM last entry");
  30. MENU_ENTRY(EEPROM_ADD_ENTRY, "[a] Add last entry to EEPROM");
  31. MENU_ENTRY(EEPROM_BACKUP_ENTRIES, "[B] Backup EEPROM entries");
  32. MENU_ENTRY(NOTIFY_FAILURES, "[F] Notify failures");
  33. MENU_ENTRY(CLEAR_ALERTS, "[A] Clear alerts");
  34. MENU_ENTRY(SLEEP_DEEP, "[s] Deep sleep for 10s");
  35. MENU_ENTRY(QUESTION, "?");
  36. const uint8_t commandIdMapping[] PROGMEM = {
  37. 'R', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RUN),
  38. 'r', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::ONCE),
  39. 'f', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RAM),
  40. 'b', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::BATTERY),
  41. 'G', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::GPS_ON),
  42. 'g', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::GPS_OFF),
  43. 'L', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::GPS_GET),
  44. 'l', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::GPS_SET),
  45. 'T', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET),
  46. 't', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_SET),
  47. 'C', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONFIG),
  48. 'c', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG),
  49. 'E', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONTENT),
  50. 'P', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES),
  51. 'p', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_LAST_ENTRY),
  52. 'a', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY),
  53. 'B', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_BACKUP_ENTRIES),
  54. 'F', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::NOTIFY_FAILURES),
  55. 'A', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::CLEAR_ALERTS),
  56. 's', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::SLEEP_DEEP),
  57. };
  58. const char * const MENU_ENTRIES[] PROGMEM = {
  59. MENU_HEADER,
  60. MENU_RUN,
  61. MENU_RUN_ONCE,
  62. MENU_SEPARATOR,
  63. MENU_RAM,
  64. MENU_READ_BATTERY,
  65. MENU_SEPARATOR,
  66. MENU_GPS_ON,
  67. MENU_GPS_OFF,
  68. MENU_GPS_GET,
  69. MENU_GPS_SET,
  70. MENU_SEPARATOR,
  71. MENU_RTC_SET,
  72. MENU_RTC_GET,
  73. MENU_SEPARATOR,
  74. MENU_EEPROM_GET_CONFIG,
  75. MENU_EEPROM_RESET_CONFIG,
  76. MENU_EEPROM_GET_CONTENT,
  77. MENU_EEPROM_GET_ENTRIES,
  78. MENU_EEPROM_GET_LAST_ENTRY,
  79. MENU_EEPROM_ADD_ENTRY,
  80. MENU_EEPROM_BACKUP_ENTRIES,
  81. MENU_SEPARATOR,
  82. MENU_NOTIFY_FAILURES,
  83. MENU_CLEAR_ALERTS,
  84. MENU_SEPARATOR,
  85. MENU_SLEEP_DEEP,
  86. MENU_QUESTION
  87. };
  88. static const PositionEntryMetadata fakeMetadata PROGMEM = {
  89. 100,
  90. 3800,
  91. 10,
  92. 20,
  93. SIM808_GPS_STATUS::ACCURATE_FIX
  94. };
  95. using namespace utils;
  96. namespace debug {
  97. #define CURRENT_LOGGER "debug"
  98. void displayFreeRam() {
  99. #define CURRENT_LOGGER_FUNCTION "displayFreeRam"
  100. NOTICE_FORMAT("%d", mainunit::freeRam());
  101. }
  102. GPSTRACKER_DEBUG_COMMAND parseCommand(char id) {
  103. size_t mappingArraySize = flash::getArraySize(commandIdMapping);
  104. char commandId;
  105. for (uint8_t i = 0; i < mappingArraySize; i += 2) {
  106. commandId = pgm_read_byte_near(commandIdMapping + i);
  107. if (commandId == id) return static_cast<GPSTRACKER_DEBUG_COMMAND>(pgm_read_byte_near(commandIdMapping + i + 1));
  108. }
  109. return GPSTRACKER_DEBUG_COMMAND::NONE;
  110. }
  111. GPSTRACKER_DEBUG_COMMAND menu(uint16_t timeout) {
  112. #define CURRENT_LOGGER_FUNCTION "menu"
  113. GPSTRACKER_DEBUG_COMMAND command;
  114. size_t menuSize = flash::getArraySize(MENU_ENTRIES);
  115. do {
  116. for (uint8_t i = 0; i < menuSize; i++) {
  117. Serial.println(reinterpret_cast<const __FlashStringHelper *>(pgm_read_word_near(&MENU_ENTRIES[i])));
  118. }
  119. while (!Serial.available()) {
  120. if (timeout > 0) {
  121. delay(MENU_INTERMEDIATE_TIMEOUT);
  122. timeout -= MENU_INTERMEDIATE_TIMEOUT;
  123. if (timeout <= 0) {
  124. NOTICE_MSG("Timeout expired.");
  125. return GPSTRACKER_DEBUG_COMMAND::RUN;
  126. }
  127. }
  128. }
  129. command = parseCommand(Serial.read());
  130. while (Serial.available()) Serial.read(); //flushing input
  131. } while (command == GPSTRACKER_DEBUG_COMMAND::NONE);
  132. return command;
  133. }
  134. void getAndDisplayGpsPosition() {
  135. #define CURRENT_LOGGER_FUNCTION "getAndDisplayGpsPosition"
  136. SIM808_GPS_STATUS gpsStatus = gps::acquireCurrentPosition(GPS_DEFAULT_TOTAL_TIMEOUT_MS);
  137. NOTICE_FORMAT("%d %s", gpsStatus, gps::lastPosition);
  138. }
  139. void setFakeGpsPosition() {
  140. #define CURRENT_LOGGER_FUNCTION "setFakeGpsPosition"
  141. strlcpy_P(gps::lastPosition, FAKE_GPS_ENTRY, GPS_POSITION_SIZE);
  142. NOTICE_FORMAT("Last position set to : %s", gps::lastPosition);
  143. NOTICE_FORMAT("Speed : %d", gps::getVelocity());
  144. NOTICE_FORMAT("Sleep time : %d", core::mapSleepTime(gps::getVelocity()));
  145. }
  146. void getAndDisplayBattery() {
  147. #define CURRENT_LOGGER_FUNCTION "getAndDisplayBattery"
  148. hardware::sim808::powerOn();
  149. SIM808ChargingStatus status = hardware::sim808::device.getChargingState();
  150. hardware::sim808::powerOff();
  151. NOTICE_FORMAT("%d %d%% %dmV", status.state, status.level, status.voltage);
  152. }
  153. void getAndDisplayRtcTime() {
  154. #define CURRENT_LOGGER_FUNCTION "getAndDisplayRtcTime"
  155. tmElements_t time;
  156. rtc::getTime(time);
  157. NOTICE_FORMAT("%d/%d/%d %d:%d:%d %t %d", time.year, time.month, time.day, time.hour, time.minute, time.second, rtc::isAccurate(), rtc::getTemperature());
  158. }
  159. void setRtcTime() {
  160. tmElements_t time;
  161. gps::getTime(time);
  162. rtc::setTime(time);
  163. }
  164. void getAndDisplaySleepTimes() {
  165. #define CURRENT_LOGGER_FUNCTION "getAndDisplaySleepTimes"
  166. size_t arraySize = flash::getArraySize(config::defaultSleepTimings);
  167. sleepTimings_t maxSpeedTiming;
  168. utils::flash::read(&config::defaultSleepTimings[arraySize - 1], maxSpeedTiming);
  169. for (int i = 0; i <= maxSpeedTiming.speed; i++) {
  170. core::mapSleepTime(i);
  171. }
  172. NOTICE_MSG("Done");
  173. }
  174. void getAndDisplayEepromConfig() {
  175. config::main::setup(); //forcing read again
  176. }
  177. void getAndDisplayEepromContent() {
  178. #define CURRENT_LOGGER_FUNCTION "getAndDisplayEepromContent"
  179. char buffer[128];
  180. hardware::i2c::powerOn();
  181. for (int i = 0; i < 8; i++) {
  182. hardware::i2c::eeprom.read(128 * i, buffer, 128);
  183. for (int i = 0; i < 128; i++) {
  184. Serial.print(buffer[i], HEX);
  185. }
  186. }
  187. Serial.println();
  188. hardware::i2c::powerOff();
  189. NOTICE_MSG("Done");
  190. }
  191. void getAndDisplayEepromPositions(uint16_t firstIndex) {
  192. uint16_t currentEntryIndex = firstIndex;
  193. PositionEntry currentEntry;
  194. hardware::i2c::powerOn();
  195. do {
  196. if (!positions::get(currentEntryIndex, currentEntry)) break;
  197. positions::print(currentEntryIndex, currentEntry);
  198. } while(positions::moveNext(currentEntryIndex));
  199. hardware::i2c::powerOff();
  200. }
  201. void addLastPositionToEeprom() {
  202. hardware::sim808::powerOn();
  203. SIM808ChargingStatus status = hardware::sim808::device.getChargingState();
  204. hardware::sim808::powerOff();
  205. PositionEntryMetadata metadata = {
  206. status.level,
  207. status.voltage,
  208. rtc::getTemperature(),
  209. 0,
  210. SIM808_GPS_STATUS::OFF
  211. };
  212. for(int i = 0; i < 10; i++) positions::appendLast(metadata);
  213. }
  214. void notifyFailures() {
  215. #define CURRENT_LOGGER_FUNCTION "notifyFailures"
  216. PositionEntryMetadata metadata = {};
  217. flash::read(&fakeMetadata, metadata);
  218. metadata.batteryLevel = 1;
  219. metadata.temperature = ALERT_SUSPICIOUS_RTC_TEMPERATURE;
  220. uint8_t alerts = core::notifyFailures(metadata);
  221. NOTICE_FORMAT("result : %B", alerts);
  222. alerts::add(alerts);
  223. }
  224. void clearAlerts() {
  225. PositionEntryMetadata metadata = {};
  226. flash::read(&fakeMetadata, metadata);
  227. alerts::clear(metadata);
  228. }
  229. }