From 0ae8fd1e38fa622a971f47763f38b1d859704b8e Mon Sep 17 00:00:00 2001 From: biver Date: Thu, 3 Mar 2022 23:28:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F?= =?UTF-8?q?=D0=B5=D0=BC=20=D0=B2=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B8=20digitalWrite(pin),=20digitalRead(pin),=20digital?= =?UTF-8?q?Invert(pin)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/classes/IoTGpio.h | 1 + src/classes/IoTGpio.cpp | 6 ++++++ src/modules/Mcp23017.cpp | 4 ++++ src/modules/SysExt.cpp | 19 ++++++++++++++++++- 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/include/classes/IoTGpio.h b/include/classes/IoTGpio.h index a77341ea..a83a63c5 100644 --- a/include/classes/IoTGpio.h +++ b/include/classes/IoTGpio.h @@ -11,6 +11,7 @@ class IoTGpio { virtual int digitalRead(uint8_t pin); virtual int analogRead(uint8_t pin); virtual void analogWrite(uint8_t pin, int val); + virtual void digitalInvert(uint8_t pin); int index; void regDriver(IoTGpio* newDriver); diff --git a/src/classes/IoTGpio.cpp b/src/classes/IoTGpio.cpp index 161a6348..29e164e8 100644 --- a/src/classes/IoTGpio.cpp +++ b/src/classes/IoTGpio.cpp @@ -48,6 +48,12 @@ void IoTGpio::analogWrite(uint8_t pin, int val) { } } +void IoTGpio::digitalInvert(uint8_t pin) { + int pinH = pin/100; + if (_drivers[pinH]) _drivers[pinH]->digitalInvert(pin - pinH*100); + else ::digitalWrite(pin, 1 - ::digitalRead(pin)); +} + void IoTGpio::regDriver(IoTGpio* newDriver) { _drivers[newDriver->index] = newDriver; diff --git a/src/modules/Mcp23017.cpp b/src/modules/Mcp23017.cpp index cf6b748d..a360230f 100644 --- a/src/modules/Mcp23017.cpp +++ b/src/modules/Mcp23017.cpp @@ -36,6 +36,10 @@ class Mcp23017 : public IoTItem, IoTGpio { return mcp.digitalRead(pin); } + void digitalInvert(uint8_t pin) { + mcp.digitalWrite(pin, 1 - mcp.digitalRead(pin)); + } + ~Mcp23017() {}; }; diff --git a/src/modules/SysExt.cpp b/src/modules/SysExt.cpp index e8272f04..6686ebaa 100644 --- a/src/modules/SysExt.cpp +++ b/src/modules/SysExt.cpp @@ -31,8 +31,25 @@ class SysExt : public IoTItem { if (command == "reboot") { // выполняем код при вызове спец команды из сценария: ID.reboot(); ESP.restart(); + } else if (command == "digitalRead") { + if (param.size()) { + IoTgpio.pinMode(param[0].valD, INPUT); + value.valD = IoTgpio.digitalRead(param[0].valD); + return value; + } + } else if (command == "digitalWrite") { + if (param.size() == 2) { + IoTgpio.pinMode(param[0].valD, OUTPUT); + IoTgpio.digitalWrite(param[0].valD, param[1].valD); + return {}; + } + } else if (command == "digitalInvert") { + if (param.size()) { + IoTgpio.pinMode(param[0].valD, OUTPUT); + IoTgpio.digitalInvert(param[0].valD); + return {}; + } } - return {}; // команда поддерживает возвращаемое значения. Т.е. по итогу выполнения команды или общения с внешней системой, можно вернуть значение в сценарий для дальнейшей обработки }