Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 35 additions & 22 deletions subsys/task_runner/runner.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,29 +384,10 @@ static bool task_has_terminated(uint8_t task_idx)
return true;
}

INFUSE_WATCHDOG_REGISTER_SYS_INIT(tr_wdog, CONFIG_TASK_RUNNER_INFUSE_WATCHDOG, wdog_channel,
loop_period);
#ifdef CONFIG_KV_STORE_KEY_TASK_SCHEDULES

void task_runner_iterate(atomic_t *app_states, uint32_t uptime, uint32_t gps_time,
uint8_t battery_charge)
static bool iterate_handle_task_reload(void)
{
bool transition;

infuse_watchdog_thread_register(wdog_channel, _current);
(void)loop_period;

/* Determine if any running tasks have terminated */
for (int i = 0; i < tsk_num; i++) {
if (tsk_states[i].running) {
if (task_has_terminated(i)) {
LOG_DBG("Task %s terminated @ %d", tsk[i].name, uptime);
sch_states[tsk_states[i].schedule_idx].last_terminate = uptime;
tsk_states[i].running = false;
}
}
}

#ifdef CONFIG_KV_STORE_KEY_TASK_SCHEDULES
if (atomic_test_and_clear_bit(&runner_flags, FLAGS_TRIGGER_SCHEDULE_RELOAD)) {
/* Schedules have changed in KV store, terminate all running schedules */
LOG_WRN("Schedules updated, terminating tasks");
Expand All @@ -425,7 +406,7 @@ void task_runner_iterate(atomic_t *app_states, uint32_t uptime, uint32_t gps_tim
for (int i = 0; i < tsk_num; i++) {
if (tsk_states[i].running) {
LOG_DBG("Task %d still running", i);
return;
return true;
}
}
/* Reload schedules from KV store */
Expand All @@ -436,6 +417,38 @@ void task_runner_iterate(atomic_t *app_states, uint32_t uptime, uint32_t gps_tim
default_sch, default_num, sch);
init_schedules(default_num, false);
}
return false;
}

#endif /* CONFIG_KV_STORE_KEY_TASK_SCHEDULES */

INFUSE_WATCHDOG_REGISTER_SYS_INIT(tr_wdog, CONFIG_TASK_RUNNER_INFUSE_WATCHDOG, wdog_channel,
loop_period);

void task_runner_iterate(atomic_t *app_states, uint32_t uptime, uint32_t gps_time,
uint8_t battery_charge)
{
bool transition;

infuse_watchdog_thread_register(wdog_channel, _current);
(void)loop_period;

/* Determine if any running tasks have terminated */
for (int i = 0; i < tsk_num; i++) {
if (tsk_states[i].running) {
if (task_has_terminated(i)) {
LOG_DBG("Task %s terminated @ %d", tsk[i].name, uptime);
sch_states[tsk_states[i].schedule_idx].last_terminate = uptime;
tsk_states[i].running = false;
}
}
}

#ifdef CONFIG_KV_STORE_KEY_TASK_SCHEDULES
/* Handle any task reloading */
if (iterate_handle_task_reload()) {
return;
}
#endif /* CONFIG_KV_STORE_KEY_TASK_SCHEDULES */

/* Loop over all schedules */
Expand Down
85 changes: 51 additions & 34 deletions subsys/tdf/tdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -438,47 +438,24 @@ int tdf_add_core(struct tdf_buffer_state *state, uint16_t tdf_id, uint8_t tdf_le
return tdf_num;
}

int tdf_parse(struct tdf_buffer_state *state, struct tdf_parsed *parsed)
static uint16_t tdf_time_flags_length(uint16_t time_flags)
{
if (state->buf.len <= sizeof(struct tdf_header)) {
return -ENOMEM;
}

struct tdf_header *header = net_buf_simple_pull_mem(&state->buf, sizeof(struct tdf_header));
uint16_t time_flags = header->id_flags & TDF_TIMESTAMP_MASK;
uint16_t array_flags = header->id_flags & TDF_ARRAY_MASK;
struct tdf_array_header *t_hdr;
uint8_t diff_bytes_per_tdf;
uint16_t data_len;
int32_t time_diff;

parsed->tdf_id = header->id_flags & TDF_ID_MASK;
parsed->tdf_len = header->size;
parsed->tdf_num = 1;
parsed->period = 0;

/* Invalid TDF ID */
if ((parsed->tdf_id == 0) || (parsed->tdf_id == 4095)) {
return -EINVAL;
}

/* Validate header length */
switch (time_flags) {
case TDF_TIMESTAMP_ABSOLUTE:
data_len = sizeof(struct tdf_time);
break;
return sizeof(struct tdf_time);
case TDF_TIMESTAMP_RELATIVE:
data_len = sizeof(uint16_t);
break;
return sizeof(uint16_t);
case TDF_TIMESTAMP_EXTENDED_RELATIVE:
data_len = 3;
break;
return 3;
default:
data_len = 0;
}
if (state->buf.len <= data_len) {
return -EINVAL;
return 0;
}
}

static int tdf_time_flags_consume(struct tdf_buffer_state *state, struct tdf_parsed *parsed,
uint16_t time_flags)
{
int32_t time_diff;

switch (time_flags) {
case TDF_TIMESTAMP_ABSOLUTE:
Expand Down Expand Up @@ -510,6 +487,46 @@ int tdf_parse(struct tdf_buffer_state *state, struct tdf_parsed *parsed)
parsed->time = 0;
break;
}
return 0;
}

int tdf_parse(struct tdf_buffer_state *state, struct tdf_parsed *parsed)
{
if (state->buf.len <= sizeof(struct tdf_header)) {
return -ENOMEM;
}

struct tdf_header *header = net_buf_simple_pull_mem(&state->buf, sizeof(struct tdf_header));
uint16_t time_flags = header->id_flags & TDF_TIMESTAMP_MASK;
uint16_t array_flags = header->id_flags & TDF_ARRAY_MASK;
struct tdf_array_header *t_hdr;
uint8_t diff_bytes_per_tdf;
uint16_t data_len;
int rc;

parsed->tdf_id = header->id_flags & TDF_ID_MASK;
parsed->tdf_len = header->size;
parsed->tdf_num = 1;
parsed->period = 0;

/* Invalid TDF ID */
if ((parsed->tdf_id == 0) || (parsed->tdf_id == 4095)) {
return -EINVAL;
}

/* Validate time header length */
data_len = tdf_time_flags_length(time_flags);
if (state->buf.len <= data_len) {
return -EINVAL;
}

/* Consume time information */
rc = tdf_time_flags_consume(state, parsed, time_flags);
if (rc < 0) {
return rc;
}

/* Consume array information */
if (array_flags) {
if (state->buf.len <= sizeof(struct tdf_array_header)) {
return -EINVAL;
Expand Down
2 changes: 1 addition & 1 deletion west.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ manifest:

projects:
- name: zephyr
revision: 6321b80b40573ca3a91bb6d35a542215d49b33ba
revision: feaafb05ef8ede7b8d87681c241a5f84fab7606d
# Limit imported repositories to reduce clone time
import:
name-allowlist:
Expand Down