diff --git a/GpsTracker/Config.cpp b/GpsTracker/Config.cpp index 3c165ff..463a664 100644 --- a/GpsTracker/Config.cpp +++ b/GpsTracker/Config.cpp @@ -8,9 +8,7 @@ namespace config { Config value; void write() { - VERBOSE("writeConfig"); hardware::i2c::eeprom.writeBlock(CONFIG_ADDR, value); - VERBOSE_FORMAT("writeConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry); } @@ -28,7 +26,6 @@ namespace config { } void read() { - VERBOSE("readConfig"); hardware::i2c::eeprom.readBlock(CONFIG_ADDR, value); if (!String(CONFIG_SEED).equals(value.seed)) reset(); diff --git a/GpsTracker/Config.h b/GpsTracker/Config.h index d59c858..9e438fa 100644 --- a/GpsTracker/Config.h +++ b/GpsTracker/Config.h @@ -15,7 +15,7 @@ struct Config { }; #define CONFIG_ADDR 0 -#define CONFIG_SEED "UIYA" +#define CONFIG_SEED "UIYB" #define VERSION "1.00" #define SLEEP_DEFAULT_TIME_SECONDS 1800 @@ -39,6 +39,7 @@ namespace config { }; void read(); + void reset(); void write(); } \ No newline at end of file diff --git a/GpsTracker/Debug.cpp b/GpsTracker/Debug.cpp index 17af53e..c9c642b 100644 --- a/GpsTracker/Debug.cpp +++ b/GpsTracker/Debug.cpp @@ -4,25 +4,50 @@ #define MENU_ENTRY(name, text) const char MENU_##name[] PROGMEM = text +const char FAKE_GPS_ENTRY[] PROGMEM = "1,1,20170924074842.000,49.454862,1.144537,71.900,67.99,172.6,1,,1.3,2.2,1.8,,11,7,,,37,,"; + MENU_ENTRY(HEADER, "-- Debug Menu --"); MENU_ENTRY(SEPARATOR, "----"); -MENU_ENTRY(RUN, "[0] Run"); -MENU_ENTRY(RUN_ONCE, "[1] Run once"); -MENU_ENTRY(RAM, "[2] Free RAM"); -MENU_ENTRY(READ_BATTERY, "[3] Read battery"); -MENU_ENTRY(GPS_ON, "[4] GPS On"); -MENU_ENTRY(GPS_OFF, "[5] GPS Off"); -MENU_ENTRY(GPS_GET, "[6] Get GPS position"); -MENU_ENTRY(RTC_ON, "[7] RTC On"); -MENU_ENTRY(RTC_OFF, "[8] RTC Off"); -MENU_ENTRY(RTC_SET, "[9] Get RTC time"); -MENU_ENTRY(RTC_GET, "[10] Set RTC time"); -MENU_ENTRY(SD_WRITE_TEST, "[11] Write to test file"); -MENU_ENTRY(EEPROM_GET_CONFIG, "[16] Get EEPROM config"); -MENU_ENTRY(EEPROM_GET_ENTRIES, "[17] Get EEPROM entries"); +MENU_ENTRY(RUN, "[R] Run"); +MENU_ENTRY(RUN_ONCE, "[r] Run once"); +MENU_ENTRY(RAM, "[f] Free RAM"); +MENU_ENTRY(READ_BATTERY, "[b] Read battery"); +MENU_ENTRY(GPS_ON, "[G] GPS On"); +MENU_ENTRY(GPS_OFF, "[g] GPS Off"); +MENU_ENTRY(GPS_GET, "[L] Get GPS position"); +MENU_ENTRY(GPS_SET, "[l] Set last GPS position"); +MENU_ENTRY(I2C_ON, "[I] I2C devices On"); +MENU_ENTRY(I2C_OFF, "[i] I2C devices Off"); +MENU_ENTRY(RTC_SET, "[T] Get RTC time"); +MENU_ENTRY(RTC_GET, "[t] Set RTC time"); +MENU_ENTRY(SD_WRITE_TEST, "[W] Write to test file"); +MENU_ENTRY(EEPROM_GET_CONFIG, "[C] Get EEPROM config"); +MENU_ENTRY(EEPROM_RESET_CONFIG, "[c] Reset EEPROM config"); +MENU_ENTRY(EEPROM_GET_ENTRIES, "[E] Get EEPROM entries"); +MENU_ENTRY(EEPROM_ADD_ENTRY, "[e] Add last entry to EEPROM"); MENU_ENTRY(QUESTION, "?"); +const PROGMEM uint8_t commandIdMapping[] = { + 'R', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::RUN), + 'r', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::ONCE), + 'f', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::RAM), + 'b', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::BATTERY), + 'G', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::GPS_ON), + 'g', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::GPS_OFF), + 'L', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::GPS_GET), + 'l', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::GPS_SET), + 'I', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::I2C_ON), + 'i', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::I2C_OFF), + 'T', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET), + 't', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::RTC_SET), + 'W', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::SD_WRITE_TEST), + 'C', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONFIG), + 'c', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG), + 'E', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES), + 'e', static_cast(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY), +}; + const char * const MENU_ENTRIES[] PROGMEM = { MENU_HEADER, MENU_RUN, @@ -38,11 +63,12 @@ const char * const MENU_ENTRIES[] PROGMEM = { MENU_GPS_ON, MENU_GPS_OFF, MENU_GPS_GET, + MENU_GPS_SET, MENU_SEPARATOR, - MENU_RTC_ON, - MENU_RTC_OFF, + MENU_I2C_ON, + MENU_I2C_OFF, MENU_RTC_SET, MENU_RTC_GET, @@ -53,7 +79,9 @@ const char * const MENU_ENTRIES[] PROGMEM = { MENU_SEPARATOR, MENU_EEPROM_GET_CONFIG, + MENU_EEPROM_RESET_CONFIG, MENU_EEPROM_GET_ENTRIES, + MENU_EEPROM_ADD_ENTRY, MENU_QUESTION }; @@ -75,23 +103,35 @@ namespace debug { return freeRam2(); } + GPSTRACKER_DEBUG_COMMAND parseCommand(char id) { + size_t mappingArraySize = flash::getArraySize(commandIdMapping); + char commandId; + + for (uint8_t i = 0; i < mappingArraySize; i += 2) { + commandId = pgm_read_byte_near(commandIdMapping + i); + if (commandId == id) return static_cast(pgm_read_byte_near(commandIdMapping + i + 1)); + } + + return GPSTRACKER_DEBUG_COMMAND::NONE; + } + GPSTRACKER_DEBUG_COMMAND menu() { - if (!Serial) return GPSTRACKER_DEBUG_COMMAND::NONE; + if (!Serial) return GPSTRACKER_DEBUG_COMMAND::RUN; - uint8_t command; + GPSTRACKER_DEBUG_COMMAND command; size_t menuSize = flash::getArraySize(MENU_ENTRIES); do { for (uint8_t i = 0; i < menuSize; i++) { - Serial.println(reinterpret_cast(pgm_read_word(&MENU_ENTRIES[i]))); + Serial.println(reinterpret_cast(pgm_read_word_near(&MENU_ENTRIES[i]))); } - while (!Serial.available()); - command = static_cast(Serial.parseInt()); + while (!Serial.available()); + command = parseCommand(Serial.read()); while (Serial.available()) Serial.read(); - } while (command > static_cast(GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES)); + } while (command == GPSTRACKER_DEBUG_COMMAND::NONE); - return static_cast(command); + return command; } void getAndDisplayGpsPosition() { @@ -100,6 +140,10 @@ namespace debug { Log.notice(F("%d %s\n"), gpsStatus, gps::lastPosition); } + void setFakeGpsPosition() { + strncpy_P(gps::lastPosition, FAKE_GPS_ENTRY, GPS_POSITION_SIZE); + } + void getAndDisplayBattery() { hardware::sim808::powerOn(); SIM808ChargingStatus status = hardware::sim808::device.getChargingState(); @@ -118,9 +162,7 @@ namespace debug { void getAndDisplayEepromConfig() { hardware::i2c::eepromPowerOn(); config::read(); - hardware::i2c::eepromPowerOff(); - - Log.notice(F("%s, %s, %d, %d\n"), config::value.seed, config::value.version, config::value.firstEntry, config::value.lastEntry); + hardware::i2c::eepromPowerOff(); } void getAndDisplayEepromPositions() { @@ -136,6 +178,14 @@ namespace debug { } + void addLastPositionToEeprom() { + hardware::sim808::powerOn(); + SIM808ChargingStatus status = hardware::sim808::device.getChargingState(); + hardware::sim808::powerOff(); + + positions::appendLast(status, SIM808_GPS_STATUS::OFF); + } + void setRtcTime() { tmElements_t time; gps::getTime(time); diff --git a/GpsTracker/Debug.h b/GpsTracker/Debug.h index 69206db..fe7a332 100644 --- a/GpsTracker/Debug.h +++ b/GpsTracker/Debug.h @@ -29,20 +29,24 @@ namespace debug { enum class GPSTRACKER_DEBUG_COMMAND : uint8_t { - NONE = 0, - ONCE = 1, - RAM = 2, - BATTERY = 3, - GPS_ON = 4, - GPS_OFF = 5, - GPS_GET = 6, - RTC_ON = 7, - RTC_OFF = 8, - RTC_GET = 9, - RTC_SET = 10, - SD_WRITE_TEST = 11, - EEPROM_GET_CONFIG = 16, - EEPROM_GET_ENTRIES = 17 + NONE = 0, + RUN = 1, + ONCE = 2, + RAM = 3, + BATTERY = 4, + GPS_ON = 5, + GPS_OFF = 6, + GPS_GET = 7, + GPS_SET = 8, + I2C_ON = 9, + I2C_OFF = 10, + RTC_GET = 11, + RTC_SET = 12, + SD_WRITE_TEST = 13, + EEPROM_GET_CONFIG = 14, + EEPROM_RESET_CONFIG = 15, + EEPROM_GET_ENTRIES = 16, + EEPROM_ADD_ENTRY = 17 }; void waitForSerial(); @@ -52,12 +56,14 @@ namespace debug { void getAndDisplayBattery(); void getAndDisplayGpsPosition(); + void setFakeGpsPosition(); void getAndDisplayRtcTime(); void setRtcTime(); void getAndDisplayEepromConfig(); void getAndDisplayEepromPositions(); + void addLastPositionToEeprom(); inline void displayFreeRam() { Serial.println(freeRam()); } diff --git a/GpsTracker/GpsTracker.ino b/GpsTracker/GpsTracker.ino index 58c60e8..b167dab 100644 --- a/GpsTracker/GpsTracker.ino +++ b/GpsTracker/GpsTracker.ino @@ -18,13 +18,13 @@ void setup() { } void loop() { - debug::GPSTRACKER_DEBUG_COMMAND command = debug::GPSTRACKER_DEBUG_COMMAND::NONE; + debug::GPSTRACKER_DEBUG_COMMAND command = debug::GPSTRACKER_DEBUG_COMMAND::RUN; if(!bypassMenu) command = debug::menu(); - bypassMenu = command == debug::GPSTRACKER_DEBUG_COMMAND::NONE; + bypassMenu = command == debug::GPSTRACKER_DEBUG_COMMAND::RUN; switch (command) { - case debug::GPSTRACKER_DEBUG_COMMAND::NONE: + case debug::GPSTRACKER_DEBUG_COMMAND::RUN: case debug::GPSTRACKER_DEBUG_COMMAND::ONCE: core::main(); break; @@ -43,10 +43,13 @@ void loop() { case debug::GPSTRACKER_DEBUG_COMMAND::GPS_GET: debug::getAndDisplayGpsPosition(); break; - case debug::GPSTRACKER_DEBUG_COMMAND::RTC_ON: + case debug::GPSTRACKER_DEBUG_COMMAND::GPS_SET: + debug::setFakeGpsPosition(); + break; + case debug::GPSTRACKER_DEBUG_COMMAND::I2C_ON: rtc::powerOn(); break; - case debug::GPSTRACKER_DEBUG_COMMAND::RTC_OFF: + case debug::GPSTRACKER_DEBUG_COMMAND::I2C_OFF: rtc::powerOff(); break; case debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET: @@ -58,9 +61,15 @@ void loop() { case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONFIG: debug::getAndDisplayEepromConfig(); break; + case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG: + config::reset(); + break; case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES: debug::getAndDisplayEepromPositions(); break; + case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY: + debug::addLastPositionToEeprom(); + break; case debug::GPSTRACKER_DEBUG_COMMAND::SD_WRITE_TEST: default: Serial.println(F("Unsupported command !")); diff --git a/GpsTracker/Positions.cpp b/GpsTracker/Positions.cpp index 272fe51..c6efc72 100644 --- a/GpsTracker/Positions.cpp +++ b/GpsTracker/Positions.cpp @@ -61,10 +61,12 @@ namespace positions { void get(uint16_t &index, PositionEntry &entry) { uint16_t entryAddress = getEntryAddress(index); - + VERBOSE_FORMAT("get", "Reading %d @ %d (%X)", index, entryAddress, entryAddress); storage::powerOn(); hardware::i2c::eeprom.readBlock(entryAddress, entry); storage::powerOff(); + + VERBOSE_FORMAT("get", "Output index : %d", index); } bool needsToSend() {