Skip to content

Commit 072a5da

Browse files
mlaschcarlescufi
authored andcommitted
net: lwm2m: Register callback for firmware update cancel
Allow to register a callback function which is called when a firmware update is canceled by the cancel command. Signed-off-by: Marc Lasch <[email protected]>
1 parent 7931424 commit 072a5da

File tree

3 files changed

+76
-5
lines changed

3 files changed

+76
-5
lines changed

include/zephyr/net/lwm2m.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,42 @@ void lwm2m_firmware_set_write_cb_inst(uint16_t obj_inst_id, lwm2m_engine_set_dat
446446
*/
447447
lwm2m_engine_set_data_cb_t lwm2m_firmware_get_write_cb_inst(uint16_t obj_inst_id);
448448

449+
/**
450+
* @brief Set callback for firmware update cancel.
451+
*
452+
* LwM2M clients use this function to register a callback to perform actions
453+
* on firmware update cancel.
454+
*
455+
* @param[in] cb A callback function perform actions on firmware update cancel.
456+
*/
457+
void lwm2m_firmware_set_cancel_cb(lwm2m_engine_user_cb_t cb);
458+
459+
/**
460+
* @brief Get a callback for firmware update cancel.
461+
*
462+
* @return A registered callback function perform actions on firmware update cancel.
463+
*/
464+
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb(void);
465+
466+
/**
467+
* @brief Set data callback for firmware update cancel.
468+
*
469+
* LwM2M clients use this function to register a callback to perform actions
470+
* on firmware update cancel.
471+
*
472+
* @param[in] obj_inst_id Object instance ID
473+
* @param[in] cb A callback function perform actions on firmware update cancel.
474+
*/
475+
void lwm2m_firmware_set_cancel_cb_inst(uint16_t obj_inst_id, lwm2m_engine_user_cb_t cb);
476+
477+
/**
478+
* @brief Get the callback for firmware update cancel.
479+
*
480+
* @param[in] obj_inst_id Object instance ID
481+
* @return A registered callback function perform actions on firmware update cancel.
482+
*/
483+
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb_inst(uint16_t obj_inst_id);
484+
449485
#if defined(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT)
450486
/**
451487
* @brief Set data callback to handle firmware update execute events.

samples/net/lwm2m_client/src/firmware_update.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,21 @@ static int firmware_block_received_cb(uint16_t obj_inst_id,
4848
return 0;
4949
}
5050

51+
static int firmware_cancel_cb(const uint16_t obj_inst_id)
52+
{
53+
LOG_INF("FIRMWARE: Update canceled");
54+
return 0;
55+
}
56+
5157
void init_firmware_update(void)
5258
{
5359
/* setup data buffer for block-wise transfer */
5460
lwm2m_register_pre_write_callback(&LWM2M_OBJ(5, 0, 0), firmware_get_buf);
5561
lwm2m_firmware_set_write_cb(firmware_block_received_cb);
5662

63+
/* register cancel callback */
64+
lwm2m_firmware_set_cancel_cb(firmware_cancel_cb);
65+
5766
if (IS_ENABLED(CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT)) {
5867
lwm2m_create_res_inst(&LWM2M_OBJ(5, 0, 8, 0));
5968
lwm2m_set_res_buf(&LWM2M_OBJ(5, 0, 8, 0), &supported_protocol[0],

subsys/net/lib/lwm2m/lwm2m_obj_firmware.c

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ static struct lwm2m_engine_res_inst res_inst[MAX_INSTANCE_COUNT][RESOURCE_INSTAN
7979

8080
static lwm2m_engine_set_data_cb_t write_cb[MAX_INSTANCE_COUNT];
8181
static lwm2m_engine_execute_cb_t update_cb[MAX_INSTANCE_COUNT];
82+
static lwm2m_engine_user_cb_t cancel_cb[MAX_INSTANCE_COUNT];
8283

8384
#ifdef CONFIG_LWM2M_FIRMWARE_UPDATE_PULL_SUPPORT
8485
extern int lwm2m_firmware_start_transfer(uint16_t obj_inst_id, char *package_uri);
@@ -234,7 +235,8 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id,
234235
{
235236
uint8_t state;
236237
int ret = 0;
237-
lwm2m_engine_set_data_cb_t callback;
238+
lwm2m_engine_set_data_cb_t write_callback;
239+
lwm2m_engine_user_cb_t cancel_callback;
238240

239241
state = lwm2m_firmware_get_update_state_inst(obj_inst_id);
240242
if (state == STATE_IDLE) {
@@ -246,6 +248,10 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id,
246248
if (data_len == 0U || (data_len == 1U && data[0] == '\0')) {
247249
/* reset to state idle and result default */
248250
lwm2m_firmware_set_update_result_inst(obj_inst_id, RESULT_DEFAULT);
251+
cancel_callback = lwm2m_firmware_get_cancel_cb_inst(obj_inst_id);
252+
if (cancel_callback) {
253+
ret = cancel_callback(obj_inst_id);
254+
}
249255
LOG_DBG("Update canceled by writing %d bytes", data_len);
250256
return 0;
251257
}
@@ -256,10 +262,10 @@ static int package_write_cb(uint16_t obj_inst_id, uint16_t res_id,
256262
return -EPERM;
257263
}
258264

259-
callback = lwm2m_firmware_get_write_cb_inst(obj_inst_id);
260-
if (callback) {
261-
ret = callback(obj_inst_id, res_id, res_inst_id,
262-
data, data_len, last_block, total_size);
265+
write_callback = lwm2m_firmware_get_write_cb_inst(obj_inst_id);
266+
if (write_callback) {
267+
ret = write_callback(obj_inst_id, res_id, res_inst_id, data, data_len, last_block,
268+
total_size);
263269
}
264270

265271
if (ret >= 0) {
@@ -331,6 +337,16 @@ lwm2m_engine_execute_cb_t lwm2m_firmware_get_update_cb(void)
331337
return lwm2m_firmware_get_update_cb_inst(0);
332338
}
333339

340+
void lwm2m_firmware_set_cancel_cb(lwm2m_engine_user_cb_t cb)
341+
{
342+
lwm2m_firmware_set_cancel_cb_inst(0, cb);
343+
}
344+
345+
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb(void)
346+
{
347+
return lwm2m_firmware_get_cancel_cb_inst(0);
348+
}
349+
334350
void lwm2m_firmware_set_write_cb_inst(uint16_t obj_inst_id, lwm2m_engine_set_data_cb_t cb)
335351
{
336352
write_cb[obj_inst_id] = cb;
@@ -351,6 +367,16 @@ lwm2m_engine_execute_cb_t lwm2m_firmware_get_update_cb_inst(uint16_t obj_inst_id
351367
return update_cb[obj_inst_id];
352368
}
353369

370+
void lwm2m_firmware_set_cancel_cb_inst(uint16_t obj_inst_id, lwm2m_engine_user_cb_t cb)
371+
{
372+
cancel_cb[obj_inst_id] = cb;
373+
}
374+
375+
lwm2m_engine_user_cb_t lwm2m_firmware_get_cancel_cb_inst(uint16_t obj_inst_id)
376+
{
377+
return cancel_cb[obj_inst_id];
378+
}
379+
354380
static int firmware_update_cb(uint16_t obj_inst_id,
355381
uint8_t *args, uint16_t args_len)
356382
{

0 commit comments

Comments
 (0)