From b5a8a1a8836cdd23312f995d01d481718c1c5935 Mon Sep 17 00:00:00 2001 From: Florent Date: Tue, 22 Jul 2025 21:08:15 +0200 Subject: [PATCH 1/2] sensors: gpio command --- examples/simple_sensor/SensorMesh.cpp | 11 ++++++++++- src/MeshCore.h | 2 ++ variants/rak3x72/target.h | 17 +++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index abdc7182..38af81e6 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -545,7 +545,16 @@ void SensorMesh::handleCommand(uint32_t sender_timestamp, char* command, char* r Serial.printf("\n"); } reply[0] = 0; - } else { + } else if (memcmp(command, "gpio ", 4) == 0) { // gpio {value}: write, gpio: read + if (command[4] == ' ') { // it's a write + uint32_t val; + sscanf(&command[5], "%x", &val); + board.setGpio(val); + strcpy(reply, "Ok"); + } else { + sprintf(reply, "%x", board.getGpio()); + } + } else{ _cli.handleCommand(sender_timestamp, command, reply); // common CLI commands } } diff --git a/src/MeshCore.h b/src/MeshCore.h index 98134e50..d8886136 100644 --- a/src/MeshCore.h +++ b/src/MeshCore.h @@ -41,6 +41,8 @@ public: virtual void onAfterTransmit() { } virtual void reboot() = 0; virtual void powerOff() { /* no op */ } + virtual uint32_t getGpio() { return 0; } + virtual void setGpio(uint32_t values) {} virtual uint8_t getStartupReason() const = 0; virtual bool startOTAUpdate(const char* id, char reply[]) { return false; } // not supported }; diff --git a/variants/rak3x72/target.h b/variants/rak3x72/target.h index 61e4747d..e0c1441e 100644 --- a/variants/rak3x72/target.h +++ b/variants/rak3x72/target.h @@ -13,6 +13,12 @@ class RAK3x72Board : public STM32Board { public: + void begin() override { + STM32Board::begin(); + pinMode(PA0, OUTPUT); + pinMode(PA1, OUTPUT); + } + const char* getManufacturerName() const override { return "RAK 3x72"; } @@ -25,6 +31,17 @@ public: } return ((double)raw) * ADC_MULTIPLIER / 8 / 4096; } + + void setGpio(uint32_t values) override { + // set led values + digitalWrite(PA0, values & 1); + digitalWrite(PA1, (values & 2) >> 1); + } + + uint32_t getGpio() override { + // get led value + return (digitalRead(PA1) << 1) | digitalRead(PA0); + } }; extern RAK3x72Board board; From 479b8ed0ce9add21f647cc5300107f2bd2cf25b5 Mon Sep 17 00:00:00 2001 From: Florent Date: Wed, 23 Jul 2025 08:02:57 +0200 Subject: [PATCH 2/2] sensors: gpio apply masks --- examples/simple_sensor/SensorMesh.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 38af81e6..24e6b62b 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -545,15 +545,25 @@ void SensorMesh::handleCommand(uint32_t sender_timestamp, char* command, char* r Serial.printf("\n"); } reply[0] = 0; - } else if (memcmp(command, "gpio ", 4) == 0) { // gpio {value}: write, gpio: read - if (command[4] == ' ') { // it's a write + } else if (memcmp(command, "io ", 2) == 0) { // io {value}: write, io: read + if (command[2] == ' ') { // it's a write uint32_t val; - sscanf(&command[5], "%x", &val); + uint32_t g = board.getGpio(); + if (command[3] == 'r') { // reset bits + sscanf(&command[4], "%x", &val); + val = g & ~val; + } else if (command[3] == 's') { // set bits + sscanf(&command[4], "%x", &val); + val |= g; + } else if (command[3] == 't') { // toggle bits + sscanf(&command[4], "%x", &val); + val ^= g; + } else { // set value + sscanf(&command[3], "%x", &val); + } board.setGpio(val); - strcpy(reply, "Ok"); - } else { - sprintf(reply, "%x", board.getGpio()); } + sprintf(reply, "%x", board.getGpio()); } else{ _cli.handleCommand(sender_timestamp, command, reply); // common CLI commands }