TinyJS on mbed. TinyJS is very simple JavaScript engine.
TinyJS on mbed
what's this ?
TinyJS is an extremely simple (under than 2000 lines) JavaScript interpreter engine.
I ported on mbed. but it restrict any features.
TinyJS project is https://github.com/gfwilliams/tiny-js
TinyJSは2000行以下で書かれた非常に小さいJavaScriptインタプリタエンジンです。
これをmbedに移植してみました。(ただし、いろいろ制限があります)
本家はこちら。 https://github.com/gfwilliams/tiny-js
how to use
You must use on serial terminal application by mbed serial USB.
baud is 57600bps
USBシリアルとして、ターミナルソフトを接続するとコンソールが表示されます。
ボーレートは57600bpsになってます。
functions
functions for mbed.
mbed用関数
- mbed.DigitalIn(pinName, mode)
- mbed.DigitalOut(pinName, val)
- mbed.AnalogIn(pinName)
- mbed.AnalogOut(pinName, val)
- mbed.InterruptIn(pinName, edge, mode, callback)
- mbed.TimerStart()
- mbed.TimerStop()
- mbed.TimerReset()
- mbed.TimerRead()
- mbed.Timeout(callback, t)
- mbed.wait(s)
- mbed.memfree()
sample JavaScript codes
DigitalOut
mbed.DigitalOut('LED1', 1); mbed.DigitalOut('LED2', 0); mbed.DigitalOut('LED3', 1); mbed.DigitalOut('LED4', 0);
LED1 = On, LED2=Off, LED3=On, ED4=Off
LED1 = 点灯、LED2=消灯、LED3=点灯、LED4=消灯
DigitalIn
print(mbed.DigitalIn('p5', 'PullUp'));
p5 is pull up, read, and print on console.
p5をPullUpして読みプリントする。
AnalogOut
mbed.AnalogOut('p18', 0.8);
p18 is analog output, value is 0.8.
p18を 値0.8でアナログ出力する。
AnalogIn
print(mbed.AnalogIn('p20'));
p20 is read analog voltage, and print on console.
p20をアナログ入力しプリントする。
InterruptIn
var led1 = 0; mbed.InterruptIn('p5', 'fall', 'PullUp', function() {led1 = !led1; mbed.DigitalOut('LED1', led1);});
Interrupt on p5, and ON/OFF does LED1.
p5で割り込んでLED1をON/OFFする。
Timeout and wait sample code
mbed.Timeout(function() {mbed.DigitalOut('LED1', 1);mbed.wait(3);mbed.DigitalOut('LED1', 0);}, 4);
LED1=on when wait for 4 seconds. and LED1=off for 3 seconds later.
LED1を4秒待って点灯して3秒後に消灯する。
memfree
print(mbed.memfree());
This prints the number of bytes of the remainder memory on mbed where TinyJS is usable.
これはTinyJSが使えるmbed上での残りメモリのバイト数をプリントアウトする。
LED Blinker by Timeout
blinker = function() {var led = 0; mbed.Timeout(function() {led = !led; mbed.DigitalOut('LED1', led);blinker();}, 0.5);}; blinker();
LED Blinker by Timeout.
Timeoutを使ったLチカ。
restrictions
- There is very little available memory. (Less than 9kbytes on LPC1768)
- Registration of InterruptIn is 4 limit.
- The loop to 8,192 times.
- The built-in functions (general JavaScript functions) that TinyJS prepares for for securing of memory is not included.
more, more, more ....
制限事項
- 利用できるメモリは非常に少ない。(LPC1768で9kbytes以下)
- InterruptInで登録できる割り込みは4つまで。4つを超えると1つめから順番に削除される。
- ループは8192回まで。
- メモリ確保のためTinyJSが用意している組み込み関数(一般的なJavaScript関数)は含まれない。
他、多数....
sample movies
http://www.youtube.com/watch?v=ARp0DK70JGM
http://www.youtube.com/watch?v=UOZQ4eEC4xA
Revision 6:30b4122b0ee2, committed 2014-01-19
- Comitter:
- ohneta
- Date:
- Sun Jan 19 17:57:05 2014 +0000
- Parent:
- 5:b5e4fbe59746
- Child:
- 7:40010b4dc51d
- Commit message:
- add wait function; add timer functions; add timeout function
Changed in this revision
--- a/Mbed_Functions.cpp Sun Jan 19 16:30:15 2014 +0000 +++ b/Mbed_Functions.cpp Sun Jan 19 17:57:05 2014 +0000 @@ -69,22 +69,22 @@ //--------------------------------------------- #define INTERRUPT_NUM 4 -CTinyJS *interrupt_tinyJS; -int interruptCount = 0; -string callbackStrings[INTERRUPT_NUM]; -InterruptIn* intrInArray[INTERRUPT_NUM] = {NULL, NULL, NULL, NULL}; +CTinyJS *_mbed_interruptIn_tinyJS; +int _mbed_interruptIn_Count = 0; +string _mbed_interruptIn_callbackStrings[INTERRUPT_NUM]; +InterruptIn* _mbed_interrupt_array[INTERRUPT_NUM] = {NULL, NULL, NULL, NULL}; -void _interruptVector_0(){ - interrupt_tinyJS->execute(callbackStrings[0]); +void _interruptVector0(){ + _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[0]); } -void _interruptVector_1(){ - interrupt_tinyJS->execute(callbackStrings[1]); +void _interruptVector1(){ + _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[1]); } -void _interruptVector_2(){ - interrupt_tinyJS->execute(callbackStrings[2]); +void _interruptVector2(){ + _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[2]); } -void _interruptVector_3(){ - interrupt_tinyJS->execute(callbackStrings[3]); +void _interruptVector3(){ + _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[3]); } void mbedSetInterrupt(CScriptVar *c, void *data) @@ -103,37 +103,51 @@ mode = PullDown; } - interrupt_tinyJS = (CTinyJS *)data; - callbackStrings[interruptCount] = c->getParameter("callback")->getString(); + _mbed_interruptIn_tinyJS = (CTinyJS *)data; + _mbed_interruptIn_callbackStrings[_mbed_interruptIn_Count] = c->getParameter("callback")->getString(); - - if (intrInArray[interruptCount] != NULL) { - delete intrInArray[interruptCount]; + if (_mbed_interrupt_array[_mbed_interruptIn_Count] != NULL) { + delete _mbed_interrupt_array[_mbed_interruptIn_Count]; } - intrInArray[interruptCount] = new InterruptIn(pinName); - intrInArray[interruptCount]->mode(mode); + _mbed_interrupt_array[_mbed_interruptIn_Count] = new InterruptIn(pinName); + _mbed_interrupt_array[_mbed_interruptIn_Count]->mode(mode); - if (interruptCount == 0) { - if (edgeString == "fall") intrInArray[interruptCount]->fall(_interruptVector_0); else if (edgeString == "rise") intrInArray[interruptCount]->rise(_interruptVector_0); - } else if (interruptCount == 1) { - if (edgeString == "fall") intrInArray[interruptCount]->fall(_interruptVector_1); else if (edgeString == "rise") intrInArray[interruptCount]->rise(_interruptVector_1); - } else if (interruptCount == 2) { - if (edgeString == "fall") intrInArray[interruptCount]->fall(_interruptVector_2); else if (edgeString == "rise") intrInArray[interruptCount]->rise(_interruptVector_2); - } else if (interruptCount == 3) { - if (edgeString == "fall") intrInArray[interruptCount]->fall(_interruptVector_3); else if (edgeString == "rise") intrInArray[interruptCount]->rise(_interruptVector_3); + if (_mbed_interruptIn_Count == 0) { + if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector0); + else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector0); + } else if (_mbed_interruptIn_Count == 1) { + if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector1); + else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector1); + } else if (_mbed_interruptIn_Count == 2) { + if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector2); + else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector2); + } else if (_mbed_interruptIn_Count == 3) { + if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector3); + else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector3); } + c->getReturnVar()->setInt(_mbed_interruptIn_Count); - interruptCount++; - if (interruptCount >= INTERRUPT_NUM) { - interruptCount = 0; + _mbed_interruptIn_Count++; + if (_mbed_interruptIn_Count >= INTERRUPT_NUM) { + _mbed_interruptIn_Count = 0; } } - +/* void mbedRemoveInterrupt(CScriptVar *c, void *) { + int intrno = c->getParameter("interrupt_no")->getInt(); +} +*/ + +//--------------------------------------------- + +void mbedWait(CScriptVar *c, void *) +{ + float val = c->getParameter("s")->getDouble(); + wait(val); } //--------------------------------------------- @@ -152,7 +166,6 @@ c->getReturnVar()->setInt(i); } - //--------------------------------------------- PinName _mbedPinNameExchange(string pinNameString) { @@ -196,49 +209,43 @@ return NC; } -/** - * - */ -void mbedPinNames(CScriptVar *c, void *) -{ - printf("mbed DIP Pin Names\n"); - printf("p5 : %d\n", p5); - printf("p6 : %d\n", p6); - printf("p7 : %d\n", p7); - printf("p8 : %d\n", p8); - printf("p9 : %d\n", p9); - printf("p10 : %d\n", p10); - printf("p11 : %d\n", p11); - printf("p12 : %d\n", p12); - printf("p13 : %d\n", p13); - printf("p14 : %d\n", p14); - printf("p15 : %d\n", p15); - printf("p16 : %d\n", p16); - printf("p17 : %d\n", p17); - printf("p18 : %d\n", p18); - printf("p19 : %d\n", p19); - printf("p20 : %d\n", p20); - printf("p21 : %d\n", p21); - printf("p22 : %d\n", p22); - printf("p23 : %d\n", p23); - printf("p24 : %d\n", p24); - printf("p25 : %d\n", p25); - printf("p26 : %d\n", p26); - printf("p27 : %d\n", p27); - printf("p28 : %d\n", p28); - printf("p29 : %d\n", p29); - printf("p30 : %d\n", p30); +//--------------------------------------------- +Timer _mbedTimer; + +void mbedTimerStart(CScriptVar *c, void *) { + _mbedTimer.start(); +} + +void mbedTimerStop(CScriptVar *c, void *) { + _mbedTimer.stop(); +} + +void mbedTimerReset(CScriptVar *c, void *) { + _mbedTimer.reset(); +} - printf("\n"); - printf("LED mbed Pin Names\n"); - printf("LED1 : %d\n", LED1); - printf("LED2 : %d\n", LED2); - printf("LED3 : %d\n", LED3); - printf("LED4 : %d\n", LED4); +void mbedTimerRead(CScriptVar *c, void *) { + float tm = _mbedTimer.read(); + c->getReturnVar()->setDouble(tm); +} + + +//--------------------------------------------- +Timeout _mbedTimeout; +CTinyJS *_mbedTimeout_tinyJS; +string _mbedTimeout_callbackStrings; - printf("Other mbed Pin Names\n"); - printf("USBTX : %d\n", USBTX); - printf("USBRX : %d\n", USBRX); +void _mbedTimeoutVector() { + _mbedTimeout_tinyJS->execute(_mbedTimeout_callbackStrings); +} + +void mbedTimeout(CScriptVar *c, void *data) { + + _mbedTimeout_tinyJS = (CTinyJS *)data; + _mbedTimeout_callbackStrings = c->getParameter("callback")->getString(); + float t = c->getParameter("t")->getDouble(); + + _mbedTimeout.attach(&_mbedTimeoutVector, t); } @@ -252,9 +259,17 @@ tinyJS->addNative("function mbed.AnalogOut(pinName, val)", mbedAnalogOut, 0); tinyJS->addNative("function mbed.SetInterrupt(pinName, edge, mode, callback)", mbedSetInterrupt, tinyJS); - tinyJS->addNative("function mbed.RemoveInterrupt(pinName)", mbedRemoveInterrupt, tinyJS); + //tinyJS->addNative("function mbed.RemoveInterrupt(pinName)", mbedRemoveInterrupt, tinyJS); + + tinyJS->addNative("function mbed.wait(s)", mbedWait, 0); - tinyJS->addNative("function mbed.PinNames()", mbedPinNames, 0); + tinyJS->addNative("function mbed.timerStart", mbedTimerStart, 0); + tinyJS->addNative("function mbed.timerStop", mbedTimerStop, 0); + tinyJS->addNative("function mbed.timerReset", mbedTimerReset, 0); + tinyJS->addNative("function mbed.timerRead", mbedTimerRead, 0); + + tinyJS->addNative("function mbed.Timeout(callback, t)", mbedTimeout, tinyJS); + tinyJS->addNative("function mbed.memfree()", mbedMemfree, 0); }
--- a/Mbed_Functions.h Sun Jan 19 16:30:15 2014 +0000 +++ b/Mbed_Functions.h Sun Jan 19 17:57:05 2014 +0000 @@ -18,6 +18,12 @@ void mbedSetInterrupt(CScriptVar *c, void *data); void mbedRemoveInterrupt(CScriptVar *c, void *); +void mbedWait(CScriptVar *c, void *); +void mbedTimerStart(CScriptVar *c, void *); +void mbedTimerStop(CScriptVar *c, void *); +void mbedTimerReset(CScriptVar *c, void *); +void mbedTimerRead(CScriptVar *c, void *); + //--------------------------------------------- void mbedMemfree(CScriptVar *c, void *); void mbedPinNames(CScriptVar *c, void *);
--- a/main.cpp Sun Jan 19 16:30:15 2014 +0000 +++ b/main.cpp Sun Jan 19 17:57:05 2014 +0000 @@ -58,7 +58,7 @@ while(1) { printf("\n"); printf("--------------------------\n"); - printf("TinyJS on mbed LPC1768 ported by ohneta.\n"); + printf("TinyJS on mbed\n"); tinyjs_main(NULL, NULL);