30
30
typedef enum {
31
31
XNCP_CMD_GET_SUPPORTED_FEATURES_REQ = 0x0000 ,
32
32
XNCP_CMD_SET_SOURCE_ROUTE_REQ = 0x0001 ,
33
- XNCP_CMD_GET_BOARD_NAME_REQ = 0x0002 ,
34
- XNCP_CMD_GET_MANUF_NAME_REQ = 0x0003 ,
33
+ XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ = 0x0002 ,
35
34
36
35
XNCP_CMD_GET_SUPPORTED_FEATURES_RSP = XNCP_CMD_GET_SUPPORTED_FEATURES_REQ | 0x8000 ,
37
36
XNCP_CMD_SET_SOURCE_ROUTE_RSP = XNCP_CMD_SET_SOURCE_ROUTE_REQ | 0x8000 ,
38
- XNCP_CMD_GET_BOARD_NAME_RSP = XNCP_CMD_GET_BOARD_NAME_REQ | 0x8000 ,
39
- XNCP_CMD_GET_MANUF_NAME_RSP = XNCP_CMD_GET_MANUF_NAME_REQ | 0x8000 ,
37
+ XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_RSP = XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ | 0x8000 ,
40
38
41
39
XNCP_CMD_UNKNOWN = 0xFFFF
42
40
} XNCP_COMMAND ;
43
41
44
42
45
43
#define FEATURE_MEMBER_OF_ALL_GROUPS (0b00000000000000000000000000000001)
46
44
#define FEATURE_MANUAL_SOURCE_ROUTE (0b00000000000000000000000000000010)
47
- #define FEATURE_BOARD_MANUF (0b00000000000000000000000000000100)
45
+ #define FEATURE_MFG_TOKEN_OVERRIDES (0b00000000000000000000000000000100)
48
46
#define SUPPORTED_FEATURES ( \
49
47
FEATURE_MEMBER_OF_ALL_GROUPS \
50
48
| FEATURE_MANUAL_SOURCE_ROUTE \
51
- | FEATURE_BOARD_MANUF \
49
+ | FEATURE_MFG_TOKEN_OVERRIDES \
52
50
)
53
51
54
52
@@ -151,22 +149,28 @@ EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength,
151
149
uint8_t * messagePayload ,
152
150
uint8_t * replyPayloadLength ,
153
151
uint8_t * replyPayload ) {
154
- * replyPayloadLength = 0 ;
155
-
156
- uint8_t rsp_status = EMBER_ERR_FATAL ;
157
- uint16_t req_command_id = XNCP_CMD_UNKNOWN ;
152
+ uint8_t rsp_status = EMBER_SUCCESS ;
158
153
uint16_t rsp_command_id = XNCP_CMD_UNKNOWN ;
159
154
160
- if (messageLength >= 3 ) {
161
- rsp_status = EMBER_SUCCESS ;
162
- req_command_id = BUILD_UINT16 (messagePayload [0 ], messagePayload [1 ]);
163
-
164
- uint8_t req_status = messagePayload [2 ];
165
- (void )req_status ;
155
+ if (messageLength < 3 ) {
156
+ rsp_status = EMBER_BAD_ARGUMENT ;
166
157
167
- messagePayload += 3 ;
158
+ replyPayload [0 ] = (uint8_t )((rsp_command_id >> 0 ) & 0xFF );
159
+ replyPayload [1 ] = (uint8_t )((rsp_command_id >> 8 ) & 0xFF );
160
+ replyPayload [2 ] = rsp_status ;
161
+ return EMBER_SUCCESS ;
168
162
}
169
163
164
+ uint16_t req_command_id = BUILD_UINT16 (messagePayload [0 ], messagePayload [1 ]);
165
+ uint8_t req_status = messagePayload [2 ];
166
+ (void )req_status ;
167
+
168
+ // Strip the packet header to simplify command parsing below
169
+ messagePayload += 3 ;
170
+ messageLength -= 3 ;
171
+
172
+ // Leave space for the reply packet header
173
+ * replyPayloadLength = 0 ;
170
174
* replyPayloadLength += 2 ; // Space for the response command ID
171
175
* replyPayloadLength += 1 ; // Space for the status
172
176
@@ -186,12 +190,12 @@ EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength,
186
190
rsp_command_id = XNCP_CMD_SET_SOURCE_ROUTE_RSP ;
187
191
rsp_status = EMBER_SUCCESS ;
188
192
189
- if (( messageLength < 4 ) || ( messageLength % 2 != 0 ) ) {
193
+ if (messageLength % 2 != 0 ) {
190
194
rsp_status = EMBER_BAD_ARGUMENT ;
191
195
break ;
192
196
}
193
197
194
- uint8_t num_relays = ( messageLength - 4 ) / 2 ;
198
+ uint8_t num_relays = messageLength / 2 ;
195
199
196
200
if (num_relays > EMBER_MAX_SOURCE_ROUTE_RELAY_COUNT + 1 ) {
197
201
rsp_status = EMBER_BAD_ARGUMENT ;
@@ -200,7 +204,7 @@ EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength,
200
204
201
205
// If we don't find a better index, pick one at random to replace
202
206
uint8_t insertion_index = emberGetPseudoRandomNumber () % XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE ;
203
- uint16_t node_id = BUILD_UINT16 (messagePayload [2 ], messagePayload [3 ]);
207
+ uint16_t node_id = BUILD_UINT16 (messagePayload [0 ], messagePayload [1 ]);
204
208
205
209
for (uint8_t i = 0 ; i < XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE ; i ++ ) {
206
210
ManualSourceRoute * route = & manual_source_routes [i ];
@@ -216,7 +220,7 @@ EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength,
216
220
ManualSourceRoute * route = & manual_source_routes [insertion_index ];
217
221
218
222
for (uint8_t i = 0 ; i < num_relays ; i ++ ) {
219
- uint16_t relay = BUILD_UINT16 (messagePayload [4 + 2 * i + 0 ], messagePayload [4 + 2 * i + 1 ]);
223
+ uint16_t relay = BUILD_UINT16 (messagePayload [2 + 2 * i + 0 ], messagePayload [2 + 2 * i + 1 ]);
220
224
route -> relays [i ] = relay ;
221
225
}
222
226
@@ -227,23 +231,39 @@ EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength,
227
231
break ;
228
232
}
229
233
230
- case XNCP_CMD_GET_BOARD_NAME_REQ : {
231
- rsp_command_id = XNCP_CMD_GET_BOARD_NAME_RSP ;
234
+ case XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ : {
235
+ rsp_command_id = XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_RSP ;
232
236
rsp_status = EMBER_SUCCESS ;
233
237
234
- uint8_t name_length = strlen (XNCP_BOARD_NAME );
235
- * replyPayloadLength += name_length ;
236
- memcpy (replyPayload , XNCP_BOARD_NAME , name_length );
237
- break ;
238
- }
238
+ if (messageLength != 1 ) {
239
+ rsp_status = EMBER_BAD_ARGUMENT ;
240
+ break ;
241
+ }
239
242
240
- case XNCP_CMD_GET_MANUF_NAME_REQ : {
241
- rsp_command_id = XNCP_CMD_GET_MANUF_NAME_RSP ;
242
- rsp_status = EMBER_SUCCESS ;
243
+ uint8_t token_id = messagePayload [0 ];
244
+ char * override_value ;
245
+
246
+ switch (token_id ) {
247
+ case EZSP_MFG_STRING : {
248
+ override_value = XNCP_MFG_MANUF_NAME ;
249
+ break ;
250
+ }
251
+
252
+ case EZSP_MFG_BOARD_NAME : {
253
+ override_value = XNCP_MFG_BOARD_NAME ;
254
+ break ;
255
+ }
256
+
257
+ default : {
258
+ rsp_status = EMBER_NOT_FOUND ;
259
+ override_value = "" ;
260
+ break ;
261
+ }
262
+ }
243
263
244
- uint8_t name_length = strlen (XNCP_MANUF_NAME );
245
- * replyPayloadLength += name_length ;
246
- memcpy ( replyPayload , XNCP_MANUF_NAME , name_length ) ;
264
+ uint8_t value_length = strlen (override_value );
265
+ memcpy ( replyPayload + * replyPayloadLength , override_value , value_length ) ;
266
+ * replyPayloadLength += value_length ;
247
267
break ;
248
268
}
249
269
0 commit comments