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 void configure(String path);
extern IoTSensor* myIoTSensor;

View File

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

View File

@@ -1,6 +1,7 @@
#include "ESPConfiguration.h"
std::vector<IoTSensor*> 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();
}

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"
//Это файл сенсора, в нем осуществляется чтение сенсора.
//для добавления сенсора вам нужно скопировать этот файл и переименовать в нем 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;
}
}
}