21
21
#include < thread>
22
22
23
23
#include " ../Memory/mem.h"
24
+ #include " ../Oop/stateful.h"
24
25
#include " ../Utils/macros.h"
25
26
#include " ../Utils/util.h"
26
27
#include " ../WARDuino/CallbackHandler.h"
@@ -46,6 +47,7 @@ double sensor_emu = 0;
46
47
if (prim_index < ALL_PRIMITIVES) { \
47
48
PrimitiveEntry *p = &primitives[prim_index++]; \
48
49
p->name = #prim_name; \
50
+ p->index = prim_index - 1 ; \
49
51
p->f = &(prim_name); \
50
52
p->f_reverse = nullptr ; \
51
53
p->f_serialize_state = nullptr ; \
@@ -73,6 +75,9 @@ double sensor_emu = 0;
73
75
void function_name##_serialize( \
74
76
std::vector<IOStateElement *> &external_state)
75
77
78
+ #define def_prim_transfer (function_name ) \
79
+ SerializeData &function_name##_transfer([[maybe_unused]] Module *m)
80
+
76
81
// TODO: use fp
77
82
#define pop_args (n ) m->sp -= n
78
83
#define get_arg (m, arg ) m->stack[(m)->sp - (arg)].value
@@ -256,16 +261,22 @@ def_prim(dummy, twoToOneU32) {
256
261
return true ;
257
262
}
258
263
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
+
259
270
def_prim (millis, NoneToOneU64) {
260
- struct timeval tv {};
271
+ struct timeval tv{};
261
272
gettimeofday (&tv, nullptr );
262
273
unsigned long millis = 1000 * tv.tv_sec + tv.tv_usec ;
263
274
pushUInt64 (millis);
264
275
return true ;
265
276
}
266
277
267
278
def_prim (micros, NoneToOneU64) {
268
- struct timeval tv {};
279
+ struct timeval tv{};
269
280
gettimeofday (&tv, nullptr );
270
281
unsigned long micros = 1000000 * tv.tv_sec + tv.tv_usec ;
271
282
pushUInt64 (micros);
@@ -646,4 +657,20 @@ std::vector<IOStateElement *> get_io_state(Module *) {
646
657
return ioState;
647
658
}
648
659
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
+
649
676
#endif // ARDUINO
0 commit comments