Merge pull request #117 from biveraxe/ver4dev

Правки кода по работе с модулями
This commit is contained in:
Dmitry Borisenko
2022-01-16 08:34:54 +01:00
committed by GitHub
5 changed files with 46 additions and 26 deletions

View File

@@ -6,3 +6,4 @@
extern std::vector<IoTSensor*> iotSensors; // вектор ссылок базового класса IoTSensor - список всех запущенных сенсоров extern std::vector<IoTSensor*> iotSensors; // вектор ссылок базового класса IoTSensor - список всех запущенных сенсоров
extern void configure(String path); extern void configure(String path);
extern IoTSensor* myIoTSensor;

View File

@@ -25,4 +25,5 @@ class IoTSensor {
unsigned long _interval; unsigned long _interval;
}; };
extern IoTSensor* myIoTSensor; //extern IoTSensor* myIoTSensor;
//модулям не нужно знать эту переменную

View File

@@ -1,6 +1,7 @@
#include "ESPConfiguration.h" #include "ESPConfiguration.h"
std::vector<IoTSensor*> iotSensors; std::vector<IoTSensor*> iotSensors;
void* getAPI(String subtype, String params);
//============================================================================================ //============================================================================================
//здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора //здесь скопируйте строку и вставьте ниже, заменив имя AnalogAdc на название вашего сенсора
@@ -15,14 +16,18 @@ void configure(String path) {
if (jsonArrayElement.startsWith(",")) { if (jsonArrayElement.startsWith(",")) {
jsonArrayElement = jsonArrayElement.substring(1, jsonArrayElement.length()); //это нужно оптимизировать в последствии jsonArrayElement = jsonArrayElement.substring(1, jsonArrayElement.length()); //это нужно оптимизировать в последствии
} }
//===============================================================================================================
//здесь нужно скопировать блок еще раз и вставить его ниже, переименовав AnalogAdc на название вашего сенсора String subtype;
myIoTSensor = (IoTSensor*)getAPI_AnalogAdc(jsonArrayElement); if (!jsonRead(jsonArrayElement, F("subtype"), subtype)) { //если нет такого ключа в представленном json или он не валидный
SerialPrint(F("E"), F("Config"), "json error " + subtype);
continue;
} else {
myIoTSensor = (IoTSensor*)getAPI(subtype, jsonArrayElement);
if (myIoTSensor) { if (myIoTSensor) {
iotSensors.push_back(myIoTSensor); iotSensors.push_back(myIoTSensor);
createWidget(jsonArrayElement); createWidget(jsonArrayElement);
} }
//================================================================================================================ }
} }
file.close(); file.close();
} }

16
src/modules/API.cpp Normal file
View File

@@ -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;
}

View File

@@ -2,8 +2,8 @@
#include "Classes/IoTSensor.h" #include "Classes/IoTSensor.h"
//Это файл сенсора, в нем осуществляется чтение сенсора. //Это файл сенсора, в нем осуществляется чтение сенсора.
//для добавления сенсора вам нужно скопировать этот файл и переименовать в нем AnalogAdc //для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора
//сочетание слов на название Вашего сенсора //Название должно быть уникальным, коротким и отражать суть сенсора.
class AnalogAdc : public IoTSensor { class AnalogAdc : public IoTSensor {
private: private:
@@ -18,41 +18,38 @@ class AnalogAdc : public IoTSensor {
// setup() // setup()
//это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора. //это аналог setup из arduino. Здесь вы можете выполнять методы инициализации сенсора.
//Такие как ...begin и подставлять в них параметры полученные из web интерфейса. //Такие как ...begin и подставлять в них параметры полученные из web интерфейса.
//Все параметры хранятся в переменнной parameters, вы можете прочитать любой параметр используя jsonRead функции: //Все параметры хранятся в перемененной parameters, вы можете прочитать любой параметр используя jsonRead функции:
// jsonReadStr, jsonReadBool, jsonReadInt // jsonReadStr, jsonReadBool, jsonReadInt
AnalogAdc(String parameters) { 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"); _pin = jsonReadInt(parameters, "pin");
} }
//======================================================================================================= //=======================================================================================================
// loop() // doByInterval()
//это аналог loop из arduino. Здесь вы должны выполнить чтение вашего сенсора в переменную float //это аналог loop из arduino, но вызываемый каждые int секунд, заданные в настройках. Здесь вы должны выполнить чтение вашего сенсора
//а затем выполнить regEvent - это регистрация произошедшего события чтения //а затем выполнить regEvent - это регистрация произошедшего события чтения
//здесь так же доступны все переменные из секции переменных, и полученные в setup //здесь так же доступны все переменные из секции переменных, и полученные в setup
//если у сенсора несколько величин то делайте несколько regEvent и объявляйте несколько переменных float, //если у сенсора несколько величин то делайте несколько regEvent
//для каждой величины свою //не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
//и выполнить за несколько тактов
void doByInterval() { void doByInterval() {
float value = analogRead(_pin); float value = analogRead(_pin);
regEvent((String)value, "AnalogAdc"); regEvent((String)value, "AnalogAdc"); //обязательный вызов хотяб один
} }
//======================================================================================================= //=======================================================================================================
~AnalogAdc(); ~AnalogAdc();
}; };
//данную функцию вы должны создать по образу и подобию, изменив в ней AnalogAdc на название Вашего сенсора //после замены названия сенсора, на функцию можно не обращать внимания
void* getAPI_AnalogAdc(String parameters) { //если сенсор предполагает использование общего объекта библиотеки для нескольких экземпляров сенсора, то в данной функции необходимо предусмотреть
String subtype; //создание и контроль соответствующих глобальных переменных (см. пример реализации сенсора ds18b20)
if (!jsonRead(parameters, F("subtype"), subtype)) { //если нет такого ключа в представленном json или он не валидный void* getAPI_AnalogAdc(String subtype, String param) {
SerialPrint(F("E"), F("Config"), F("json error AnalogAdc"));
return nullptr;
} else {
if (subtype == F("AnalogAdc")) { if (subtype == F("AnalogAdc")) {
return new AnalogAdc(parameters); return new AnalogAdc(param);
} else { } else {
return nullptr; return nullptr;
} }
}
} }