32
32
#include " ../Utils/util.h"
33
33
#include " primitives.h"
34
34
35
- #define ALL_PRIMITIVES 5
35
+ #define ALL_PRIMITIVES 9
36
36
37
37
// Global index for installing primitives
38
38
int prim_index = 0 ;
@@ -262,6 +262,100 @@ def_prim(print_int, oneToNoneU32) {
262
262
return true ;
263
263
}
264
264
265
+ #include < zephyr/drivers/led_strip.h>
266
+ #define RGB (_r, _g, _b ) { .r = (_r), .g = (_g), .b = (_b) }
267
+ static const struct device *const strip = DEVICE_DT_GET(DT_ALIAS(led_strip));
268
+ const size_t strip_length = 64 ;// led_strip_length(device);
269
+ struct led_rgb pixels[strip_length] = {0 };
270
+
271
+ void fun () {
272
+ size_t color = 0 ;
273
+ int rc;
274
+
275
+ if (device_is_ready (strip)) {
276
+ printf (" Found LED strip device %s\n " , strip->name );
277
+ } else {
278
+ printf (" LED strip device %s is not ready\n " , strip->name );
279
+ return ;
280
+ }
281
+
282
+ printf (" Displaying pattern on strip\n " );
283
+ const struct led_rgb colors[] = {
284
+ RGB (16 , 0x00 , 0x00 ), // red
285
+ RGB (0x00 , 16 , 0x00 ), // green
286
+ RGB (0x00 , 0x00 , 16 ), // blue
287
+ };
288
+ size_t width = 3 ;
289
+ while (1 ) {
290
+ for (size_t cursor = 0 ; cursor < ARRAY_SIZE (pixels) - width + 1 ; cursor++) {
291
+ memset (&pixels, 0x00 , sizeof (pixels));
292
+ for (size_t i = 0 ; i < width; i++) {
293
+ memcpy (&pixels[cursor + i], &colors[color], sizeof (struct led_rgb ));
294
+ color = (color + 1 ) % ARRAY_SIZE (colors);
295
+ }
296
+
297
+ printf (" Update strip!\n " );
298
+ rc = led_strip_update_rgb (strip, pixels, strip_length);
299
+ if (rc) {
300
+ printf (" couldn't update strip: %d" , rc);
301
+ }
302
+
303
+ k_sleep (K_MSEC (100 ));
304
+ }
305
+ }
306
+ }
307
+
308
+ def_prim (led_fun, NoneToNoneU32) {
309
+ fun ();
310
+ return true ;
311
+ }
312
+
313
+ def_prim (show_pixels, NoneToNoneU32) {
314
+ int rc = led_strip_update_rgb (strip, pixels, strip_length);
315
+ if (rc) {
316
+ printf (" couldn't update strip: %d" , rc);
317
+ }
318
+ return true ;
319
+ }
320
+
321
+ def_prim (set_pixel_color, fourToOneU32) {
322
+ uint8_t blue = arg0.uint32 ;
323
+ uint8_t green = arg1.uint32 ;
324
+ uint8_t red = arg2.uint32 ;
325
+ uint8_t index = arg3.uint32 ;
326
+
327
+ led_rgb color = {.r = red, .g = green, .b = blue};
328
+ memcpy (&pixels[index ], &color, sizeof (struct led_rgb ));
329
+ pop_args (4 );
330
+ return true ;
331
+ }
332
+
333
+ def_prim_serialize (set_pixel_color) {
334
+ for (int i = 0 ; i < strip_length; i++) {
335
+ auto *state = new IOStateElement ();
336
+ state->key = " n" + std::to_string (i);
337
+ state->output = true ;
338
+ state->value = pixels[i].r << 16 | pixels[i].g << 8 | pixels[i].b ;
339
+ external_state.push_back (state);
340
+ }
341
+ }
342
+
343
+ def_prim_reverse (set_pixel_color) {
344
+ for (IOStateElement state : external_state) {
345
+ if (!state.output ) {
346
+ continue ;
347
+ }
348
+
349
+ if (state.key [0 ] == ' n' ) {
350
+ int index = stoi (state.key .substr (1 ));
351
+ pixels[index ].r = ((uint32_t ) state.value >> 16 ) & 0xff ;
352
+ pixels[index ].g = ((uint32_t ) state.value >> 8 ) & 0xff ;
353
+ pixels[index ].b = state.value & 0xff ;
354
+ invoke_primitive (m, " show_pixels" );
355
+ }
356
+ }
357
+ }
358
+
265
359
// ------------------------------------------------------
266
360
// Installing all the primitives
267
361
// ------------------------------------------------------
@@ -272,6 +366,10 @@ void install_primitives() {
272
366
install_primitive (chip_digital_write);
273
367
install_primitive (chip_digital_read);
274
368
install_primitive (print_int);
369
+ install_primitive (led_fun);
370
+ install_primitive (set_pixel_color);
371
+ install_primitive_reverse (set_pixel_color);
372
+ install_primitive (show_pixels);
275
373
}
276
374
277
375
// ------------------------------------------------------
@@ -322,22 +420,23 @@ void restore_external_state(Module *m,
322
420
// instructions such as call_indirect
323
421
// maybe there should just be a function that checks if a certain function
324
422
// is being called that handles all these cases?
325
- if (opcode == 0x10 ) { // call opcode
423
+ /* if (opcode == 0x10) { // call opcode
326
424
uint8_t *pc_copy = m->pc_ptr + 1;
327
425
uint32_t fidx = read_LEB_32(&pc_copy);
328
- if (fidx < m->import_count ) {
329
- for (auto &primitive : primitives) {
330
- if (!strcmp (primitive.name , m->functions [fidx].import_field )) {
426
+ if (fidx < m->import_count) {*/
427
+ for (int i = 0 ; i < ALL_PRIMITIVES; i++) {
428
+ auto primitive = primitives[i];
429
+ printf (" %s\n " , primitive.name );
430
+ // if (!strcmp(primitive.name, m->functions[fidx].import_field)) {
331
431
if (primitive.f_reverse ) {
332
432
debug (" Reversing action for primitive %s\n " ,
333
433
primitive.name );
334
434
primitive.f_reverse (m, external_state);
335
435
}
336
- return ;
337
- }
436
+ // }
338
437
}
339
- }
340
- }
438
+ /* }
439
+ }*/
341
440
}
342
441
343
442
std::vector<IOStateElement *> get_io_state (Module *m) {
0 commit comments