@@ -304,6 +304,76 @@ static void modem_time_wait(void)
304304 LOG_INF ("Network time obtained" );
305305}
306306
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+
307377static int setup (void )
308378{
309379 int err = 0 ;
@@ -362,6 +432,8 @@ static int setup(void)
362432#endif
363433 nrf_cloud_log_enable (nrf_cloud_log_control_get () != LOG_LEVEL_NONE );
364434
435+ check_desired_log_level ();
436+
365437 return 0 ;
366438}
367439
@@ -429,5 +501,6 @@ int main(void)
429501
430502 while (1 ) {
431503 send_message_on_button ();
504+ check_desired_log_level ();
432505 }
433506}
0 commit comments