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
2 changes: 1 addition & 1 deletion library.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": "*",
Expand Down
2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -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
Expand Down
90 changes: 71 additions & 19 deletions src/bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -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<typename RType, typename... Args>
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>(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>(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<typename... Args>
Expand All @@ -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;
Expand All @@ -176,6 +226,7 @@ BridgeClass Bridge(Serial1);
void updateEntryPoint(void *, void *, void *){
while(1){
Bridge.update();
k_msleep(1);
}
}

Expand All @@ -184,6 +235,7 @@ static void safeUpdate(){
}

void __loopHook(){
k_msleep(1);
safeUpdate();
}

Expand Down