initial_advert_work race

This commit is contained in:
liquidraver
2026-06-08 10:21:55 +02:00
parent 7e00a6682d
commit f9bc6934b9
3 changed files with 51 additions and 28 deletions
+14 -8
View File
@@ -89,7 +89,8 @@ static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE, gpios);
#define MESH_EVENT_GPS_ACTION BIT(4) /* GPS state change (must run on main thread!) */
#define MESH_EVENT_TX_DRAIN BIT(5) /* Outbound packet delay expired, run checkSend */
#define MESH_EVENT_RTC_SAVE BIT(6) /* Hardware-RTC write requested off-main */
#define MESH_EVENT_ALL (MESH_EVENT_LORA_RX | MESH_EVENT_LORA_TX_DONE | MESH_EVENT_CLI_RX | MESH_EVENT_HOUSEKEEPING | MESH_EVENT_GPS_ACTION | MESH_EVENT_TX_DRAIN | MESH_EVENT_RTC_SAVE)
#define MESH_EVENT_INIT_ADVERT BIT(7) /* Deferred boot advert — send on main thread */
#define MESH_EVENT_ALL (MESH_EVENT_LORA_RX | MESH_EVENT_LORA_TX_DONE | MESH_EVENT_CLI_RX | MESH_EVENT_HOUSEKEEPING | MESH_EVENT_GPS_ACTION | MESH_EVENT_TX_DRAIN | MESH_EVENT_RTC_SAVE | MESH_EVENT_INIT_ADVERT)
/* Housekeeping interval - infrequent to preserve power savings */
#define HOUSEKEEPING_INTERVAL_MS CONFIG_ZEPHCORE_HOUSEKEEPING_INTERVAL_MS
@@ -271,16 +272,14 @@ static void tx_drain_work_fn(struct k_work *work)
k_event_post(&mesh_events, MESH_EVENT_TX_DRAIN);
}
/* Deferred initial advertisement — gives GPS time to get a fix at boot */
/* Deferred initial advertisement — gives GPS time to get a fix at boot.
* Runs on sysworkq (the 10 s delay timer), so it must NOT send the advert
* here: sendSelfAdvertisement() mutates the packet pool / dispatcher shared
* with loop(). Post an event and let the main thread send it. */
static void initial_advert_work_fn(struct k_work *work)
{
ARG_UNUSED(work);
#ifdef ZEPHCORE_LORA
if (repeater_mesh_ptr) {
LOG_INF("Sending deferred initial advertisement");
repeater_mesh_ptr->sendSelfAdvertisement(500, false);
}
#endif
k_event_post(&mesh_events, MESH_EVENT_INIT_ADVERT);
}
static void tx_queued_callback(uint32_t delay_ms, void *user_data)
@@ -392,6 +391,13 @@ static void repeater_event_loop(void)
process_cli_commands();
}
/* Deferred boot advert — sent on the main thread (see
* initial_advert_work_fn); loop() below drains the queued packet. */
if (repeater_mesh_ptr && (events & MESH_EVENT_INIT_ADVERT)) {
LOG_INF("Sending deferred initial advertisement");
repeater_mesh_ptr->sendSelfAdvertisement(500, false);
}
/* Packet processing — only on radio/CLI/TX events */
if (repeater_mesh_ptr &&
(events & (MESH_EVENT_LORA_RX | MESH_EVENT_LORA_TX_DONE |