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

Mbed_Functions.cpp

Committer:
ohneta
Date:
2014-01-19
Revision:
5:b5e4fbe59746
Parent:
4:729cab0e95c6
Child:
6:30b4122b0ee2

File content as of revision 5:b5e4fbe59746:

/*
 * TinyJS for mbed.
 * Mbed_Functions.cpp
 *
 * Authored by Takehisa Oneta (ohneta@gmail.com)
 * 17th Jan. 2014
 */

#include "mbed.h"
#include "TinyJS.h"
#include "Mbed_Functions.h"

//---------------------------------------------

void mbedDigitalIn(CScriptVar *c, void *)
{
    string pinNameString = c->getParameter("pinName")->getString();
    PinName pinName = _mbedPinNameExchange(pinNameString);
    string modeString = c->getParameter("mode")->getString();

    int mode = PullDown;
    if (modeString == "PullUp") {
        mode = PullUp;
    } else if (modeString == "PullNone"){
        mode = PullNone;
    } else if (modeString == "PullDown") {
        mode = PullDown;
    }

    DigitalIn din = DigitalIn((PinName)pinName);
    din.mode((PinMode)mode);
    int val = din.read();
    c->getReturnVar()->setInt(val);
}

void mbedDigitalOut(CScriptVar *c, void *)
{
    string pinNameString = c->getParameter("pinName")->getString();
    PinName pinName = _mbedPinNameExchange(pinNameString);

    int val = c->getParameter("val")->getInt();

    DigitalOut dout = DigitalOut((PinName)pinName);
    dout.write(val);
}

//---------------------------------------------

void mbedAnalogIn(CScriptVar *c, void *)
{
    string pinNameString = c->getParameter("pinName")->getString();
    PinName pinName = _mbedPinNameExchange(pinNameString);

    AnalogIn ain = AnalogIn((PinName)pinName);
    float val = ain.read();

    c->getReturnVar()->setDouble(val);
}

void mbedAnalogOut(CScriptVar *c, void *)
{
    string pinNameString = c->getParameter("pinName")->getString();
    PinName pinName = _mbedPinNameExchange(pinNameString);
    float val = c->getParameter("val")->getDouble();

    AnalogOut aout = AnalogOut((PinName)pinName);
    aout.write(val);
}

//---------------------------------------------
#define INTERRUPT_NUM   4
CTinyJS *interrupt_tinyJS;
int interruptCount = 0;
string callbackStrings[INTERRUPT_NUM];
InterruptIn* intrInArray[INTERRUPT_NUM] = {NULL, NULL, NULL, NULL};

void _interruptVector_0(){
    interrupt_tinyJS->execute(callbackStrings[0]);
}
void _interruptVector_1(){
    interrupt_tinyJS->execute(callbackStrings[1]);
}
void _interruptVector_2(){
    interrupt_tinyJS->execute(callbackStrings[2]);
}
void _interruptVector_3(){
    interrupt_tinyJS->execute(callbackStrings[3]);
}

void mbedSetInterrupt(CScriptVar *c, void *data)
{
    string pinNameString = c->getParameter("pinName")->getString();
    PinName pinName = _mbedPinNameExchange(pinNameString);

    string edgeString = c->getParameter("edge")->getString();
    string modeString = c->getParameter("mode")->getString();
    PinMode mode = PullDown;
    if (modeString == "PullUp") {
        mode = PullUp;
    } else if (modeString == "PullNone"){
        mode = PullNone;
    } else if (modeString == "PullDown") {
        mode = PullDown;
    }

    interrupt_tinyJS = (CTinyJS *)data;
    callbackStrings[interruptCount] = c->getParameter("callback")->getString();


    if (intrInArray[interruptCount] != NULL) {
        delete intrInArray[interruptCount];
    }

    intrInArray[interruptCount] = new InterruptIn(pinName);
    intrInArray[interruptCount]->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);
    }


    interruptCount++;
    if (interruptCount >= INTERRUPT_NUM) {
        interruptCount = 0;
    }
}


void mbedRemoveInterrupt(CScriptVar *c, void *)
{
}

//---------------------------------------------
/**
 *
 */
void mbedMemfree(CScriptVar *c, void *)
{
    int i = 0;
    while(1) {
        void *p = malloc(i);
        if (p == NULL)  break;
        free(p);
        i++;
    }
    c->getReturnVar()->setInt(i);
}


//---------------------------------------------
PinName _mbedPinNameExchange(string pinNameString)
{
    if (pinNameString == "p5") return p5;
    if (pinNameString == "p6") return p6;
    if (pinNameString == "p7") return p7;
    if (pinNameString == "p8") return p8;
    if (pinNameString == "p9") return p9;
    if (pinNameString == "p10") return p10;
    if (pinNameString == "p11") return p11;
    if (pinNameString == "p12") return p12;
    if (pinNameString == "p13") return p13;
    if (pinNameString == "p14") return p14;
    if (pinNameString == "p15") return p15;
    if (pinNameString == "p16") return p16;
    if (pinNameString == "p17") return p17;
    if (pinNameString == "p18") return p18;
    if (pinNameString == "p19") return p19;
    if (pinNameString == "p20") return p20;

    if (pinNameString == "p21") return p21;
    if (pinNameString == "p22") return p22;
    if (pinNameString == "p23") return p23;
    if (pinNameString == "p24") return p24;
    if (pinNameString == "p25") return p25;
    if (pinNameString == "p26") return p26;
    if (pinNameString == "p27") return p27;
    if (pinNameString == "p28") return p28;
    if (pinNameString == "p29") return p29;
    if (pinNameString == "p30") return p30;


    if (pinNameString == "LED1") return LED1;
    if (pinNameString == "LED2") return LED2;
    if (pinNameString == "LED3") return LED3;
    if (pinNameString == "LED4") return LED4;

    if (pinNameString == "USBTX") return USBTX;
    if (pinNameString == "USBRX") return USBRX;

    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);

    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);

    printf("Other mbed Pin Names\n");
    printf("USBTX : %d\n", USBTX);
    printf("USBRX : %d\n", USBRX);
}


//---------------------------------------------
// ----------------------------------------------- Register Functions
void registerMbedFunctions(CTinyJS *tinyJS) {
    tinyJS->addNative("function mbed.DigitalIn(pinName, mode)", mbedDigitalIn, 0);
    tinyJS->addNative("function mbed.DigitalOut(pinName, val)", mbedDigitalOut, 0);

    tinyJS->addNative("function mbed.AnalogIn(pinName)", mbedAnalogIn, 0);
    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.PinNames()", mbedPinNames, 0);

    tinyJS->addNative("function mbed.memfree()", mbedMemfree, 0);
}