@@ -86,7 +86,6 @@ ArduinoIoTCloudTCP::ArduinoIoTCloudTCP()
8686, _password(" " )
8787 #endif
8888, _mqttClient{nullptr }
89- , _syncStatus{ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED}
9089, _stdinTopic(" " )
9190, _stdoutTopic(" " )
9291, _shadowTopicOut(" " )
@@ -188,11 +187,17 @@ void ArduinoIoTCloudTCP::update()
188187
189188 if (checkPhyConnection () != NetworkConnectionState::CONNECTED) return ;
190189
190+ /* Retrieve the latest data from the MQTT Client. */
191+ if (_mqttClient.connected ())
192+ _mqttClient.poll ();
193+
194+ /* Run through the state machine. */
191195 State next_state = _state;
192196 switch (_state)
193197 {
194198 case State::ConnectMqttBroker: next_state = handle_ConnectMqttBroker (); break ;
195199 case State::SubscribeMqttTopics: next_state = handle_SubscribeMqttTopics (); break ;
200+ case State::RequestLastValues: next_state = handle_RequestLastValues (); break ;
196201 case State::Connected: next_state = handle_Connected (); break ;
197202 }
198203 _state = next_state;
@@ -214,30 +219,7 @@ void ArduinoIoTCloudTCP::update()
214219 _mqtt_data_request_retransmit = false ;
215220 }
216221
217- // MTTQClient connected!, poll() used to retrieve data from MQTT broker
218- _mqttClient.poll ();
219-
220- switch (_syncStatus)
221- {
222- case ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED: sendPropertiesToCloud (); break ;
223-
224- case ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES:
225- {
226- if (millis () - _lastSyncRequestTickTime > TIMEOUT_FOR_LASTVALUES_SYNC)
227- {
228- requestLastValue ();
229- _lastSyncRequestTickTime = millis ();
230- }
231- }
232- break ;
233-
234- case ArduinoIoTSynchronizationStatus::SYNC_STATUS_VALUES_PROCESSED:
235- {
236- execCloudEventCallback (ArduinoIoTCloudEvent::SYNC);
237- _syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_SYNCHRONIZED;
238- }
239- break ;
240- }
222+ sendPropertiesToCloud ();
241223}
242224
243225int ArduinoIoTCloudTCP::connected ()
@@ -302,13 +284,25 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SubscribeMqttTopics()
302284 DBG_ERROR (" ArduinoIoTCloudTCP::%s could not subscribe to %s" , __FUNCTION__, _ota_topic_in.c_str ());
303285 return State::SubscribeMqttTopics;
304286 }
305- _syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES;
306- _lastSyncRequestTickTime = 0 ;
307287 }
308288
309289 DBG_VERBOSE (" Connected to Arduino IoT Cloud" );
310290 execCloudEventCallback (ArduinoIoTCloudEvent::CONNECT);
311- return State::Connected;
291+ return State::RequestLastValues;
292+ }
293+
294+ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_RequestLastValues ()
295+ {
296+ /* Check wether or not we need to send a new request. */
297+ unsigned long const now = millis ();
298+ if ((now - _lastSyncRequestTickTime) > TIMEOUT_FOR_LASTVALUES_SYNC)
299+ {
300+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s [%d] last values requested" , __FUNCTION__, now);
301+ requestLastValue ();
302+ _lastSyncRequestTickTime = now;
303+ }
304+
305+ return State::RequestLastValues;
312306}
313307
314308ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_Connected ()
@@ -345,11 +339,16 @@ void ArduinoIoTCloudTCP::handleMessage(int length)
345339 if (_dataTopicIn == topic) {
346340 CBORDecoder::decode (_property_container, (uint8_t *)bytes, length);
347341 }
348- if ((_shadowTopicIn == topic) && _syncStatus == ArduinoIoTSynchronizationStatus::SYNC_STATUS_WAIT_FOR_CLOUD_VALUES) {
342+
343+ if ((_shadowTopicIn == topic) && (_state == State::RequestLastValues))
344+ {
345+ DBG_VERBOSE (" ArduinoIoTCloudTCP::%s [%d] last values received" , __FUNCTION__, millis ());
349346 CBORDecoder::decode (_property_container, (uint8_t *)bytes, length, true );
350347 sendPropertiesToCloud ();
351- _syncStatus = ArduinoIoTSynchronizationStatus::SYNC_STATUS_VALUES_PROCESSED;
348+ execCloudEventCallback (ArduinoIoTCloudEvent::SYNC);
349+ _state = State::Connected;
352350 }
351+
353352#if OTA_ENABLED
354353 if (_ota_topic_in == topic) {
355354 _ota_logic.onOTADataReceived (bytes, length);
0 commit comments