From 6e1f34136ffb7421e2a279ba697df5f7d2b1032b Mon Sep 17 00:00:00 2001 From: biver Date: Sun, 16 Jan 2022 12:17:53 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=BF=D0=BE=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=20=D1=81=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ESPConfiguration.h | 1 + include/classes/IoTSensor.h | 3 ++- src/ESPConfiguration.cpp | 19 ++++++++++++------- src/modules/API.cpp | 16 ++++++++++++++++ src/modules/AnalogAdc.cpp | 33 +++++++++++++++------------------ 5 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 src/modules/API.cpp diff --git a/include/ESPConfiguration.h b/include/ESPConfiguration.h index 95ac715c..9ec4dcc8 100644 --- a/include/ESPConfiguration.h +++ b/include/ESPConfiguration.h @@ -6,3 +6,4 @@ extern std::vector iotSensors; // вектор ссылок базового класса IoTSensor - список всех запущенных сенсоров extern void configure(String path); +extern IoTSensor* myIoTSensor; diff --git a/include/classes/IoTSensor.h b/include/classes/IoTSensor.h index c7c5cf9e..34d6969e 100644 --- a/include/classes/IoTSensor.h +++ b/include/classes/IoTSensor.h @@ -25,4 +25,5 @@ class IoTSensor { unsigned long _interval; }; -extern IoTSensor* myIoTSensor; \ No newline at end of file +//extern IoTSensor* myIoTSensor; +//модулям не нужно знать эту переменную \ No newline at end of file diff --git a/src/ESPConfiguration.cpp b/src/ESPConfiguration.cpp index 338d41d6..a6891696 100644 --- a/src/ESPConfiguration.cpp +++ b/src/ESPConfiguration.cpp @@ -1,6 +1,7 @@ #include "ESPConfiguration.h" std::vector iotSensors; +void* getAPI(String subtype, String params); //============================================================================================ //здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора @@ -15,14 +16,18 @@ void configure(String path) { if (jsonArrayElement.startsWith(",")) { jsonArrayElement = jsonArrayElement.substring(1, jsonArrayElement.length()); //это нужно оптимизировать в последствии } - //=============================================================================================================== - //здесь нужно скопировать блок еще раз и вставить его ниже, переименовав AnalogAdc на название вашего сенсора - myIoTSensor = (IoTSensor*)getAPI_AnalogAdc(jsonArrayElement); - if (myIoTSensor) { - iotSensors.push_back(myIoTSensor); - createWidget(jsonArrayElement); + + String subtype; + if (!jsonRead(jsonArrayElement, F("subtype"), subtype)) { //если нет такого ключа в представленном json или он не валидный + SerialPrint(F("E"), F("Config"), "json error " + subtype); + continue; + } else { + myIoTSensor = (IoTSensor*)getAPI(subtype, jsonArrayElement); + if (myIoTSensor) { + iotSensors.push_back(myIoTSensor); + createWidget(jsonArrayElement); + } } - //================================================================================================================ } file.close(); } \ No newline at end of file diff --git a/src/modules/API.cpp b/src/modules/API.cpp new file mode 100644 index 00000000..8d077ad4 --- /dev/null +++ b/src/modules/API.cpp @@ -0,0 +1,16 @@ +#include "ESPConfiguration.h" + +//============================================================================================ +//здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора +void* getAPI_AnalogAdc(String subtype, String params); +//============================================================================================ + +void* getAPI(String subtype, String params) { + void* tmpAPI; + //=============================================================================================================== + //здесь нужно скопировать строку еще раз и вставить ее ниже, переименовав AnalogAdc на название вашего сенсора + if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; + //================================================================================================================ + + return nullptr; +} \ No newline at end of file diff --git a/src/modules/AnalogAdc.cpp b/src/modules/AnalogAdc.cpp index fb328b26..df806dd8 100644 --- a/src/modules/AnalogAdc.cpp +++ b/src/modules/AnalogAdc.cpp @@ -2,8 +2,8 @@ #include "Classes/IoTSensor.h" //Это файл сенсора, в нем осуществляется чтение сенсора. -//для добавления сенсора вам нужно скопировать этот файл и переименовать в нем AnalogAdc -//сочетание слов на название Вашего сенсора +//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора +//Название должно быть уникальным, коротким и отражать суть сенсора. class AnalogAdc : public IoTSensor { private: @@ -18,41 +18,38 @@ class AnalogAdc : public IoTSensor { // setup() //это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. //Такие как ...begin и подставлять в них параметры полученные из web интерфейса. - //Все параметры хранятся в переменнной parameters, вы можете прочитать любой параметр используя jsonRead функции: + //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции: // jsonReadStr, jsonReadBool, jsonReadInt AnalogAdc(String parameters) { - init(jsonReadStr(parameters, "key"), jsonReadStr(parameters, "id"), jsonReadInt(parameters, "int")); + init(jsonReadStr(parameters, "key"), jsonReadStr(parameters, "id"), jsonReadInt(parameters, "int")); //обязательный вызов _pin = jsonReadInt(parameters, "pin"); } //======================================================================================================= - // loop() - //это аналог loop из arduino. Здесь вы должны выполнить чтение вашего сенсора в переменную float + // doByInterval() + //это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора //а затем выполнить regEvent - это регистрация произошедшего события чтения //здесь так же доступны все переменные из секции переменных, и полученные в setup - //если у сенсора несколько величин то делайте несколько regEvent и объявляйте несколько переменных float, - //для каждой величины свою + //если у сенсора несколько величин то делайте несколько regEvent + //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции + //и выполнить за несколько тактов void doByInterval() { float value = analogRead(_pin); - regEvent((String)value, "AnalogAdc"); + regEvent((String)value, "AnalogAdc"); //обязательный вызов хотяб один } //======================================================================================================= ~AnalogAdc(); }; -//данную функцию вы должны создать по образу и подобию, изменив в ней AnalogAdc на название Вашего сенсора -void* getAPI_AnalogAdc(String parameters) { - String subtype; - if (!jsonRead(parameters, F("subtype"), subtype)) { //если нет такого ключа в представленном json или он не валидный - SerialPrint(F("E"), F("Config"), F("json error AnalogAdc")); - return nullptr; - } else { +//после замены названия сенсора, на функцию можно не обращать внимания +//если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть +//создание и контроль соответствующих глобальных переменных (см. пример реализации сенсора ds18b20) +void* getAPI_AnalogAdc(String subtype, String param) { if (subtype == F("AnalogAdc")) { - return new AnalogAdc(parameters); + return new AnalogAdc(param); } else { return nullptr; } - } }