diff --git a/examples/simple_sensor/SensorMesh.cpp b/examples/simple_sensor/SensorMesh.cpp index 5966e928..ce36e0c2 100644 --- a/examples/simple_sensor/SensorMesh.cpp +++ b/examples/simple_sensor/SensorMesh.cpp @@ -547,7 +547,26 @@ void SensorMesh::handleCommand(uint32_t sender_timestamp, char* command, char* r Serial.printf("\n"); } reply[0] = 0; - } else { + } else if (memcmp(command, "io ", 2) == 0) { // io {value}: write, io: read + if (command[2] == ' ') { // it's a write + uint32_t 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); + } + 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;