Skip to content

Commit 3274a5b

Browse files
committed
Adding the capability to register callbacks for various cloud connection events
1 parent 19f63c2 commit 3274a5b

File tree

2 files changed

+48
-9
lines changed

2 files changed

+48
-9
lines changed

src/ArduinoIoTCloud.cpp

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ ArduinoIoTCloudClass::ArduinoIoTCloudClass() :
7272
_dataTopicOut(""),
7373
_dataTopicIn(""),
7474
_otaTopic(""),
75-
_lastSyncRequestTickTime(0) {
75+
_lastSyncRequestTickTime(0),
76+
_on_sync_event_callback(NULL),
77+
_on_connect_event_callback(NULL),
78+
_on_disconnect_event_callback(NULL) {
79+
7680
}
7781

7882
ArduinoIoTCloudClass::~ArduinoIoTCloudClass() {
@@ -237,21 +241,25 @@ void ArduinoIoTCloudClass::update(int const reconnectionMaxRetries, int const re
237241
_mqttClient->poll();
238242

239243
switch (_syncStatus) {
240-
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED:
244+
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED: {
241245
sendPropertiesToCloud();
242-
break;
243-
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES:
246+
}
247+
break;
248+
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES: {
244249
if (millis() - _lastSyncRequestTickTime > TIMEOUT_FOR_LASTVALUES_SYNC) {
245250
requestLastValue();
246251
_lastSyncRequestTickTime = millis();
247252
}
248-
break;
249-
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_VALUES_PROCESSED:
253+
}
254+
break;
255+
case ArduinoIoTSynchronizationStatus::SYNC_STATUS_VALUES_PROCESSED: {
250256
if (onSyncCompleteCallback != NULL) {
251257
(*onSyncCompleteCallback)();
252258
}
259+
execCloudConnectionEventCallback(_on_sync_event_callback, 0 /* callback_arg */);
253260
_syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED;
254-
break;
261+
}
262+
break;
255263
}
256264
}
257265

@@ -385,6 +393,7 @@ void ArduinoIoTCloudClass::connectionCheck() {
385393
debugMessageNoTimestamp(DebugLevel::Verbose, ".");
386394
if (!_mqttClient->connected()) {
387395
setIoTConnectionState(ArduinoIoTConnectionStatus::DISCONNECTED);
396+
execCloudConnectionEventCallback(_on_disconnect_event_callback, 0 /* callback_arg - e.g. could be error code casted to void * */);
388397
}
389398
}
390399
break;
@@ -397,6 +406,7 @@ void ArduinoIoTCloudClass::connectionCheck() {
397406
debugMessage(DebugLevel::Info, "ArduinoCloud.reconnect(): %d", ret_code_reconnect);
398407
if (ret_code_reconnect == CONNECT_SUCCESS) {
399408
setIoTConnectionState(ArduinoIoTConnectionStatus::CONNECTED);
409+
execCloudConnectionEventCallback(_on_connect_event_callback, 0 /* callback_arg */);
400410
CloudSerial.begin(9600);
401411
CloudSerial.println("Hello from Cloud Serial!");
402412
}
@@ -407,6 +417,7 @@ void ArduinoIoTCloudClass::connectionCheck() {
407417
debugMessage(DebugLevel::Verbose, "ArduinoCloud.connect(): %d", ret_code_connect);
408418
if (ret_code_connect == CONNECT_SUCCESS) {
409419
setIoTConnectionState(ArduinoIoTConnectionStatus::CONNECTED);
420+
execCloudConnectionEventCallback(_on_connect_event_callback, 0 /* callback_arg */);
410421
CloudSerial.begin(9600);
411422
CloudSerial.println("Hello from Cloud Serial!");
412423
} else if (ret_code_connect == CONNECT_FAILURE_SUBSCRIBE) {
@@ -435,4 +446,18 @@ void ArduinoIoTCloudClass::printDebugInfo() {
435446
debugMessage(DebugLevel::Info, "MQTT Broker: %s:%d", _brokerAddress.c_str(), _brokerPort);
436447
}
437448

449+
void ArduinoIoTCloudClass::addCallback(ArduinoIoTCloudConnectionEvent const event, OnCloudConnectionEventCallback callback) {
450+
switch (event) {
451+
case ArduinoIoTCloudConnectionEvent::SYNC: _on_sync_event_callback = callback; break;
452+
case ArduinoIoTCloudConnectionEvent::CONNECT: _on_connect_event_callback = callback; break;
453+
case ArduinoIoTCloudConnectionEvent::DISCONNECT: _on_disconnect_event_callback = callback; break;
454+
}
455+
}
456+
457+
void ArduinoIoTCloudClass::execCloudConnectionEventCallback(OnCloudConnectionEventCallback & callback, void * callback_arg) {
458+
if(callback) {
459+
(*callback)(callback_arg);
460+
}
461+
}
462+
438463
ArduinoIoTCloudClass ArduinoCloud;

src/ArduinoIoTCloud.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ typedef struct {
4040
int timeout;
4141
} mqttConnectionOptions;
4242

43-
typedef void (*CallbackFunc)(void);
44-
4543
extern ConnectionManager *ArduinoIoTPreferredConnection;
4644

4745
enum class ArduinoIoTConnectionStatus {
@@ -59,6 +57,13 @@ enum class ArduinoIoTSynchronizationStatus {
5957
SYNC_STATUS_VALUES_PROCESSED
6058
};
6159

60+
enum class ArduinoIoTCloudConnectionEvent {
61+
SYNC, CONNECT, DISCONNECT
62+
};
63+
64+
typedef void (*CallbackFunc)(void);
65+
typedef void (*OnCloudConnectionEventCallback)(void * /* arg */);
66+
6267
class ArduinoIoTCloudClass {
6368

6469
public:
@@ -136,6 +141,8 @@ class ArduinoIoTCloudClass {
136141
}
137142
void printDebugInfo();
138143

144+
void addCallback(ArduinoIoTCloudConnectionEvent const event, OnCloudConnectionEventCallback callback);
145+
139146
protected:
140147
friend class CloudSerialClass;
141148
int writeStdout(const byte data[], int length);
@@ -182,6 +189,13 @@ class ArduinoIoTCloudClass {
182189
String _dataTopicIn;
183190
String _otaTopic;
184191
Client *_net;
192+
193+
OnCloudConnectionEventCallback _on_sync_event_callback,
194+
_on_connect_event_callback,
195+
_on_disconnect_event_callback;
196+
197+
static void execCloudConnectionEventCallback(OnCloudConnectionEventCallback & callback, void * callback_arg);
198+
185199
};
186200

187201
extern ArduinoIoTCloudClass ArduinoCloud;

0 commit comments

Comments
 (0)