diff --git a/library.json b/library.json index ce24b6d..f248494 100644 --- a/library.json +++ b/library.json @@ -11,7 +11,7 @@ "url": "https://github.com/bcmi-labs/Arduino_RouterBridge", "maintainer": true }, - "version": "0.1.0", + "version": "0.1.2", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/library.properties b/library.properties index 9e0dfb5..1229434 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Arduino_RouterBridge -version=0.1.0 +version=0.1.2 author=BCMI-labs maintainer=BCMI-labs sentence=A RPC bridge for Arduino UNO Q boards diff --git a/src/bridge.h b/src/bridge.h index afc1d25..5bf57fe 100644 --- a/src/bridge.h +++ b/src/bridge.h @@ -26,6 +26,8 @@ class BridgeClass { struct k_mutex read_mutex; struct k_mutex write_mutex; + struct k_mutex server_mutex; + struct k_mutex client_mutex; k_tid_t upd_tid; k_thread_stack_t *upd_stack_area; @@ -44,6 +46,8 @@ class BridgeClass { k_mutex_init(&read_mutex); k_mutex_init(&write_mutex); + k_mutex_init(&server_mutex); + k_mutex_init(&client_mutex); client = new RPCClient(*transport); server = new RPCServer(*transport); @@ -81,45 +85,76 @@ class BridgeClass { void update() { - k_msleep(1); + if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return; + // Lock read mutex - k_mutex_lock(&read_mutex, K_FOREVER); + if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; + if (!server->get_rpc()) { k_mutex_unlock(&read_mutex); + k_msleep(1); return; } + k_mutex_unlock(&read_mutex); server->process_request(); // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - server->send_response(); - k_mutex_unlock(&write_mutex); + while (true) { + + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){ + server->send_response(); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + + } + + k_mutex_unlock(&server_mutex); } template bool call(const MsgPack::str_t method, RType& result, Args&&... args) { + k_mutex_lock(&client_mutex, K_FOREVER); + // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - client->send_rpc(method, std::forward(args)...); - k_mutex_unlock(&write_mutex); + while (true) { + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0) { + client->send_rpc(method, std::forward(args)...); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + } // Lock read mutex - while(1) { - k_mutex_lock(&read_mutex, K_FOREVER); - if (client->get_response(result)) { + while(true) { + if (k_mutex_lock(&read_mutex, K_MSEC(10)) == 0 ) { + if (client->get_response(result)) { + k_mutex_unlock(&read_mutex); + k_msleep(1); + break; + } k_mutex_unlock(&read_mutex); - break; + k_msleep(1); + } else { + k_msleep(1); } - k_mutex_unlock(&read_mutex); - k_msleep(1); + } return (client->lastError.code == NO_ERR); + k_mutex_unlock(&client_mutex); + } template @@ -139,22 +174,37 @@ class BridgeClass { void update_safe() { + if (k_mutex_lock(&server_mutex, K_MSEC(10)) != 0) return; + // Lock read mutex - k_msleep(1); - k_mutex_lock(&read_mutex, K_FOREVER); + if (k_mutex_lock(&read_mutex, K_MSEC(10)) != 0 ) return; + if (!server->get_rpc()) { k_mutex_unlock(&read_mutex); + k_msleep(1); return; } + k_mutex_unlock(&read_mutex); server->process_request("__safe__"); // Lock write mutex - k_mutex_lock(&write_mutex, K_FOREVER); - server->send_response(); - k_mutex_unlock(&write_mutex); + while (true) { + + if (k_mutex_lock(&write_mutex, K_MSEC(10)) == 0){ + server->send_response(); + k_mutex_unlock(&write_mutex); + k_msleep(1); + break; + } else { + k_msleep(1); + } + } + + k_mutex_unlock(&server_mutex); + } friend class BridgeClassUpdater; @@ -176,6 +226,7 @@ BridgeClass Bridge(Serial1); void updateEntryPoint(void *, void *, void *){ while(1){ Bridge.update(); + k_msleep(1); } } @@ -184,6 +235,7 @@ static void safeUpdate(){ } void __loopHook(){ + k_msleep(1); safeUpdate(); }