TinyJS on mbed. TinyJS is very simple JavaScript engine.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Mbed_Functions.cpp Source File

Mbed_Functions.cpp

00001 /*
00002  * TinyJS for mbed.
00003  * Mbed_Functions.cpp
00004  *
00005  * Authored by Takehisa Oneta (ohneta@gmail.com)
00006  * 17th Jan. 2014 -
00007  */
00008 
00009 #include "mbed.h"
00010 #include "TinyJS.h"
00011 #include "Mbed_Functions.h"
00012 
00013 //---------------------------------------------
00014 
00015 void mbedDigitalIn(CScriptVar *c, void *)
00016 {
00017     string pinNameString = c->getParameter("pinName")->getString();
00018     PinName pinName = _mbedPinNameExchange(pinNameString);
00019     string modeString = c->getParameter("mode")->getString();
00020 
00021     int mode = PullDown;
00022     if (modeString == "PullUp") {
00023         mode = PullUp;
00024     } else if (modeString == "PullNone"){
00025         mode = PullNone;
00026     } else if (modeString == "PullDown") {
00027         mode = PullDown;
00028     }
00029 
00030     DigitalIn din = DigitalIn((PinName)pinName);
00031     din.mode((PinMode)mode);
00032     int val = din.read();
00033     c->getReturnVar()->setInt(val);
00034 }
00035 
00036 void mbedDigitalOut(CScriptVar *c, void *)
00037 {
00038     string pinNameString = c->getParameter("pinName")->getString();
00039     PinName pinName = _mbedPinNameExchange(pinNameString);
00040 
00041     int val = c->getParameter("val")->getInt();
00042 
00043     DigitalOut dout = DigitalOut((PinName)pinName);
00044     dout.write(val);
00045 }
00046 
00047 //---------------------------------------------
00048 
00049 void mbedAnalogIn(CScriptVar *c, void *)
00050 {
00051     string pinNameString = c->getParameter("pinName")->getString();
00052     PinName pinName = _mbedPinNameExchange(pinNameString);
00053 
00054     AnalogIn ain = AnalogIn((PinName)pinName);
00055     float val = ain.read();
00056 
00057     c->getReturnVar()->setDouble(val);
00058 }
00059 
00060 void mbedAnalogOut(CScriptVar *c, void *)
00061 {
00062     string pinNameString = c->getParameter("pinName")->getString();
00063     PinName pinName = _mbedPinNameExchange(pinNameString);
00064     float val = c->getParameter("val")->getDouble();
00065 
00066     AnalogOut aout = AnalogOut((PinName)pinName);
00067     aout.write(val);
00068 }
00069 
00070 //---------------------------------------------
00071 #define INTERRUPT_NUM   4
00072 CTinyJS *_mbed_interruptIn_tinyJS;
00073 int _mbed_interruptIn_Count = 0;
00074 string _mbed_interruptIn_callbackStrings[INTERRUPT_NUM];
00075 InterruptIn* _mbed_interrupt_array[INTERRUPT_NUM] = {NULL, NULL, NULL, NULL};
00076 
00077 void _interruptVector0(){
00078     _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[0]);
00079 }
00080 void _interruptVector1(){
00081     _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[1]);
00082 }
00083 void _interruptVector2(){
00084     _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[2]);
00085 }
00086 void _interruptVector3(){
00087     _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[3]);
00088 }
00089 
00090 void mbedInterruptIn(CScriptVar *c, void *data)
00091 {
00092     string pinNameString = c->getParameter("pinName")->getString();
00093     PinName pinName = _mbedPinNameExchange(pinNameString);
00094 
00095     string edgeString = c->getParameter("edge")->getString();
00096     string modeString = c->getParameter("mode")->getString();
00097     PinMode mode = PullDown;
00098     if (modeString == "PullUp") {
00099         mode = PullUp;
00100     } else if (modeString == "PullNone"){
00101         mode = PullNone;
00102     } else if (modeString == "PullDown") {
00103         mode = PullDown;
00104     }
00105 
00106     _mbed_interruptIn_tinyJS = (CTinyJS *)data;
00107     _mbed_interruptIn_callbackStrings[_mbed_interruptIn_Count] = c->getParameter("callback")->getString();
00108 
00109     if (_mbed_interrupt_array[_mbed_interruptIn_Count] != NULL) {
00110         delete _mbed_interrupt_array[_mbed_interruptIn_Count];
00111     }
00112 
00113     _mbed_interrupt_array[_mbed_interruptIn_Count] = new InterruptIn(pinName);
00114     _mbed_interrupt_array[_mbed_interruptIn_Count]->mode(mode);
00115 
00116     if (_mbed_interruptIn_Count == 0) {
00117         if (edgeString == "fall")      _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector0);
00118         else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector0);
00119     } else if (_mbed_interruptIn_Count == 1) {
00120         if (edgeString == "fall")      _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector1);
00121         else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector1);
00122     } else if (_mbed_interruptIn_Count == 2) {
00123         if (edgeString == "fall")      _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector2);
00124         else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector2);
00125     } else if (_mbed_interruptIn_Count == 3) {
00126         if (edgeString == "fall")      _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector3);
00127         else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector3);
00128     }
00129 
00130     c->getReturnVar()->setInt(_mbed_interruptIn_Count);
00131 
00132     _mbed_interruptIn_Count++;
00133     if (_mbed_interruptIn_Count >= INTERRUPT_NUM) {
00134         _mbed_interruptIn_Count = 0;
00135     }
00136 }
00137 
00138 /*
00139 void mbedRemoveInterrupt(CScriptVar *c, void *)
00140 {
00141     int intrno = c->getParameter("interrupt_no")->getInt();
00142 }
00143 */
00144 
00145 //---------------------------------------------
00146 
00147 void mbedWait(CScriptVar *c, void *)
00148 {
00149     float val = c->getParameter("s")->getDouble();
00150     wait(val);
00151 }
00152 
00153 //---------------------------------------------
00154 /**
00155  *
00156  */
00157 void mbedMemfree(CScriptVar *c, void *)
00158 {
00159     int i = 0;
00160     while(1) {
00161         void *p = malloc(i);
00162         if (p == NULL)  break;
00163         free(p);
00164         i++;
00165     }
00166     c->getReturnVar()->setInt(i);
00167 }
00168 
00169 //---------------------------------------------
00170 PinName _mbedPinNameExchange(string pinNameString)
00171 {
00172     if (pinNameString == "p5") return p5;
00173     if (pinNameString == "p6") return p6;
00174     if (pinNameString == "p7") return p7;
00175     if (pinNameString == "p8") return p8;
00176     if (pinNameString == "p9") return p9;
00177     if (pinNameString == "p10") return p10;
00178     if (pinNameString == "p11") return p11;
00179     if (pinNameString == "p12") return p12;
00180     if (pinNameString == "p13") return p13;
00181     if (pinNameString == "p14") return p14;
00182     if (pinNameString == "p15") return p15;
00183     if (pinNameString == "p16") return p16;
00184     if (pinNameString == "p17") return p17;
00185     if (pinNameString == "p18") return p18;
00186     if (pinNameString == "p19") return p19;
00187     if (pinNameString == "p20") return p20;
00188 
00189     if (pinNameString == "p21") return p21;
00190     if (pinNameString == "p22") return p22;
00191     if (pinNameString == "p23") return p23;
00192     if (pinNameString == "p24") return p24;
00193     if (pinNameString == "p25") return p25;
00194     if (pinNameString == "p26") return p26;
00195     if (pinNameString == "p27") return p27;
00196     if (pinNameString == "p28") return p28;
00197     if (pinNameString == "p29") return p29;
00198     if (pinNameString == "p30") return p30;
00199 
00200 
00201     if (pinNameString == "LED1") return LED1;
00202     if (pinNameString == "LED2") return LED2;
00203     if (pinNameString == "LED3") return LED3;
00204     if (pinNameString == "LED4") return LED4;
00205 
00206     if (pinNameString == "USBTX") return USBTX;
00207     if (pinNameString == "USBRX") return USBRX;
00208 
00209     return NC;
00210 }
00211 
00212 //---------------------------------------------
00213 Timer _mbedTimer;
00214 
00215 void mbedTimerStart(CScriptVar *c, void *) {
00216     _mbedTimer.start();
00217 }
00218 
00219 void mbedTimerStop(CScriptVar *c, void *) {
00220     _mbedTimer.stop();
00221 }
00222 
00223 void mbedTimerReset(CScriptVar *c, void *) {
00224     _mbedTimer.reset();
00225 }
00226 
00227 void mbedTimerRead(CScriptVar *c, void *) {
00228     float tm = _mbedTimer.read();
00229     c->getReturnVar()->setDouble(tm);
00230 }
00231 
00232 
00233 //---------------------------------------------
00234 Timeout _mbedTimeout;
00235 CTinyJS *_mbedTimeout_tinyJS;
00236 string _mbedTimeout_callbackStrings;
00237 
00238 void _mbedTimeoutVector() {
00239     _mbedTimeout_tinyJS->execute(_mbedTimeout_callbackStrings);
00240 }
00241 
00242 void mbedTimeout(CScriptVar *c, void *data) {
00243     
00244     _mbedTimeout_tinyJS = (CTinyJS *)data;
00245     _mbedTimeout_callbackStrings = c->getParameter("callback")->getString();
00246     float t = c->getParameter("t")->getDouble();
00247 
00248     _mbedTimeout.attach(&_mbedTimeoutVector, t);
00249 }
00250 
00251 
00252 //---------------------------------------------
00253 // ----------------------------------------------- Register Functions
00254 void registerMbedFunctions(CTinyJS *tinyJS) {
00255     tinyJS->addNative("function mbed.DigitalIn(pinName, mode)", mbedDigitalIn, 0);
00256     tinyJS->addNative("function mbed.DigitalOut(pinName, val)", mbedDigitalOut, 0);
00257 
00258     tinyJS->addNative("function mbed.AnalogIn(pinName)", mbedAnalogIn, 0);
00259     tinyJS->addNative("function mbed.AnalogOut(pinName, val)", mbedAnalogOut, 0);
00260 
00261     tinyJS->addNative("function mbed.InterruptIn(pinName, edge, mode, callback)", mbedInterruptIn, tinyJS);
00262     tinyJS->addNative("function mbed.wait(s)", mbedWait, 0);
00263     tinyJS->addNative("function mbed.TimerStart", mbedTimerStart, 0);
00264     tinyJS->addNative("function mbed.TimerStop", mbedTimerStop, 0);
00265     tinyJS->addNative("function mbed.TimerReset", mbedTimerReset, 0);
00266     tinyJS->addNative("function mbed.TimerRead", mbedTimerRead, 0);
00267     tinyJS->addNative("function mbed.Timeout(callback, t)", mbedTimeout, tinyJS);
00268 
00269     tinyJS->addNative("function mbed.memfree()", mbedMemfree, 0);
00270 }
00271 
00272