Добавляем системный класс прослойку для доступа к GPIO при помощи плат расширения портов

This commit is contained in:
2022-02-14 18:33:52 +03:00
parent da845b7ecb
commit 5c8221f86f
8 changed files with 96 additions and 2 deletions

View File

@@ -49,11 +49,13 @@
#include "Utils/SerialPrint.h"
#include "Utils/StringUtils.h"
#include "PeriodicTasks.h"
#include "classes/IoTGpio.h"
/*********************************************************************************************************************
*****************************************глобальные объекты классов***************************************************
**********************************************************************************************************************/
extern TickerScheduler ts;
extern WiFiClient espClient;
extern PubSubClient mqtt;

25
include/classes/IoTGpio.h Normal file
View File

@@ -0,0 +1,25 @@
#pragma once
#include <Arduino.h>
class IoTGpio {
public:
IoTGpio();
~IoTGpio();
void pinMode(uint8_t pin, uint8_t mode);
void digitalWrite(uint8_t pin, uint8_t val);
int digitalRead(uint8_t pin);
int analogRead(uint8_t pin);
void analogReference(uint8_t mode);
void analogWrite(uint8_t pin, int val);
void analogWriteFreq(uint32_t freq);
void analogWriteRange(uint32_t range);
void regDriver(IoTGpio* newDriver);
private:
IoTGpio* _ext1; //ссылка на объект доступа к портам свыше 100
IoTGpio* _ext2; //200
IoTGpio* _ext3; //300
IoTGpio* _ext4; //400
};

View File

@@ -1,4 +1,5 @@
#pragma once
#include "classes/IoTGpio.h"
struct IoTValue {
float valD = 0;
@@ -27,6 +28,8 @@ class IoTItem {
IoTValue value; // хранение основного значения, котрое обновляется из сценария, execute(), loop() или doByInterval()
IoTGpio* getGpioDriver();
protected:
String _subtype;
String _id;

View File

@@ -1,4 +1,7 @@
#include "ESPConfiguration.h"
#include "classes/IoTGpio.h"
extern IoTGpio IoTgpio;
std::vector<IoTItem*> IoTItems;
void* getAPI(String subtype, String params);
@@ -19,6 +22,8 @@ void configure(String path) {
} else {
myIoTItem = (IoTItem*)getAPI(subtype, jsonArrayElement);
if (myIoTItem) {
IoTGpio* tmp = myIoTItem->getGpioDriver();
if (tmp) IoTgpio.regDriver(tmp);
IoTItems.push_back(myIoTItem);
}
}

View File

@@ -29,6 +29,7 @@ WebSocketsServer standWebSocket = WebSocketsServer(81);
/*********************************************************************************************************************
***********************************************глобальные переменные**************************************************
**********************************************************************************************************************/
IoTGpio IoTgpio = {};
String settingsFlashJson = "{}"; //переменная в которой хранятся все настройки, находится в оперативной памяти и синхронизированна с flash памятью
String errorsHeapJson = "{}"; //переменная в которой хранятся все ошибки, находится в оперативной памяти только

52
src/classes/IoTGpio.cpp Normal file
View File

@@ -0,0 +1,52 @@
#include "classes/IoTGpio.h"
IoTGpio::IoTGpio(){
_ext1 = _ext2 = _ext3 = _ext4 = nullptr;
}
IoTGpio::~IoTGpio(){
}
void IoTGpio::pinMode(uint8_t pin, uint8_t mode) {
::pinMode(pin, mode);
}
void IoTGpio::digitalWrite(uint8_t pin, uint8_t val) {
::digitalWrite(pin, val);
}
int IoTGpio::digitalRead(uint8_t pin) {
return ::digitalRead(pin);
}
int IoTGpio::analogRead(uint8_t pin) {
return ::analogRead(pin);
}
void IoTGpio::analogReference(uint8_t mode) {
::analogReference(mode);
}
void IoTGpio::analogWrite(uint8_t pin, int val) {
::analogWrite(pin, val);
}
void IoTGpio::analogWriteFreq(uint32_t freq) {
::analogWriteFreq(freq);
}
void IoTGpio::analogWriteRange(uint32_t range) {
::analogWriteRange(range);
}
void IoTGpio::regDriver(IoTGpio* newDriver) {
}

View File

@@ -84,3 +84,7 @@ IoTItem* findIoTItem(String name) { // поиск элемента модуля
}
IoTItem* myIoTItem;
IoTGpio* IoTItem::getGpioDriver() {
return nullptr;
}

View File

@@ -1,6 +1,8 @@
#include "Global.h"
#include "Classes/IoTItem.h"
extern IoTGpio IoTgpio;
//Это файл сенсора, в нем осуществляется чтение сенсора.
//для добавления сенсора вам нужно скопировать этот файл и заменить в нем текст AnalogAdc на название вашего сенсора
//Название должно быть уникальным, коротким и отражать суть сенсора.
@@ -32,7 +34,7 @@ class AnalogAdc : public IoTItem {
//не используйте delay - помните, что данный loop общий для всех модулей. Если у вас планируется длительная операция, постарайтесь разбить ее на порции
//и выполнить за несколько тактов
void doByInterval() {
value.valD = analogRead(_pin);
value.valD = IoTgpio.analogRead(_pin);
regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один
}