概要
duktape( http://duktape.org/ ) というのをつかうとJavaScriptが解釈できるということで、esp32-arduino環境で動作する方法を調べてみました。
ArduinoIDEではなく、platformioを使います。
duktapeの設定
いろいろ設定ができるようだが、とりあえず無指定でいく
$ git clone -b v2.2.1 https://github.com/svaarala/duktape.git
$ cd duktape
$ python tools/configure.py \
--source-directory src-input \
--output-directory src-custom \
--config-metadata config
src-custom/に
- duk_config.h
- duk_source_meta.json
- duktape.c
- duktape.h
が出力されています
これらをincludeするだけでduktapeを使うことができます。
platformio環境の設定
ディレクトリ構成
- lib/
- duktape/
- duk_config.h
- duktape.c
- duktape.h
- duk_source_meta.json (別にいらなそうだけど置いておく)
- duktape/
- src/
- main.ino
- platformio.ini
platformio.ini
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 921600
lib_deps =
board_f_cpu = 240000000L
board_f_flash = 80000000L
main.ino
#include "duk_config.h"
#include "duktape.h"
duk_context *ctx;
static duk_ret_t native_print(duk_context *ctx) {
duk_push_string(ctx, " "); //joinに使う区切り文字
duk_insert(ctx, 0); //スタックの先頭に移動
duk_join(ctx, duk_get_top(ctx) - 1); // スタックにある個数を数えて結合
printf("%s\n", duk_to_string(ctx, -1)); //printfでシリアル出力
return 0; // 戻り値なし
}
void setup(){
// コンテキストの作成
ctx = duk_create_heap_default();
if (!ctx) { exit(1); }
// グローバルオブジェクトの登録
duk_push_global_object(ctx);
// C言語の関数を登録
duk_push_c_function(ctx, native_print, DUK_VARARGS); // 可変引数関数native_print
duk_put_prop_string(ctx, -2, "print"); // -2(global)に global["print"] = native_printみたいなことをする
// JavaScript文字列を評価する
duk_push_string(ctx, "function test(){for(var i = 0; i < 10; i ++){print(i,\"hoge\")}}");
if(duk_peval(ctx)!=0){
Serial.println("Error");
Serial.println(duk_safe_to_string(ctx, -1));
}
duk_pop(ctx); // 結果を捨てる
// JavaScript関数を呼ぶ
duk_get_prop_string(ctx, -1, "test");
if (duk_pcall(ctx, 0) != 0) {
printf("Error: %s\n", duk_safe_to_string(ctx, -1));
}
duk_pop(ctx); // 戻り値を捨てる
// コンテキストを破棄する
duk_destroy_heap(ctx);
}
void loop(){
}
これで
$ platformio run --target upload
などするとesp32に書き込みできます
実行ログは下記のようにしてみることができます
$ platformio.exe device monitor -b115200
--- Miniterm on COM10 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun 8 2016 00:22:57
(略)
0 hoge
1 hoge
2 hoge
3 hoge
4 hoge
5 hoge
6 hoge
7 hoge
8 hoge
9 hoge
まとめ
ESP32でJavaScriptを動かすことができました。
これを使うとWeb経由でJavaScriptを受け取って、動作を変えるなど面白いことができそうです。
duktapeはドキュメントも読みやすく使いやすいと思いました。