瀏覽代碼

Fixed positions saving and reading

tags/v1.2.0
Bertrand Lemasle 7 年之前
父節點
當前提交
a4cc7b250a
共有 8 個文件被更改,包括 131 次插入66 次删除
  1. +17
    -6
      GpsTracker/Config.cpp
  2. +1
    -1
      GpsTracker/Config.h
  3. +62
    -26
      GpsTracker/Debug.cpp
  4. +6
    -2
      GpsTracker/Debug.h
  5. +6
    -0
      GpsTracker/GpsTracker.ino
  6. +36
    -29
      GpsTracker/Positions.cpp
  7. +2
    -1
      GpsTracker/Positions.h
  8. +1
    -1
      GpsTracker/Rtc.cpp

+ 17
- 6
GpsTracker/Config.cpp 查看文件

@@ -7,8 +7,18 @@
namespace config { namespace config {
Config value; Config value;


void format() {
VERBOSE("format");
hardware::i2c::eepromPowerOn();
for (int i = 0; i < 1024; i++)
{
hardware::i2c::eeprom.write(i, 0);
}
hardware::i2c::eepromPowerOff();
}

void write() { void write() {
VERBOSE_FORMAT("writeConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
VERBOSE_FORMAT("write", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);


hardware::i2c::eepromPowerOn(); hardware::i2c::eepromPowerOn();
int written = hardware::i2c::eeprom.writeBlock(CONFIG_ADDR, value); int written = hardware::i2c::eeprom.writeBlock(CONFIG_ADDR, value);
@@ -16,18 +26,19 @@ namespace config {
} }


void reset() { void reset() {
VERBOSE("resetConfig");
VERBOSE("reset");
Config config = { Config config = {
CONFIG_SEED, CONFIG_SEED,
VERSION, VERSION,
0,
0
0xFFFF,
0xFFFF
}; };


value = config; value = config;
format();
write(); write();


VERBOSE_FORMAT("resetConfig", "value : %s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
VERBOSE_FORMAT("reset", "value : %s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
} }


void read() { void read() {
@@ -36,7 +47,7 @@ namespace config {
if (!String(CONFIG_SEED).equals(value.seed)) reset(); if (!String(CONFIG_SEED).equals(value.seed)) reset();
hardware::i2c::eepromPowerOff(); hardware::i2c::eepromPowerOff();


VERBOSE_FORMAT("readConfig", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);
VERBOSE_FORMAT("read", "%s, %s, %d, %d", value.seed, value.version, value.firstEntry, value.lastEntry);


} }
} }

+ 1
- 1
GpsTracker/Config.h 查看文件

@@ -15,7 +15,7 @@ struct Config {
}; };


#define CONFIG_ADDR 0 #define CONFIG_ADDR 0
#define CONFIG_SEED "UIYA"
#define CONFIG_SEED "UIYB"
#define VERSION "1.00" #define VERSION "1.00"


#define SLEEP_DEFAULT_TIME_SECONDS 1800 #define SLEEP_DEFAULT_TIME_SECONDS 1800


+ 62
- 26
GpsTracker/Debug.cpp 查看文件

@@ -9,22 +9,24 @@ const char FAKE_GPS_ENTRY[] PROGMEM = "1,1,20170924074842.000,49.454862,1.144537
MENU_ENTRY(HEADER, "-- Debug Menu --"); MENU_ENTRY(HEADER, "-- Debug Menu --");
MENU_ENTRY(SEPARATOR, "----"); MENU_ENTRY(SEPARATOR, "----");


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(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, "?");
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(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, "[S] Get EEPROM config");
MENU_ENTRY(EEPROM_RESET_CONFIG, "[s] Reset EEPROM config");
MENU_ENTRY(EEPROM_GET_CONTENT, "[C] Get EEPROM content");
MENU_ENTRY(EEPROM_GET_ENTRIES, "[P] Get EEPROM entries");
MENU_ENTRY(EEPROM_GET_LAST_ENTRY, "[p] Get EEPROM last entry");
MENU_ENTRY(EEPROM_ADD_ENTRY, "[a] Add last entry to EEPROM");
MENU_ENTRY(QUESTION, "?");


const PROGMEM uint8_t commandIdMapping[] = { const PROGMEM uint8_t commandIdMapping[] = {
'R', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RUN), 'R', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RUN),
@@ -38,10 +40,12 @@ const PROGMEM uint8_t commandIdMapping[] = {
'T', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET), 'T', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_GET),
't', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_SET), 't', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::RTC_SET),
'W', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::SD_WRITE_TEST), 'W', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::SD_WRITE_TEST),
'C', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONFIG),
'c', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG),
'E', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES),
'e', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY),
'S', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONFIG),
's', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG),
'C', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONTENT),
'P', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES),
'p', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_LAST_ENTRY),
'a', static_cast<uint8_t>(debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY),
}; };


const char * const MENU_ENTRIES[] PROGMEM = { const char * const MENU_ENTRIES[] PROGMEM = {
@@ -74,7 +78,9 @@ const char * const MENU_ENTRIES[] PROGMEM = {


MENU_EEPROM_GET_CONFIG, MENU_EEPROM_GET_CONFIG,
MENU_EEPROM_RESET_CONFIG, MENU_EEPROM_RESET_CONFIG,
MENU_EEPROM_GET_CONTENT,
MENU_EEPROM_GET_ENTRIES, MENU_EEPROM_GET_ENTRIES,
MENU_EEPROM_GET_LAST_ENTRY,
MENU_EEPROM_ADD_ENTRY, MENU_EEPROM_ADD_ENTRY,


MENU_QUESTION MENU_QUESTION
@@ -88,6 +94,12 @@ int freeRam2() { // dirty hack because putting it in namespace doesn't compile


namespace debug { namespace debug {


namespace details {
inline void displayPosition(PositionEntry entry) {
Log.notice(F("%d%%, %dmV, %d, %s\n"), entry.battery.level, entry.battery.voltage, entry.status, entry.position);
}
}

void waitForSerial() { void waitForSerial() {
while (!Serial); while (!Serial);
Serial.begin(DEBUG_SERIAL_SPEED); Serial.begin(DEBUG_SERIAL_SPEED);
@@ -159,17 +171,41 @@ namespace debug {
config::read(); config::read();
} }


void getAndDisplayEepromContent() {
char buffer[128];
hardware::i2c::eepromPowerOn();

//Serial.print('[');
for (int i = 0; i < 8; i++) {
hardware::i2c::eeprom.read(128 * i, buffer, 128);
for (int i = 0; i < 128; i++) {
//if (buffer[i] == 0) Serial.print(' ');
//else
Serial.print(buffer[i], HEX);
}
}
//Serial.println(']');
Serial.println();
hardware::i2c::eepromPowerOff();
Log.notice("Done\n");
}

void getAndDisplayEepromPositions() { void getAndDisplayEepromPositions() {
uint16_t firstEntryIndex = config::value.firstEntry;
uint16_t currentEntryIndex = firstEntryIndex;
uint16_t currentEntryIndex = config::value.firstEntry;
PositionEntry currentEntry; PositionEntry currentEntry;


do {
while(positions::moveNext(currentEntryIndex)) {
positions::get(currentEntryIndex, currentEntry); positions::get(currentEntryIndex, currentEntry);
Log.notice(F("%d%%, %dmV, %d, %s\n"), currentEntry.battery.level, currentEntry.battery.voltage, currentEntry.status, currentEntry.position);
details::displayPosition(currentEntry);
}
}


} while (currentEntryIndex != config::value.lastEntry);
void getAndDisplayEepromLastPosition() {
uint16_t lastEntryIndex = config::value.lastEntry;
PositionEntry lastEntry;

positions::get(lastEntryIndex, lastEntry);
details::displayPosition(lastEntry);
} }


void addLastPositionToEeprom() { void addLastPositionToEeprom() {


+ 6
- 2
GpsTracker/Debug.h 查看文件

@@ -43,8 +43,10 @@ namespace debug {
SD_WRITE_TEST = 13, SD_WRITE_TEST = 13,
EEPROM_GET_CONFIG = 14, EEPROM_GET_CONFIG = 14,
EEPROM_RESET_CONFIG = 15, EEPROM_RESET_CONFIG = 15,
EEPROM_GET_ENTRIES = 16,
EEPROM_ADD_ENTRY = 17
EEPROM_GET_CONTENT = 16,
EEPROM_GET_LAST_ENTRY = 17,
EEPROM_GET_ENTRIES = 18,
EEPROM_ADD_ENTRY = 19
}; };


void waitForSerial(); void waitForSerial();
@@ -60,7 +62,9 @@ namespace debug {
void setRtcTime(); void setRtcTime();


void getAndDisplayEepromConfig(); void getAndDisplayEepromConfig();
void getAndDisplayEepromContent();
void getAndDisplayEepromPositions(); void getAndDisplayEepromPositions();
void getAndDisplayEepromLastPosition();
void addLastPositionToEeprom(); void addLastPositionToEeprom();


inline void displayFreeRam() { Serial.println(freeRam()); } inline void displayFreeRam() { Serial.println(freeRam()); }


+ 6
- 0
GpsTracker/GpsTracker.ino 查看文件

@@ -59,9 +59,15 @@ void loop() {
case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG: case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_RESET_CONFIG:
config::reset(); config::reset();
break; break;
case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_CONTENT:
debug::getAndDisplayEepromContent();
break;
case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES: case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_ENTRIES:
debug::getAndDisplayEepromPositions(); debug::getAndDisplayEepromPositions();
break; break;
case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_GET_LAST_ENTRY:
debug::getAndDisplayEepromLastPosition();
break;
case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY: case debug::GPSTRACKER_DEBUG_COMMAND::EEPROM_ADD_ENTRY:
debug::addLastPositionToEeprom(); debug::addLastPositionToEeprom();
break; break;


+ 36
- 29
GpsTracker/Positions.cpp 查看文件

@@ -13,60 +13,67 @@


namespace positions { namespace positions {


uint16_t getEntryAddress(uint16_t &index) {
uint16_t address = ENTRIES_ADDR + (ENTRY_RESERVED_SIZE * index);
if (address + ENTRY_RESERVED_SIZE > E24_MAX_ADDRESS(hardware::i2c::eeprom.getSize())) {
address = ENTRIES_ADDR;
index = 0;
}
uint16_t _maxEntryIndex = (E24_MAX_ADDRESS(hardware::i2c::eeprom.getSize()) - ENTRIES_ADDR) / ENTRY_RESERVED_SIZE;


return address;
}

void setEntriesIndexes(uint16_t lastEntry) {
uint16_t firstEntry = config::value.firstEntry;

while (config::value.lastEntry < config::value.firstEntry) {
config::value.firstEntry++;
getEntryAddress(firstEntry);
}

config::value.lastEntry = lastEntry;
config::value.firstEntry = firstEntry;
uint16_t getEntryAddress(uint16_t index) {
if (index > _maxEntryIndex) return -1;
return ENTRIES_ADDR + (ENTRY_RESERVED_SIZE * index);
} }


void appendLast(const SIM808ChargingStatus battery, const SIM808_GPS_STATUS gpsStatus) { void appendLast(const SIM808ChargingStatus battery, const SIM808_GPS_STATUS gpsStatus) {
VERBOSE("appendLast"); VERBOSE("appendLast");


uint16_t entryIndex;
uint16_t lastEntryIndex;
uint16_t firstEntryIndex;
uint16_t entryAddress; uint16_t entryAddress;
PositionEntry entry = { battery, gpsStatus }; PositionEntry entry = { battery, gpsStatus };
strlcpy(entry.position, gps::lastPosition, POSITION_SIZE); strlcpy(entry.position, gps::lastPosition, POSITION_SIZE);


storage::powerOn(); storage::powerOn();
config::read(); config::read();
entryIndex = config::value.lastEntry + 1;
entryAddress = getEntryAddress(entryIndex);
bool success = hardware::i2c::eeprom.writeBlock(entryAddress, entry);
firstEntryIndex = config::value.firstEntry;
lastEntryIndex = config::value.lastEntry;


lastEntryIndex++;
if (lastEntryIndex > _maxEntryIndex) lastEntryIndex = 0;
if (lastEntryIndex == firstEntryIndex) firstEntryIndex++;
if (firstEntryIndex > _maxEntryIndex) firstEntryIndex = 0;

entryAddress = getEntryAddress(lastEntryIndex);
bool success = hardware::i2c::eeprom.writeBlock(entryAddress, entry);
if (success) { if (success) {
VERBOSE_MSG("appendLast", "written to EEPROM");
setEntriesIndexes(entryIndex);
VERBOSE_FORMAT("appendLast", "Written to EEPROM @ %X : [%d%% @ %dmV] [%d, %s]", entryAddress, battery.level, battery.voltage, gpsStatus, entry.position);
config::value.firstEntry = firstEntryIndex;
config::value.lastEntry = lastEntryIndex;
config::write(); config::write();
} }


storage::powerOff(); storage::powerOff();
} }


void get(uint16_t &index, PositionEntry &entry) {
void get(uint16_t index, PositionEntry &entry) {
uint16_t entryAddress = getEntryAddress(index); uint16_t entryAddress = getEntryAddress(index);
VERBOSE_FORMAT("get", "Reading %d @ %d (%X)", index, entryAddress, entryAddress);
if (entryAddress == -1) return;

VERBOSE_FORMAT("get", "Reading entry n°%d @ %X", index, entryAddress);

storage::powerOn(); storage::powerOn();
hardware::i2c::eeprom.readBlock(entryAddress, entry); hardware::i2c::eeprom.readBlock(entryAddress, entry);
storage::powerOff(); storage::powerOff();


VERBOSE_FORMAT("get", "Output index : %d", index);
VERBOSE_FORMAT("get", "Read from EEPROM @ %X : [%d%% @ %dmV] [%d, %s]", entryAddress, entry.battery.level, entry.battery.voltage, entry.status, entry.position);
}

bool moveNext(uint16_t &index) {
config::read();
if (index == config::value.lastEntry) return false;
if (index == _maxEntryIndex) index = 0; //could use a modulo but easier to understand that way
else index++;

return true;
} }


bool needsToSend() { bool needsToSend() {


+ 2
- 1
GpsTracker/Positions.h 查看文件

@@ -13,7 +13,8 @@ struct PositionEntry {
namespace positions { namespace positions {
void appendLast(const SIM808ChargingStatus battery, const SIM808_GPS_STATUS gpsStatus); void appendLast(const SIM808ChargingStatus battery, const SIM808_GPS_STATUS gpsStatus);


void get(uint16_t &index, PositionEntry &entry);
void get(uint16_t index, PositionEntry &entry);
bool moveNext(uint16_t &index);


bool needsToSend(); bool needsToSend();
void send(); void send();

+ 1
- 1
GpsTracker/Rtc.cpp 查看文件

@@ -47,7 +47,7 @@ namespace rtc {
hardware::i2c::rtcPowerOff(); hardware::i2c::rtcPowerOff();


details::readTimeFromRegisters(time); details::readTimeFromRegisters(time);
VERBOSE_FORMAT("getTime", "%d / %d / %d %d:%d : %d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
VERBOSE_FORMAT("getTime", "%d/%d/%d %d:%d:%d", tmYearToCalendar(time.Year), time.Month, time.Day, time.Hour, time.Minute, time.Second);
} }


void setTime(tmElements_t &time) { void setTime(tmElements_t &time) {


Loading…
取消
儲存