Norimasa Okamoto / Mbed 2 deprecated TinyJS

Dependencies:   mbed

Fork of TinyJS by Takehisa Oneta

Mbed_Functions.cpp

Committer:
ohneta
Date:
2014-01-18
Revision:
3:f56c36ea8266
Child:
4:729cab0e95c6

File content as of revision 3:f56c36ea8266:

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

#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);
    int val = c->getParameter("val")->getInt();

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