Skip to content

Commit db3e943

Browse files
committed
Split _property_container in _device_property_container and _thing_property container
1 parent b0b75cd commit db3e943

5 files changed

+118
-37
lines changed

src/ArduinoIoTCloud.cpp

+76-16
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ ArduinoIoTCloudClass::ArduinoIoTCloudClass()
4444

4545
void ArduinoIoTCloudClass::push()
4646
{
47-
requestUpdateForAllProperties(_property_container);
47+
requestUpdateForAllProperties(_thing_property_container);
4848
}
4949

5050
bool ArduinoIoTCloudClass::setTimestamp(String const & prop_name, unsigned long const timestamp)
5151
{
52-
Property * p = getProperty(_property_container, prop_name);
52+
Property * p = getProperty(_thing_property_container, prop_name);
5353

5454
if (p == nullptr)
5555
return false;
@@ -81,20 +81,30 @@ void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int
8181
}
8282

8383
if (seconds == ON_CHANGE) {
84-
addPropertyToContainer(_property_container, property, name, permission, tag).publishOnChange(minDelta, Property::DEFAULT_MIN_TIME_BETWEEN_UPDATES_MILLIS).onUpdate(fn).onSync(synFn);
84+
addPropertyToContainer(_thing_property_container, property, name, permission, tag).publishOnChange(minDelta, Property::DEFAULT_MIN_TIME_BETWEEN_UPDATES_MILLIS).onUpdate(fn).onSync(synFn);
8585
} else {
86-
addPropertyToContainer(_property_container, property, name, permission, tag).publishEvery(seconds).onUpdate(fn).onSync(synFn);
86+
addPropertyToContainer(_thing_property_container, property, name, permission, tag).publishEvery(seconds).onUpdate(fn).onSync(synFn);
8787
}
8888
}
8989

9090
Property& ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, Permission const permission)
9191
{
92-
return addPropertyToContainer(_property_container, property, name, permission);
92+
return addPropertyToContainer(_thing_property_container, property, name, permission);
9393
}
9494

9595
Property& ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, Permission const permission)
9696
{
97-
return addPropertyToContainer(_property_container, property, name, permission, tag);
97+
return addPropertyToContainer(_thing_property_container, property, name, permission, tag);
98+
}
99+
100+
Property& ArduinoIoTCloudClass::addPropertyReal(Property& property, PropertyContainer &prop_cont, String name, Permission const permission)
101+
{
102+
return addPropertyToContainer(prop_cont, property, name, permission, -1);
103+
}
104+
105+
Property& ArduinoIoTCloudClass::addPropertyReal(Property& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
106+
{
107+
return addPropertyToContainer(prop_cont, property, name, permission, tag);
98108
}
99109

100110
void ArduinoIoTCloudClass::addPropertyReal(bool& property, String name, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property))
@@ -110,13 +120,23 @@ void ArduinoIoTCloudClass::addPropertyReal(bool& property, String name, int tag,
110120

111121
Property& ArduinoIoTCloudClass::addPropertyReal(bool& property, String name, Permission const permission)
112122
{
113-
return addPropertyReal(property, name, -1, permission);
123+
return addPropertyReal(property, _thing_property_container, name, -1, permission);
114124
}
115125

116126
Property& ArduinoIoTCloudClass::addPropertyReal(bool& property, String name, int tag, Permission const permission)
127+
{
128+
return addPropertyReal(property, _thing_property_container, name, tag, permission);
129+
}
130+
131+
Property& ArduinoIoTCloudClass::addPropertyReal(bool& property, PropertyContainer &prop_cont, String name, Permission const permission)
132+
{
133+
return addPropertyReal(property, prop_cont, name, -1, permission);
134+
}
135+
136+
Property& ArduinoIoTCloudClass::addPropertyReal(bool& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
117137
{
118138
Property* p = new CloudWrapperBool(property);
119-
return addPropertyToContainer(_property_container, *p, name, permission, tag);
139+
return addPropertyToContainer(prop_cont, *p, name, permission, tag);
120140
}
121141

122142
void ArduinoIoTCloudClass::addPropertyReal(float& property, String name, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property))
@@ -132,13 +152,23 @@ void ArduinoIoTCloudClass::addPropertyReal(float& property, String name, int tag
132152

133153
Property& ArduinoIoTCloudClass::addPropertyReal(float& property, String name, Permission const permission)
134154
{
135-
return addPropertyReal(property, name, -1, permission);
155+
return addPropertyReal(property, _thing_property_container, name, -1, permission);
136156
}
137157

138158
Property& ArduinoIoTCloudClass::addPropertyReal(float& property, String name, int tag, Permission const permission)
159+
{
160+
return addPropertyReal(property, _thing_property_container, name, tag, permission);
161+
}
162+
163+
Property& ArduinoIoTCloudClass::addPropertyReal(float& property, PropertyContainer &prop_cont, String name, Permission const permission)
164+
{
165+
return addPropertyReal(property, prop_cont, name, -1, permission);
166+
}
167+
168+
Property& ArduinoIoTCloudClass::addPropertyReal(float& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
139169
{
140170
Property* p = new CloudWrapperFloat(property);
141-
return addPropertyToContainer(_property_container, *p, name, permission, tag);
171+
return addPropertyToContainer(prop_cont, *p, name, permission, tag);
142172
}
143173

144174
void ArduinoIoTCloudClass::addPropertyReal(int& property, String name, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property))
@@ -154,13 +184,23 @@ void ArduinoIoTCloudClass::addPropertyReal(int& property, String name, int tag,
154184

155185
Property& ArduinoIoTCloudClass::addPropertyReal(int& property, String name, Permission const permission)
156186
{
157-
return addPropertyReal(property, name, -1, permission);
187+
return addPropertyReal(property, _thing_property_container, name, -1, permission);
158188
}
159189

160190
Property& ArduinoIoTCloudClass::addPropertyReal(int& property, String name, int tag, Permission const permission)
191+
{
192+
return addPropertyReal(property, _thing_property_container, name, tag, permission);
193+
}
194+
195+
Property& ArduinoIoTCloudClass::addPropertyReal(int& property, PropertyContainer &prop_cont, String name, Permission const permission)
196+
{
197+
return addPropertyReal(property, prop_cont, name, -1, permission);
198+
}
199+
200+
Property& ArduinoIoTCloudClass::addPropertyReal(int& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
161201
{
162202
Property* p = new CloudWrapperInt(property);
163-
return addPropertyToContainer(_property_container, *p, name, permission, tag);
203+
return addPropertyToContainer(prop_cont, *p, name, permission, tag);
164204
}
165205

166206
void ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, String name, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property))
@@ -176,13 +216,23 @@ void ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, String name,
176216

177217
Property& ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, String name, Permission const permission)
178218
{
179-
return addPropertyReal(property, name, -1, permission);
219+
return addPropertyReal(property, _thing_property_container, name, -1, permission);
180220
}
181221

182222
Property& ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, String name, int tag, Permission const permission)
223+
{
224+
return addPropertyReal(property, _thing_property_container, name, tag, permission);
225+
}
226+
227+
Property& ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, PropertyContainer &prop_cont, String name, Permission const permission)
228+
{
229+
return addPropertyReal(property, prop_cont, name, -1, permission);
230+
}
231+
232+
Property& ArduinoIoTCloudClass::addPropertyReal(unsigned int& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
183233
{
184234
Property* p = new CloudWrapperUnsignedInt(property);
185-
return addPropertyToContainer(_property_container, *p, name, permission, tag);
235+
return addPropertyToContainer(prop_cont, *p, name, permission, tag);
186236
}
187237

188238
void ArduinoIoTCloudClass::addPropertyReal(String& property, String name, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property))
@@ -198,13 +248,23 @@ void ArduinoIoTCloudClass::addPropertyReal(String& property, String name, int ta
198248

199249
Property& ArduinoIoTCloudClass::addPropertyReal(String& property, String name, Permission const permission)
200250
{
201-
return addPropertyReal(property, name, -1, permission);
251+
return addPropertyReal(property, _thing_property_container, name, -1, permission);
202252
}
203253

204254
Property& ArduinoIoTCloudClass::addPropertyReal(String& property, String name, int tag, Permission const permission)
255+
{
256+
return addPropertyReal(property, _thing_property_container, name, tag, permission);
257+
}
258+
259+
Property& ArduinoIoTCloudClass::addPropertyReal(String& property, PropertyContainer &prop_cont, String name, Permission const permission)
260+
{
261+
return addPropertyReal(property, prop_cont, name, -1, permission);
262+
}
263+
264+
Property& ArduinoIoTCloudClass::addPropertyReal(String& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission)
205265
{
206266
Property* p = new CloudWrapperString(property);
207-
return addPropertyToContainer(_property_container, *p, name, permission, tag);
267+
return addPropertyToContainer(prop_cont, *p, name, permission, tag);
208268
}
209269

210270
/******************************************************************************

src/ArduinoIoTCloud.h

+20-2
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class ArduinoIoTCloudClass
9696
inline void setDeviceId(String const device_id) { _device_id = device_id; };
9797
inline String & getDeviceId() { return _device_id; };
9898

99+
inline bool deviceNotAttached() { return _thing_id == "null";}
100+
inline bool deviceNotConfigured() { return _thing_id == "";}
101+
99102
inline ConnectionHandler * getConnection() { return _connection; }
100103

101104
inline unsigned long getInternalTime() { return _time_service.getTime(); }
@@ -124,6 +127,20 @@ class ArduinoIoTCloudClass
124127
Property& addPropertyReal(unsigned int& property, String name, Permission const permission);
125128
Property& addPropertyReal(String& property, String name, Permission const permission);
126129

130+
Property& addPropertyReal(Property& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
131+
Property& addPropertyReal(bool& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
132+
Property& addPropertyReal(float& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
133+
Property& addPropertyReal(int& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
134+
Property& addPropertyReal(unsigned int& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
135+
Property& addPropertyReal(String& property, PropertyContainer &prop_cont, String name, int tag, Permission const permission);
136+
137+
Property& addPropertyReal(Property& property, PropertyContainer &prop_cont, String name, Permission const permission);
138+
Property& addPropertyReal(bool& property, PropertyContainer &prop_cont, String name, Permission const permission);
139+
Property& addPropertyReal(float& property, PropertyContainer &prop_cont, String name, Permission const permission);
140+
Property& addPropertyReal(int& property, PropertyContainer &prop_cont, String name, Permission const permission);
141+
Property& addPropertyReal(unsigned int& property, PropertyContainer &prop_cont, String name, Permission const permission);
142+
Property& addPropertyReal(String& property, PropertyContainer &prop_cont, String name, Permission const permission);
143+
127144
/* The following methods are for MKR WAN 1300/1310 LoRa boards since
128145
* they use a number to identify a given property within a CBOR message.
129146
* This approach reduces the required amount of data which is of great
@@ -147,17 +164,18 @@ class ArduinoIoTCloudClass
147164
protected:
148165

149166
ConnectionHandler * _connection;
150-
PropertyContainer _property_container;
167+
PropertyContainer _device_property_container;
168+
PropertyContainer _thing_property_container;
151169
unsigned int _last_checked_property_index;
152170
TimeService & _time_service;
153171
int _tz_offset;
154172
unsigned int _tz_dst_until;
173+
String _thing_id;
155174

156175
void execCloudEventCallback(ArduinoIoTCloudEvent const event);
157176

158177
private:
159178

160-
String _thing_id;
161179
String _device_id;
162180
OnCloudEventCallback _cloud_event_callback[3];
163181
};

src/ArduinoIoTCloudLPWAN.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ ArduinoIoTCloudLPWAN::State ArduinoIoTCloudLPWAN::handle_Connected()
121121

122122
/* Check if a primitive property wrapper is locally changed. */
123123
updateTimestampOnLocallyChangedProperties(_property_container);
124-
124+
125125
/* Decode available data. */
126126
if (_connection->available())
127127
decodePropertiesFromCloud();
@@ -142,15 +142,15 @@ void ArduinoIoTCloudLPWAN::decodePropertiesFromCloud()
142142
{
143143
lora_msg_buf[bytes_received] = _connection->read();
144144
}
145-
CBORDecoder::decode(_property_container, lora_msg_buf, bytes_received);
145+
CBORDecoder::decode(_thing_property_container, lora_msg_buf, bytes_received);
146146
}
147147

148148
void ArduinoIoTCloudLPWAN::sendPropertiesToCloud()
149149
{
150150
int bytes_encoded = 0;
151151
uint8_t data[CBOR_LORA_MSG_MAX_SIZE];
152152

153-
if (CBOREncoder::encode(_property_container, data, sizeof(data), bytes_encoded, _last_checked_property_index, true) == CborNoError)
153+
if (CBOREncoder::encode(_thing_property_container, data, sizeof(data), bytes_encoded, _last_checked_property_index, true) == CborNoError)
154154
if (bytes_encoded > 0)
155155
writeProperties(data, bytes_encoded);
156156
}

src/ArduinoIoTCloudTCP.cpp

+17-14
Original file line numberDiff line numberDiff line change
@@ -243,15 +243,17 @@ int ArduinoIoTCloudTCP::begin(bool const enable_watchdog, String brokerAddress,
243243
_dataTopicIn = getTopic_datain();
244244

245245
#if OTA_ENABLED
246-
addPropertyReal(_ota_cap, "OTA_CAP", Permission::Read);
247-
addPropertyReal(_ota_error, "OTA_ERROR", Permission::Read);
248-
addPropertyReal(_ota_img_sha256, "OTA_SHA256", Permission::Read);
249-
addPropertyReal(_ota_url, "OTA_URL", Permission::ReadWrite).onSync(CLOUD_WINS);
250-
addPropertyReal(_ota_req, "OTA_REQ", Permission::ReadWrite).onSync(CLOUD_WINS);
246+
addPropertyReal(_ota_cap, _device_property_container, "OTA_CAP", Permission::Read);
247+
addPropertyReal(_ota_error, _device_property_container, "OTA_ERROR", Permission::Read);
248+
addPropertyReal(_ota_img_sha256, _device_property_container, "OTA_SHA256", Permission::Read);
249+
addPropertyReal(_ota_url, _device_property_container, "OTA_URL", Permission::ReadWrite).onSync(CLOUD_WINS);
250+
addPropertyReal(_ota_req, _device_property_container, "OTA_REQ", Permission::ReadWrite).onSync(CLOUD_WINS);
251251
#endif /* OTA_ENABLED */
252252

253-
addPropertyReal(_tz_offset, "tz_offset", Permission::ReadWrite).onSync(CLOUD_WINS).onUpdate(updateTimezoneInfo);
254-
addPropertyReal(_tz_dst_until, "tz_dst_until", Permission::ReadWrite).onSync(CLOUD_WINS).onUpdate(updateTimezoneInfo);
253+
addPropertyReal(_tz_offset, _thing_property_container, "tz_offset", Permission::ReadWrite).onSync(CLOUD_WINS).onUpdate(updateTimezoneInfo);
254+
addPropertyReal(_tz_dst_until, _thing_property_container, "tz_dst_until", Permission::ReadWrite).onSync(CLOUD_WINS).onUpdate(updateTimezoneInfo);
255+
256+
addPropertyReal(_thing_id, _device_property_container, "thing_id", Permission::ReadWrite).onUpdate(setThingIdOutdated);
255257

256258
#if OTA_STORAGE_PORTENTA_QSPI
257259
#define BOOTLOADER_ADDR (0x8000000)
@@ -524,7 +526,7 @@ ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_Connected()
524526
* the connection from being established due to a wrong data
525527
* in the reconstructed certificate.
526528
*/
527-
updateTimestampOnLocallyChangedProperties(_property_container);
529+
updateTimestampOnLocallyChangedProperties(_thing_property_container);
528530

529531
/* Retransmit data in case there was a lost transaction due
530532
* to phy layer or MQTT connectivity loss.
@@ -586,13 +588,13 @@ void ArduinoIoTCloudTCP::handleMessage(int length)
586588
}
587589

588590
if (_dataTopicIn == topic) {
589-
CBORDecoder::decode(_property_container, (uint8_t*)bytes, length);
591+
CBORDecoder::decode(_thing_property_container, (uint8_t*)bytes, length);
590592
}
591593

592594
if ((_shadowTopicIn == topic) && (_state == State::RequestLastValues))
593595
{
594596
DEBUG_VERBOSE("ArduinoIoTCloudTCP::%s [%d] last values received", __FUNCTION__, millis());
595-
CBORDecoder::decode(_property_container, (uint8_t*)bytes, length, true);
597+
CBORDecoder::decode(_thing_property_container, (uint8_t*)bytes, length, true);
596598
sendPropertiesToCloud();
597599
_time_service.setTimeZoneData(_tz_offset, _tz_dst_until);
598600
execCloudEventCallback(ArduinoIoTCloudEvent::SYNC);
@@ -602,7 +604,7 @@ void ArduinoIoTCloudTCP::handleMessage(int length)
602604
}
603605
}
604606

605-
void ArduinoIoTCloudTCP::sendPropertyContainerToCloud(PropertyContainer & property_container, unsigned int & current_property_index)
607+
void ArduinoIoTCloudTCP::sendPropertyContainerToCloud(String const topic, PropertyContainer & property_container, unsigned int & current_property_index)
606608
{
607609
int bytes_encoded = 0;
608610
uint8_t data[MQTT_TRANSMIT_BUFFER_SIZE];
@@ -616,13 +618,14 @@ void ArduinoIoTCloudTCP::sendPropertyContainerToCloud(PropertyContainer & proper
616618
_mqtt_data_len = bytes_encoded;
617619
memcpy(_mqtt_data_buf, data, _mqtt_data_len);
618620
/* Transmit the properties to the MQTT broker */
619-
write(_dataTopicOut, _mqtt_data_buf, _mqtt_data_len);
621+
DEBUG_INFO("ArduinoIoTCloudTCP::%s send data to %s", __FUNCTION__, topic.c_str());
622+
write(topic, _mqtt_data_buf, _mqtt_data_len);
620623
}
621624
}
622625

623626
void ArduinoIoTCloudTCP::sendPropertiesToCloud()
624627
{
625-
sendPropertyContainerToCloud(_property_container, _last_checked_property_index);
628+
sendPropertyContainerToCloud(_thing_property_container, _last_checked_property_index);
626629
}
627630

628631
#if OTA_ENABLED
@@ -636,7 +639,7 @@ void ArduinoIoTCloudTCP::sendOTAPropertiesToCloud()
636639
ota_property_list.cend(),
637640
[this, &ota_property_container ] (String const & name)
638641
{
639-
Property* p = getProperty(this->_property_container, name);
642+
Property* p = getProperty(this->_device_property_container, name);
640643
if(p != nullptr)
641644
addPropertyToContainer(ota_property_container, *p, p->name(), p->isWriteableByCloud() ? Permission::ReadWrite : Permission::Read);
642645
}

src/ArduinoIoTCloudTCP.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
166166

167167
static void onMessage(int length);
168168
void handleMessage(int length);
169-
void sendPropertyContainerToCloud(PropertyContainer & property_container, unsigned int & current_property_index);
169+
void sendPropertyContainerToCloud(String const topic, PropertyContainer & property_container, unsigned int & current_property_index);
170170
void sendPropertiesToCloud();
171171
void requestLastValue();
172172
int write(String const topic, byte const data[], int const length);
@@ -184,4 +184,4 @@ class ArduinoIoTCloudTCP: public ArduinoIoTCloudClass
184184

185185
extern ArduinoIoTCloudTCP ArduinoCloud;
186186

187-
#endif
187+
#endif

0 commit comments

Comments
 (0)