TinyJS on mbed. TinyJS is very simple JavaScript engine.

Dependencies:   mbed

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

Files at this revision

API Documentation at this revision

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

Mbed_Functions.cpp Show annotated file Show diff for this revision Revisions of this file
Mbed_Functions.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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);