Убираем глобальные переменные из модулей, есть веростность, что получится при линковке не включать модули, которые исключены из api.cpp

This commit is contained in:
2021-12-30 12:11:19 +03:00
parent 6a7653c7ff
commit b0fb71832c
5 changed files with 35 additions and 38 deletions

View File

@@ -6,8 +6,6 @@
#include <Bounce2.h> #include <Bounce2.h>
extern std::vector<IoTModule*> iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями
class IoTSensorButtonIn: public IoTSensor { class IoTSensorButtonIn: public IoTSensor {
private: private:
//описание переменных экземпляра датчика - аналог глобальных переменных из Arduino //описание переменных экземпляра датчика - аналог глобальных переменных из Arduino
@@ -76,7 +74,6 @@ class IoTModuleButtonIn: public IoTModule {
}; };
//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp //точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp
void getApiIoTSensorButtonIn() { void* getApiIoTSensorButtonIn() {
iotModules.push_back(new IoTModuleButtonIn()); return new IoTModuleButtonIn();
return;
} }

View File

@@ -9,7 +9,6 @@
#include <OneWire.h> #include <OneWire.h>
#include <map> #include <map>
extern std::vector<IoTModule*> iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями
//глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина //глобальные списки необходимы для хранения объектов об активных линиях 1-wire используемых разными датчиками из модуля. Ключ - номер пина
std::map<int, OneWire*> oneWireTemperatureArray; std::map<int, OneWire*> oneWireTemperatureArray;
@@ -86,19 +85,19 @@ class IoTModuleDallasTemp: public IoTModule {
//обязательный к заполнению метод, если модуль использует свои глобальные переменные. Необходимо сбросить и очистить используемую память. //обязательный к заполнению метод, если модуль использует свои глобальные переменные. Необходимо сбросить и очистить используемую память.
void clear() { void clear() {
for (auto it = sensorsTemperatureArray.cbegin(), next_it = it; it != sensorsTemperatureArray.cend(); it = next_it) { // for (auto it = sensorsTemperatureArray.cbegin(), next_it = it; it != sensorsTemperatureArray.cend(); it = next_it) {
++next_it; // ++next_it;
DallasTemperature* tmpptr = it->second; //временно сохраняем указатель на сенсор, т.к. его преждевременное удаление оставит поломаную запись в векторе, к которой может обратиться ядро и вызвать исключение // DallasTemperature* tmpptr = it->second; //временно сохраняем указатель на сенсор, т.к. его преждевременное удаление оставит поломаную запись в векторе, к которой может обратиться ядро и вызвать исключение
sensorsTemperatureArray.erase(it); // sensorsTemperatureArray.erase(it);
delete tmpptr; //а далее уже удаляем объект сенсора // delete tmpptr; //а далее уже удаляем объект сенсора
} // }
for (auto it = oneWireTemperatureArray.cbegin(), next_it = it; it != oneWireTemperatureArray.cend(); it = next_it) { // for (auto it = oneWireTemperatureArray.cbegin(), next_it = it; it != oneWireTemperatureArray.cend(); it = next_it) {
++next_it; // ++next_it;
OneWire* tmpptr = it->second; //временно сохраняем указатель на сенсор, т.к. его преждевременное удаление оставит поломаную запись в векторе, к которой может обратиться ядро и вызвать исключение // OneWire* tmpptr = it->second; //временно сохраняем указатель на сенсор, т.к. его преждевременное удаление оставит поломаную запись в векторе, к которой может обратиться ядро и вызвать исключение
oneWireTemperatureArray.erase(it); // oneWireTemperatureArray.erase(it);
delete tmpptr; //а далее уже удаляем объект сенсора // delete tmpptr; //а далее уже удаляем объект сенсора
} // }
} }
//обязательный метод для отправки информации о модуле, //обязательный метод для отправки информации о модуле,
@@ -113,7 +112,6 @@ class IoTModuleDallasTemp: public IoTModule {
}; };
//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp //точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp
void getApiIoTSensorDallasTemp() { void* getApiIoTSensorDallasTemp() {
iotModules.push_back(new IoTModuleDallasTemp()); return new IoTModuleDallasTemp();
return;
} }

View File

@@ -8,7 +8,6 @@
#include "Wire.h" #include "Wire.h"
#include "SHT2x.h" #include "SHT2x.h"
extern std::vector<IoTModule*> iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями
SHT2x* sht = nullptr; SHT2x* sht = nullptr;
@@ -76,7 +75,6 @@ class IoTModuleSHT20: public IoTModule {
}; };
//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp //точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp
void getApiIoTSensorSHT20() { void* getApiIoTSensorSHT20() {
iotModules.push_back(new IoTModuleSHT20()); return new IoTModuleSHT20();
return;
} }

View File

@@ -5,7 +5,6 @@
#include "Class/IoTVariable.h" #include "Class/IoTVariable.h"
#include "Class/IoTModule.h" #include "Class/IoTModule.h"
extern std::vector<IoTModule*> iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями
class IoTVariableVirtual: public IoTVariable { class IoTVariableVirtual: public IoTVariable {
private: private:
@@ -65,7 +64,6 @@ class IoTModuleVariable: public IoTModule {
}; };
//точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp //точка входа в модуль для заполнения вектора, требуется только изменить имя и прописать в файле api.cpp
void getApiIoTVariableVirtual() { void* getApiIoTVariableVirtual() {
iotModules.push_back(new IoTModuleVariable()); return new IoTModuleVariable();
return;
} }

View File

@@ -1,17 +1,23 @@
#include "Utils/SerialPrint.h" #include "Utils/SerialPrint.h"
//объявляем функцию для добавления модуля в вектор #include "Class/IoTSensor.h"
void getApiIoTSensorDallasTemp(); #include "Class/IoTModule.h"
void getApiIoTSensorSHT20(); #include "Class/IoTVariable.h"
void getApiIoTSensorButtonIn();
void getApiIoTVariableVirtual(); extern std::vector<IoTModule*> iotModules; //v3dev: вектор ссылок базового класса IoTModule - интерфейсы для общения со всеми поддерживаемыми системой модулями
//объявляем функцию для добавления модуля в вектор
void* getApiIoTSensorDallasTemp();
void* getApiIoTSensorSHT20();
void* getApiIoTSensorButtonIn();
void* getApiIoTVariableVirtual();
//формируем вектор модулей путем вызова из каждого модуля специальной функции //формируем вектор модулей путем вызова из каждого модуля специальной функции
//в дальнейшем предполагается отключать вызов, если модуль не участвует в сборке //в дальнейшем предполагается отключать вызов, если модуль не участвует в сборке
void InitModulesApi() { void InitModulesApi() {
getApiIoTSensorDallasTemp(); iotModules.push_back((IoTModule*) getApiIoTSensorDallasTemp());
getApiIoTSensorSHT20(); iotModules.push_back((IoTModule*) getApiIoTSensorSHT20());
getApiIoTSensorButtonIn(); iotModules.push_back((IoTModule*) getApiIoTSensorButtonIn());
getApiIoTVariableVirtual(); iotModules.push_back((IoTModule*) getApiIoTVariableVirtual());
} }