Skip to content

Commit f102f25

Browse files
committed
mod: call method yields but re-attempts deserialization on no new bytes received. feat: notifications. test: checked param-less calls/notif
1 parent 7a7590a commit f102f25

File tree

6 files changed

+71
-5
lines changed

6 files changed

+71
-5
lines changed

examples/rpc_lite_client/rpc_lite_client.ino

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,16 @@ void loop() {
4444
Serial.println(result);
4545
}
4646

47+
int rand_int;
48+
ok = client.call("get_rand", rand_int);
49+
50+
if (ok) {
51+
Serial.print("Random int from server: ");
52+
Serial.println(rand_int);
53+
}
54+
55+
client.notify("blink");
56+
Serial.println("Sent a blink notification");
57+
4758
delay(2000);
4859
}

extras/examples/serial_server_example.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import random
12
from serial_server import SerialServer
23

34
def add(a, b):
@@ -10,15 +11,35 @@ def multiply(a, b):
1011
return a*b
1112

1213
def divide(a, b):
14+
if b == 0:
15+
print("0 denominator: this will raise an exception")
1316
return a/b
1417

18+
def blink():
19+
"""
20+
Used for notification
21+
"""
22+
print("Blink maybe")
23+
24+
def get_rand():
25+
"""
26+
Used for testing parameter-less RPCs
27+
"""
28+
r = random.randint(0, 10)
29+
print(f"returning a random integer: {r}")
30+
return r
31+
32+
1533
PORT = '/dev/ttySTM0'
1634

1735
server = SerialServer(port=PORT, baudrate=115200)
1836
server.register_callback('add', add)
1937
server.register_callback('mult', multiply)
2038
server.register_callback('divi', divide)
2139
server.register_callback('greet', greet)
40+
server.register_callback('blink', blink)
41+
server.register_callback('get_rand', get_rand)
42+
2243
server.start()
2344

2445
print("Serial server running... Press Ctrl+C to exit.")

extras/serial_server.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,14 @@ def on_request(self, msg_id, command, args):
2727
except Exception as e:
2828
return [RESPONSE, msg_id, [GENERIC_EXCEPTION, str(e)] ,None]
2929

30-
def handle_message(self, message) -> bytes:
30+
def on_notify(self, command, args):
31+
"""Execute the callback"""
32+
try:
33+
self.callbacks[command](*args)
34+
except Exception as e:
35+
print(f"Exception on notification... the client will never know {str(e)}")
36+
37+
def handle_message(self, message) -> bytes | None:
3138
"""Process incoming messages"""
3239
msgsize = len(message)
3340
if msgsize != 4 and msgsize != 3:
@@ -40,9 +47,8 @@ def handle_message(self, message) -> bytes:
4047
raise Exception("Server receiving RESPONSE not implemented")
4148
# response = self.on_response(message[1], message[2], message[3])
4249
elif msgtype == NOTIFY:
43-
print("Server does nothing on notification")
44-
# self.on_notify(message[1], message[2])
45-
response = None
50+
self.on_notify(message[1], message[2])
51+
return None
4652
else:
4753
raise Exception("Unknown message type: type = {0}".format(msgtype))
4854

src/SerialTransport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class SerialTransport: public ITransport {
3535
}
3636
buffer[r_size] = _stream->read();
3737
r_size++;
38+
// TODO the following delay is essential for GIGA to work. Is it worth making giga-specific?
3839
delay(1);
3940
}
4041

src/client.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,29 @@ class RPCClient {
1414
public:
1515
RPCClient(ITransport& t) : transport(t) {}
1616

17+
template<typename... Args>
18+
void notify(const MsgPack::str_t method, Args&&... args) {
19+
MsgPack::Packer packer;
20+
21+
int msg_type = NOTIFY_MSG;
22+
23+
MsgPack::arr_size_t notify_size(3);
24+
25+
packer.serialize(notify_size, msg_type, method);
26+
27+
MsgPack::arr_size_t arg_size(sizeof...(args));
28+
29+
packer.serialize(arg_size, std::forward<Args>(args)...);
30+
31+
send_msg(transport, packer.packet());
32+
}
33+
1734
template<typename RType, typename... Args>
1835
bool call(const MsgPack::str_t method, RType& result, Args&&... args) {
1936

2037
MsgPack::Packer packer;
2138

22-
int msg_type = 0;
39+
int msg_type = CALL_MSG;
2340

2441
MsgPack::arr_size_t call_size(4);
2542

@@ -37,7 +54,12 @@ class RPCClient {
3754

3855
while (true){
3956
if (!recv_msg(transport, unpacker)){
57+
// If not receiving new bytes yield first then attempt a new deserialization
4058
delay(1);
59+
}
60+
61+
if (raw_buffer_fill == 0){
62+
//Serial.println("Empty buffer... waiting response");
4163
continue;
4264
}
4365

src/rpc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
#include "transport.h"
99
#include "MsgPack.h"
1010

11+
12+
#define CALL_MSG 0
13+
#define RESP_MSG 1
14+
#define NOTIFY_MSG 2
15+
1116
#define MAX_BUFFER_SIZE 1024
1217
#define CHUNK_SIZE 32
1318

0 commit comments

Comments
 (0)