cli_gps: use sensormanger to toggle gps on/off to keep state coherent

This commit is contained in:
Florent 2025-10-05 20:31:25 +02:00
parent 0502bc370d
commit e4f2d63b0a
4 changed files with 36 additions and 15 deletions

View file

@ -761,11 +761,15 @@ void MyMesh::removeNeighbor(const uint8_t *pubkey, int key_len) {
void MyMesh::gpsGetStatus(char * reply) { void MyMesh::gpsGetStatus(char * reply) {
LocationProvider * l = sensors.getLocationProvider(); LocationProvider * l = sensors.getLocationProvider();
if (l != NULL) { if (l != NULL) {
bool status = l->isActive(); bool enabled = l->isEnabled(); // is EN pin on ?
bool sync = l->isValid(); bool active = gpsGetState(); // is enabled at SensorManager level ?
bool fix = l->isValid(); // has fix ?
int sats = l->satellitesCount(); int sats = l->satellitesCount();
if (status) { if (enabled) {
sprintf(reply, "on, %s, %d sats", sync?"fix":"no fix", sats); sprintf(reply, "on, %s, %s, %d sats",
active?"active":"deactivated",
fix?"fix":"no fix",
sats);
} else { } else {
strcpy(reply, "off"); strcpy(reply, "off");
} }
@ -774,19 +778,33 @@ void MyMesh::gpsGetStatus(char * reply) {
} }
} }
void MyMesh::gpsStart() { bool MyMesh::gpsGetState() {
LocationProvider * l = sensors.getLocationProvider(); int num = sensors.getNumSettings();
if (l != NULL) { for (int i = 0; i < num; i++) {
l->begin(); if (strcmp(sensors.getSettingName(i), "gps") == 0) {
l->reset(); return !strcmp(sensors.getSettingValue(i), "1");
}
} }
return false;
}
void MyMesh::gpsSetState(bool value) {
// toggle GPS on/off
int num = sensors.getNumSettings();
for (int i = 0; i < num; i++) {
if (strcmp(sensors.getSettingName(i), "gps") == 0) {
sensors.setSettingValue("gps", value?"1":"0");
break;
}
}
}
void MyMesh::gpsStart() {
gpsSetState(true);
} }
void MyMesh::gpsStop() { void MyMesh::gpsStop() {
LocationProvider * l = sensors.getLocationProvider(); gpsSetState(false);
if (l != NULL) {
l->stop();
}
} }
void MyMesh::gpsSyncTime() { void MyMesh::gpsSyncTime() {

View file

@ -142,6 +142,9 @@ protected:
void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t* secret, uint8_t* data, size_t len) override; void onPeerDataRecv(mesh::Packet* packet, uint8_t type, int sender_idx, const uint8_t* secret, uint8_t* data, size_t len) override;
bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override; bool onPeerPathRecv(mesh::Packet* packet, int sender_idx, const uint8_t* secret, uint8_t* path, uint8_t path_len, uint8_t extra_type, uint8_t* extra, uint8_t extra_len) override;
bool gpsGetState();
void gpsSetState(bool value);
public: public:
MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables);

View file

@ -21,5 +21,5 @@ public:
virtual void begin() = 0; virtual void begin() = 0;
virtual void stop() = 0; virtual void stop() = 0;
virtual void loop() = 0; virtual void loop() = 0;
virtual bool isActive() = 0; virtual bool isEnabled() = 0;
}; };

View file

@ -78,7 +78,7 @@ public :
} }
} }
bool isActive() override { bool isEnabled() override {
// directly read the enable pin if present as gps can be // directly read the enable pin if present as gps can be
// activated/deactivated outside of here ... // activated/deactivated outside of here ...
if (_pin_en != -1) { if (_pin_en != -1) {