diff --git a/include/Class/IoTSensor.h b/include/Class/IoTSensor.h index 07fe75be..f4fb061c 100644 --- a/include/Class/IoTSensor.h +++ b/include/Class/IoTSensor.h @@ -5,7 +5,7 @@ class IoTSensor { public: IoTSensor(); - virtual ~IoTSensor(); + ~IoTSensor(); void loop(); virtual void doByInterval(); diff --git a/include/Class/IoTVariable.h b/include/Class/IoTVariable.h index b760572d..244f8f0d 100644 --- a/include/Class/IoTVariable.h +++ b/include/Class/IoTVariable.h @@ -8,17 +8,17 @@ class IoTVariable { ~IoTVariable(); virtual String execute(String command); + virtual void selfExec(); virtual void loop(); - void init(String key, String value); - void setValue(String value); - void getValue(String value); + void init(String key, String id); void regEvent(String value, String consoleInfo); - String _widgetName; //название виджета на фронтэнде для правильного отображения информации из меременной - String _key; //код переменной для идентификации событий, команд в сценариях - String _title; + String getKey(); + String getID(); + + protected: + String _key; //имя переменной, для идентификации при работе с несколькими переменными в одном модуле + String _id; //код переменной для идентификации событий, команд в сценариях и логах - private: - String _value; //значение переменной }; \ No newline at end of file diff --git a/src/BufferExecute.cpp b/src/BufferExecute.cpp index 63a8e7e7..8b851184 100644 --- a/src/BufferExecute.cpp +++ b/src/BufferExecute.cpp @@ -26,9 +26,11 @@ #include "Class/IoTModule.h" #include "Class/IoTSensor.h" +#include "Class/IoTVariable.h" extern std::vector iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями extern std::vector iotSensors; //v3dev: вектор ссылок базового класса IoTSensor - список всех запущенных сенсоров +extern std::vector iotVariables; //v3dev: вектор ссылок базового класса IoTVariable - список всех подготовленных переменных void loopCmdAdd(const String& cmdStr) { if (cmdStr.endsWith(",")) { @@ -168,25 +170,24 @@ void csvCmdExecute(String& cmdStr) { //del SerialPrint("I", "moduleInfo.name", moduleInfo.name); //del SerialPrint("I", "order", order); if (moduleInfo.name == order) { //проверка вхождения имени искомого модуля в ключе элемента настройки - if (moduleInfo.type == "Sensor") { - myLineParsing.update(); //v3dev: пока используем мостик для совместимости версий, предполагается, что настройки сразу будут в JSON - String interval = myLineParsing.gint(); - if (interval == "") interval = "50"; - String pin = myLineParsing.gpin(); - String index = myLineParsing.gindex(); - String addr = myLineParsing.gaddr(); - String c = myLineParsing.gc(); - String id = myLineParsing.gkey(); - String key = myLineParsing.gfile(); - String db = myLineParsing.gdb(); - myLineParsing.clear(); - String strTmp = "{\"key\": \"" + key + "\", \"id\": \"" + id + "\", \"addr\": \"" + addr + "\", \"int\": \"" + interval + "\", \"pin\": \"" + pin + "\", \"index\": \"" + index + "\", \"c\": \"" + c + "\", \"db\": \"" + db + "\"}"; + myLineParsing.update(); //v3dev: пока используем мостик для совместимости версий, предполагается, что настройки сразу будут в JSON + String interval = myLineParsing.gint(); + if (interval == "") interval = "50"; + String pin = myLineParsing.gpin(); + String index = myLineParsing.gindex(); + String addr = myLineParsing.gaddr(); + String c = myLineParsing.gc(); + String id = myLineParsing.gkey(); + String key = myLineParsing.gfile(); + String db = myLineParsing.gdb(); + myLineParsing.clear(); + String strTmp = "{\"key\": \"" + key + "\", \"id\": \"" + id + "\", \"addr\": \"" + addr + "\", \"int\": \"" + interval + "\", \"pin\": \"" + pin + "\", \"index\": \"" + index + "\", \"c\": \"" + c + "\", \"db\": \"" + db + "\"}"; + SerialPrint("I", "Строка параметров при инициализации модуля " + moduleInfo.name + ": ", strTmp); - SerialPrint("I", "Строка параметров при инициализации модуля " + moduleInfo.name + ": ", strTmp); + if (moduleInfo.type == "Sensor") { iotSensors.push_back((IoTSensor*)iotModules[i]->initInstance(strTmp)); - } else if (moduleInfo.type == "Container") - { - //iot.push_back((IoTSensor*)iotModules[i]->initInstance(moduleInfo.parameters)); + } else if (moduleInfo.type == "Variable") { + iotVariables.push_back((IoTVariable*)iotModules[i]->initInstance(strTmp)); } } } diff --git a/src/Class/IoTVariable.cpp b/src/Class/IoTVariable.cpp index f8564ef5..31545ff3 100644 --- a/src/Class/IoTVariable.cpp +++ b/src/Class/IoTVariable.cpp @@ -6,24 +6,26 @@ IoTVariable::IoTVariable() {} IoTVariable::~IoTVariable() {} -String execute(String command) {} +String IoTVariable::execute(String command) { return "";} +void IoTVariable::selfExec() {} void IoTVariable::loop() {} -void IoTVariable::init(String key, String value) { - +void IoTVariable::init(String key, String id) { + _key = key; + _id = id; } -void setValue(String value) { - -}; - -void getValue(String value ){ - -}; - void IoTVariable::regEvent(String value, String consoleInfo = "") { eventGen2(_key, String(value)); jsonWriteStr(configLiveJson, _key, String(value)); publishStatus(_key, String(value)); SerialPrint("I", "Sensor", "'" + _key + "' data: " + String(value) + "' " + consoleInfo); -} \ No newline at end of file +} + +String IoTVariable::getKey() { + return _key; +} + +String IoTVariable::getID() { + return _id; +}; \ No newline at end of file diff --git a/src/Modules/Variables/IoTVariableVirtual.cpp b/src/Modules/Variables/IoTVariableVirtual.cpp new file mode 100644 index 00000000..196e5b9d --- /dev/null +++ b/src/Modules/Variables/IoTVariableVirtual.cpp @@ -0,0 +1,71 @@ +#include "Utils/JsonUtils.h" +#include "Utils/SerialPrint.h" +#include "Utils/StringUtils.h" + +#include "Class/IoTVariable.h" +#include "Class/IoTModule.h" + +extern std::vector iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями + +class IoTVariableVirtual: public IoTVariable { + private: + //описание переменных экземпляра Variable - аналог глобальных переменных из Arduino + String value; + + //описание параметров передаваемых из настроек переменной из веба + + public: + //аналог setup() из Arduino + IoTVariableVirtual(String parameters) { + //передаем часть базовых параметров в конструктор базового класса для обеспечения работы его методов + init(jsonReadStr(parameters, "key"), jsonReadStr(parameters, "id")); + + } + + ~IoTVariableVirtual() {} + + //аналог loop() из Arduino + void loop() { + + } + + //вызывается при выполнении команды связанной с конкретным экземпляром переменной + String execute(String command) { + + return ""; + } + + //вызывается при любом изменении переменной + void selfExec() { + + } +}; + +//технический класс для взаимодействия с ядром, меняются только названия +class IoTModuleVariable: public IoTModule { + //обязательный метод для инициализации экземпляра переменной, вызывается при чтении конфигурации. + void* initInstance(String parameters) { + return new IoTVariableVirtual(parameters); + }; + + //обязательный к заполнению метод, если модуль использует свои глобальные переменные. Необходимо сбросить и очистить используемую память. + void clear() { + //и так чисто + } + + //обязательный метод для отправки информации о модуле, + ModuleInfo getInfo() { + ModuleInfo MI; + MI.name = "variable"; + MI.title = "Переменная для хранения значений пользователя"; + MI.parameters = "{\"key\": \"variable\", \"id\": \"var\"}"; + MI.type = "Variable"; + return MI; + }; +}; + +//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp + void getApiIoTVariableVirtual() { + iotModules.push_back(new IoTModuleVariable()); + return; +} \ No newline at end of file diff --git a/src/Modules/api.cpp b/src/Modules/api.cpp index f26e114f..e617d033 100644 --- a/src/Modules/api.cpp +++ b/src/Modules/api.cpp @@ -4,10 +4,14 @@ void getApiIoTSensorDallasTemp(); void getApiIoTSensorSHT20(); void getApiIoTSensorButtonIn(); +void getApiIoTVariableVirtual(); + //формируем вектор модулей путем вызова из каждого модуля специальной функции //в дальнейшем предполагается отключать вызов, если модуль не участвует в сборке void InitModulesApi() { getApiIoTSensorDallasTemp(); getApiIoTSensorSHT20(); getApiIoTSensorButtonIn(); + + getApiIoTVariableVirtual(); } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b004e30c..09690911 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,10 +37,12 @@ #include #include "Class/IoTSensor.h" #include "Class/IoTModule.h" +#include "Class/IoTVariable.h" std::vector iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями std::vector iotSensors; //v3dev: вектор ссылок базового класса IoTSensor - список всех запущенных сенсоров +std::vector iotVariables; //v3dev: вектор ссылок базового класса IoTVariable - список всех подготовленных переменных void InitModulesApi(); //v3dev: инициализация модуля при первом вызове .