Переписываем взаимодействие c драйверами IoTGpio

This commit is contained in:
2022-10-01 22:58:27 +03:00
parent 98812e7470
commit 7def6d0543
4 changed files with 58 additions and 42 deletions

View File

@@ -41,7 +41,7 @@ class IoTItem {
bool needSave = false; bool needSave = false;
bool enableDoByInt = true; bool enableDoByInt = true;
virtual bool isGpioDriver(); virtual IoTGpio* getGpioDriver();
virtual void setValue(IoTValue Value); virtual void setValue(IoTValue Value);
virtual void setValue(String valStr); virtual void setValue(String valStr);

View File

@@ -26,8 +26,9 @@ void configure(String path) {
//(IoTItem*) - getAPI вернула ссылку, что бы ее привести к классу IoTItem используем //(IoTItem*) - getAPI вернула ссылку, что бы ее привести к классу IoTItem используем
myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement); myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement);
if (myIoTItem) { if (myIoTItem) {
void* driver;
// пробуем спросить драйвер GPIO // пробуем спросить драйвер GPIO
if (myIoTItem->isGpioDriver()) IoTgpio.regDriver((IoTGpio*)myIoTItem); if (driver = myIoTItem->getGpioDriver()) IoTgpio.regDriver((IoTGpio*)driver);
IoTItems.push_back(myIoTItem); IoTItems.push_back(myIoTItem);
} }

View File

@@ -146,8 +146,8 @@ void IoTItem::setInterval(unsigned long interval) {
_interval = interval; _interval = interval;
} }
bool IoTItem::isGpioDriver() { IoTGpio* IoTItem::getGpioDriver() {
return false; return nullptr;
} }
//сетевое общение==================================================================================================================================== //сетевое общение====================================================================================================================================

View File

@@ -3,64 +3,79 @@
#include "classes/IoTGpio.h" #include "classes/IoTGpio.h"
#include <Adafruit_MCP23X17.h> #include <Adafruit_MCP23X17.h>
class Mcp23017 : public IoTItem, IoTGpio { void scanI2C();
class Mcp23017Driver : public IoTGpio {
private: private:
Adafruit_MCP23X17 _mcp;
public: public:
Adafruit_MCP23X17 mcp; Mcp23017Driver(int index, String addr) : IoTGpio(index) {
if (!_mcp.begin_I2C(hexStringToUint8(addr))) {
Mcp23017(String parameters, int index) : IoTItem(parameters), IoTGpio(index) { Serial.println("MCP23X17 Init Error.");
} }
void doByInterval() {
// regEvent(value.valD, "Mcp23017");
}
//возвращает ссылку на экземпляр класса Mcp23017
bool isGpioDriver() {
return true;
} }
void pinMode(uint8_t pin, uint8_t mode) { void pinMode(uint8_t pin, uint8_t mode) {
mcp.pinMode(pin, mode); _mcp.pinMode(pin, mode);
} }
void digitalWrite(uint8_t pin, uint8_t val) { void digitalWrite(uint8_t pin, uint8_t val) {
mcp.digitalWrite(pin, val); _mcp.digitalWrite(pin, val);
} }
int digitalRead(uint8_t pin) { int digitalRead(uint8_t pin) {
return mcp.digitalRead(pin); return _mcp.digitalRead(pin);
} }
void digitalInvert(uint8_t pin) { void digitalInvert(uint8_t pin) {
mcp.digitalWrite(pin, 1 - mcp.digitalRead(pin)); _mcp.digitalWrite(pin, 1 - _mcp.digitalRead(pin));
} }
~Mcp23017(){}; ~Mcp23017Driver() {};
};
class Mcp23017 : public IoTItem {
private:
Mcp23017Driver* _driver;
public:
Mcp23017(String parameters) : IoTItem(parameters) {
_driver = nullptr;
String addr;
jsonRead(parameters, "addr", addr);
if (addr == "") {
scanI2C();
return;
}
int index;
jsonRead(parameters, "index", index);
if (index > 4) {
Serial.println("MCP23X17 wrong index. Must be 0 - 4");
return;
}
_driver = new Mcp23017Driver(index, addr);
}
void doByInterval() {}
//возвращает ссылку на экземпляр класса Mcp23017Driver
IoTGpio* getGpioDriver() {
return _driver;
}
~Mcp23017() {
delete _driver;
};
}; };
void* getAPI_Mcp23017(String subtype, String param) { void* getAPI_Mcp23017(String subtype, String param) {
if (subtype == F("Mcp23017")) { if (subtype == F("Mcp23017")) {
String addr; return new Mcp23017(param);
jsonRead(param, "addr", addr);
Serial.printf("deviceAddress %s = %02x \n", addr.c_str(), hexStringToUint8(addr));
String index_str;
jsonRead(param, "index", index_str);
int index = index_str.toInt();
if (index > 4) {
Serial.println("MCP23X17 wrong index. Must be 0 - 4");
return nullptr;
}
Mcp23017* newItem = new Mcp23017(param, index);
if (!newItem->mcp.begin_I2C(hexStringToUint8(addr))) {
Serial.println("MCP23X17 Init Error.");
delete newItem;
return nullptr;
}
return newItem;
} else { } else {
return nullptr; return nullptr;
} }