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
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ A MessagePack RPC library for Arduino allows to create a client/server architect
```cpp
#include <Arduino_RPClite.h>

RPCServer server(Serial1);
SerialTransport transport(Serial1);
RPCServer server(transport);

int add(int a, int b){
return a+b;
Expand Down Expand Up @@ -42,7 +43,8 @@ void loop() {
```cpp
#include <Arduino_RPClite.h>

RPCClient client(Serial1);
SerialTransport transport(Serial1);
RPCClient client(transport);

void setup() {
Serial1.begin(115200);
Expand Down
4 changes: 0 additions & 4 deletions examples/decoder_tests/DummyTransport.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
//
// Created by lucio on 4/8/25.
//

#ifndef DUMMY_TRANSPORT_H
#define DUMMY_TRANSPORT_H
#include "transport.h"
Expand Down
9 changes: 3 additions & 6 deletions examples/decoder_tests/decoder_tests.ino
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,9 @@ void runDecoderTest(const char* label) {
delay(50);
}

while (decoder.packet_incoming()) {
size_t removed = decoder.discard_packet();
Serial.print("Removed bytes: ");
Serial.println(removed);
decoder.decode();
}
size_t pack_size = decoder.get_packet_size();
Serial.print("1st Packet size: ");
Serial.println(pack_size);

Serial.println("-- Done --\n");
}
Expand Down
11 changes: 6 additions & 5 deletions examples/rpc_lite_client/rpc_lite_client.ino
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
#include <Arduino_RPClite.h>

RPCClient client(Serial1);
SerialTransport transport(Serial1);
RPCClient client(transport);

void setup() {
Serial1.begin(115200);
while(!Serial1);

pinMode(LED_BUILTIN, OUTPUT);

Serial.begin(9600);
delay(10);

Serial.begin(115200);
while(!Serial);
}

Expand All @@ -30,7 +32,7 @@ void blink_before(){
void loop() {
float result;
blink_before();

String str_res;
bool ok = client.call("loopback", str_res, "Sending a greeting");
Serial.println(str_res);
Expand Down Expand Up @@ -75,5 +77,4 @@ void loop() {
Serial.println("Server could not handle a notification as a call");
}

delay(2000);
}
17 changes: 16 additions & 1 deletion examples/rpc_lite_server/rpc_lite_server.ino
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
#include <Arduino_RPClite.h>

RPCServer server(Serial1);
SerialTransport transport(Serial1);
RPCServer server(transport);

int add(int a, int b){
return a+b;
}

int add2(int a, int b){
return a+b;
}

String greet(){
return String("Hello Friend");
}
Expand All @@ -24,6 +29,10 @@ public:
};


float multip(float a, float b) {
return a*b;
}

void setup() {
Serial1.begin(115200);
while(!Serial1);
Expand All @@ -34,10 +43,16 @@ void setup() {
while(!Serial);

server.bind("add", add);

if (!server.bind("add", add2)){
Serial.println("server refused to bind same name twice");
}

server.bind("greet", greet);
server.bind("loopback", loopback);
server.bind("another_greeting", [] {return MsgPack::str_t ("This is a lambda greeting");});
server.bind("object_multi", &multiplier::mult);
server.bind("multip", multip);

}

Expand Down
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/eigen-value",
"maintainer": true
},
"version": "0.0.1",
"version": "0.1.0",
"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_RPClite
version=0.0.1
version=0.1.0
author=Lucio Rossi (eigen-value)
maintainer=Lucio Rossi (eigen-value)
sentence=A MessagePack RPC library for Arduino
Expand Down
4 changes: 0 additions & 4 deletions src/Arduino_RPClite.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
//
// Created by lucio on 4/8/25.
//

#ifndef ARDUINO_RPCLITE_H
#define ARDUINO_RPCLITE_H

Expand Down
51 changes: 35 additions & 16 deletions src/client.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
//
// Created by lucio on 4/8/25.
//

#ifndef RPCLITE_CLIENT_H
#define RPCLITE_CLIENT_H
#include "error.h"
Expand All @@ -11,16 +7,18 @@

class RPCClient {
RpcDecoder<>* decoder = nullptr;
int _waiting_msg_id;

public:
RpcError lastError;

RPCClient(ITransport& t) : decoder(&RpcDecoderManager<>::getDecoder(t)) {}

RPCClient(Stream& stream) {
ITransport* transport = (ITransport*) new SerialTransport(stream);
decoder = &RpcDecoderManager<>::getDecoder(*transport);
}
// This constructor was removed because it leads to decoder duplication
// RPCClient(Stream& stream) {
// ITransport* transport = (ITransport*) new SerialTransport(stream);
// decoder = &RpcDecoderManager<>::getDecoder(*transport);
// }

template<typename... Args>
void notify(const MsgPack::str_t method, Args&&... args) {
Expand All @@ -31,23 +29,44 @@ class RPCClient {
template<typename RType, typename... Args>
bool call(const MsgPack::str_t method, RType& result, Args&&... args) {

int msg_id;
if (!decoder->send_call(CALL_MSG, method, msg_id, std::forward<Args>(args)...)){
if(!send_rpc(method, std::forward<Args>(args)...)) {
lastError.code = GENERIC_ERR;
lastError.traceback = "Failed to send RPC call";
return false;
}

RpcError error;
// blocking call
while (!decoder->get_response(msg_id, result, error)){
decoder->decode();
while (!get_response(result)){
//delay(1);
}

lastError.code = error.code;
lastError.traceback = error.traceback;
return (lastError.code == NO_ERR);

}

template<typename... Args>
bool send_rpc(const MsgPack::str_t method, Args&&... args) {
int msg_id;
if (decoder->send_call(CALL_MSG, method, msg_id, std::forward<Args>(args)...)) {
_waiting_msg_id = msg_id;
return true;
}
return false;
}

return (error.code == NO_ERR);
template<typename RType>
bool get_response(RType& result) {
RpcError tmp_error;
decoder->decode();

if (decoder->get_response(_waiting_msg_id, result, tmp_error)) {
lastError.code = tmp_error.code;
lastError.traceback = tmp_error.traceback;
return true;
}
return false;
}

};

#endif //RPCLITE_CLIENT_H
Loading