gps_cli: gps state is now saved and restored upon reboot
This commit is contained in:
@@ -631,7 +631,12 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc
|
|||||||
_prefs.bridge_pkt_src = 0; // logTx
|
_prefs.bridge_pkt_src = 0; // logTx
|
||||||
_prefs.bridge_baud = 115200; // baud rate
|
_prefs.bridge_baud = 115200; // baud rate
|
||||||
_prefs.bridge_channel = 1; // channel 1
|
_prefs.bridge_channel = 1; // channel 1
|
||||||
|
|
||||||
StrHelper::strncpy(_prefs.bridge_secret, "LVSITANOS", sizeof(_prefs.bridge_secret));
|
StrHelper::strncpy(_prefs.bridge_secret, "LVSITANOS", sizeof(_prefs.bridge_secret));
|
||||||
|
|
||||||
|
// GPS defaults
|
||||||
|
_prefs.gps_enabled = 0;
|
||||||
|
_prefs.gps_interval = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyMesh::begin(FILESYSTEM *fs) {
|
void MyMesh::begin(FILESYSTEM *fs) {
|
||||||
@@ -653,8 +658,18 @@ void MyMesh::begin(FILESYSTEM *fs) {
|
|||||||
|
|
||||||
updateAdvertTimer();
|
updateAdvertTimer();
|
||||||
updateFloodAdvertTimer();
|
updateFloodAdvertTimer();
|
||||||
|
|
||||||
|
#if ENV_INCLUDE_GPS == 1
|
||||||
|
applyGpsPrefs();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENV_INCLUDE_GPS == 1
|
||||||
|
void MyMesh::applyGpsPrefs() {
|
||||||
|
sensors.setSettingByKey("gps", _prefs.gps_enabled?"1":"0");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) {
|
void MyMesh::applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) {
|
||||||
set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params
|
set_radio_at = futureMillis(2000); // give CLI reply some time to be sent back, before applying temp radio params
|
||||||
pending_freq = freq;
|
pending_freq = freq;
|
||||||
|
|||||||
@@ -159,6 +159,10 @@ public:
|
|||||||
_cli.savePrefs(_fs);
|
_cli.savePrefs(_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENV_INCLUDE_GPS == 1
|
||||||
|
void applyGpsPrefs();
|
||||||
|
#endif
|
||||||
|
|
||||||
void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override;
|
void applyTempRadioParams(float freq, float bw, uint8_t sf, uint8_t cr, int timeout_mins) override;
|
||||||
bool formatFileSystem() override;
|
bool formatFileSystem() override;
|
||||||
void sendSelfAdvertisement(int delay_millis) override;
|
void sendSelfAdvertisement(int delay_millis) override;
|
||||||
|
|||||||
@@ -62,8 +62,12 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
file.read((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128
|
file.read((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128
|
||||||
file.read((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130
|
file.read((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130
|
||||||
file.read((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131
|
file.read((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131
|
||||||
file.read((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 132
|
file.read((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 135
|
||||||
file.read((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 133
|
file.read((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 136
|
||||||
|
file.read(pad, 4); // 152
|
||||||
|
file.read((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156
|
||||||
|
file.read((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157
|
||||||
|
// 161
|
||||||
|
|
||||||
// sanitise bad pref values
|
// sanitise bad pref values
|
||||||
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
_prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f);
|
||||||
@@ -84,6 +88,8 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) {
|
|||||||
_prefs->bridge_baud = constrain(_prefs->bridge_baud, 9600, 115200);
|
_prefs->bridge_baud = constrain(_prefs->bridge_baud, 9600, 115200);
|
||||||
_prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14);
|
_prefs->bridge_channel = constrain(_prefs->bridge_channel, 0, 14);
|
||||||
|
|
||||||
|
_prefs->gps_enabled = constrain(_prefs->gps_enabled, 0, 1);
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,8 +137,12 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) {
|
|||||||
file.write((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128
|
file.write((uint8_t *)&_prefs->bridge_delay, sizeof(_prefs->bridge_delay)); // 128
|
||||||
file.write((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130
|
file.write((uint8_t *)&_prefs->bridge_pkt_src, sizeof(_prefs->bridge_pkt_src)); // 130
|
||||||
file.write((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131
|
file.write((uint8_t *)&_prefs->bridge_baud, sizeof(_prefs->bridge_baud)); // 131
|
||||||
file.write((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 132
|
file.write((uint8_t *)&_prefs->bridge_channel, sizeof(_prefs->bridge_channel)); // 135
|
||||||
file.write((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 133
|
file.write((uint8_t *)&_prefs->bridge_secret, sizeof(_prefs->bridge_secret)); // 136
|
||||||
|
file.write(pad, 4); // 152
|
||||||
|
file.write((uint8_t *)&_prefs->gps_enabled, sizeof(_prefs->gps_enabled)); // 156
|
||||||
|
file.write((uint8_t *)&_prefs->gps_interval, sizeof(_prefs->gps_interval)); // 157
|
||||||
|
// 161
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
@@ -147,27 +157,6 @@ void CommonCLI::savePrefs() {
|
|||||||
_callbacks->savePrefs();
|
_callbacks->savePrefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* CommonCLI::sensorGetCustomVar(const char* key) {
|
|
||||||
int num = sensors.getNumSettings();
|
|
||||||
for (int i = 0; i < num; i++) {
|
|
||||||
if (strcmp(sensors.getSettingName(i), key) == 0) {
|
|
||||||
return sensors.getSettingValue(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CommonCLI::sensorSetCustomVar(const char* key, const char* value) {
|
|
||||||
int num = sensors.getNumSettings();
|
|
||||||
for (int i = 0; i < num; i++) {
|
|
||||||
if (strcmp(sensors.getSettingName(i), key) == 0) {
|
|
||||||
sensors.setSettingValue(key, value);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, char* reply) {
|
void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, char* reply) {
|
||||||
if (memcmp(command, "reboot", 6) == 0) {
|
if (memcmp(command, "reboot", 6) == 0) {
|
||||||
_board->reboot(); // doesn't return
|
_board->reboot(); // doesn't return
|
||||||
@@ -527,7 +516,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
sprintf(reply, "%s", _board->getManufacturerName());
|
sprintf(reply, "%s", _board->getManufacturerName());
|
||||||
} else if (memcmp(command, "sensor get ", 11) == 0) {
|
} else if (memcmp(command, "sensor get ", 11) == 0) {
|
||||||
const char* key = command + 11;
|
const char* key = command + 11;
|
||||||
const char* val = sensorGetCustomVar(key);
|
const char* val = sensors.getSettingByKey(key);
|
||||||
if (val != NULL) {
|
if (val != NULL) {
|
||||||
strcpy(reply, val);
|
strcpy(reply, val);
|
||||||
} else {
|
} else {
|
||||||
@@ -538,7 +527,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
const char* value = strchr(args,' ') + 1;
|
const char* value = strchr(args,' ') + 1;
|
||||||
char key [value-args+1];
|
char key [value-args+1];
|
||||||
strncpy(key, args, value-args-1);
|
strncpy(key, args, value-args-1);
|
||||||
if (sensorSetCustomVar(key, value)) {
|
if (sensors.setSettingByKey(key, value)) {
|
||||||
strcpy(reply, "ok");
|
strcpy(reply, "ok");
|
||||||
} else {
|
} else {
|
||||||
strcpy(reply, "can't find custom var");
|
strcpy(reply, "can't find custom var");
|
||||||
@@ -570,13 +559,17 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
}
|
}
|
||||||
#if ENV_INCLUDE_GPS == 1
|
#if ENV_INCLUDE_GPS == 1
|
||||||
} else if (memcmp(command, "gps on", 6) == 0) {
|
} else if (memcmp(command, "gps on", 6) == 0) {
|
||||||
if (sensorSetCustomVar("gps", "1")) {
|
if (sensors.setSettingByKey("gps", "1")) {
|
||||||
|
_prefs->gps_enabled = 1;
|
||||||
|
savePrefs();
|
||||||
strcpy(reply, "ok");
|
strcpy(reply, "ok");
|
||||||
} else {
|
} else {
|
||||||
strcpy(reply, "gps toggle not found");
|
strcpy(reply, "gps toggle not found");
|
||||||
}
|
}
|
||||||
} else if (memcmp(command, "gps off", 7) == 0) {
|
} else if (memcmp(command, "gps off", 7) == 0) {
|
||||||
if (sensorSetCustomVar("gps", "0")) {
|
if (sensors.setSettingByKey("gps", "0")) {
|
||||||
|
_prefs->gps_enabled = 0;
|
||||||
|
savePrefs();
|
||||||
strcpy(reply, "ok");
|
strcpy(reply, "ok");
|
||||||
} else {
|
} else {
|
||||||
strcpy(reply, "gps toggle not found");
|
strcpy(reply, "gps toggle not found");
|
||||||
@@ -592,7 +585,7 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch
|
|||||||
bool enabled = l->isEnabled(); // is EN pin on ?
|
bool enabled = l->isEnabled(); // is EN pin on ?
|
||||||
bool fix = l->isValid(); // has fix ?
|
bool fix = l->isValid(); // has fix ?
|
||||||
int sats = l->satellitesCount();
|
int sats = l->satellitesCount();
|
||||||
bool active = !strcmp(sensorGetCustomVar("gps"), "1");
|
bool active = !strcmp(sensors.getSettingByKey("gps"), "1");
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
sprintf(reply, "on, %s, %s, %d sats",
|
sprintf(reply, "on, %s, %s, %d sats",
|
||||||
active?"active":"deactivated",
|
active?"active":"deactivated",
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ struct NodePrefs { // persisted to file
|
|||||||
uint32_t bridge_baud; // 9600, 19200, 38400, 57600, 115200 (default 115200)
|
uint32_t bridge_baud; // 9600, 19200, 38400, 57600, 115200 (default 115200)
|
||||||
uint8_t bridge_channel; // 1-14 (ESP-NOW only)
|
uint8_t bridge_channel; // 1-14 (ESP-NOW only)
|
||||||
char bridge_secret[16]; // for XOR encryption of bridge packets (ESP-NOW only)
|
char bridge_secret[16]; // for XOR encryption of bridge packets (ESP-NOW only)
|
||||||
|
// Gps settings
|
||||||
|
uint8_t gps_enabled;
|
||||||
|
uint32_t gps_interval; // in seconds
|
||||||
};
|
};
|
||||||
|
|
||||||
class CommonCLICallbacks {
|
class CommonCLICallbacks {
|
||||||
@@ -83,9 +86,6 @@ class CommonCLI {
|
|||||||
void savePrefs();
|
void savePrefs();
|
||||||
void loadPrefsInt(FILESYSTEM* _fs, const char* filename);
|
void loadPrefsInt(FILESYSTEM* _fs, const char* filename);
|
||||||
|
|
||||||
const char* sensorGetCustomVar(const char* key);
|
|
||||||
bool sensorSetCustomVar(const char* key, const char* value);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CommonCLI(mesh::MainBoard& board, mesh::RTCClock& rtc, NodePrefs* prefs, CommonCLICallbacks* callbacks)
|
CommonCLI(mesh::MainBoard& board, mesh::RTCClock& rtc, NodePrefs* prefs, CommonCLICallbacks* callbacks)
|
||||||
: _board(&board), _rtc(&rtc), _prefs(prefs), _callbacks(callbacks) { }
|
: _board(&board), _rtc(&rtc), _prefs(prefs), _callbacks(callbacks) { }
|
||||||
|
|||||||
@@ -23,4 +23,25 @@ public:
|
|||||||
virtual const char* getSettingValue(int i) const { return NULL; }
|
virtual const char* getSettingValue(int i) const { return NULL; }
|
||||||
virtual bool setSettingValue(const char* name, const char* value) { return false; }
|
virtual bool setSettingValue(const char* name, const char* value) { return false; }
|
||||||
virtual LocationProvider* getLocationProvider() { return NULL; }
|
virtual LocationProvider* getLocationProvider() { return NULL; }
|
||||||
|
|
||||||
|
// Helper functions to manage setting by keys (useful in many places ...)
|
||||||
|
const char* getSettingByKey(const char* key) {
|
||||||
|
int num = getNumSettings();
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
if (strcmp(getSettingName(i), key) == 0) {
|
||||||
|
return getSettingValue(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool setSettingByKey(const char* key, const char* value) {
|
||||||
|
int num = getNumSettings();
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
if (strcmp(getSettingName(i), key) == 0) {
|
||||||
|
return setSettingValue(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user