From da477993020e1c13c297394d90202d0f3500c611 Mon Sep 17 00:00:00 2001 From: Lucio Rossi Date: Fri, 5 Dec 2025 16:39:06 +0100 Subject: [PATCH] feat: Bridge.begin waits to be greenlighted by MPU up to timeout --- src/bridge.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/bridge.h b/src/bridge.h index 8c2c77a..1df6795 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -22,6 +22,8 @@ #define UPDATE_THREAD_PRIORITY 5 #define DEFAULT_SERIAL_BAUD 115200 +#define GREENLIGHT_METHOD "$/start" +#define BEGIN_TIMEOUT_MS 5000 #include #include @@ -32,6 +34,13 @@ void updateEntryPoint(void *, void *, void *); +k_sem cleared_sem; + +inline void greenLight() { + Serial.println("Green Light"); + //k_sem_give(&cleared_sem); +} + template class RpcCall { @@ -179,10 +188,10 @@ class BridgeClass { k_mutex_init(&read_mutex); k_mutex_init(&write_mutex); k_mutex_init(&bridge_mutex); + k_sem_init(&cleared_sem, 0, 1); // if (is_started()) return true; - k_mutex_lock(&bridge_mutex, K_FOREVER); serial_ptr->begin(baud); transport = new SerialTransport(*serial_ptr); @@ -190,6 +199,13 @@ class BridgeClass { client = new RPCClient(*transport); server = new RPCServer(*transport); + // The service method greenLight is not registered to the MPU, but it is provided for signaling + k_mutex_lock(&bridge_mutex, K_FOREVER); + started = server->bind(GREENLIGHT_METHOD, greenLight); + if (!started) Serial.println("Failed to bind greenlight"); + + k_mutex_unlock(&bridge_mutex); + upd_stack_area = k_thread_stack_alloc(UPDATE_THREAD_STACK_SIZE, 0); upd_tid = k_thread_create(&upd_thread_data, upd_stack_area, UPDATE_THREAD_STACK_SIZE, @@ -198,6 +214,13 @@ class BridgeClass { UPDATE_THREAD_PRIORITY, 0, K_NO_WAIT); k_thread_name_set(upd_tid, "bridge"); + // This should not be mutexed and go before the call to RESET_METHOD + // BEGIN_TIMEOUT_MS ensures compatibility with older versions that do not use signaling + Serial.println("Waiting to be cleared"); + k_sem_take(&cleared_sem, K_MSEC(BEGIN_TIMEOUT_MS)); // wait to be cleared by the other side + Serial.println("Cleared->Resetting"); + + k_mutex_lock(&bridge_mutex, K_FOREVER); bool res = false; started = call(RESET_METHOD).result(res) && res; k_mutex_unlock(&bridge_mutex); @@ -236,6 +259,13 @@ class BridgeClass { k_mutex_unlock(&read_mutex); + Serial.print("Processing: "); + for (size_t i = 0; i < req.size; i++) { + Serial.print(" 0x"); + Serial.print(req.buffer[i], HEX); + } + Serial.println(""); + server->process_request(req); // Lock write mutex