From 148de04e6f77afdcea2b7ed7fe3b00008feeb6c7 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Mon, 12 Jul 2021 22:08:22 +0200 Subject: [PATCH] WASM Interpreter functional --- wled00/fcn_declare.h | 2 + wled00/wasm.cpp | 174 ++++++++++++++++--------------------------- wled00/wasmfx.cpp | 4 + wled00/wasmfx.h | 17 ----- 4 files changed, 71 insertions(+), 126 deletions(-) delete mode 100644 wled00/wasmfx.h diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index bc472b8f..daf13723 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -266,6 +266,8 @@ class WASMFX { uint32_t now(); uint32_t speed(); uint32_t intensity(); + uint32_t len(); + void set(uint32_t i, uint32_t r, uint32_t g, uint32_t b); }; //wled_eeprom.cpp diff --git a/wled00/wasm.cpp b/wled00/wasm.cpp index 4e33f6a2..9c2e07c0 100644 --- a/wled00/wasm.cpp +++ b/wled00/wasm.cpp @@ -9,81 +9,26 @@ #define WASM_MEMORY_LIMIT 4096 unsigned char app_wasm[] = { - 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x03, 0x60, - 0x00, 0x00, 0x60, 0x02, 0x7f, 0x7f, 0x00, 0x60, 0x01, 0x7f, 0x01, 0x7f, - 0x02, 0x11, 0x01, 0x07, 0x61, 0x72, 0x64, 0x75, 0x69, 0x6e, 0x6f, 0x05, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x00, 0x01, 0x03, 0x06, 0x05, 0x02, 0x01, - 0x00, 0x00, 0x00, 0x05, 0x03, 0x01, 0x00, 0x01, 0x06, 0x06, 0x01, 0x7f, - 0x01, 0x41, 0x00, 0x0b, 0x07, 0x0f, 0x02, 0x02, 0x66, 0x78, 0x00, 0x04, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, 0x08, 0x01, 0x05, - 0x0a, 0xaf, 0x05, 0x05, 0xb1, 0x01, 0x01, 0x06, 0x7f, 0x20, 0x00, 0x41, - 0xec, 0xff, 0xff, 0xff, 0x03, 0x4b, 0x04, 0x40, 0x00, 0x0b, 0x20, 0x00, - 0x41, 0x10, 0x6a, 0x22, 0x01, 0x41, 0xfc, 0xff, 0xff, 0xff, 0x03, 0x4b, - 0x04, 0x40, 0x00, 0x0b, 0x23, 0x00, 0x21, 0x05, 0x23, 0x00, 0x41, 0x04, - 0x6a, 0x22, 0x03, 0x20, 0x01, 0x41, 0x13, 0x6a, 0x41, 0x70, 0x71, 0x41, - 0x04, 0x6b, 0x22, 0x06, 0x6a, 0x22, 0x01, 0x3f, 0x00, 0x22, 0x04, 0x41, - 0x10, 0x74, 0x41, 0x0f, 0x6a, 0x41, 0x70, 0x71, 0x22, 0x02, 0x4b, 0x04, - 0x40, 0x20, 0x04, 0x20, 0x01, 0x20, 0x02, 0x6b, 0x41, 0xff, 0xff, 0x03, - 0x6a, 0x41, 0x80, 0x80, 0x7c, 0x71, 0x41, 0x10, 0x76, 0x22, 0x02, 0x20, - 0x02, 0x20, 0x04, 0x48, 0x1b, 0x40, 0x00, 0x41, 0x00, 0x48, 0x04, 0x40, - 0x20, 0x02, 0x40, 0x00, 0x41, 0x00, 0x48, 0x04, 0x40, 0x00, 0x0b, 0x0b, - 0x0b, 0x20, 0x01, 0x24, 0x00, 0x20, 0x05, 0x20, 0x06, 0x36, 0x02, 0x00, - 0x20, 0x03, 0x41, 0x04, 0x6b, 0x22, 0x01, 0x41, 0x00, 0x36, 0x02, 0x04, - 0x20, 0x01, 0x41, 0x00, 0x36, 0x02, 0x08, 0x20, 0x01, 0x41, 0x00, 0x36, - 0x02, 0x0c, 0x20, 0x01, 0x20, 0x00, 0x36, 0x02, 0x10, 0x20, 0x03, 0x41, - 0x10, 0x6a, 0x0b, 0xbc, 0x02, 0x01, 0x03, 0x7f, 0x41, 0xa0, 0x08, 0x21, - 0x02, 0x20, 0x00, 0x41, 0x01, 0x74, 0x41, 0xa0, 0x08, 0x6a, 0x21, 0x03, - 0x20, 0x01, 0x21, 0x00, 0x03, 0x40, 0x20, 0x02, 0x20, 0x03, 0x49, 0x04, - 0x40, 0x20, 0x02, 0x2f, 0x01, 0x00, 0x22, 0x01, 0x41, 0x80, 0x01, 0x49, - 0x04, 0x7f, 0x20, 0x00, 0x20, 0x01, 0x3a, 0x00, 0x00, 0x20, 0x00, 0x41, - 0x01, 0x6a, 0x05, 0x20, 0x01, 0x41, 0x80, 0x10, 0x49, 0x04, 0x7f, 0x20, - 0x00, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0xc0, 0x01, 0x72, 0x20, 0x01, - 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x41, 0x08, 0x74, 0x72, 0x3b, - 0x01, 0x00, 0x20, 0x00, 0x41, 0x02, 0x6a, 0x05, 0x20, 0x01, 0x41, 0x80, - 0xf0, 0x03, 0x71, 0x41, 0x80, 0xb0, 0x03, 0x46, 0x04, 0x40, 0x20, 0x03, - 0x20, 0x02, 0x41, 0x02, 0x6a, 0x4b, 0x41, 0x00, 0x20, 0x01, 0x41, 0x80, - 0xb8, 0x03, 0x49, 0x1b, 0x04, 0x40, 0x20, 0x02, 0x2f, 0x01, 0x02, 0x22, - 0x04, 0x41, 0x80, 0xf8, 0x03, 0x71, 0x41, 0x80, 0xb8, 0x03, 0x46, 0x04, - 0x40, 0x20, 0x00, 0x20, 0x01, 0x41, 0xff, 0x07, 0x71, 0x41, 0x0a, 0x74, - 0x41, 0x80, 0x80, 0x04, 0x6a, 0x20, 0x04, 0x41, 0xff, 0x07, 0x71, 0x72, - 0x22, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x41, 0x18, 0x74, - 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, - 0x41, 0x10, 0x74, 0x72, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, 0x3f, 0x71, - 0x41, 0x80, 0x01, 0x72, 0x41, 0x08, 0x74, 0x72, 0x20, 0x01, 0x41, 0x12, - 0x76, 0x41, 0xf0, 0x01, 0x72, 0x72, 0x36, 0x02, 0x00, 0x20, 0x00, 0x41, - 0x04, 0x6a, 0x21, 0x00, 0x20, 0x02, 0x41, 0x04, 0x6a, 0x21, 0x02, 0x0c, - 0x06, 0x0b, 0x0b, 0x0b, 0x20, 0x00, 0x20, 0x01, 0x41, 0x0c, 0x76, 0x41, - 0xe0, 0x01, 0x72, 0x20, 0x01, 0x41, 0x06, 0x76, 0x41, 0x3f, 0x71, 0x41, - 0x80, 0x01, 0x72, 0x41, 0x08, 0x74, 0x72, 0x3b, 0x01, 0x00, 0x20, 0x00, - 0x20, 0x01, 0x41, 0x3f, 0x71, 0x41, 0x80, 0x01, 0x72, 0x3a, 0x00, 0x02, - 0x20, 0x00, 0x41, 0x03, 0x6a, 0x0b, 0x0b, 0x21, 0x00, 0x20, 0x02, 0x41, - 0x02, 0x6a, 0x21, 0x02, 0x0c, 0x01, 0x0b, 0x0b, 0x0b, 0xae, 0x01, 0x01, - 0x04, 0x7f, 0x41, 0xa0, 0x08, 0x21, 0x01, 0x41, 0x9c, 0x08, 0x28, 0x02, - 0x00, 0x41, 0xa0, 0x08, 0x6a, 0x21, 0x02, 0x03, 0x40, 0x20, 0x01, 0x20, - 0x02, 0x49, 0x04, 0x40, 0x20, 0x01, 0x2f, 0x01, 0x00, 0x22, 0x03, 0x41, - 0x80, 0x01, 0x49, 0x04, 0x7f, 0x20, 0x00, 0x41, 0x01, 0x6a, 0x05, 0x20, - 0x03, 0x41, 0x80, 0x10, 0x49, 0x04, 0x7f, 0x20, 0x00, 0x41, 0x02, 0x6a, - 0x05, 0x20, 0x02, 0x20, 0x01, 0x41, 0x02, 0x6a, 0x4b, 0x41, 0x00, 0x20, - 0x03, 0x41, 0x80, 0xf8, 0x03, 0x71, 0x41, 0x80, 0xb0, 0x03, 0x46, 0x1b, - 0x04, 0x40, 0x20, 0x01, 0x2f, 0x01, 0x02, 0x41, 0x80, 0xf8, 0x03, 0x71, - 0x41, 0x80, 0xb8, 0x03, 0x46, 0x04, 0x40, 0x20, 0x00, 0x41, 0x04, 0x6a, - 0x21, 0x00, 0x20, 0x01, 0x41, 0x04, 0x6a, 0x21, 0x01, 0x0c, 0x05, 0x0b, - 0x0b, 0x20, 0x00, 0x41, 0x03, 0x6a, 0x0b, 0x0b, 0x21, 0x00, 0x20, 0x01, - 0x41, 0x02, 0x6a, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x0b, 0x20, 0x00, 0x10, - 0x01, 0x21, 0x00, 0x41, 0x9c, 0x08, 0x28, 0x02, 0x00, 0x41, 0x01, 0x76, - 0x20, 0x00, 0x10, 0x02, 0x20, 0x00, 0x20, 0x00, 0x41, 0x14, 0x6b, 0x28, - 0x02, 0x10, 0x10, 0x00, 0x0b, 0x04, 0x00, 0x10, 0x03, 0x0b, 0x07, 0x00, - 0x41, 0xcc, 0x08, 0x24, 0x00, 0x0b, 0x0b, 0x3f, 0x02, 0x00, 0x41, 0x8c, - 0x08, 0x0b, 0x01, 0x3c, 0x00, 0x41, 0x98, 0x08, 0x0b, 0x31, 0x01, 0x00, - 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, - 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, 0x4c, 0x00, 0x45, 0x00, - 0x44, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, - 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x53, 0x00, 0x4d, 0x00, 0x21, 0x00, + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x03, 0x60, + 0x00, 0x01, 0x7f, 0x60, 0x04, 0x7f, 0x7f, 0x7f, 0x7f, 0x00, 0x60, 0x00, + 0x00, 0x02, 0x2b, 0x04, 0x03, 0x6c, 0x65, 0x64, 0x03, 0x6e, 0x6f, 0x77, + 0x00, 0x00, 0x03, 0x6c, 0x65, 0x64, 0x03, 0x6c, 0x65, 0x6e, 0x00, 0x00, + 0x03, 0x6c, 0x65, 0x64, 0x03, 0x73, 0x65, 0x74, 0x00, 0x01, 0x03, 0x6c, + 0x65, 0x64, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x00, 0x00, 0x03, 0x02, + 0x01, 0x02, 0x05, 0x03, 0x01, 0x00, 0x00, 0x07, 0x0f, 0x02, 0x02, 0x66, + 0x78, 0x00, 0x04, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x02, 0x00, + 0x0a, 0x45, 0x01, 0x43, 0x01, 0x04, 0x7f, 0x10, 0x00, 0x41, 0x02, 0x76, + 0x21, 0x00, 0x10, 0x01, 0x21, 0x02, 0x03, 0x40, 0x20, 0x01, 0x20, 0x02, + 0x49, 0x04, 0x40, 0x20, 0x01, 0x20, 0x00, 0x41, 0xff, 0x01, 0x71, 0x22, + 0x03, 0x20, 0x03, 0x41, 0x01, 0x76, 0x41, 0x00, 0x10, 0x02, 0x20, 0x00, + 0x10, 0x03, 0x41, 0x04, 0x76, 0x41, 0x01, 0x6a, 0x6a, 0x21, 0x00, 0x20, + 0x01, 0x41, 0x01, 0x6a, 0x21, 0x01, 0x0c, 0x01, 0x0b, 0x0b, 0x0b, 0x00, 0x20, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x55, 0x52, 0x4c, 0x0e, 0x2e, 0x2f, 0x61, 0x70, 0x70, 0x2e, 0x77, 0x61, 0x73, 0x6d, 0x2e, 0x6d, 0x61, 0x70 }; -unsigned int app_wasm_len = 873; +unsigned int app_wasm_len = 201; + /* @@ -107,9 +52,9 @@ m3ApiRawFunction(m3_arduino_delay) m3ApiGetArg (uint32_t, ms) // You can also trace API calls - //Serial.print("api: delay "); Serial.println(ms); + Serial.print("api: delay "); Serial.println(ms); - delay(ms); + //delay(ms); m3ApiSuccess(); } @@ -169,17 +114,17 @@ m3ApiRawFunction(m3_led_now) { m3ApiRawFunction(m3_led_speed) { m3ApiReturnType(uint32_t) - m3ApiReturn(0);//strip._segments[strip._segment_index].speed); + m3ApiReturn(wasmfx.speed());//strip._segments[strip._segment_index].speed); } m3ApiRawFunction(m3_led_intensity) { m3ApiReturnType(uint32_t) - m3ApiReturn(0);//strip._segments[strip._segment_index].intensity); + m3ApiReturn(wasmfx.intensity());//strip._segments[strip._segment_index].intensity); } m3ApiRawFunction(m3_led_len) { m3ApiReturnType(uint32_t) - m3ApiReturn(0);//strip._virtualSegmentLength); + m3ApiReturn(wasmfx.len());//strip._virtualSegmentLength); } m3ApiRawFunction(m3_led_fill) { @@ -192,9 +137,11 @@ m3ApiRawFunction(m3_led_fill) { m3ApiRawFunction(m3_led_set) { m3ApiGetArg (uint32_t, index) - m3ApiGetArg (uint32_t, color) + m3ApiGetArg (uint32_t, r) + m3ApiGetArg (uint32_t, g) + m3ApiGetArg (uint32_t, b) - strip.setPixelColor(index, color); + strip.setPixelColor(index, r,g,b); m3ApiSuccess(); } @@ -230,7 +177,7 @@ M3Result LinkArduino (IM3Runtime runtime) m3_LinkRawFunction (module, led, "intensity", "i()", &m3_led_intensity); m3_LinkRawFunction (module, led, "len", "i()", &m3_led_len); m3_LinkRawFunction (module, led, "fill", "v(i)", &m3_led_fill); - m3_LinkRawFunction (module, led, "set", "v(ii)", &m3_led_set); + m3_LinkRawFunction (module, led, "set", "v(iiii)",&m3_led_set); m3_LinkRawFunction (module, led, "rgb", "i(iii)", &m3_led_rgb); return m3Err_none; @@ -242,62 +189,48 @@ M3Result LinkArduino (IM3Runtime runtime) #define FATAL(func, msg) { Serial.print("Fatal: " func " "); Serial.println(msg); return; } +M3Result result; +IM3Environment env; +IM3Runtime runtime; +IM3Module module; +IM3Function fu; + void wasm_task(void*) { - M3Result result = m3Err_none; + result = m3Err_none; - IM3Environment env = m3_NewEnvironment (); + env = m3_NewEnvironment (); if (!env) FATAL("NewEnv", "failed"); - IM3Runtime runtime = m3_NewRuntime (env, WASM_STACK_SLOTS, NULL); + runtime = m3_NewRuntime (env, WASM_STACK_SLOTS, NULL); if (!runtime) FATAL("NewRt", "failed"); #ifdef WASM_MEMORY_LIMIT runtime->memoryLimit = WASM_MEMORY_LIMIT; #endif - IM3Module module; result = m3_ParseModule (env, &module, app_wasm, app_wasm_len); - if (result) FATAL("ParseModule", result); + if (result) FATAL("Prs", result); result = m3_LoadModule (runtime, module); - if (result) FATAL("LoadModule", result); + if (result) FATAL("Load", result); result = LinkArduino (runtime); - if (result) FATAL("LinkArd", result); + if (result) FATAL("Lnk", result); - IM3Function f; - result = m3_FindFunction (&f, runtime, "fx"); - if (result) FATAL("FindFunc", result); + result = m3_FindFunction (&fu, runtime, "fx"); + if (result) FATAL("Func", result); - Serial.println("Run WASM..."); - - result = m3_CallV (f); + Serial.println(F("WASM init success!")); // Should not arrive here - if (result) { - M3ErrorInfo info; - m3_GetErrorInfo (runtime, &info); - Serial.print("Err: "); - Serial.print(result); - Serial.print(" ("); - Serial.print(info.message); - Serial.println(")"); - if (info.file && strlen(info.file) && info.line) { - Serial.print("At "); - Serial.print(info.file); - Serial.print(":"); - Serial.println(info.line); - } - } - //while (true) {} } void wasmInit() { - Serial.println("\nWasm3 v" M3_VERSION " (" M3_ARCH "), build " __DATE__ " " __TIME__); + //Serial.println("\nWasm3 v" M3_VERSION " (" M3_ARCH "), build " __DATE__ " " __TIME__); /* #ifdef ESP32 // On ESP32, we can launch in a separate thread @@ -310,5 +243,28 @@ void wasmInit() } void wasmRun() { + if (result) { + //Serial.println(F("You fucked up... Majorly...")); + Serial.println("If only..."); + //Serial.println("That could save us🥺"); + return; + } + result = m3_CallV (fu); + + if (result) { + M3ErrorInfo info; + m3_GetErrorInfo (runtime, &info); + Serial.print("Err: "); + Serial.print(result); + Serial.print(" ("); + Serial.print(info.message); + Serial.println(")"); + if (info.file && strlen(info.file) && info.line) { + Serial.print("At "); + Serial.print(info.file); + Serial.print(":"); + Serial.println(info.line); + } +} } \ No newline at end of file diff --git a/wled00/wasmfx.cpp b/wled00/wasmfx.cpp index b3fbe5de..c3484d75 100644 --- a/wled00/wasmfx.cpp +++ b/wled00/wasmfx.cpp @@ -10,4 +10,8 @@ uint32_t WASMFX::speed() { uint32_t WASMFX::intensity() { return strip._segments[strip._segment_index].intensity; +} + +uint32_t WASMFX::len() { + return strip._virtualSegmentLength; } \ No newline at end of file diff --git a/wled00/wasmfx.h b/wled00/wasmfx.h deleted file mode 100644 index c08199b6..00000000 --- a/wled00/wasmfx.h +++ /dev/null @@ -1,17 +0,0 @@ -/*#pragma once -#include "wled.h" - -class WASMFX { - public: - void init() { - wasmInit(); - } - - void run() { - wasmRun(); - } - - uint32_t now(); - uint32_t speed(); - uint32_t intensity(); -};*/ \ No newline at end of file