Skip to content

Commit 04d8fa6

Browse files
committed
Simplifying synchronisation logic by making it a distinctive step in the connect procedure
1 parent f15b7d7 commit 04d8fa6

File tree

3 files changed

+31
-39
lines changed

3 files changed

+31
-39
lines changed

src/ArduinoIoTCloud.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,6 @@ enum class ArduinoIoTConnectionStatus
5959
ERROR,
6060
};
6161

62-
enum class ArduinoIoTSynchronizationStatus
63-
{
64-
SYNC_STATUS_SYNCHRONIZED,
65-
SYNC_STATUS_WAIT_FOR_CLOUD_VALUES,
66-
SYNC_STATUS_VALUES_PROCESSED
67-
};
68-
6962
enum class ArduinoIoTCloudEvent : size_t
7063
{
7164
SYNC = 0, CONNECT = 1, DISCONNECT = 2

src/ArduinoIoTCloudTCP.cpp

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

243225
int 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

314308
ArduinoIoTCloudTCP::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);

src/ArduinoIoTCloudTCP.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
100100
{
101101
ConnectMqttBroker,
102102
SubscribeMqttTopics,
103+
RequestLastValues,
103104
Connected,
104105
};
105106

@@ -122,8 +123,6 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
122123

123124
MqttClient _mqttClient;
124125

125-
ArduinoIoTSynchronizationStatus _syncStatus;
126-
127126
// Class attribute to define MTTQ topics 2 for stdIn/out and 2 for data, in order to avoid getting previous pupblished payload
128127
String _stdinTopic;
129128
String _stdoutTopic;
@@ -149,6 +148,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
149148

150149
State handle_ConnectMqttBroker();
151150
State handle_SubscribeMqttTopics();
151+
State handle_RequestLastValues();
152152
State handle_Connected();
153153

154154
static void onMessage(int length);

0 commit comments

Comments
 (0)