Skip to content

Commit c957f24

Browse files
implementing cbor message encoder following cloud utils definition
1 parent 38507e4 commit c957f24

File tree

2 files changed

+110
-232
lines changed

2 files changed

+110
-232
lines changed

src/cbor/MessageEncoder.cpp

Lines changed: 68 additions & 194 deletions
Original file line numberDiff line numberDiff line change
@@ -14,239 +14,113 @@
1414

1515
#include "CBOREncoder.h"
1616

17-
#undef max
18-
#undef min
19-
#include <algorithm>
20-
#include <iterator>
21-
2217
#include "MessageEncoder.h"
2318

2419
/******************************************************************************
2520
* PUBLIC MEMBER FUNCTIONS
2621
******************************************************************************/
2722

28-
Encoder::Status CBORMessageEncoder::encode(Message * message, uint8_t * data, size_t& len)
29-
{
30-
EncoderState current_state = EncoderState::EncodeTag,
31-
next_state = EncoderState::Error;
32-
33-
CborEncoder encoder;
34-
CborEncoder arrayEncoder;
3523

36-
cbor_encoder_init(&encoder, data, len, 0);
24+
/******************************************************************************
25+
PRIVATE MEMBER FUNCTIONS
26+
******************************************************************************/
3727

38-
while (current_state != EncoderState::Complete) {
28+
Encoder::Status OtaBeginCommandEncoder::encode(CborEncoder* encoder, Message *msg) {
29+
OtaBeginUp * otaBeginUp = (OtaBeginUp*) msg;
30+
CborEncoder array_encoder;
3931

40-
switch (current_state) {
41-
case EncoderState::EncodeTag : next_state = handle_EncodeTag(&encoder, message); break;
42-
case EncoderState::EncodeArray : next_state = handle_EncodeArray(&encoder, &arrayEncoder, message); break;
43-
case EncoderState::EncodeParam : next_state = handle_EncodeParam(&arrayEncoder, message); break;
44-
case EncoderState::CloseArray : next_state = handle_CloseArray(&encoder, &arrayEncoder); break;
45-
case EncoderState::Complete : /* Nothing to do */ break;
46-
case EncoderState::MessageNotSupported :
47-
case EncoderState::Error : return Encoder::Status::Error;
48-
}
32+
if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) {
33+
return Encoder::Status::Error;
34+
}
4935

50-
current_state = next_state;
36+
if(cbor_encode_byte_string(&array_encoder, otaBeginUp->params.sha, SHA256_SIZE) != CborNoError) {
37+
return Encoder::Status::Error;
5138
}
5239

53-
len = cbor_encoder_get_buffer_size(&encoder, data);
40+
if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) {
41+
return Encoder::Status::Error;
42+
}
5443

5544
return Encoder::Status::Complete;
5645
}
5746

58-
/******************************************************************************
59-
PRIVATE MEMBER FUNCTIONS
60-
******************************************************************************/
47+
Encoder::Status ThingBeginCommandEncoder::encode(CborEncoder* encoder, Message *msg) {
48+
ThingBeginCmd * thingBeginCmd = (ThingBeginCmd*) msg;
49+
CborEncoder array_encoder;
6150

62-
CBORMessageEncoder::EncoderState CBORMessageEncoder::handle_EncodeTag(CborEncoder * encoder, Message * message)
63-
{
64-
CborTag commandTag = toCBORCommandTag(message->id);
65-
if (commandTag == CBORCommandTag::CBORUnknownCmdTag16b ||
66-
commandTag == CBORCommandTag::CBORUnknownCmdTag32b ||
67-
commandTag == CBORCommandTag::CBORUnknownCmdTag64b ||
68-
cbor_encode_tag(encoder, commandTag) != CborNoError) {
69-
return EncoderState::Error;
51+
if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) {
52+
return Encoder::Status::Error;
7053
}
7154

72-
return EncoderState::EncodeArray;
73-
}
74-
75-
CBORMessageEncoder::EncoderState CBORMessageEncoder::handle_EncodeArray(CborEncoder * encoder, CborEncoder * array_encoder, Message * message)
76-
{
77-
// Set array size based on the message id
78-
size_t array_size = 0;
79-
switch (message->id)
80-
{
81-
case CommandId::OtaBeginUpId:
82-
array_size = 1;
83-
break;
84-
case CommandId::ThingBeginCmdId:
85-
array_size = 1;
86-
break;
87-
case CommandId::DeviceBeginCmdId:
88-
array_size = 1;
89-
break;
90-
case CommandId::LastValuesBeginCmdId:
91-
break;
92-
case CommandId::OtaProgressCmdUpId:
93-
array_size = 4;
94-
break;
95-
case CommandId::TimezoneCommandUpId:
96-
break;
97-
case CommandId::ProvisioningStatus:
98-
array_size = 1;
99-
break;
100-
case CommandId::ProvisioningListWifiNetworks:
101-
{
102-
ProvisioningListWifiNetworksMessage *msg = (ProvisioningListWifiNetworksMessage *) message;
103-
array_size = 2 * msg->params.numDiscoveredWiFiNetworks;
104-
break;
105-
}
106-
case CommandId::ProvisioningUniqueHardwareId:
107-
array_size = 1;
108-
break;
109-
case CommandId::ProvisioningJWT:
110-
array_size = 1;
111-
break;
112-
case CommandId::ProvisioningBLEMacAddress:
113-
array_size = 1;
114-
break;
115-
default:
116-
return EncoderState::MessageNotSupported;
55+
if(cbor_encode_text_stringz(&array_encoder, thingBeginCmd->params.thing_id) != CborNoError) {
56+
return Encoder::Status::Error;
11757
}
11858

119-
// Start an array with fixed width based on message type
120-
if (cbor_encoder_create_array(encoder, array_encoder, array_size) != CborNoError){
121-
return EncoderState::Error;
59+
if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) {
60+
return Encoder::Status::Error;
12261
}
12362

124-
return EncoderState::EncodeParam;
63+
return Encoder::Status::Complete;
12564
}
12665

127-
CBORMessageEncoder::EncoderState CBORMessageEncoder::handle_EncodeParam(CborEncoder * array_encoder, Message * message)
128-
{
129-
CborError error = CborNoError;
130-
switch (message->id)
131-
{
132-
case CommandId::OtaBeginUpId:
133-
error = CBORMessageEncoder::encodeOtaBeginUp(array_encoder, message);
134-
break;
135-
case CommandId::ThingBeginCmdId:
136-
error = CBORMessageEncoder::encodeThingBeginCmd(array_encoder, message);
137-
break;
138-
case CommandId::DeviceBeginCmdId:
139-
error = CBORMessageEncoder::encodeDeviceBeginCmd(array_encoder, message);
140-
break;
141-
case CommandId::LastValuesBeginCmdId:
142-
break;
143-
case CommandId::OtaProgressCmdUpId:
144-
error = CBORMessageEncoder::encodeOtaProgressCmdUp(array_encoder, message);
145-
break;
146-
case CommandId::TimezoneCommandUpId:
147-
break;
148-
case CommandId::ProvisioningStatus:
149-
error = CBORMessageEncoder::encodeProvisioningStatus(array_encoder, message);
150-
break;
151-
case CommandId::ProvisioningListWifiNetworks:
152-
error = CBORMessageEncoder::encodeProvisioningListWifiNetworks(array_encoder, message);
153-
break;
154-
case CommandId::ProvisioningUniqueHardwareId:
155-
error = CBORMessageEncoder::encodeProvisioningUniqueHardwareId(array_encoder, message);
156-
break;
157-
case CommandId::ProvisioningJWT:
158-
error = CBORMessageEncoder::encodeProvisioningJWT(array_encoder, message);
159-
break;
160-
case CommandId::ProvisioningBLEMacAddress:
161-
error = CBORMessageEncoder::encodeProvisioningBLEMacAddress(array_encoder, message);
162-
break;
163-
default:
164-
return EncoderState::MessageNotSupported;
66+
Encoder::Status LastValuesBeginCommandEncoder::encode(CborEncoder* encoder, Message *msg) {
67+
// This command contains no parameters, it contains just the id of the message
68+
// nothing to perform here
69+
return Encoder::Status::Complete;
70+
}
71+
72+
Encoder::Status DeviceBeginCommandEncoder::encode(CborEncoder* encoder, Message *msg) {
73+
DeviceBeginCmd * deviceBeginCmd = (DeviceBeginCmd*) msg;
74+
CborEncoder array_encoder;
75+
76+
if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) {
77+
return Encoder::Status::Error;
16578
}
16679

167-
return (error != CborNoError) ? EncoderState::Error : EncoderState::CloseArray;
168-
}
80+
if(cbor_encode_text_stringz(&array_encoder, deviceBeginCmd->params.lib_version) != CborNoError) {
81+
return Encoder::Status::Error;
82+
}
16983

170-
CBORMessageEncoder::EncoderState CBORMessageEncoder::handle_CloseArray(CborEncoder * encoder, CborEncoder * array_encoder)
171-
{
172-
CborError error = cbor_encoder_close_container(encoder, array_encoder);
84+
if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) {
85+
return Encoder::Status::Error;
86+
}
17387

174-
return (error != CborNoError) ? EncoderState::Error : EncoderState::Complete;
88+
return Encoder::Status::Complete;
17589
}
17690

177-
// Message specific encoders
178-
CborError CBORMessageEncoder::encodeOtaBeginUp(CborEncoder * array_encoder, Message * message)
179-
{
180-
OtaBeginUp * otaBeginUp = (OtaBeginUp *) message;
181-
CHECK_CBOR(cbor_encode_byte_string(array_encoder, otaBeginUp->params.sha, SHA256_SIZE));
182-
return CborNoError;
183-
}
91+
Encoder::Status OtaProgressCommandUpEncoder::encode(CborEncoder* encoder, Message *msg) {
92+
OtaProgressCmdUp * ota = (OtaProgressCmdUp*) msg;
93+
CborEncoder array_encoder;
18494

185-
CborError CBORMessageEncoder::encodeThingBeginCmd(CborEncoder * array_encoder, Message * message)
186-
{
187-
ThingBeginCmd * thingBeginCmd = (ThingBeginCmd *) message;
188-
CHECK_CBOR(cbor_encode_text_stringz(array_encoder, thingBeginCmd->params.thing_id));
189-
return CborNoError;
190-
}
95+
if(cbor_encoder_create_array(encoder, &array_encoder, 4) != CborNoError) {
96+
return Encoder::Status::Error;
97+
}
19198

192-
CborError CBORMessageEncoder::encodeDeviceBeginCmd(CborEncoder * array_encoder, Message * message)
193-
{
194-
DeviceBeginCmd * deviceBeginCmd = (DeviceBeginCmd *) message;
195-
CHECK_CBOR(cbor_encode_text_stringz(array_encoder, deviceBeginCmd->params.lib_version));
196-
return CborNoError;
197-
}
99+
if(cbor_encode_byte_string(&array_encoder, ota->params.id, ID_SIZE) != CborNoError) {
100+
return Encoder::Status::Error;
101+
}
198102

199-
CborError CBORMessageEncoder::encodeOtaProgressCmdUp(CborEncoder * array_encoder, Message * message)
200-
{
201-
OtaProgressCmdUp * ota = (OtaProgressCmdUp *)message;
202-
CHECK_CBOR(cbor_encode_byte_string(array_encoder, ota->params.id, ID_SIZE));
203-
CHECK_CBOR(cbor_encode_simple_value(array_encoder, ota->params.state));
204-
CHECK_CBOR(cbor_encode_int(array_encoder, ota->params.state_data));
205-
CHECK_CBOR(cbor_encode_uint(array_encoder, ota->params.time));
206-
return CborNoError;
207-
}
103+
if(cbor_encode_simple_value(&array_encoder, ota->params.state) != CborNoError) {
104+
return Encoder::Status::Error;
105+
}
208106

209-
// Provisioning specific encoders
210-
CborError CBORMessageEncoder::encodeProvisioningStatus(CborEncoder * array_encoder, Message * message)
211-
{
212-
ProvisioningStatusMessage * provisioningStatus = (ProvisioningStatusMessage *) message;
213-
CHECK_CBOR(cbor_encode_int(array_encoder, provisioningStatus->params.status));
214-
return CborNoError;
215-
}
107+
if(cbor_encode_int(&array_encoder, ota->params.state_data) != CborNoError) {
108+
return Encoder::Status::Error;
109+
}
216110

217-
CborError CBORMessageEncoder::encodeProvisioningListWifiNetworks(CborEncoder * array_encoder, Message * message)
218-
{
219-
ProvisioningListWifiNetworksMessage * provisioningListWifiNetworks = (ProvisioningListWifiNetworksMessage *) message;
220-
for (int i = 0; i < provisioningListWifiNetworks->params.numDiscoveredWiFiNetworks; i++) {
221-
CHECK_CBOR(cbor_encode_text_stringz(array_encoder, provisioningListWifiNetworks->params.discoveredWifiNetworks[i].SSID));
222-
CHECK_CBOR(cbor_encode_int(array_encoder, *provisioningListWifiNetworks->params.discoveredWifiNetworks[i].RSSI));
111+
if(cbor_encode_uint(&array_encoder, ota->params.time) != CborNoError) {
112+
return Encoder::Status::Error;
223113
}
224-
return CborNoError;
225-
}
226114

227-
CborError CBORMessageEncoder::encodeProvisioningUniqueHardwareId(CborEncoder * array_encoder, Message * message)
228-
{
229-
ProvisioningUniqueHardwareIdMessage * provisioningUniqueHardwareId = (ProvisioningUniqueHardwareIdMessage *) message;
230-
CHECK_CBOR(cbor_encode_byte_string(array_encoder, (uint8_t *) provisioningUniqueHardwareId->params.uniqueHardwareId, UHWID_SIZE));
231-
return CborNoError;
232-
}
115+
if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) {
116+
return Encoder::Status::Error;
117+
}
233118

234-
CborError CBORMessageEncoder::encodeProvisioningJWT(CborEncoder * array_encoder, Message * message)
235-
{
236-
ProvisioningJWTMessage * provisioningJWT = (ProvisioningJWTMessage *) message;
237-
CHECK_CBOR(cbor_encode_byte_string(array_encoder, (uint8_t *) provisioningJWT->params.jwt, PROVISIONING_JWT_SIZE));
238-
return CborNoError;
119+
return Encoder::Status::Complete;
239120
}
240121

241-
CborError CBORMessageEncoder::encodeProvisioningBLEMacAddress(CborEncoder *array_encoder, Message *message)
242-
{
243-
ProvisioningBLEMacAddressMessage *provisioningBLEMacAddress = (ProvisioningBLEMacAddressMessage *)message;
244-
uint8_t size = 0;
245-
uint8_t emptyMac[] = {0, 0, 0, 0, 0, 0};
246-
if(memcmp(provisioningBLEMacAddress->params.macAddress, emptyMac, BLE_MAC_ADDRESS_SIZE) != 0)
247-
{
248-
size = BLE_MAC_ADDRESS_SIZE;
249-
}
250-
CHECK_CBOR(cbor_encode_byte_string(array_encoder, provisioningBLEMacAddress->params.macAddress, size));
251-
return CborNoError;
122+
Encoder::Status TimezoneCommandUpEncoder::encode(CborEncoder* encoder, Message *msg) {
123+
// This command contains no parameters, it contains just the id of the message
124+
// nothing to perform here
125+
return Encoder::Status::Complete;
252126
}

0 commit comments

Comments
 (0)