Skip to content

Commit 7d57709

Browse files
committed
Add transfer to RFC call
1 parent b42ae4b commit 7d57709

File tree

7 files changed

+61
-5
lines changed

7 files changed

+61
-5
lines changed

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ if (BUILD_EMULATOR)
5656
src/Oop/proxy.cpp
5757
src/Oop/proxy_supervisor.cpp
5858
src/Oop/RFC.cpp
59+
src/Oop/stateful.cpp
5960
)
6061

6162
add_definitions(-DINFO=0)
@@ -98,6 +99,7 @@ if (BUILD_UNITTEST)
9899
src/Oop/proxy.cpp
99100
src/Oop/proxy_supervisor.cpp
100101
src/Oop/RFC.cpp
102+
src/Oop/stateful.cpp
101103
)
102104

103105
# Set default compile flags for GCC

src/Oop/RFC.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
11
#include "RFC.h"
22

3+
#include <cstdlib>
4+
#include <cstring>
5+
36
RFC::RFC(Module *m, uint32_t id, Type *t_type, StackValue *t_args)
47
: m(m), fidx(id), args(t_args), type(t_type) {}
8+
9+
SerializeData *merge(SerializeData a, SerializeData b) {
10+
auto data = new SerializeData;
11+
data->size = a.size + b.size + 2;
12+
data->raw = (unsigned char *)calloc(sizeof(char), data->size);
13+
std::memcpy(data->raw, a.raw, a.size);
14+
*(data->raw + a.size) = '\n';
15+
std::memcpy(data->raw + a.size + 1, b.raw, b.size);
16+
*(data->raw + a.size + b.size + 1) = '\n';
17+
return data;
18+
}

src/Oop/RFC.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ struct StackValue;
77
struct Type;
88

99
struct SerializeData {
10-
const unsigned char *raw;
10+
unsigned char *raw;
1111
uint32_t size;
1212
};
1313

14+
SerializeData *merge(SerializeData a, SerializeData b);
15+
1416
class RFC {
1517
public:
1618
Module *m;

src/Oop/proxy_supervisor.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "../../lib/json/single_include/nlohmann/json.hpp"
1313
#endif
1414

15+
#include "../Primitives/primitives.h"
1516
#include "../Utils/macros.h"
1617
#include "../Utils/util.h"
1718
#include "../WARDuino/CallbackHandler.h"
@@ -195,7 +196,13 @@ struct SerializeData *ProxySupervisor::serializeRFC(RFC *callee) {
195196
auto *ser = new SerializeData;
196197
ser->size = hexa_size + 1;
197198
ser->raw = hexa;
198-
return ser;
199+
200+
auto *transfer = get_transfer(callee->m, callee->fidx);
201+
auto *message = merge(*transfer, *ser);
202+
203+
delete ser;
204+
free(transfer);
205+
return message;
199206
}
200207

201208
void ProxySupervisor::deserializeRFCResult(RFC *rfc) {

src/Primitives/emulated.cpp

+29-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <thread>
2222

2323
#include "../Memory/mem.h"
24+
#include "../Oop/stateful.h"
2425
#include "../Utils/macros.h"
2526
#include "../Utils/util.h"
2627
#include "../WARDuino/CallbackHandler.h"
@@ -46,6 +47,7 @@ double sensor_emu = 0;
4647
if (prim_index < ALL_PRIMITIVES) { \
4748
PrimitiveEntry *p = &primitives[prim_index++]; \
4849
p->name = #prim_name; \
50+
p->index = prim_index - 1; \
4951
p->f = &(prim_name); \
5052
p->f_reverse = nullptr; \
5153
p->f_serialize_state = nullptr; \
@@ -73,6 +75,9 @@ double sensor_emu = 0;
7375
void function_name##_serialize( \
7476
std::vector<IOStateElement *> &external_state)
7577

78+
#define def_prim_transfer(function_name) \
79+
SerializeData &function_name##_transfer([[maybe_unused]] Module *m)
80+
7681
// TODO: use fp
7782
#define pop_args(n) m->sp -= n
7883
#define get_arg(m, arg) m->stack[(m)->sp - (arg)].value
@@ -256,16 +261,22 @@ def_prim(dummy, twoToOneU32) {
256261
return true;
257262
}
258263

264+
def_prim_transfer(dummy) {
265+
uint32_t start = arg1.uint32;
266+
uint32_t end = arg0.uint32;
267+
return sync_memory(m, start, end);
268+
}
269+
259270
def_prim(millis, NoneToOneU64) {
260-
struct timeval tv {};
271+
struct timeval tv{};
261272
gettimeofday(&tv, nullptr);
262273
unsigned long millis = 1000 * tv.tv_sec + tv.tv_usec;
263274
pushUInt64(millis);
264275
return true;
265276
}
266277

267278
def_prim(micros, NoneToOneU64) {
268-
struct timeval tv {};
279+
struct timeval tv{};
269280
gettimeofday(&tv, nullptr);
270281
unsigned long micros = 1000000 * tv.tv_sec + tv.tv_usec;
271282
pushUInt64(micros);
@@ -646,4 +657,20 @@ std::vector<IOStateElement *> get_io_state(Module *) {
646657
return ioState;
647658
}
648659

660+
SerializeData *get_transfer(Module *m, uint32_t index) {
661+
SerializeData *nil = new SerializeData;
662+
nil->raw = nullptr;
663+
nil->size = 0;
664+
for (auto &primitive : primitives) {
665+
if (index == primitive.index) {
666+
if (primitive.f_transfer) {
667+
return primitive.f_transfer(m);
668+
} else {
669+
return nil;
670+
}
671+
}
672+
}
673+
return nil;
674+
}
675+
649676
#endif // ARDUINO

src/Primitives/primitives.h

+2
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,6 @@ void invoke_primitive(Module *m, const std::string &function_name, Ts... args) {
8181
primitive(m);
8282
}
8383

84+
SerializeData *get_transfer(Module *m, uint32_t index);
85+
8486
#endif

src/WARDuino.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
#include <vector>
1010

1111
#include "Debug/debugger.h"
12-
#include "Oop/proxy_supervisor.h"
1312
#include "Interpreter/interpreter.h"
13+
#include "Oop/proxy_supervisor.h"
1414
#include "WARDuino/internals.h"
1515

1616
// Constants
@@ -71,9 +71,11 @@ struct IOStateElement {
7171

7272
typedef struct PrimitiveEntry {
7373
const char *name;
74+
uint32_t index;
7475
Primitive f;
7576
void (*f_reverse)(Module *m, std::vector<IOStateElement>);
7677
void (*f_serialize_state)(std::vector<IOStateElement *> &);
78+
SerializeData *(*f_transfer)(Module *m);
7779
Type t;
7880
} PrimitiveEntry;
7981

0 commit comments

Comments
 (0)