1616
1717#define RESET_METHOD " $/reset"
1818#define BIND_METHOD " $/register"
19+ #define GET_VERSION_METHOD " $/version"
20+
1921// #define BRIDGE_ERROR "$/bridgeLog"
2022
2123#define UPDATE_THREAD_STACK_SIZE 500
2729#include < zephyr/sys/atomic.h>
2830#include < Arduino_RPClite.h>
2931
32+ #include < utility>
33+
3034
3135void updateEntryPoint (void *, void *, void *);
3236
3337template <typename ... Args>
3438class RpcCall {
39+
40+ RpcError error;
41+
42+ void setError (int code, MsgPack::str_t text) {
43+ k_mutex_lock (&call_mutex, K_FOREVER);
44+ error.code = code;
45+ error.traceback = std::move (text);
46+ k_mutex_unlock (&call_mutex);
47+ }
48+
3549public:
36- RpcError error{GENERIC_ERR, " This call is not executed yet" };
3750
38- RpcCall (const MsgPack::str_t & m, RPCClient* c, struct k_mutex * rm, struct k_mutex * wm, Args&&... args): method(m), client(c), read_mutex(rm), write_mutex(wm), callback_params(std::forward_as_tuple(std::forward<Args>(args)...)) {}
51+ RpcCall (const MsgPack::str_t & m, RPCClient* c, struct k_mutex * rm, struct k_mutex * wm, Args&&... args): method(m), client(c), read_mutex(rm), write_mutex(wm), callback_params(std::forward_as_tuple(std::forward<Args>(args)...)) {
52+ k_mutex_init (&call_mutex);
53+ setError (GENERIC_ERR, " This call is not yet executed" );
54+ }
55+
56+ bool isError () {
57+ k_mutex_lock (&call_mutex, K_FOREVER);
58+ const bool out = error.code > NO_ERR;
59+ k_mutex_unlock (&call_mutex);
60+ return out;
61+ }
62+
63+ int getErrorCode () {
64+ k_mutex_lock (&call_mutex, K_FOREVER);
65+ const int out = error.code ;
66+ k_mutex_unlock (&call_mutex);
67+ return out;
68+ }
69+
70+ MsgPack::str_t getErrorMessage () {
71+ k_mutex_lock (&call_mutex, K_FOREVER);
72+ MsgPack::str_t out = error.traceback ;
73+ k_mutex_unlock (&call_mutex);
74+ return out;
75+ }
3976
4077 template <typename RType> bool result (RType& result) {
4178
4279 if (!atomic_cas (&_executed, 0 , 1 )){
4380 // this thread lost the race
44- error.code = GENERIC_ERR;
45- error.traceback = " This call result is no longer available" ;
81+ setError (GENERIC_ERR, " This call is no longer available" );
4682 return false ;
4783 }
4884
@@ -60,13 +96,15 @@ class RpcCall {
6096
6197 while (true ) {
6298 if (k_mutex_lock (read_mutex, K_MSEC (10 )) == 0 ) {
63- if (client->get_response (msg_id_wait, result, error)) {
99+ RpcError temp_err;
100+ if (client->get_response (msg_id_wait, result, temp_err)) {
64101 k_mutex_unlock (read_mutex);
65102 // if (error.code == PARSING_ERR) {
66103 // k_mutex_lock(write_mutex, K_FOREVER);
67104 // client->notify(BRIDGE_ERROR, error.traceback);
68105 // k_mutex_unlock(write_mutex);
69106 // }
107+ setError (temp_err.code , temp_err.traceback );
70108 break ;
71109 }
72110 k_mutex_unlock (read_mutex);
@@ -76,7 +114,7 @@ class RpcCall {
76114 }
77115 }
78116
79- return error. code == NO_ERR ;
117+ return ! isError () ;
80118 }
81119
82120 bool result () {
@@ -100,6 +138,7 @@ class RpcCall {
100138 RPCClient* client;
101139 struct k_mutex * read_mutex;
102140 struct k_mutex * write_mutex;
141+ struct k_mutex call_mutex{};
103142 std::tuple<Args...> callback_params;
104143};
105144
@@ -120,6 +159,8 @@ class BridgeClass {
120159
121160 bool started = false ;
122161
162+ MsgPack::str_t router_ver;
163+
123164public:
124165
125166 explicit BridgeClass (HardwareSerial& serial) {
@@ -145,6 +186,8 @@ class BridgeClass {
145186
146187 if (is_started ()) return true ;
147188
189+ k_mutex_lock (&bridge_mutex, K_FOREVER);
190+
148191 serial_ptr->begin (baud);
149192 transport = new SerialTransport (*serial_ptr);
150193
@@ -159,13 +202,16 @@ class BridgeClass {
159202 UPDATE_THREAD_PRIORITY, 0 , K_NO_WAIT);
160203 k_thread_name_set (upd_tid, " bridge" );
161204
162- k_mutex_lock (&bridge_mutex, K_FOREVER);
163205 bool res = false ;
164206 started = call (RESET_METHOD).result (res) && res;
165207 k_mutex_unlock (&bridge_mutex);
166208 return res;
167209 }
168210
211+ bool getRouterVersion (MsgPack::str_t & version) {
212+ return call (GET_VERSION_METHOD).result (version);
213+ }
214+
169215 template <typename F>
170216 bool provide (const MsgPack::str_t & name, F&& func) {
171217 k_mutex_lock (&bridge_mutex, K_FOREVER);
0 commit comments