Takehisa Oneta
/
TinyJS
TinyJS on mbed. TinyJS is very simple JavaScript engine.
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Tue Jul 12 2022 21:01:11 by 1.7.2