@@ -304,6 +304,76 @@ static void modem_time_wait(void)
304
304
LOG_INF ("Network time obtained" );
305
305
}
306
306
307
+ /* For simplicity, just build the JSON string here and add the interval with snprintk */
308
+ #define REP_CTRL_TMPLT "{\"" NRF_CLOUD_JSON_KEY_REP "\":{" \
309
+ "\"" NRF_CLOUD_JSON_KEY_CTRL "\":{" \
310
+ "\"" NRF_CLOUD_JSON_KEY_LOG "\":%lu}}}"
311
+
312
+ /* The transform is just a dotted string of the JSON keys */
313
+ #define TRANSFORM_DESIRED_LOG_LVL NRF_CLOUD_JSON_KEY_STATE "." \
314
+ NRF_CLOUD_JSON_KEY_DES "." \
315
+ NRF_CLOUD_JSON_KEY_CTRL "." \
316
+ NRF_CLOUD_JSON_KEY_LOG
317
+
318
+ /* Size of the template plus three additional chars for the number value */
319
+ #define REP_CTRL_BUFF_SZ (sizeof(REP_CTRL_TMPLT) + 3)
320
+
321
+ static void check_desired_log_level (void )
322
+ {
323
+ /* Ensure the reported section gets sent once */
324
+ static bool reported_sent ;
325
+ static char ctrl_buf [REP_CTRL_BUFF_SZ ];
326
+ long desired_log_level = -1 ;
327
+ bool update_reported = false;
328
+ int err ;
329
+
330
+ /* Check if there is a value in the desired config */
331
+ err = nrf_cloud_rest_shadow_transform_request (& rest_ctx , device_id ,
332
+ TRANSFORM_DESIRED_LOG_LVL );
333
+ if (err ) {
334
+ LOG_ERR ("Failed to request desired log level, error: %u" , err );
335
+ } else if ((rest_ctx .response_len == 0 ) || !rest_ctx .response ) {
336
+ LOG_DBG ("No desired log level exists" );
337
+ desired_log_level = nrf_cloud_log_control_get ();
338
+ } else {
339
+ char * endptr ;
340
+
341
+ /* Parse the desired log level */
342
+ desired_log_level = strtol (rest_ctx .response , & endptr , 10 );
343
+ if ((endptr == rest_ctx .response ) || (errno )) {
344
+ LOG_ERR ("Failed to parse desired log level value" );
345
+ }
346
+ }
347
+
348
+ /* Validate desired log level */
349
+ LOG_INF ("Desired log level: %ld" , desired_log_level );
350
+
351
+ if (desired_log_level < LOG_LEVEL_NONE || desired_log_level > LOG_LEVEL_DBG ) {
352
+ LOG_ERR ("Invalid desired log level: %ld" , desired_log_level );
353
+ desired_log_level = nrf_cloud_log_control_get ();
354
+ } else {
355
+ update_reported = (desired_log_level != nrf_cloud_log_control_get ());
356
+ }
357
+ nrf_cloud_log_control_set (desired_log_level );
358
+
359
+ if (update_reported || !reported_sent ) {
360
+ /* Format the JSON for the reported config */
361
+ err = snprintk (ctrl_buf , REP_CTRL_BUFF_SZ , REP_CTRL_TMPLT , desired_log_level );
362
+
363
+ if ((err < 0 ) || (err >= REP_CTRL_BUFF_SZ )) {
364
+ LOG_ERR ("Could not format reported config JSON" );
365
+ } else {
366
+ /* Update the shadow's reported config with the log level value */
367
+ err = nrf_cloud_rest_shadow_state_update (& rest_ctx , device_id , ctrl_buf );
368
+ if (!err ) {
369
+ reported_sent = true;
370
+ } else {
371
+ LOG_ERR ("Failed to update reported config, error: %d" , err );
372
+ }
373
+ }
374
+ }
375
+ }
376
+
307
377
static int setup (void )
308
378
{
309
379
int err = 0 ;
@@ -362,6 +432,8 @@ static int setup(void)
362
432
#endif
363
433
nrf_cloud_log_enable (nrf_cloud_log_control_get () != LOG_LEVEL_NONE );
364
434
435
+ check_desired_log_level ();
436
+
365
437
return 0 ;
366
438
}
367
439
@@ -429,5 +501,6 @@ int main(void)
429
501
430
502
while (1 ) {
431
503
send_message_on_button ();
504
+ check_desired_log_level ();
432
505
}
433
506
}
0 commit comments