Skip to content

Commit c1bb83c

Browse files
committed
modules: app: Move shadow_get() to transport module
The shadow_get() function is moved to the transport module to simplify the app module. Signed-off-by: Jan Tore Guggedal <jantore.guggedal@nordicsemi.no>
1 parent dd50533 commit c1bb83c

File tree

2 files changed

+51
-124
lines changed

2 files changed

+51
-124
lines changed

app/src/modules/app/app.c

+2-123
Original file line numberDiff line numberDiff line change
@@ -7,71 +7,13 @@
77
#include <zephyr/kernel.h>
88
#include <zephyr/logging/log.h>
99
#include <zephyr/zbus/zbus.h>
10-
#include <zephyr/task_wdt/task_wdt.h>
1110
#include <date_time.h>
12-
#include <net/nrf_cloud_coap.h>
13-
#include <nrf_cloud_coap_transport.h>
14-
15-
#if defined(CONFIG_MEMFAULT)
16-
#include <memfault/core/trace_event.h>
17-
#endif /* CONFIG_MEMFAULT */
1811

1912
#include "message_channel.h"
2013

2114
/* Register log module */
2215
LOG_MODULE_REGISTER(app, CONFIG_APP_LOG_LEVEL);
2316

24-
/* Register subscriber */
25-
ZBUS_MSG_SUBSCRIBER_DEFINE(app);
26-
27-
/* Observe channels */
28-
ZBUS_CHAN_ADD_OBS(TRIGGER_CHAN, app, 0);
29-
ZBUS_CHAN_ADD_OBS(CLOUD_CHAN, app, 0);
30-
31-
#define MAX_MSG_SIZE (MAX(sizeof(enum trigger_type), sizeof(enum cloud_msg_type)))
32-
33-
BUILD_ASSERT(CONFIG_APP_MODULE_WATCHDOG_TIMEOUT_SECONDS > CONFIG_APP_MODULE_EXEC_TIME_SECONDS_MAX,
34-
"Watchdog timeout must be greater than maximum execution time");
35-
36-
static void shadow_get(bool delta_only)
37-
{
38-
int err;
39-
uint8_t recv_buf[CONFIG_APP_MODULE_RECV_BUFFER_SIZE] = { 0 };
40-
size_t recv_buf_len = sizeof(recv_buf);
41-
42-
LOG_DBG("Requesting device shadow from the device");
43-
44-
err = nrf_cloud_coap_shadow_get(recv_buf, &recv_buf_len, delta_only,
45-
COAP_CONTENT_FORMAT_APP_JSON);
46-
if (err == -EACCES) {
47-
LOG_WRN("Not connected, error: %d", err);
48-
return;
49-
} else if (err == -ETIMEDOUT) {
50-
LOG_WRN("Request timed out, error: %d", err);
51-
return;
52-
} else if (err > 0) {
53-
LOG_WRN("Cloud error: %d", err);
54-
55-
IF_ENABLED(CONFIG_MEMFAULT,
56-
(MEMFAULT_TRACE_EVENT_WITH_STATUS(nrf_cloud_coap_shadow_get, err)));
57-
58-
return;
59-
} else if (err) {
60-
LOG_ERR("Failed to request shadow delta: %d", err);
61-
return;
62-
}
63-
64-
/* No further processing of shadow is implemented */
65-
}
66-
67-
static void task_wdt_callback(int channel_id, void *user_data)
68-
{
69-
LOG_ERR("Watchdog expired, Channel: %d, Thread: %s",
70-
channel_id, k_thread_name_get((k_tid_t)user_data));
71-
72-
SEND_FATAL_ERROR_WATCHDOG_TIMEOUT();
73-
}
74-
7517
static void date_time_handler(const struct date_time_evt *evt) {
7618
if (evt->type != DATE_TIME_NOT_OBTAINED) {
7719
int err;
@@ -85,75 +27,12 @@ static void date_time_handler(const struct date_time_evt *evt) {
8527
}
8628
}
8729

88-
static void app_task(void)
30+
static int app_init(void)
8931
{
90-
int err;
91-
const struct zbus_channel *chan = NULL;
92-
int task_wdt_id;
93-
const uint32_t wdt_timeout_ms = (CONFIG_APP_MODULE_WATCHDOG_TIMEOUT_SECONDS * MSEC_PER_SEC);
94-
const uint32_t execution_time_ms = (CONFIG_APP_MODULE_EXEC_TIME_SECONDS_MAX * MSEC_PER_SEC);
95-
const k_timeout_t zbus_wait_ms = K_MSEC(wdt_timeout_ms - execution_time_ms);
96-
uint8_t msg_buf[MAX_MSG_SIZE];
97-
98-
LOG_DBG("Application module task started");
99-
100-
task_wdt_id = task_wdt_add(wdt_timeout_ms, task_wdt_callback, (void *)k_current_get());
101-
10232
/* Setup handler for date_time library */
10333
date_time_register_handler(date_time_handler);
10434

105-
while (true) {
106-
err = task_wdt_feed(task_wdt_id);
107-
if (err) {
108-
LOG_ERR("task_wdt_feed, error: %d", err);
109-
SEND_FATAL_ERROR();
110-
return;
111-
}
112-
113-
err = zbus_sub_wait_msg(&app, &chan, &msg_buf, zbus_wait_ms);
114-
if (err == -ENOMSG) {
115-
continue;
116-
} else if (err) {
117-
LOG_ERR("zbus_sub_wait, error: %d", err);
118-
SEND_FATAL_ERROR();
119-
return;
120-
}
121-
122-
if (&CLOUD_CHAN == chan) {
123-
LOG_DBG("Cloud connection status received");
124-
125-
const enum cloud_msg_type *status = (const enum cloud_msg_type *)msg_buf;
126-
127-
if (*status == CLOUD_CONNECTED_READY_TO_SEND) {
128-
LOG_DBG("Cloud ready to send");
129-
130-
shadow_get(false);
131-
}
132-
}
133-
134-
if (&TRIGGER_CHAN == chan) {
135-
LOG_DBG("Trigger received");
136-
137-
const enum trigger_type *type = (const enum trigger_type *)msg_buf;
138-
139-
if (*type == TRIGGER_POLL) {
140-
LOG_DBG("Poll trigger received");
141-
142-
shadow_get(true);
143-
}
144-
}
145-
}
146-
}
147-
148-
K_THREAD_DEFINE(app_task_id,
149-
CONFIG_APP_MODULE_THREAD_STACK_SIZE,
150-
app_task, NULL, NULL, NULL, K_LOWEST_APPLICATION_THREAD_PRIO, 0, 0);
151-
152-
static int watchdog_init(void)
153-
{
154-
__ASSERT((task_wdt_init(NULL) == 0), "Task watchdog init failure");
155-
15635
return 0;
15736
}
15837

159-
SYS_INIT(watchdog_init, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY);
38+
SYS_INIT(app_init, POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY);

app/src/modules/transport/transport.c

+49-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
#include <net/nrf_cloud_coap.h>
1414
#include <app_version.h>
1515

16+
#if defined(CONFIG_MEMFAULT)
17+
#include <memfault/core/trace_event.h>
18+
#endif /* CONFIG_MEMFAULT */
19+
1620
#include "modules_common.h"
1721
#include "message_channel.h"
1822

@@ -33,6 +37,7 @@ ZBUS_MSG_SUBSCRIBER_DEFINE(transport);
3337
ZBUS_CHAN_ADD_OBS(PAYLOAD_CHAN, transport, 0);
3438
ZBUS_CHAN_ADD_OBS(NETWORK_CHAN, transport, 0);
3539
ZBUS_CHAN_ADD_OBS(BATTERY_CHAN, transport, 0);
40+
ZBUS_CHAN_ADD_OBS(TRIGGER_CHAN, transport, 0);
3641

3742
#define MAX_MSG_SIZE (MAX(sizeof(struct payload), MAX(sizeof(struct network_msg), sizeof(struct battery_msg))))
3843

@@ -409,6 +414,37 @@ static void state_connected_exit(void *o)
409414

410415
/* Handlers for STATE_CONNECTED_READY */
411416

417+
static void shadow_get(bool delta_only)
418+
{
419+
int err;
420+
uint8_t recv_buf[CONFIG_APP_MODULE_RECV_BUFFER_SIZE] = { 0 };
421+
size_t recv_buf_len = sizeof(recv_buf);
422+
423+
LOG_DBG("Requesting device shadow from the device");
424+
425+
err = nrf_cloud_coap_shadow_get(recv_buf, &recv_buf_len, delta_only,
426+
COAP_CONTENT_FORMAT_APP_JSON);
427+
if (err == -EACCES) {
428+
LOG_WRN("Not connected, error: %d", err);
429+
return;
430+
} else if (err == -ETIMEDOUT) {
431+
LOG_WRN("Request timed out, error: %d", err);
432+
return;
433+
} else if (err > 0) {
434+
LOG_WRN("Cloud error: %d", err);
435+
436+
IF_ENABLED(CONFIG_MEMFAULT,
437+
(MEMFAULT_TRACE_EVENT_WITH_STATUS(nrf_cloud_coap_shadow_get, err)));
438+
439+
return;
440+
} else if (err) {
441+
LOG_ERR("Failed to request shadow delta: %d", err);
442+
return;
443+
}
444+
445+
/* No further processing of shadow is implemented */
446+
}
447+
412448
static void state_connected_ready_entry(void *o)
413449
{
414450
int err;
@@ -425,6 +461,8 @@ static void state_connected_ready_entry(void *o)
425461

426462
return;
427463
}
464+
465+
shadow_get(false);
428466
}
429467

430468
static void state_connected_ready_run(void *o)
@@ -489,14 +527,24 @@ static void state_connected_ready_run(void *o)
489527
}
490528

491529
if (state_object->chan == &PAYLOAD_CHAN) {
492-
struct payload *payload = (struct payload *)state_object->msg_buf;
530+
struct payload *payload = MSG_TO_PAYLOAD(state_object->msg_buf);
493531

494532
err = nrf_cloud_coap_json_message_send(payload->buffer, false, false);
495533
if (err) {
496534
LOG_ERR("nrf_cloud_coap_json_message_send, error: %d", err);
497535
SEND_FATAL_ERROR();
498536
}
499537
}
538+
539+
if (state_object->chan == &TRIGGER_CHAN) {
540+
const enum trigger_type type = MSG_TO_TRIGGER_TYPE(state_object->msg_buf);
541+
542+
if (type == TRIGGER_POLL) {
543+
LOG_DBG("Poll trigger received");
544+
545+
shadow_get(true);
546+
}
547+
}
500548
}
501549

502550
/* Handlers for STATE_CONNECTED_PAUSED */

0 commit comments

Comments
 (0)