diff --git a/include/classes/IoTItem.h b/include/classes/IoTItem.h index 32a57351..e16e536e 100644 --- a/include/classes/IoTItem.h +++ b/include/classes/IoTItem.h @@ -41,7 +41,7 @@ class IoTItem { bool needSave = false; bool enableDoByInt = true; - virtual bool isGpioDriver(); + virtual IoTGpio* getGpioDriver(); virtual void setValue(IoTValue Value); virtual void setValue(String valStr); diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 9c05b39a..0a70e979 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -26,8 +26,9 @@ void configure(String path) { //(IoTItem*) - getAPI вернула ссылку, что бы ее привести к классу IoTItem используем myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement); if (myIoTItem) { + void* driver; // пробуем спросить драйвер GPIO - if (myIoTItem->isGpioDriver()) IoTgpio.regDriver((IoTGpio*)myIoTItem); + if (driver = myIoTItem->getGpioDriver()) IoTgpio.regDriver((IoTGpio*)driver); IoTItems.push_back(myIoTItem); } diff --git a/src/classes/IoTItem.cpp b/src/classes/IoTItem.cpp index 34355e05..68f88c96 100644 --- a/src/classes/IoTItem.cpp +++ b/src/classes/IoTItem.cpp @@ -146,8 +146,8 @@ void IoTItem::setInterval(unsigned long interval) { _interval = interval; } -bool IoTItem::isGpioDriver() { - return false; +IoTGpio* IoTItem::getGpioDriver() { + return nullptr; } //сетевое общение==================================================================================================================================== diff --git a/src/modules/exec/Mcp23017/Mcp23017.cpp b/src/modules/exec/Mcp23017/Mcp23017.cpp index 07f77bab..657a3fde 100644 --- a/src/modules/exec/Mcp23017/Mcp23017.cpp +++ b/src/modules/exec/Mcp23017/Mcp23017.cpp @@ -3,64 +3,79 @@ #include "classes/IoTGpio.h" #include -class Mcp23017 : public IoTItem, IoTGpio { +void scanI2C(); + +class Mcp23017Driver : public IoTGpio { private: + Adafruit_MCP23X17 _mcp; + public: - Adafruit_MCP23X17 mcp; - - Mcp23017(String parameters, int index) : IoTItem(parameters), IoTGpio(index) { - } - - void doByInterval() { - // regEvent(value.valD, "Mcp23017"); - } - - //возвращает ссылку на экземпляр класса Mcp23017 - bool isGpioDriver() { - return true; + Mcp23017Driver(int index, String addr) : IoTGpio(index) { + if (!_mcp.begin_I2C(hexStringToUint8(addr))) { + Serial.println("MCP23X17 Init Error."); + } } void pinMode(uint8_t pin, uint8_t mode) { - mcp.pinMode(pin, mode); + _mcp.pinMode(pin, mode); } void digitalWrite(uint8_t pin, uint8_t val) { - mcp.digitalWrite(pin, val); + _mcp.digitalWrite(pin, val); } int digitalRead(uint8_t pin) { - return mcp.digitalRead(pin); + return _mcp.digitalRead(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) { if (subtype == F("Mcp23017")) { - String addr; - 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; + return new Mcp23017(param); } else { return nullptr; }