mirror of
https://github.com/liquidraver/ZephCore.git
synced 2026-10-15 07:19:56 +00:00
initial_advert_work race
This commit is contained in:
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user