changes for generial input/output via mqtt
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
build
|
build
|
||||||
cmake-build-debug
|
cmake-build-debug
|
||||||
cmake-build-release
|
cmake-build-release
|
||||||
|
cmake-build-release-s3
|
||||||
|
|||||||
@@ -82,6 +82,9 @@ set(SRCFILES
|
|||||||
lib/nuki_ble/src/NukiUtils.cpp
|
lib/nuki_ble/src/NukiUtils.cpp
|
||||||
lib/nuki_ble/src/NukiLockUtils.cpp
|
lib/nuki_ble/src/NukiLockUtils.cpp
|
||||||
lib/nuki_ble/src/NukiOpenerUtils.cpp
|
lib/nuki_ble/src/NukiOpenerUtils.cpp
|
||||||
|
lib/gpio2go/src/Gpio2Go.cpp
|
||||||
|
lib/gpio2go/src/InterruptMode.h
|
||||||
|
lib/gpio2go/src/PinMode.h
|
||||||
lib/BleScanner/src/BleInterfaces.h
|
lib/BleScanner/src/BleInterfaces.h
|
||||||
lib/BleScanner/src/BleScanner.cpp
|
lib/BleScanner/src/BleScanner.cpp
|
||||||
lib/MqttLogger/src/MqttLogger.cpp
|
lib/MqttLogger/src/MqttLogger.cpp
|
||||||
|
|||||||
44
Gpio.cpp
44
Gpio.cpp
@@ -5,6 +5,7 @@
|
|||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "PreferencesKeys.h"
|
#include "PreferencesKeys.h"
|
||||||
#include "RestartReason.h"
|
#include "RestartReason.h"
|
||||||
|
#include "lib/gpio2go/src/Gpio2Go.h"
|
||||||
|
|
||||||
Gpio* Gpio::_inst = nullptr;
|
Gpio* Gpio::_inst = nullptr;
|
||||||
unsigned long Gpio::_debounceTs = 0;
|
unsigned long Gpio::_debounceTs = 0;
|
||||||
@@ -65,10 +66,24 @@ void Gpio::init()
|
|||||||
pinMode(entry.pin, INPUT_PULLUP);
|
pinMode(entry.pin, INPUT_PULLUP);
|
||||||
attachInterrupt(entry.pin, isrDeactivateRtoCm, FALLING);
|
attachInterrupt(entry.pin, isrDeactivateRtoCm, FALLING);
|
||||||
break;
|
break;
|
||||||
|
case PinRole::OutputHighLocked:
|
||||||
|
case PinRole::OutputHighUnlocked:
|
||||||
|
case PinRole::OutputHighMotorBlocked:
|
||||||
|
case PinRole::OutputHighRtoActive:
|
||||||
|
case PinRole::OutputHighCmActive:
|
||||||
|
case PinRole::OutputHighRtoOrCmActive:
|
||||||
|
case PinRole::GeneralOutput:
|
||||||
|
pinMode(entry.pin, OUTPUT);
|
||||||
|
break;
|
||||||
|
case PinRole::GeneralInput:
|
||||||
|
Gpio2Go::configurePin(entry.pin, PinMode::InputPullup, InterruptMode::Change, 300);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
pinMode(entry.pin, OUTPUT);
|
pinMode(entry.pin, OUTPUT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Gpio2Go::subscribe(Gpio::inputCallback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +184,10 @@ String Gpio::getRoleDescription(PinRole role) const
|
|||||||
return "Output: High when CM active";
|
return "Output: High when CM active";
|
||||||
case PinRole::OutputHighRtoOrCmActive:
|
case PinRole::OutputHighRtoOrCmActive:
|
||||||
return "Output: High when RTO or CM active";
|
return "Output: High when RTO or CM active";
|
||||||
|
case PinRole::GeneralOutput:
|
||||||
|
return "General output";
|
||||||
|
case PinRole::GeneralInput:
|
||||||
|
return "General input (Pull-up)";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
@@ -198,15 +217,20 @@ const std::vector<PinRole>& Gpio::getAllRoles() const
|
|||||||
return _allRoles;
|
return _allRoles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::notify(const GpioAction &action)
|
void Gpio::notify(const GpioAction &action, const int& pin)
|
||||||
{
|
{
|
||||||
for(auto& callback : _callbacks)
|
for(auto& callback : _callbacks)
|
||||||
{
|
{
|
||||||
callback(action);
|
callback(action, pin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::addCallback(std::function<void(const GpioAction&)> callback)
|
void Gpio::inputCallback(const int &pin)
|
||||||
|
{
|
||||||
|
_inst->notify(GpioAction::GeneralInput, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio::addCallback(std::function<void(const GpioAction&, const int&)> callback)
|
||||||
{
|
{
|
||||||
_callbacks.push_back(callback);
|
_callbacks.push_back(callback);
|
||||||
}
|
}
|
||||||
@@ -214,49 +238,49 @@ void Gpio::addCallback(std::function<void(const GpioAction&)> callback)
|
|||||||
void Gpio::isrLock()
|
void Gpio::isrLock()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::Lock);
|
_inst->notify(GpioAction::Lock, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrUnlock()
|
void Gpio::isrUnlock()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::Unlock);
|
_inst->notify(GpioAction::Unlock, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrUnlatch()
|
void Gpio::isrUnlatch()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::Unlatch);
|
_inst->notify(GpioAction::Unlatch, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrElectricStrikeActuation()
|
void Gpio::isrElectricStrikeActuation()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::ElectricStrikeActuation);
|
_inst->notify(GpioAction::ElectricStrikeActuation, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrActivateRTO()
|
void Gpio::isrActivateRTO()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::ActivateRTO);
|
_inst->notify(GpioAction::ActivateRTO, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrActivateCM()
|
void Gpio::isrActivateCM()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::ActivateCM);
|
_inst->notify(GpioAction::ActivateCM, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gpio::isrDeactivateRtoCm()
|
void Gpio::isrDeactivateRtoCm()
|
||||||
{
|
{
|
||||||
if(millis() < _debounceTs) return;
|
if(millis() < _debounceTs) return;
|
||||||
_inst->notify(GpioAction::DeactivateRtoCm);
|
_inst->notify(GpioAction::DeactivateRtoCm, -1);
|
||||||
_debounceTs = millis() + _debounceTime;
|
_debounceTs = millis() + _debounceTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
14
Gpio.h
14
Gpio.h
@@ -19,7 +19,9 @@ enum class PinRole
|
|||||||
OutputHighMotorBlocked,
|
OutputHighMotorBlocked,
|
||||||
OutputHighRtoActive,
|
OutputHighRtoActive,
|
||||||
OutputHighCmActive,
|
OutputHighCmActive,
|
||||||
OutputHighRtoOrCmActive
|
OutputHighRtoOrCmActive,
|
||||||
|
GeneralOutput,
|
||||||
|
GeneralInput
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class GpioAction
|
enum class GpioAction
|
||||||
@@ -30,7 +32,8 @@ enum class GpioAction
|
|||||||
ElectricStrikeActuation,
|
ElectricStrikeActuation,
|
||||||
ActivateRTO,
|
ActivateRTO,
|
||||||
ActivateCM,
|
ActivateCM,
|
||||||
DeactivateRtoCm
|
DeactivateRtoCm,
|
||||||
|
GeneralInput
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PinEntry
|
struct PinEntry
|
||||||
@@ -47,7 +50,7 @@ public:
|
|||||||
|
|
||||||
void migrateObsoleteSetting();
|
void migrateObsoleteSetting();
|
||||||
|
|
||||||
void addCallback(std::function<void(const GpioAction&)> callback);
|
void addCallback(std::function<void(const GpioAction&, const int&)> callback);
|
||||||
|
|
||||||
void loadPinConfiguration();
|
void loadPinConfiguration();
|
||||||
void savePinConfiguration(const std::vector<PinEntry>& pinConfiguration);
|
void savePinConfiguration(const std::vector<PinEntry>& pinConfiguration);
|
||||||
@@ -63,7 +66,8 @@ public:
|
|||||||
void setPinOutput(const uint8_t& pin, const uint8_t& state);
|
void setPinOutput(const uint8_t& pin, const uint8_t& state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void notify(const GpioAction& action);
|
void IRAM_ATTR notify(const GpioAction& action, const int& pin);
|
||||||
|
static void inputCallback(const int & pin);
|
||||||
|
|
||||||
const std::vector<uint8_t> _availablePins = { 2, 4, 5, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33 };
|
const std::vector<uint8_t> _availablePins = { 2, 4, 5, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33 };
|
||||||
const std::vector<PinRole> _allRoles =
|
const std::vector<PinRole> _allRoles =
|
||||||
@@ -94,7 +98,7 @@ private:
|
|||||||
static void IRAM_ATTR isrActivateCM();
|
static void IRAM_ATTR isrActivateCM();
|
||||||
static void IRAM_ATTR isrDeactivateRtoCm();
|
static void IRAM_ATTR isrDeactivateRtoCm();
|
||||||
|
|
||||||
std::vector<std::function<void(const GpioAction&)>> _callbacks;
|
std::vector<std::function<void(const GpioAction&, const int&)>> _callbacks;
|
||||||
|
|
||||||
static Gpio* _inst;
|
static Gpio* _inst;
|
||||||
static unsigned long _debounceTs;
|
static unsigned long _debounceTs;
|
||||||
|
|||||||
@@ -60,4 +60,6 @@
|
|||||||
#define mqtt_topic_restart_reason_fw "/maintenance/restartReasonNukiHub"
|
#define mqtt_topic_restart_reason_fw "/maintenance/restartReasonNukiHub"
|
||||||
#define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp"
|
#define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp"
|
||||||
#define mqtt_topic_mqtt_connection_state "/maintenance/mqttConnectionState"
|
#define mqtt_topic_mqtt_connection_state "/maintenance/mqttConnectionState"
|
||||||
#define mqtt_topic_network_device "/maintenance/networkDevice"
|
#define mqtt_topic_network_device "/maintenance/networkDevice"
|
||||||
|
|
||||||
|
#define mqtt_topic_gpio_prefix "/gpio/"
|
||||||
|
|||||||
27
Network.cpp
27
Network.cpp
@@ -14,8 +14,9 @@ bool _versionPublished = false;
|
|||||||
|
|
||||||
RTC_NOINIT_ATTR char WiFi_fallbackDetect[14];
|
RTC_NOINIT_ATTR char WiFi_fallbackDetect[14];
|
||||||
|
|
||||||
Network::Network(Preferences *preferences, const String& maintenancePathPrefix, char* buffer, size_t bufferSize)
|
Network::Network(Preferences *preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize)
|
||||||
: _preferences(preferences),
|
: _preferences(preferences),
|
||||||
|
_gpio(gpio),
|
||||||
_buffer(buffer),
|
_buffer(buffer),
|
||||||
_bufferSize(bufferSize)
|
_bufferSize(bufferSize)
|
||||||
{
|
{
|
||||||
@@ -137,6 +138,9 @@ void Network::setupDevice()
|
|||||||
|
|
||||||
void Network::initialize()
|
void Network::initialize()
|
||||||
{
|
{
|
||||||
|
_networkGpio->initialize();
|
||||||
|
registerMqttReceiver(_networkGpio);
|
||||||
|
|
||||||
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect);
|
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect);
|
||||||
_rssiPublishInterval = _preferences->getInt(preference_rssi_publish_interval) * 1000;
|
_rssiPublishInterval = _preferences->getInt(preference_rssi_publish_interval) * 1000;
|
||||||
|
|
||||||
@@ -204,6 +208,20 @@ void Network::initialize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info);
|
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info);
|
||||||
|
|
||||||
|
for(const auto& pinEntry : _gpio->pinConfiguration())
|
||||||
|
{
|
||||||
|
switch(pinEntry.role)
|
||||||
|
{
|
||||||
|
case PinRole::GeneralInput:
|
||||||
|
String inp = "input_";
|
||||||
|
inp.concat(pinEntry.pin);
|
||||||
|
initTopic(mqtt_topic_gpio_prefix, inp.c_str(), )
|
||||||
|
break;
|
||||||
|
case PinRole::GeneralOutput:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Network::update()
|
bool Network::update()
|
||||||
@@ -303,6 +321,8 @@ bool Network::update()
|
|||||||
_lastMaintenanceTs = ts;
|
_lastMaintenanceTs = ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_networkGpio->update();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1238,3 +1258,8 @@ void Network::disableMqtt()
|
|||||||
_device->disableMqtt();
|
_device->disableMqtt();
|
||||||
_mqttEnabled = false;
|
_mqttEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetworkDevice *Network::device()
|
||||||
|
{
|
||||||
|
return _device;
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
#include "MqttReceiver.h"
|
#include "MqttReceiver.h"
|
||||||
#include "networkDevices/IPConfiguration.h"
|
#include "networkDevices/IPConfiguration.h"
|
||||||
#include "MqttTopics.h"
|
#include "MqttTopics.h"
|
||||||
|
#include "Gpio.h"
|
||||||
|
#include "NetworkGpio.h"
|
||||||
|
|
||||||
enum class NetworkDeviceType
|
enum class NetworkDeviceType
|
||||||
{
|
{
|
||||||
@@ -23,7 +25,7 @@ enum class NetworkDeviceType
|
|||||||
class Network
|
class Network
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Network(Preferences* preferences, const String& maintenancePathPrefix, char* buffer, size_t bufferSize);
|
explicit Network(Preferences* preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize);
|
||||||
|
|
||||||
void initialize();
|
void initialize();
|
||||||
bool update();
|
bool update();
|
||||||
@@ -70,6 +72,8 @@ public:
|
|||||||
void setKeepAliveCallback(std::function<void()> reconnectTick);
|
void setKeepAliveCallback(std::function<void()> reconnectTick);
|
||||||
void addReconnectedCallback(std::function<void()> reconnectedCallback);
|
void addReconnectedCallback(std::function<void()> reconnectedCallback);
|
||||||
|
|
||||||
|
NetworkDevice* device();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void onMqttDataReceivedCallback(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
static void onMqttDataReceivedCallback(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
||||||
void onMqttDataReceived(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
void onMqttDataReceived(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
||||||
@@ -105,6 +109,7 @@ private:
|
|||||||
char _mqttConnectionStateTopic[211] = {0};
|
char _mqttConnectionStateTopic[211] = {0};
|
||||||
|
|
||||||
Preferences* _preferences;
|
Preferences* _preferences;
|
||||||
|
Gpio* _gpio;
|
||||||
IPConfiguration* _ipConfiguration = nullptr;
|
IPConfiguration* _ipConfiguration = nullptr;
|
||||||
String _hostname;
|
String _hostname;
|
||||||
char _hostnameArr[101] = {0};
|
char _hostnameArr[101] = {0};
|
||||||
|
|||||||
@@ -482,7 +482,7 @@ void NukiOpenerWrapper::onKeypadCommandReceivedCallback(const char *command, con
|
|||||||
nukiOpenerInst->onKeypadCommandReceived(command, id, name, code, enabled);
|
nukiOpenerInst->onKeypadCommandReceived(command, id, name, code, enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NukiOpenerWrapper::gpioActionCallback(const GpioAction &action)
|
void NukiOpenerWrapper::gpioActionCallback(const GpioAction &action, const int& pin)
|
||||||
{
|
{
|
||||||
switch(action)
|
switch(action)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ private:
|
|||||||
static bool onLockActionReceivedCallback(const char* value);
|
static bool onLockActionReceivedCallback(const char* value);
|
||||||
static void onConfigUpdateReceivedCallback(const char* topic, const char* value);
|
static void onConfigUpdateReceivedCallback(const char* topic, const char* value);
|
||||||
static void onKeypadCommandReceivedCallback(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
static void onKeypadCommandReceivedCallback(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
||||||
static void gpioActionCallback(const GpioAction& action);
|
static void gpioActionCallback(const GpioAction& action, const int& pin);
|
||||||
void onConfigUpdateReceived(const char* topic, const char* value);
|
void onConfigUpdateReceived(const char* topic, const char* value);
|
||||||
void onKeypadCommandReceived(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
void onKeypadCommandReceived(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
||||||
|
|
||||||
|
|||||||
@@ -450,7 +450,7 @@ void NukiWrapper::onKeypadCommandReceivedCallback(const char *command, const uin
|
|||||||
nukiInst->onKeypadCommandReceived(command, id, name, code, enabled);
|
nukiInst->onKeypadCommandReceived(command, id, name, code, enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NukiWrapper::gpioActionCallback(const GpioAction &action)
|
void NukiWrapper::gpioActionCallback(const GpioAction &action, const int& pin)
|
||||||
{
|
{
|
||||||
switch(action)
|
switch(action)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ private:
|
|||||||
static bool onLockActionReceivedCallback(const char* value);
|
static bool onLockActionReceivedCallback(const char* value);
|
||||||
static void onConfigUpdateReceivedCallback(const char* topic, const char* value);
|
static void onConfigUpdateReceivedCallback(const char* topic, const char* value);
|
||||||
static void onKeypadCommandReceivedCallback(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
static void onKeypadCommandReceivedCallback(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
||||||
static void gpioActionCallback(const GpioAction& action);
|
static void gpioActionCallback(const GpioAction& action, const int& pin);
|
||||||
|
|
||||||
void onConfigUpdateReceived(const char* topic, const char* value);
|
void onConfigUpdateReceived(const char* topic, const char* value);
|
||||||
void onKeypadCommandReceived(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
void onKeypadCommandReceived(const char* command, const uint& id, const String& name, const String& code, const int& enabled);
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ void Scanner::update() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bleScan->clearResults();
|
||||||
|
|
||||||
bool result = bleScan->start(scanDuration, nullptr, false);
|
bool result = bleScan->start(scanDuration, nullptr, false);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
scanErrors++;
|
scanErrors++;
|
||||||
|
|||||||
58
lib/gpio2go/CMakeLists.txt
Normal file
58
lib/gpio2go/CMakeLists.txt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.0.0)
|
||||||
|
|
||||||
|
if(NOT ARDUINO_BOARD)
|
||||||
|
set(ARDUINO_BOARD "ESP32 Dev Module [esp32.esp32]")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
project(gpio2go CXX)
|
||||||
|
|
||||||
|
# ARDUHAL_LOG_LEVEL_NONE, define ARDUHAL_LOG_LEVEL_ERROR, define ARDUHAL_LOG_LEVEL_WARN, define ARDUHAL_LOG_LEVEL_INFO,
|
||||||
|
# define ARDUHAL_LOG_LEVEL_DEBUG, define ARDUHAL_LOG_LEVEL_VERBOSE
|
||||||
|
|
||||||
|
set(LOG_LEVEL ARDUHAL_LOG_LEVEL_NONE)
|
||||||
|
|
||||||
|
#add_compile_definitions(DEBUG_SENSE_NUKI)
|
||||||
|
#add_compile_definitions(DEBUG_NUKI_COMMAND)
|
||||||
|
#add_compile_definitions(DEBUG_NUKI_CONNECT)
|
||||||
|
#add_compile_definitions(DEBUG_NUKI_COMMUNICATION)
|
||||||
|
#add_compile_definitions(DEBUG_NUKI_HEX_DATA)
|
||||||
|
#add_compile_definitions(DEBUG_NUKI_READABLE_DATA)
|
||||||
|
|
||||||
|
add_compile_definitions(ESP_PLATFORM)
|
||||||
|
add_compile_definitions(ESP32)
|
||||||
|
add_compile_definitions(ARDUINO_ARCH_ESP32)
|
||||||
|
|
||||||
|
include_directories(${PROJECT_NAME}
|
||||||
|
PRIVATE
|
||||||
|
src
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SRCFILES
|
||||||
|
src/PinMode.h
|
||||||
|
src/Gpio2Go.cpp
|
||||||
|
src/InterruptMode.h
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE SRCFILESREC
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME}
|
||||||
|
main.cpp
|
||||||
|
${SRCFILES}
|
||||||
|
${SRCFILESREC}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(${PROJECT_NAME}
|
||||||
|
PRIVATE
|
||||||
|
ARDUHAL_LOG_LEVEL=${LOG_LEVEL}
|
||||||
|
CORE_DEBUG_LEVEL=${LOG_LEVEL}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_arduino_libraries(${PROJECT_NAME}
|
||||||
|
PRIVATE
|
||||||
|
core
|
||||||
|
)
|
||||||
|
|
||||||
|
target_enable_arduino_upload(${PROJECT_NAME})
|
||||||
|
|
||||||
21
lib/gpio2go/LICENSE
Normal file
21
lib/gpio2go/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Jan-Ole Schümann
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
1
lib/gpio2go/README.md
Normal file
1
lib/gpio2go/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# gpio2go
|
||||||
38
lib/gpio2go/main.cpp
Normal file
38
lib/gpio2go/main.cpp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include "Arduino.h"
|
||||||
|
#include "Gpio2Go.h"
|
||||||
|
|
||||||
|
#define INPUT_PIN 21
|
||||||
|
|
||||||
|
bool hasMessage = false;
|
||||||
|
String message;
|
||||||
|
|
||||||
|
void inputCb(const int & pin)
|
||||||
|
{
|
||||||
|
message = "";
|
||||||
|
message.concat("Input, Pin ");
|
||||||
|
message.concat(pin);
|
||||||
|
message.concat(" ");
|
||||||
|
message.concat(", state ");
|
||||||
|
message.concat(digitalRead(INPUT_PIN) ? "High" : "Low");
|
||||||
|
hasMessage = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(115200);
|
||||||
|
|
||||||
|
delay(1100);
|
||||||
|
Serial.println(F("Started"));
|
||||||
|
Gpio2Go::configurePin(INPUT_PIN, PinMode::InputPullup, InterruptMode::Change, 200);
|
||||||
|
Gpio2Go::subscribe(inputCb);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
delay(100);
|
||||||
|
if(hasMessage)
|
||||||
|
{
|
||||||
|
hasMessage = false;
|
||||||
|
Serial.println(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
242
lib/gpio2go/src/Gpio2Go.cpp
Normal file
242
lib/gpio2go/src/Gpio2Go.cpp
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
#include "Gpio2Go.h"
|
||||||
|
|
||||||
|
|
||||||
|
void Gpio2Go::configurePin(int pin, PinMode pin_Mode, InterruptMode interrupt_Mode, uint16_t timeoutAfterTriggerMS)
|
||||||
|
{
|
||||||
|
timeoutDurations[pin - GPIO2GO_NR_FIRST_PIN] = timeoutAfterTriggerMS;
|
||||||
|
|
||||||
|
switch(pin_Mode)
|
||||||
|
{
|
||||||
|
case PinMode::InputPullup:
|
||||||
|
pinMode(pin, INPUT_PULLUP);
|
||||||
|
attachIsr(pin, interrupt_Mode);
|
||||||
|
break;
|
||||||
|
case PinMode::InputPullDown:
|
||||||
|
pinMode(pin, INPUT_PULLDOWN);
|
||||||
|
attachIsr(pin, interrupt_Mode);
|
||||||
|
break;
|
||||||
|
case PinMode::Output:
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::subscribe(std::function<void(const int &)> callback)
|
||||||
|
{
|
||||||
|
subscriptions.push_back(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long Gpio2Go::getLastTriggeredMillis(const int &pin)
|
||||||
|
{
|
||||||
|
if(pin >= GPIO2GO_NR_FIRST_PIN && pin <= (GPIO2GO_NR_OF_PINS + GPIO2GO_NR_FIRST_PIN))
|
||||||
|
{
|
||||||
|
return lastTriggeredTimestamps[pin - GPIO2GO_NR_FIRST_PIN];
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::attachIsr(int pin, InterruptMode interruptMode)
|
||||||
|
{
|
||||||
|
switch(pin)
|
||||||
|
{
|
||||||
|
case 2:
|
||||||
|
attachInterrupt(2, isrGpio2, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
attachInterrupt(4, isrGpio4, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
attachInterrupt(5, isrGpio5, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
attachInterrupt(13, isrGpio13, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
attachInterrupt(14, isrGpio14, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
attachInterrupt(15, isrGpio15, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
attachInterrupt(16, isrGpio16, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 17:
|
||||||
|
attachInterrupt(17, isrGpio17, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 18:
|
||||||
|
attachInterrupt(18, isrGpio18, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
attachInterrupt(19, isrGpio19, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 20:
|
||||||
|
attachInterrupt(20, isrGpio20, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
attachInterrupt(21, isrGpio21, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 22:
|
||||||
|
attachInterrupt(22, isrGpio22, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 23:
|
||||||
|
attachInterrupt(23, isrGpio23, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
attachInterrupt(24, isrGpio24, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 25:
|
||||||
|
attachInterrupt(25, isrGpio25, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 26:
|
||||||
|
attachInterrupt(26, isrGpio26, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
attachInterrupt(27, isrGpio27, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
attachInterrupt(32, isrGpio32, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
case 33:
|
||||||
|
attachInterrupt(33, isrGpio33, resolveInterruptMode(interruptMode));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Gpio2Go: Unsupported pin.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Gpio2Go::resolveInterruptMode(InterruptMode interruptMode)
|
||||||
|
{
|
||||||
|
switch(interruptMode)
|
||||||
|
{
|
||||||
|
case InterruptMode::Rising:
|
||||||
|
return RISING;
|
||||||
|
case InterruptMode::Falling:
|
||||||
|
return FALLING;
|
||||||
|
case InterruptMode::Change:
|
||||||
|
return CHANGE;
|
||||||
|
case InterruptMode::OnLow:
|
||||||
|
return ONLOW;
|
||||||
|
case InterruptMode::OnHigh:
|
||||||
|
return ONHIGH;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error("Gpio2Go: Unsupported interrupt mode.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrHandler(int pin)
|
||||||
|
{
|
||||||
|
unsigned long timeout = lastTriggeredTimestamps[pin - GPIO2GO_NR_FIRST_PIN];
|
||||||
|
if(timeoutDurations[pin - GPIO2GO_NR_FIRST_PIN] != 0 && (millis() - timeout) < timeoutDurations[pin - GPIO2GO_NR_FIRST_PIN]) return;
|
||||||
|
lastTriggeredTimestamps[pin - GPIO2GO_NR_FIRST_PIN] = millis();
|
||||||
|
|
||||||
|
bool state = digitalRead(pin) == HIGH;
|
||||||
|
|
||||||
|
for(const auto& callback : subscriptions)
|
||||||
|
{
|
||||||
|
callback(pin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio2()
|
||||||
|
{
|
||||||
|
isrHandler(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio4()
|
||||||
|
{
|
||||||
|
isrHandler(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio5()
|
||||||
|
{
|
||||||
|
isrHandler(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio13()
|
||||||
|
{
|
||||||
|
isrHandler(13);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio14()
|
||||||
|
{
|
||||||
|
isrHandler(14);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio15()
|
||||||
|
{
|
||||||
|
isrHandler(15);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio16()
|
||||||
|
{
|
||||||
|
isrHandler(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio17()
|
||||||
|
{
|
||||||
|
isrHandler(17);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio18()
|
||||||
|
{
|
||||||
|
isrHandler(18);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio19()
|
||||||
|
{
|
||||||
|
isrHandler(19);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio20()
|
||||||
|
{
|
||||||
|
isrHandler(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio21()
|
||||||
|
{
|
||||||
|
isrHandler(21);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio22()
|
||||||
|
{
|
||||||
|
isrHandler(22);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio23()
|
||||||
|
{
|
||||||
|
isrHandler(23);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio24()
|
||||||
|
{
|
||||||
|
isrHandler(24);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio25()
|
||||||
|
{
|
||||||
|
isrHandler(25);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio26()
|
||||||
|
{
|
||||||
|
isrHandler(26);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio27()
|
||||||
|
{
|
||||||
|
isrHandler(27);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio32()
|
||||||
|
{
|
||||||
|
isrHandler(32);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio2Go::isrGpio33()
|
||||||
|
{
|
||||||
|
isrHandler(33);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long Gpio2Go::lastTriggeredTimestamps[] = {0};
|
||||||
|
uint16_t Gpio2Go::timeoutDurations[] = {0};
|
||||||
|
std::vector<std::function<void(const int&)>> Gpio2Go::subscriptions;
|
||||||
49
lib/gpio2go/src/Gpio2Go.h
Normal file
49
lib/gpio2go/src/Gpio2Go.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <vector>
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "PinMode.h"
|
||||||
|
#include "InterruptMode.h"
|
||||||
|
|
||||||
|
#define GPIO2GO_NR_OF_PINS 31
|
||||||
|
#define GPIO2GO_NR_FIRST_PIN 2
|
||||||
|
|
||||||
|
class Gpio2Go
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void configurePin(int pin, PinMode pin_Mode, InterruptMode interrupt_Mode, uint16_t timeoutAfterTriggerMS);
|
||||||
|
static void subscribe(std::function<void(const int&)> callback);
|
||||||
|
|
||||||
|
unsigned long getLastTriggeredMillis(const int& pin);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void attachIsr(int pin, InterruptMode interruptMode);
|
||||||
|
static int resolveInterruptMode(InterruptMode interruptMode);
|
||||||
|
|
||||||
|
static void IRAM_ATTR isrHandler(int pin);
|
||||||
|
static void IRAM_ATTR isrGpio2();
|
||||||
|
static void IRAM_ATTR isrGpio4();
|
||||||
|
static void IRAM_ATTR isrGpio5();
|
||||||
|
static void IRAM_ATTR isrGpio13();
|
||||||
|
static void IRAM_ATTR isrGpio14();
|
||||||
|
static void IRAM_ATTR isrGpio15();
|
||||||
|
static void IRAM_ATTR isrGpio16();
|
||||||
|
static void IRAM_ATTR isrGpio17();
|
||||||
|
static void IRAM_ATTR isrGpio18();
|
||||||
|
static void IRAM_ATTR isrGpio19();
|
||||||
|
static void IRAM_ATTR isrGpio20();
|
||||||
|
static void IRAM_ATTR isrGpio21();
|
||||||
|
static void IRAM_ATTR isrGpio22();
|
||||||
|
static void IRAM_ATTR isrGpio23();
|
||||||
|
static void IRAM_ATTR isrGpio24();
|
||||||
|
static void IRAM_ATTR isrGpio25();
|
||||||
|
static void IRAM_ATTR isrGpio26();
|
||||||
|
static void IRAM_ATTR isrGpio27();
|
||||||
|
static void IRAM_ATTR isrGpio32();
|
||||||
|
static void IRAM_ATTR isrGpio33();
|
||||||
|
|
||||||
|
static unsigned long DRAM_ATTR lastTriggeredTimestamps[GPIO2GO_NR_OF_PINS];
|
||||||
|
static uint16_t DRAM_ATTR timeoutDurations[GPIO2GO_NR_OF_PINS];
|
||||||
|
static std::vector<std::function<void(const int&)>> DRAM_ATTR subscriptions;
|
||||||
|
};
|
||||||
10
lib/gpio2go/src/InterruptMode.h
Normal file
10
lib/gpio2go/src/InterruptMode.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum class InterruptMode
|
||||||
|
{
|
||||||
|
Rising = 0x01,
|
||||||
|
Falling = 0x02,
|
||||||
|
Change = 0x03,
|
||||||
|
OnLow = 0x04,
|
||||||
|
OnHigh = 0x05
|
||||||
|
};
|
||||||
20
lib/gpio2go/src/PinMode.h
Normal file
20
lib/gpio2go/src/PinMode.h
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum class PinMode
|
||||||
|
{
|
||||||
|
Output = 0x03,
|
||||||
|
InputPullup = 0x05,
|
||||||
|
InputPullDown = 0x09
|
||||||
|
};
|
||||||
|
|
||||||
|
//#define INPUT 0x01
|
||||||
|
//// Changed OUTPUT from 0x02 to behave the same as Arduino pinMode(pin,OUTPUT)
|
||||||
|
//// where you can read the state of pin even when it is set as OUTPUT
|
||||||
|
//#define OUTPUT 0x03
|
||||||
|
//#define PULLUP 0x04
|
||||||
|
//#define INPUT_PULLUP 0x05
|
||||||
|
//#define PULLDOWN 0x08
|
||||||
|
//#define INPUT_PULLDOWN 0x09
|
||||||
|
//#define OPEN_DRAIN 0x10
|
||||||
|
//#define OUTPUT_OPEN_DRAIN 0x12
|
||||||
|
//#define ANALOG 0xC0
|
||||||
Submodule lib/nuki_ble updated: 1de629002a...d23f6d794a
12
main.cpp
12
main.cpp
@@ -180,11 +180,16 @@ void setup()
|
|||||||
restartTs = preferences->getInt(preference_restart_timer) * 60 * 1000;
|
restartTs = preferences->getInt(preference_restart_timer) * 60 * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gpio = new Gpio(preferences);
|
||||||
|
String gpioDesc;
|
||||||
|
gpio->getConfigurationText(gpioDesc, gpio->pinConfiguration(), "\n\r");
|
||||||
|
Serial.print(gpioDesc.c_str());
|
||||||
|
|
||||||
lockEnabled = preferences->getBool(preference_lock_enabled);
|
lockEnabled = preferences->getBool(preference_lock_enabled);
|
||||||
openerEnabled = preferences->getBool(preference_opener_enabled);
|
openerEnabled = preferences->getBool(preference_opener_enabled);
|
||||||
|
|
||||||
const String mqttLockPath = preferences->getString(preference_mqtt_lock_path);
|
const String mqttLockPath = preferences->getString(preference_mqtt_lock_path);
|
||||||
network = new Network(preferences, mqttLockPath, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
network = new Network(preferences, gpio, mqttLockPath, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
||||||
network->initialize();
|
network->initialize();
|
||||||
|
|
||||||
networkLock = new NetworkLock(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
networkLock = new NetworkLock(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
||||||
@@ -209,11 +214,6 @@ void setup()
|
|||||||
bleScanner->initialize("NukiHub");
|
bleScanner->initialize("NukiHub");
|
||||||
bleScanner->setScanDuration(10);
|
bleScanner->setScanDuration(10);
|
||||||
|
|
||||||
gpio = new Gpio(preferences);
|
|
||||||
String gpioDesc;
|
|
||||||
gpio->getConfigurationText(gpioDesc, gpio->pinConfiguration(), "\n\r");
|
|
||||||
Serial.print(gpioDesc.c_str());
|
|
||||||
|
|
||||||
Log->println(lockEnabled ? F("NUKI Lock enabled") : F("NUKI Lock disabled"));
|
Log->println(lockEnabled ? F("NUKI Lock enabled") : F("NUKI Lock disabled"));
|
||||||
if(lockEnabled)
|
if(lockEnabled)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ public:
|
|||||||
virtual uint16_t mqttSubscribe(const char* topic, uint8_t qos) = 0;
|
virtual uint16_t mqttSubscribe(const char* topic, uint8_t qos) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const uint16_t _mqttMaxBufferSize = 6144;
|
|
||||||
const String _hostname;
|
const String _hostname;
|
||||||
const IPConfiguration* _ipConfiguration = nullptr;
|
const IPConfiguration* _ipConfiguration = nullptr;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user