diff --git a/include/Class/LineParsing.h b/include/Class/LineParsing.h index ff8a3965..c1519edb 100644 --- a/include/Class/LineParsing.h +++ b/include/Class/LineParsing.h @@ -210,6 +210,9 @@ class LineParsing { String gtm2() { return _tm2; } + String gdb() { + return _db; + } int getPinErrors() { return pinErrors; diff --git a/include/items/ButtonInClass.h b/include/items/ButtonInClass.h deleted file mode 100644 index e9719874..00000000 --- a/include/items/ButtonInClass.h +++ /dev/null @@ -1,65 +0,0 @@ - -#ifdef EnableButtonIn -#pragma once -#include -#include -#include "Class/LineParsing.h" -#include "Global.h" - -extern boolean but[NUM_BUTTONS]; -extern Bounce* buttons; - -class ButtonInClass : public LineParsing { - protected: - int numberEntering = 0; - int state = _state.toInt(); - - public: - ButtonInClass() : LineParsing(){}; - - void init() { - if (_pin != "") { - int number = numberEntering++; - buttons[number].attach(_pin.toInt(), INPUT); - buttons[number].interval(_db.toInt()); - but[number] = true; - jsonWriteStr(configOptionJson, "switch_num_" + String(number), _key); - } - } - - void loop() { - static uint8_t switch_number = 1; - if (but[switch_number]) { - buttons[switch_number].update(); - if (buttons[switch_number].fell()) { - String key = jsonReadStr(configOptionJson, "switch_num_" + String(switch_number)); - state = 1; - switchChangeVirtual(key, String(state)); - } - if (buttons[switch_number].rose()) { - String key = jsonReadStr(configOptionJson, "switch_num_" + String(switch_number)); - state = 0; - switchChangeVirtual(key, String(state)); - } - } - switch_number++; - if (switch_number == NUM_BUTTONS) { - switch_number = 0; - } - } - - void switchStateSetDefault() { - if (_state != "") { - switchChangeVirtual(_key, _state); - } - } - - void switchChangeVirtual(String key, String state) { - eventGen2(key, state); - jsonWriteInt(configLiveJson, key, state.toInt()); - publishStatus(key, state); - } -}; - -extern ButtonInClass myButtonIn; -#endif \ No newline at end of file diff --git a/src/BufferExecute.cpp b/src/BufferExecute.cpp index 63464255..63a8e7e7 100644 --- a/src/BufferExecute.cpp +++ b/src/BufferExecute.cpp @@ -88,10 +88,6 @@ void csvCmdExecute(String& cmdStr) { } else if (order == F("pwm-out")) { #ifdef EnablePwmOut sCmd.addCommand(order.c_str(), pwmOut); -#endif - } else if (order == F("button-in")) { -#ifdef EnableButtonIn - sCmd.addCommand(order.c_str(), buttonIn); #endif } else if (order == F("input-value")) { #ifdef EnableInput @@ -182,8 +178,9 @@ void csvCmdExecute(String& cmdStr) { 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 + "\"}"; + String strTmp = "{\"key\": \"" + key + "\", \"id\": \"" + id + "\", \"addr\": \"" + addr + "\", \"int\": \"" + interval + "\", \"pin\": \"" + pin + "\", \"index\": \"" + index + "\", \"c\": \"" + c + "\", \"db\": \"" + db + "\"}"; SerialPrint("I", "Строка параметров при инициализации модуля " + moduleInfo.name + ": ", strTmp); iotSensors.push_back((IoTSensor*)iotModules[i]->initInstance(strTmp)); diff --git a/src/Class/IoTSensor.cpp b/src/Class/IoTSensor.cpp index ac493244..13e95914 100644 --- a/src/Class/IoTSensor.cpp +++ b/src/Class/IoTSensor.cpp @@ -25,7 +25,6 @@ void IoTSensor::loop() { difference = currentMillis - prevMillis; if (difference >= _interval) { prevMillis = millis(); - SerialPrint("I", "Sensor", "Вызывается loop"); this->doByInterval(); } } diff --git a/src/Modules/Sensors/IoTSensorButtonIn.cpp b/src/Modules/Sensors/IoTSensorButtonIn.cpp new file mode 100644 index 00000000..83c1daee --- /dev/null +++ b/src/Modules/Sensors/IoTSensorButtonIn.cpp @@ -0,0 +1,82 @@ +#include "Utils/JsonUtils.h" +#include "Utils/SerialPrint.h" +#include "Utils/StringUtils.h" +#include "Class/IoTSensor.h" +#include "Class/IoTModule.h" + +#include + +extern std::vector iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями + +class IoTSensorButtonIn: public IoTSensor { + private: + //описание переменных экземпляра датчика - аналог глобальных переменных из Arduino + //для работы библиотеки с несколькими линиями необходимо обеспечить каждый экземпляр класса ссылками на объекты настроенные на эти линии + Bounce* bButton; + boolean status; + + //описание параметров передаваемых из настроек датчика из веба + unsigned int _pin; + unsigned int _db; + + public: + //аналог setup() из Arduino + IoTSensorButtonIn(String parameters) { + //передаем часть базовых параметров в конструктор базового класса для обеспечения работы его методов + init(jsonReadStr(parameters, "key"), jsonReadStr(parameters, "id"), 0); + _pin = jsonReadInt(parameters, "pin"); + _db = jsonReadInt(parameters, "db"); + + bButton = new Bounce(); + bButton->attach(_pin, INPUT); + bButton->interval(_db); + status = true; + } + + ~IoTSensorButtonIn() { + delete bButton; + } + + //аналог loop() из Arduino, но квотируемый по времени параметром interval + void doByInterval() { + bButton->update(); + if (bButton->fell()) { + status = 1; + regEvent((String)status, ""); //обязательный вызов для отправки результата работы + } + if (bButton->rose()) { + status = 0; + regEvent((String)status, ""); //обязательный вызов для отправки результата работы + } + } +}; + +//технический класс для взаимодействия с ядром, меняются только названия +class IoTModuleButtonIn: public IoTModule { + //обязательный метод для инициализации экземпляра датчика, вызывается при чтении конфигурации. Нужно учитывать, что некоторые датчики могут обеспечивать + //несколько измерений, для каждого будет отдельный вызов. + void* initInstance(String parameters) { + return new IoTSensorButtonIn(parameters); + }; + + //обязательный к заполнению метод, если модуль использует свои глобальные переменные. Необходимо сбросить и очистить используемую память. + void clear() { + //и так чисто + } + + //обязательный метод для отправки информации о модуле, + ModuleInfo getInfo() { + ModuleInfo MI; + MI.name = "button-in"; + MI.title = "Кнопка физическая, чтение состояния пина (подключается проводами к устройству)"; + MI.parameters = "{\"key\": \"button-in\", \"id\": \"btn\", \"pin\": \"2\", \"db\": \"20\"}"; + MI.type = "Sensor"; + return MI; + }; +}; + +//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp +void getApiIoTSensorButtonIn() { + iotModules.push_back(new IoTModuleButtonIn()); + return; +} \ No newline at end of file diff --git a/src/Modules/api.cpp b/src/Modules/api.cpp index 8eeb56a8..f26e114f 100644 --- a/src/Modules/api.cpp +++ b/src/Modules/api.cpp @@ -2,10 +2,12 @@ //объявляем функцию для добавления модуля в вектор void getApiIoTSensorDallasTemp(); void getApiIoTSensorSHT20(); +void getApiIoTSensorButtonIn(); //формируем вектор модулей путем вызова из каждого модуля специальной функции //в дальнейшем предполагается отключать вызов, если модуль не участвует в сборке void InitModulesApi() { getApiIoTSensorDallasTemp(); getApiIoTSensorSHT20(); + getApiIoTSensorButtonIn(); } \ No newline at end of file diff --git a/src/items/ButtonInClass.cpp b/src/items/ButtonInClass.cpp deleted file mode 100644 index 7e64aaec..00000000 --- a/src/items/ButtonInClass.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "Consts.h" -#ifdef EnableButtonIn -#include "BufferExecute.h" -#include "items/ButtonInClass.h" -//==========================================Модуль физических кнопок======================================== -//button-in switch1 toggle Кнопки Свет 1 pin[2] db[20] -//========================================================================================================== - -boolean but[NUM_BUTTONS]; -Bounce *buttons = new Bounce[NUM_BUTTONS]; - -ButtonInClass myButtonIn; -void buttonIn() { - myButtonIn.update(); - String key = myButtonIn.gkey(); - String pin = myButtonIn.gpin(); - sCmd.addCommand(key.c_str(), buttonInSet); - myButtonIn.init(); - myButtonIn.switchStateSetDefault(); - myButtonIn.clear(); -} - -void buttonInSet() { - String key = sCmd.order(); - String state = sCmd.next(); - myButtonIn.switchChangeVirtual(key, state); -} -#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index b2759499..b004e30c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,6 @@ #include "Utils/statUtils.h" #include "Utils/Timings.h" #include "Utils/WebUtils.h" -#include "items/ButtonInClass.h" #include "items/vCountDown.h" #include "items/vImpulsOut.h" #include "items/vLogging.h" @@ -231,9 +230,7 @@ void loop() { } } #endif -#ifdef EnableButtonIn - myButtonIn.loop(); -#endif +