Skip to content

Commit 84b2429

Browse files
committed
fix: decoder stuck on process_requests. mod: rem wrapper result prints, decoder send_call debug prints. python: serial_client can send notifications
1 parent 6a954fa commit 84b2429

File tree

4 files changed

+17
-22
lines changed

4 files changed

+17
-22
lines changed

extras/examples/serial_client_example.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@
1111

1212
client.call("add", 1, 2, 3) # too many args
1313

14-
client.call("greet")
14+
client.call("greet")
15+
16+
client.notify("add", 5, 9)
17+
18+
client.notify("greet")

extras/serial_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,7 @@ def call(self, method, *args):
2323
unpacker = msgpack.Unpacker(BytesIO(data))
2424
for message in unpacker:
2525
print(message)
26+
27+
def notify(self, method, *args):
28+
request = [NOTIFY, method, [*args]]
29+
self.ser.write(msgpack.packb(request))

src/decoder.h

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ class RpcDecoder {
4444
MsgPack::arr_size_t arg_size(sizeof...(args));
4545
packer.serialize(arg_size, std::forward<Args>(args)...);
4646

47-
#ifdef DEBUG
48-
Serial.print("Sending: ");
49-
for (size_t i=0; i<packer.size(); i++){
50-
Serial.print(packer.data()[i], HEX);
51-
Serial.print(" ");
52-
}
53-
Serial.println(" ");
54-
#endif
55-
5647
if (send(reinterpret_cast<const uint8_t*>(packer.data()), packer.size()) == packer.size()){
5748
_msg_id++;
5849
return true;
@@ -134,28 +125,25 @@ class RpcDecoder {
134125
MsgPack::str_t method;
135126
MsgPack::arr_size_t req_size;
136127

137-
if (!unpacker.deserialize(req_size, msg_type)) break;
128+
if (!unpacker.deserialize(req_size, msg_type)) continue;
138129
// todo HANDLE MALFORMED CLIENT REQ ERRORS
139130
if ((req_size.size() == REQUEST_SIZE) && (msg_type == CALL_MSG)){
140-
if (!unpacker.deserialize(msg_id, method)) {
141-
discard_packet();
142-
break;
143-
}
131+
if (!unpacker.deserialize(msg_id, method)) continue;
132+
if (unpacker.size() < REQUEST_SIZE + 1) continue; // there must be at least 5 indices
144133
} else if ((req_size.size() == NOTIFY_SIZE) && (msg_type == NOTIFY_MSG)) {
145-
if (!unpacker.deserialize(method)) {
146-
discard_packet();
147-
break;
148-
}
149-
} else if ((req_size.size() == RESPONSE_SIZE) && (msg_type == RESP_MSG)) { // this should never happen
134+
if (!unpacker.deserialize(method)) continue;
135+
if (unpacker.size() < NOTIFY_SIZE + 1) continue; // there must be at least 4 indices
136+
} else if ((req_size.size() == RESPONSE_SIZE) && (msg_type == RESP_MSG)) { // this should never happen but it's addressed to a client
150137
break;
151138
} else {
152139
discard_packet();
153140
break;
154141
}
142+
// Headers unpacked
155143

156144
MsgPack::arr_size_t resp_size(RESPONSE_SIZE);
157145
packer.clear();
158-
packer.serialize(resp_size, RESP_MSG, msg_id);
146+
if (msg_type == CALL_MSG) packer.serialize(resp_size, RESP_MSG, msg_id);
159147
size_t headers_size = packer.size();
160148

161149
if (!dispatcher.call(method, unpacker, packer)) {

src/wrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ class RpcFunctionWrapper<R(Args...)>: public IFunctionWrapper {
104104
return true;
105105
} else {
106106
R out = invoke_with_tuple(_func, args, arx::stdx::make_index_sequence<sizeof...(Args)>{});
107-
Serial.println(out);
108107
packer.serialize(nil, out);
109108
return true;
110109
}

0 commit comments

Comments
 (0)