Skip to content

Commit 1509a66

Browse files
authored
Merge pull request #16 from bcmi-labs/new_call_api
Bridge.call: move result retrieval to separate API
2 parents 3226cc2 + 5dc55dd commit 1509a66

File tree

6 files changed

+89
-42
lines changed

6 files changed

+89
-42
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ void setup() {
4141

4242
void loop() {
4343
float res;
44-
if (!Bridge.call("multiply", res, 1.0, 2.0)) {
44+
if (!Bridge.call("multiply", 1.0, 2.0).result(res)) {
4545
Serial.println("Error calling method: multiply");
4646
Serial.println(Bridge.get_error_code());
4747
Serial.println(Bridge.get_error_message());

examples/simple_bridge/simple_bridge.ino

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,23 @@ void setup() {
4747

4848
void loop() {
4949
float res;
50-
if (!Bridge.call("multiply", res, 1.0, 2.0)) {
50+
if (!Bridge.call("multiply", 1.0, 2.0).result(res)) {
5151
Serial.println("Error calling method: multiply");
5252
Serial.println(Bridge.get_error_code());
5353
Serial.println(Bridge.get_error_message());
5454
};
5555

56+
// Call with deferred response check
57+
RpcResult outcome = Bridge.call("multiply", 5.0, 7.0);
58+
Serial.println("RPC called");
59+
delay(10);
60+
if (outcome.result(res)) {
61+
Serial.print("Result of the operation is: ");
62+
Serial.println(res);
63+
} else {
64+
Serial.println(Bridge.get_error_code());
65+
Serial.println(Bridge.get_error_message());
66+
}
67+
5668
Bridge.notify("signal", 200);
5769
}

src/bridge.h

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#define RESET_METHOD "$/reset"
1818
#define BIND_METHOD "$/register"
19+
//#define BRIDGE_ERROR "$/bridgeLog"
1920

2021
#define UPDATE_THREAD_STACK_SIZE 500
2122
#define UPDATE_THREAD_PRIORITY 5
@@ -28,6 +29,58 @@
2829

2930
void updateEntryPoint(void *, void *, void *);
3031

32+
class RpcResult {
33+
34+
public:
35+
RpcError error;
36+
37+
RpcResult(uint32_t id, RPCClient* c, struct k_mutex* rm, struct k_mutex* wm) : msg_id_wait(id), client(c), read_mutex(rm), write_mutex(wm) {}
38+
39+
template<typename RType> bool result(RType& result) {
40+
if (_executed) return error.code == NO_ERR;
41+
42+
while(true) {
43+
if (k_mutex_lock(read_mutex, K_MSEC(10)) == 0 ) {
44+
if (client->get_response(msg_id_wait, result, error)) {
45+
k_mutex_unlock(read_mutex);
46+
// if (error.code == PARSING_ERR) {
47+
// k_mutex_lock(write_mutex, K_FOREVER);
48+
// client->notify(BRIDGE_ERROR, error.traceback);
49+
// k_mutex_unlock(write_mutex);
50+
// }
51+
break;
52+
}
53+
k_mutex_unlock(read_mutex);
54+
k_msleep(1);
55+
} else {
56+
k_yield();
57+
}
58+
}
59+
_executed = true;
60+
return error.code == NO_ERR;
61+
}
62+
63+
bool result() {
64+
MsgPack::object::nil_t nil;
65+
return result(nil);
66+
}
67+
68+
~RpcResult(){
69+
result();
70+
}
71+
72+
operator bool() {
73+
return result();
74+
}
75+
76+
private:
77+
uint32_t msg_id_wait;
78+
RPCClient* client;
79+
bool _executed = false;
80+
struct k_mutex* read_mutex;
81+
struct k_mutex* write_mutex;
82+
};
83+
3184
class BridgeClass {
3285

3386
RPCClient* client = nullptr;
@@ -73,7 +126,7 @@ class BridgeClass {
73126
UPDATE_THREAD_PRIORITY, 0, K_NO_WAIT);
74127

75128
bool res;
76-
call(RESET_METHOD, res);
129+
call(RESET_METHOD).result(res);
77130
if (res) {
78131
started = true;
79132
}
@@ -83,7 +136,7 @@ class BridgeClass {
83136
template<typename F>
84137
bool provide(const MsgPack::str_t& name, F&& func) {
85138
bool res;
86-
if (!call(BIND_METHOD, res, name)) {
139+
if (!call(BIND_METHOD, name).result(res)) {
87140
return false;
88141
}
89142
return server->bind(name, func);
@@ -92,7 +145,7 @@ class BridgeClass {
92145
template<typename F>
93146
bool provide_safe(const MsgPack::str_t& name, F&& func) {
94147
bool res;
95-
if (!call(BIND_METHOD, res, name)) {
148+
if (!call(BIND_METHOD, name).result(res)) {
96149
return false;
97150
}
98151

@@ -131,8 +184,8 @@ class BridgeClass {
131184

132185
}
133186

134-
template<typename RType, typename... Args>
135-
bool call(const MsgPack::str_t& method, RType& result, Args&&... args) {
187+
template<typename... Args>
188+
RpcResult call(const MsgPack::str_t& method, Args&&... args) {
136189

137190
uint32_t msg_id_wait;
138191

@@ -145,26 +198,11 @@ class BridgeClass {
145198
} else {
146199
k_yield();
147200
}
148-
}
149-
150-
// Lock read mutex
151-
while(true) {
152-
if (k_mutex_lock(&read_mutex, K_MSEC(10)) == 0 ) {
153-
if (client->get_response(msg_id_wait, result)) {
154-
k_mutex_unlock(&read_mutex);
155-
break;
156-
}
157-
k_mutex_unlock(&read_mutex);
158-
k_msleep(1);
159-
} else {
160-
k_yield();
161-
}
162-
163-
}
201+
}
202+
return RpcResult{msg_id_wait, client, &read_mutex, &write_mutex};
203+
}
164204

165-
return (client->lastError.code == NO_ERR);
166205

167-
}
168206

169207
template<typename... Args>
170208
void notify(const MsgPack::str_t method, Args&&... args) {

src/monitor.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class BridgeMonitor: public Stream {
4444
if (!bridge_started) {
4545
bridge_started = bridge->begin();
4646
}
47-
return bridge_started && bridge->call(MON_CONNECTED_METHOD, is_connected);
47+
return bridge_started && bridge->call(MON_CONNECTED_METHOD).result(is_connected);
4848
}
4949

5050
explicit operator bool() const {
@@ -99,7 +99,7 @@ class BridgeMonitor: public Stream {
9999
}
100100

101101
size_t written;
102-
const bool ret = bridge->call(MON_WRITE_METHOD, written, send_buffer);
102+
const bool ret = bridge->call(MON_WRITE_METHOD, send_buffer).result(written);
103103
if (ret) {
104104
return written;
105105
}
@@ -109,7 +109,7 @@ class BridgeMonitor: public Stream {
109109

110110
bool reset() {
111111
bool res;
112-
bool ok = bridge->call(MON_RESET_METHOD, res);
112+
bool ok = bridge->call(MON_RESET_METHOD).result(res);
113113
if (ok && res) {
114114
is_connected = false;
115115
}
@@ -121,25 +121,22 @@ class BridgeMonitor: public Stream {
121121

122122
if (size == 0) return;
123123

124-
k_mutex_lock(&monitor_mutex, K_FOREVER);
125-
126124
MsgPack::arr_t<uint8_t> message;
127-
bool ret = bridge->call(MON_READ_METHOD, message, size);
125+
bool ret = bridge->call(MON_READ_METHOD, size).result(message);
128126

129127
if (ret) {
128+
k_mutex_lock(&monitor_mutex, K_FOREVER);
130129
for (size_t i = 0; i < message.size(); ++i) {
131130
temp_buffer.store_char(static_cast<char>(message[i]));
132131
}
132+
k_mutex_unlock(&monitor_mutex);
133133
}
134134

135135
// if (bridge.lastError.code > NO_ERR) {
136136
// is_connected = false;
137137
// }
138-
139-
k_mutex_unlock(&monitor_mutex);
140138
}
141139

142-
143140
};
144141

145142
extern BridgeClass Bridge;

src/tcp_client.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class BridgeTCPClient : public Client {
6161

6262
k_mutex_lock(&client_mutex, K_FOREVER);
6363

64-
const bool resp = bridge->call(TCP_CONNECT_METHOD, connection_id, hostname, port);
64+
const bool resp = bridge->call(TCP_CONNECT_METHOD, hostname, port).result(connection_id);
6565

6666
if (!resp) {
6767
_connected = false;
@@ -84,7 +84,7 @@ class BridgeTCPClient : public Client {
8484

8585
k_mutex_lock(&client_mutex, K_FOREVER);
8686

87-
const bool resp = bridge->call(TCP_CONNECT_SSL_METHOD, connection_id, hostname, port, ca_cert_str);
87+
const bool resp = bridge->call(TCP_CONNECT_SSL_METHOD, hostname, port, ca_cert_str).result(connection_id);
8888

8989
if (!resp) {
9090
_connected = false;
@@ -116,7 +116,7 @@ class BridgeTCPClient : public Client {
116116
}
117117

118118
size_t written;
119-
const bool ret = bridge->call(TCP_WRITE_METHOD, written, connection_id, payload);
119+
const bool ret = bridge->call(TCP_WRITE_METHOD, connection_id, payload).result(written);
120120
if (ret) {
121121
return written;
122122
}
@@ -170,7 +170,7 @@ class BridgeTCPClient : public Client {
170170
void stop() override {
171171
k_mutex_lock(&client_mutex, K_FOREVER);
172172
String msg;
173-
const bool resp = bridge->call(TCP_CLOSE_METHOD, msg, connection_id);
173+
const bool resp = bridge->call(TCP_CLOSE_METHOD, connection_id).result(msg);
174174
if (resp) {
175175
_connected = false;
176176
}
@@ -198,7 +198,7 @@ class BridgeTCPClient : public Client {
198198
k_mutex_lock(&client_mutex, K_FOREVER);
199199

200200
MsgPack::arr_t<uint8_t> message;
201-
const bool ret = bridge->call(TCP_READ_METHOD, message, connection_id, size);
201+
const bool ret = bridge->call(TCP_READ_METHOD, connection_id, size).result(message);
202202

203203
if (ret) {
204204
for (size_t i = 0; i < message.size(); ++i) {

src/tcp_server.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class BridgeTCPServer final: public Server {
5252
k_mutex_lock(&server_mutex, K_FOREVER);
5353

5454
String hostname = _addr.toString();
55-
_listening = bridge->call(TCP_LISTEN_METHOD, listener_id, hostname, _port);
55+
_listening = bridge->call(TCP_LISTEN_METHOD, hostname, _port).result(listener_id);
5656

5757
k_mutex_unlock(&server_mutex);
5858

@@ -70,7 +70,7 @@ class BridgeTCPServer final: public Server {
7070

7171
k_mutex_lock(&server_mutex, K_FOREVER);
7272

73-
const bool ret = bridge->call(TCP_ACCEPT_METHOD, connection_id, listener_id);
73+
const bool ret = bridge->call(TCP_ACCEPT_METHOD, listener_id).result(connection_id);
7474

7575
k_mutex_unlock(&server_mutex);
7676

@@ -104,7 +104,7 @@ class BridgeTCPServer final: public Server {
104104
k_mutex_lock(&server_mutex, K_FOREVER);
105105

106106
String msg;
107-
const bool ret = bridge->call(TCP_CLOSE_LISTENER_METHOD, msg, listener_id);
107+
const bool ret = bridge->call(TCP_CLOSE_LISTENER_METHOD, listener_id).result(msg);
108108

109109
if (ret) {
110110
_listening = false;

0 commit comments

Comments
 (0)