@@ -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
7882ArduinoIoTCloudClass::~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+
438463ArduinoIoTCloudClass ArduinoCloud;
0 commit comments