Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat WiFiとディスプレイAPI,ESP32 randomのサポート #106

Merged
merged 20 commits into from
Dec 31, 2023
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
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"cppcheck",
"mahiwa",
"pico",
"PICOW",
"platformio",
"tinygo",
"wasi"
Expand Down
90 changes: 48 additions & 42 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -8,80 +8,86 @@
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

; coremark測定時に宣言するやつ
; USE_COREMARK

[env]
framework = arduino
monitor_speed = 115200
debug_speed = 115200
build_flags =
-Wno-unused-function -Wno-unused-variable -Wno-unused-parameter
-Wno-missing-field-initializers
build_flags =
-Wno-unused-function -Wno-unused-variable -Wno-unused-parameter
-Wno-missing-field-initializers
; デフォがOsなので最適化オプション不要

[env:m5stack-atom]
platform = espressif32
board = m5stack-atom
framework = arduino
lib_deps = wasm3/Wasm3@^0.5.0
lib_deps =
wasm3/Wasm3@^0.5.0
lovyan03/LovyanGFX@^1.1.9
build_flags =
${env.build_flags}
-DESP32
-DCORE_DEBUG_LEVEL=5

${env.build_flags}
-DESP32
-DM5STACKATOM

[env:pico]
platform = raspberrypi
board = pico
framework = arduino
lib_deps = wasm3/Wasm3@^0.5.0
# arch linux
; upload_port = /run/media/usuyuki/RPI-RP2/
# ubuntu
lib_deps =
wasm3/Wasm3@^0.5.0
lovyan03/LovyanGFX@^1.1.9
upload_port = /media/usuyuki/RPI-RP2
build_flags =
${env.build_flags}
; picoのデフォルトのヒープは2048byteだが,wasmは1pで64kbの線形メモリなので足りない
; 基本的に2ページで収まるが3ページ分用意しておく
; ↓これ効かない
; -DPICO_HEAP_SIZE=0x2ee00
${env.build_flags}
-DPICOW
-DRP2040

# M5 ATOM Matrixはwasm3が動かない(PSRAMが無い)が,壊れの検証用にあえて残しておく
[env:m5stack-atoms3]
platform = espressif32
board = m5stack-atoms3
framework = arduino
lib_deps = wasm3/Wasm3@^0.5.0
build_flags =
${env.build_flags}
-DESP32
; 最近のESPだとSerialの先がUSBにならないのでオプションで調整
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
-DCORE_DEBUG_LEVEL=5
lib_deps =
; m5stack/M5AtomS3の依存でFastLEDが必要(内部で自動解決してくれないので明示的に依存に追加,インクルードすら不要)
fastled/FastLED@^3.6.0
; m5stack/M5AtomS3の依存でM5Unifiedが必要(内部で自動解決してくれないので明示的に依存に追加,インクルードすら不要)
m5stack/M5Unified@^0.1.12
; ↓意味がない
; m5stack/M5AtomS3@^1.0.0
wasm3/Wasm3@^0.5.0
lovyan03/LovyanGFX@^1.1.9
build_flags =
${env.build_flags}
-DESP32
-DM5ATOMS3
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1

[env:seeed_xiao_esp32c3]
platform = espressif32
board = seeed_xiao_esp32c3
framework = arduino
lib_deps = wasm3/Wasm3@^0.5.0
; pio checkがコケるので一部除外する(https://github.com/project-mahiwa/mahiwa-backend/issues/17)
lib_deps =
wasm3/Wasm3@^0.5.0
lovyan03/LovyanGFX@^1.1.9
check_skip_packages = yes
build_flags =
${env.build_flags}
-D ESP32
; 最近のESPだとSerialの先がUSBにならないのでオプションで調整
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
-DCORE_DEBUG_LEVEL=5
build_flags =
${env.build_flags}
-DESP32
-DESP32C3
-DSEEED_STUDIO_ESP32C3
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1

[env:m5stack-core2]
platform = espressif32
board = m5stack-core2
framework = arduino
lib_deps = wasm3/Wasm3@^0.5.0
lib_deps =
m5stack/M5Core2@^0.1.8
wasm3/Wasm3@^0.5.0
lovyan03/LovyanGFX@^1.1.9
build_flags =
${env.build_flags}
-DESP32
-DCORE_DEBUG_LEVEL=5
${env.build_flags}
-DESP32
-DMAHIWA_WIFI
-DM5CORE2
10 changes: 10 additions & 0 deletions src/config/mcu-function-mapper.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// マイコンの使える機能マッピング
#ifdef ESP32
#define MAHIWA_WIFI
#define MAHIWA_BlUETOOTH
#define MAHIWA_FREERTOS
#endif

#ifdef RP2040
#define MAHIWA_WIFI
#endif
29 changes: 29 additions & 0 deletions src/lib/roader/wasm-roader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,35 @@ void wasm_task(void *)
{
wasm3_error_printer("mahiwa_LinkSerial", result);
}

#if defined(M5CORE2) || defined(M5ATOMS3)
Serial.println("Display function is enabled");
result = mahiwa_LinkDisplay(runtime);
if (result)
{
wasm3_error_printer("mahiwa_LinkDisplay", result);
}
#endif

// @todo もっと抽象化したdefinedにしたい
#if defined(ESP32) || defined(PICOW)
Serial.println("Network function is enabled");
result = mahiwa_LinkNetwork(runtime);
if (result)
{
wasm3_error_printer("mahiwa_LinkNetwork", result);
}
#endif

#ifdef ESP32
Serial.println("ESP32 function is enabled");
result = mahiwa_LinkESP32(runtime);
if (result)
{
wasm3_error_printer("mahiwa_LinkESP32", result);
}
#endif

#ifdef USE_COREMARK
Serial.println("call coremark function link");
result = mahiwa_LinkCoremark(runtime);
Expand Down
15 changes: 14 additions & 1 deletion src/lib/roader/wasm-roader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,21 @@
// 定義読み込み
#include <lib/wasm-functions/arduino/arduino.hpp>
#include <lib/wasm-functions/arduino/serial.hpp>

#if defined(ESP32) || defined(PICOW)
#include <lib/wasm-functions/network/network.hpp>
#endif

#if defined(M5CORE2) || defined(M5ATOMS3)
#include <lib/wasm-functions/display/display.hpp>
#endif

#ifdef ESP32
#include <lib/wasm-functions/esp32/esp32.hpp>
#endif

#ifdef USE_COREMARK
#include <lib/wasm-functions/mahiwa/coremark/coremark.hpp>
#include <lib/wasm-functions/coremark/coremark.hpp>
#endif

// wasm3のexampleの値に従う
Expand Down
50 changes: 25 additions & 25 deletions src/lib/wasm-functions/arduino/arduino.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,8 @@ m3ApiRawFunction(m3_millis)

M3Result mahiwa_LinkArduino(IM3Runtime runtime)
{
IM3Module module = runtime->modules;
const char *arduino = "arduino";
IM3Module modules = runtime->modules;
const char *module = "arduino";
// m3_LinkRawFunctionのi_signatureの書き方→https://github.com/wasm3/wasm3/issues/109
// 厳密には正しくないが,WebAssemblyの型の制限もあるので,下記のように変換する
// int,uint_8,uint_16,uint_32→i(i32)
Expand All @@ -320,47 +320,47 @@ M3Result mahiwa_LinkArduino(IM3Runtime runtime)
* Random Numbers
*/
// randomがWASIと競合するらしく,TinyGoではオーバーライドされて壊れるので,名前を変える
m3_LinkRawFunction(module, arduino, "randomArduino", "i()", &m3_random);
m3_LinkRawFunction(module, arduino, "randomSeed", "v(i)", &m3_randomSeed);
m3_LinkRawFunction(modules, module, "randomArduino", "i()", &m3_random);
m3_LinkRawFunction(modules, module, "randomSeed", "v(i)", &m3_randomSeed);
/**
* Trigonometry
*/
m3_LinkRawFunction(module, arduino, "cos", "F(F)", &m3_cos);
m3_LinkRawFunction(module, arduino, "sin", "F(F)", &m3_sin);
m3_LinkRawFunction(module, arduino, "tan", "F(F)", &m3_tan);
m3_LinkRawFunction(modules, module, "cos", "F(F)", &m3_cos);
m3_LinkRawFunction(modules, module, "sin", "F(F)", &m3_sin);
m3_LinkRawFunction(modules, module, "tan", "F(F)", &m3_tan);
/**
* Math
*/
m3_LinkRawFunction(module, arduino, "abs", "i(i)", &m3_abs);
m3_LinkRawFunction(module, arduino, "constrain", "i(iii)", &m3_constrain);
m3_LinkRawFunction(module, arduino, "map", "i(iiiii)", &m3_map);
m3_LinkRawFunction(module, arduino, "max", "i(ii)", &m3_max);
m3_LinkRawFunction(module, arduino, "min", "i(ii)", &m3_min);
m3_LinkRawFunction(modules, module, "abs", "i(i)", &m3_abs);
m3_LinkRawFunction(modules, module, "constrain", "i(iii)", &m3_constrain);
m3_LinkRawFunction(modules, module, "map", "i(iiiii)", &m3_map);
m3_LinkRawFunction(modules, module, "max", "i(ii)", &m3_max);
m3_LinkRawFunction(modules, module, "min", "i(ii)", &m3_min);
// powがWASIと競合するらしく,TinyGoではオーバーライドされて壊れるので,名前を変える
m3_LinkRawFunction(module, arduino, "powArduino", "F(ii)", &m3_pow);
m3_LinkRawFunction(module, arduino, "sq", "i(i)", &m3_sq);
m3_LinkRawFunction(modules, module, "powArduino", "F(ii)", &m3_pow);
m3_LinkRawFunction(modules, module, "sq", "i(i)", &m3_sq);
// sqrtがWASIと競合するらしく,TinyGoではオーバーライドされて壊れるので,名前を変える
m3_LinkRawFunction(module, arduino, "sqrtArduino", "F(i)", &m3_sqrt);
m3_LinkRawFunction(modules, module, "sqrtArduino", "F(i)", &m3_sqrt);
/**
* analog I/O
*/
m3_LinkRawFunction(module, arduino, "analogRead", "i(i)", &m3_analogRead);
// m3_LinkRawFunction(module, arduino, "analogReference", "v(ii)", &m3_analogReference);
m3_LinkRawFunction(module, arduino, "analogWrite", "v(ii)", &m3_analogWrite);
m3_LinkRawFunction(modules, module, "analogRead", "i(i)", &m3_analogRead);
// m3_LinkRawFunction(modules, module, "analogReference", "v(ii)", &m3_analogReference);
m3_LinkRawFunction(modules, module, "analogWrite", "v(ii)", &m3_analogWrite);
/**
* Digital I/O
*/
m3_LinkRawFunction(module, arduino, "digitalRead", "i(i)", &m3_digitalRead);
m3_LinkRawFunction(module, arduino, "digitalWrite", "v(ii)", &m3_digitalWrite);
m3_LinkRawFunction(module, arduino, "pinMode", "v(ii)", &m3_pinMode);
m3_LinkRawFunction(modules, module, "digitalRead", "i(i)", &m3_digitalRead);
m3_LinkRawFunction(modules, module, "digitalWrite", "v(ii)", &m3_digitalWrite);
m3_LinkRawFunction(modules, module, "pinMode", "v(ii)", &m3_pinMode);

/**
* Time
*/
m3_LinkRawFunction(module, arduino, "delay", "v(I)", &m3_delay);
m3_LinkRawFunction(module, arduino, "delayMicroseconds", "v(I)", &m3_delayMicroseconds);
m3_LinkRawFunction(module, arduino, "millis", "I()", &m3_millis);
m3_LinkRawFunction(module, arduino, "micros", "I()", &m3_micros);
m3_LinkRawFunction(modules, module, "delay", "v(I)", &m3_delay);
m3_LinkRawFunction(modules, module, "delayMicroseconds", "v(I)", &m3_delayMicroseconds);
m3_LinkRawFunction(modules, module, "millis", "I()", &m3_millis);
m3_LinkRawFunction(modules, module, "micros", "I()", &m3_micros);

return m3Err_none;
}
14 changes: 7 additions & 7 deletions src/lib/wasm-functions/arduino/serial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,14 @@ m3ApiRawFunction(m3_printF64)
}
M3Result mahiwa_LinkSerial(IM3Runtime runtime)
{
IM3Module module = runtime->modules;
const char *serial = "serial";
IM3Module modules = runtime->modules;
const char *module = "serial";

m3_LinkRawFunction(module, serial, "print", "v(*i)", &m3_print);
m3_LinkRawFunction(module, serial, "printI32", "v(i)", &m3_printI32);
m3_LinkRawFunction(module, serial, "printI64", "v(I)", &m3_printI64);
m3_LinkRawFunction(module, serial, "printF32", "v(fi)", &m3_printF32);
m3_LinkRawFunction(module, serial, "printF64", "v(Fi)", &m3_printF64);
m3_LinkRawFunction(modules, module, "print", "v(*i)", &m3_print);
m3_LinkRawFunction(modules, module, "printI32", "v(i)", &m3_printI32);
m3_LinkRawFunction(modules, module, "printI64", "v(I)", &m3_printI64);
m3_LinkRawFunction(modules, module, "printF32", "v(fi)", &m3_printF32);
m3_LinkRawFunction(modules, module, "printF64", "v(Fi)", &m3_printF64);

return m3Err_none;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <lib/wasm-functions/mahiwa/coremark/coremark.hpp>
#include <lib/wasm-functions/coremark/coremark.hpp>

// coremark-minimalに必要な関数を用意する
// (import "env" "clock_ms" (func (;0;) (type 8)))
Expand All @@ -14,9 +14,9 @@ m3ApiRawFunction(m3_clock_ms)
M3Result mahiwa_LinkCoremark(IM3Runtime runtime)
{
Serial.println("link coremark function");
IM3Module module = runtime->modules;
IM3Module modules = runtime->modules;

m3_LinkRawFunction(module, "env", "clock_ms", "I()", &m3_clock_ms);
m3_LinkRawFunction(modules, "env", "clock_ms", "I()", &m3_clock_ms);

return m3Err_none;
}
53 changes: 53 additions & 0 deletions src/lib/wasm-functions/display/display.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#include <lib/wasm-functions/display/display.hpp>

// coremark-minimalに必要な関数を用意する
// (import "env" "clock_ms" (func (;0;) (type 8)))
// (type (;8;) (func (result i64)))
m3ApiRawFunction(m3_display_init)
{
lcd.init();
// // 初期実装は回転固定
// lcd.setRotation(1);
// // 初期実装は輝度固定
// lcd.setBrightness(128);
// // 初期実装はカラーモード固定
// lcd.setColorDepth(24);
// // 初期実装はフォント固定
// lcd.setFont(&fonts::Font0);
// // 初期実装は色固定
// lcd.setTextColor(TFT_WHITE, TFT_BLACK);
// // 初期実装はサイズ固定
lcd.setTextSize(2);

m3ApiSuccess();
}
m3ApiRawFunction(m3_display_print)
{
// cppcheck-suppress cstyleCast
m3ApiGetArgMem(const uint8_t *, out);
// cppcheck-suppress cstyleCast
m3ApiGetArg(uint32_t, out_len);
// m3ApiGetArg(int32_t, x);
// m3ApiGetArg(int32_t, y);

byte buff[out_len + 1];
memcpy(buff, out, out_len);
buff[out_len] = '\0';

lcd.println((char *)buff);

m3ApiSuccess();

m3ApiSuccess();
}

M3Result mahiwa_LinkDisplay(IM3Runtime runtime)
{
IM3Module modules = runtime->modules;
const char *module = "display";

m3_LinkRawFunction(modules, module, "init", "v()", &m3_display_init);
m3_LinkRawFunction(modules, module, "printD", "v(*i)", &m3_display_print);

return m3Err_none;
}
Loading
Loading