From 0527344d37ec4eb3d991eb58549ea2da72bf405d Mon Sep 17 00:00:00 2001 From: Chris Hatton Date: Fri, 10 Apr 2020 22:35:29 +1000 Subject: [PATCH 1/3] Add support for using std::function callbacks instead of C-pointers --- src/MqttClient.cpp | 15 +++++++++++++++ src/MqttClient.h | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 8e2684e..1bd0eb2 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -97,10 +97,17 @@ MqttClient::~MqttClient() } } +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK +void MqttClient::onMessage(MqttMessageCallback callback) +{ + _onMessage = callback; +} +#else void MqttClient::onMessage(void(*callback)(int)) { _onMessage = callback; } +#endif int MqttClient::parseMessage() { @@ -550,7 +557,11 @@ void MqttClient::poll() _rxState = MQTT_CLIENT_RX_STATE_READ_PUBLISH_PAYLOAD; if (_onMessage) { +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK + _onMessage(this,_rxLength); +#else _onMessage(_rxLength); +#endif if (_rxLength == 0) { _rxState = MQTT_CLIENT_RX_STATE_READ_TYPE; @@ -573,7 +584,11 @@ void MqttClient::poll() _rxState = MQTT_CLIENT_RX_STATE_READ_PUBLISH_PAYLOAD; if (_onMessage) { +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK + _onMessage(this,_rxLength); +#else _onMessage(_rxLength); +#endif } if (_rxLength == 0) { diff --git a/src/MqttClient.h b/src/MqttClient.h index e0e9d63..4382e3b 100644 --- a/src/MqttClient.h +++ b/src/MqttClient.h @@ -32,12 +32,24 @@ #define MQTT_BAD_USER_NAME_OR_PASSWORD 4 #define MQTT_NOT_AUTHORIZED 5 +// Make this definition in your application code to use std::functions for onMessage callbacks instead of C-pointers: +// #define MQTT_CLIENT_STD_FUNCTION_CALLBACK + +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK +#include +#endif + class MqttClient : public Client { public: MqttClient(Client& client); virtual ~MqttClient(); +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK + typedef std::function MessageCallback; + void onMessage(MessageCallback callback); +#else void onMessage(void(*)(int)); +#endif int parseMessage(); String messageTopic() const; @@ -128,7 +140,11 @@ class MqttClient : public Client { private: Client* _client; +#ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK + MqttClient::MessageCallback _onMessage; +#else void (*_onMessage)(int); +#endif String _id; String _username; From 9d22ef1a2f9d197cba2fa0873abe97f13f9bdc7c Mon Sep 17 00:00:00 2001 From: Chris Hatton Date: Fri, 10 Apr 2020 22:52:23 +1000 Subject: [PATCH 2/3] Remove some redundancy --- src/MqttClient.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index 1bd0eb2..ff7cf61 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -99,15 +99,12 @@ MqttClient::~MqttClient() #ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK void MqttClient::onMessage(MqttMessageCallback callback) -{ - _onMessage = callback; -} #else void MqttClient::onMessage(void(*callback)(int)) +#endif { _onMessage = callback; } -#endif int MqttClient::parseMessage() { From 0179fcdc5a9f789b3b12b8bd52579bb9f180671c Mon Sep 17 00:00:00 2001 From: Chris Hatton Date: Sat, 11 Apr 2020 00:46:50 +1000 Subject: [PATCH 3/3] Fix compile error & redundant class qualifier. --- src/MqttClient.cpp | 2 +- src/MqttClient.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index ff7cf61..0ab6863 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -98,7 +98,7 @@ MqttClient::~MqttClient() } #ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK -void MqttClient::onMessage(MqttMessageCallback callback) +void MqttClient::onMessage(MessageCallback callback) #else void MqttClient::onMessage(void(*callback)(int)) #endif diff --git a/src/MqttClient.h b/src/MqttClient.h index 4382e3b..27c1787 100644 --- a/src/MqttClient.h +++ b/src/MqttClient.h @@ -141,7 +141,7 @@ class MqttClient : public Client { Client* _client; #ifdef MQTT_CLIENT_STD_FUNCTION_CALLBACK - MqttClient::MessageCallback _onMessage; + MessageCallback _onMessage; #else void (*_onMessage)(int); #endif