Skip to content

Commit d3842d9

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 d3842d9

File tree

2 files changed

+47
-124
lines changed

2 files changed

+47
-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

+45-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ZBUS_MSG_SUBSCRIBER_DEFINE(transport);
3333
ZBUS_CHAN_ADD_OBS(PAYLOAD_CHAN, transport, 0);
3434
ZBUS_CHAN_ADD_OBS(NETWORK_CHAN, transport, 0);
3535
ZBUS_CHAN_ADD_OBS(BATTERY_CHAN, transport, 0);
36+
ZBUS_CHAN_ADD_OBS(TRIGGER_CHAN, transport, 0);
3637

3738
#define MAX_MSG_SIZE (MAX(sizeof(struct payload), MAX(sizeof(struct network_msg), sizeof(struct battery_msg))))
3839

@@ -409,6 +410,37 @@ static void state_connected_exit(void *o)
409410

410411
/* Handlers for STATE_CONNECTED_READY */
411412

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

426458
return;
427459
}
460+
461+
shadow_get(false);
428462
}
429463

430464
static void state_connected_ready_run(void *o)
@@ -489,14 +523,24 @@ static void state_connected_ready_run(void *o)
489523
}
490524

491525
if (state_object->chan == &PAYLOAD_CHAN) {
492-
struct payload *payload = (struct payload *)state_object->msg_buf;
526+
struct payload *payload = MSG_TO_PAYLOAD(state_object->msg_buf);
493527

494528
err = nrf_cloud_coap_json_message_send(payload->buffer, false, false);
495529
if (err) {
496530
LOG_ERR("nrf_cloud_coap_json_message_send, error: %d", err);
497531
SEND_FATAL_ERROR();
498532
}
499533
}
534+
535+
if (state_object->chan == &TRIGGER_CHAN) {
536+
const enum trigger_type type = MSG_TO_TRIGGER_TYPE(state_object->msg_buf);
537+
538+
if (type == TRIGGER_POLL) {
539+
LOG_DBG("Poll trigger received");
540+
541+
shadow_get(true);
542+
}
543+
}
500544
}
501545

502546
/* Handlers for STATE_CONNECTED_PAUSED */

0 commit comments

Comments
 (0)