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

266 рядки
7.9 KiB

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