diff --git a/include/classes/IoTSensor.h b/include/classes/IoTSensor.h index e790cff5..34d6969e 100644 --- a/include/classes/IoTSensor.h +++ b/include/classes/IoTSensor.h @@ -25,11 +25,5 @@ class IoTSensor { unsigned long _interval; }; -struct ModuleInfo -{ - void* apiToComponent; - String defConfig; -}; - //extern IoTSensor* myIoTSensor; //модулям не нужно знать эту переменную \ No newline at end of file diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 7564c4cd..a6891696 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -1,7 +1,12 @@ #include "ESPConfiguration.h" std::vector iotSensors; -ModuleInfo getAPI(String subtype, String params); +void* getAPI(String subtype, String params); + +//============================================================================================ +//здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора +extern void* getAPI_AnalogAdc(String params); +//============================================================================================ void configure(String path) { File file = seekFile(path); @@ -17,7 +22,7 @@ void configure(String path) { SerialPrint(F("E"), F("Config"), "json error " + subtype); continue; } else { - myIoTSensor = (IoTSensor*)getAPI(subtype, jsonArrayElement).apiToComponent; + myIoTSensor = (IoTSensor*)getAPI(subtype, jsonArrayElement); if (myIoTSensor) { iotSensors.push_back(myIoTSensor); createWidget(jsonArrayElement); diff --git a/src/modules/API.cpp b/src/modules/API.cpp index 5eb53404..8d077ad4 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -2,22 +2,15 @@ //============================================================================================ //здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора -ModuleInfo getAPI_AnalogAdc(String subtype, String params); -ModuleInfo getAPI_ds18b20(String subtype, String params); +void* getAPI_AnalogAdc(String subtype, String params); //============================================================================================ -ModuleInfo getAPI(String subtype, String params) { - ModuleInfo tmpMi; - String defConfig = ""; +void* getAPI(String subtype, String params) { + void* tmpAPI; //=============================================================================================================== //здесь нужно скопировать строку еще раз и вставить ее ниже, переименовав AnalogAdc на название вашего сенсора - if ((tmpMi = getAPI_AnalogAdc(subtype, params)).apiToComponent != nullptr) return tmpMi; else defConfig += tmpMi.defConfig; + if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; //================================================================================================================ - if ((tmpMi = getAPI_ds18b20(subtype, params)).apiToComponent != nullptr) return tmpMi; else defConfig += tmpMi.defConfig; - - - - tmpMi.defConfig = defConfig; - return tmpMi; + return nullptr; } \ No newline at end of file diff --git a/src/modules/AnalogAdc.cpp b/src/modules/AnalogAdc.cpp index 0766751d..df806dd8 100644 --- a/src/modules/AnalogAdc.cpp +++ b/src/modules/AnalogAdc.cpp @@ -46,13 +46,10 @@ class AnalogAdc : public IoTSensor { //после замены названия сенсора, на функцию можно не обращать внимания //если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть //создание и контроль соответствующих глобальных переменных (см. пример реализации сенсора ds18b20) -ModuleInfo getAPI_AnalogAdc(String subtype, String param) { - ModuleInfo mi; - mi.apiToComponent = nullptr; - mi.defConfig = "конфин такой вот джисон"; +void* getAPI_AnalogAdc(String subtype, String param) { if (subtype == F("AnalogAdc")) { - mi.apiToComponent = new AnalogAdc(param); + return new AnalogAdc(param); + } else { + return nullptr; } - - return mi; } diff --git a/src/modules/ds18b20.cpp b/src/modules/ds18b20.cpp deleted file mode 100644 index fe5d19cb..00000000 --- a/src/modules/ds18b20.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "Global.h" -#include "Classes/IoTSensor.h" - -#include "DallasTemperature.h" -#include -#include - -//глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина -std::map oneWireTemperatureArray; -std::map sensorsTemperatureArray; - -class ds18b20 : public IoTSensor { - private: - //для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии - OneWire* oneWire; - DallasTemperature* sensors; - - //описание параметров передаваемых из настроек датчика из веба - String _addr; - unsigned int _pin; - unsigned int _index; - - public: - //======================================================================================================= - // setup() - //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: - // jsonReadStr, jsonReadBool, jsonReadInt - ds18b20(String parameters) { - init(jsonReadStr(parameters, "key"), jsonReadStr(parameters, "id"), jsonReadInt(parameters, "int")); //обязательный вызов - - _pin = jsonReadInt(parameters, "pin"); - _index = jsonReadInt(parameters, "index"); - _addr = jsonReadStr(parameters, "addr"); - - //учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась - if (oneWireTemperatureArray.find(_pin) == oneWireTemperatureArray.end()) { - oneWire = new OneWire((uint8_t)_pin); - sensors = new DallasTemperature(); - sensors->setOneWire(oneWire); - sensors->begin(); - sensors->setResolution(12); - - oneWireTemperatureArray[_pin] = oneWire; - sensorsTemperatureArray[_pin] = sensors; - } else { - oneWire = oneWireTemperatureArray[_pin]; - sensors = sensorsTemperatureArray[_pin]; - } - } - //======================================================================================================= - // doByInterval() - //это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора - //а затем выполнить regEvent - это регистрация произошедшего события чтения - //здесь так же доступны все переменные из секции переменных, и полученные в setup - //если у сенсора несколько величин то делайте несколько regEvent - //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции - //и выполнить за несколько тактов - void doByInterval() { - //запускаем опрос измерений у всех датчиков на линии - sensors->requestTemperatures(); - - //Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу - DeviceAddress deviceAddress; - if (_addr == "") { - sensors->getAddress(deviceAddress, _index); - } else { - string2hex(_addr.c_str(), deviceAddress); - } - //получаем температуру по адресу - float value = sensors->getTempC(deviceAddress); - - char addrStr[20] = ""; - hex2string(deviceAddress, 8, addrStr); - - regEvent((String)value, "addr: " + String(addrStr)); //обязательный вызов для отправки результата работы - } - //======================================================================================================= - - ~ds18b20() {}; -}; - -//после замены названия сенсора, на функцию можно не обращать внимания -//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть -//создание и контроль соответствующих глобальных переменных (см. пример реализации сенсора ds18b20) -ModuleInfo getAPI_ds18b20(String subtype, String param) { - ModuleInfo mi; - mi.apiToComponent = nullptr; - mi.defConfig = "конфин такой вот джисон"; - if (subtype == F("AnalogAdc")) { - mi.apiToComponent = new ds18b20(param); - } - - return mi; -}