TinyJS

Dependencies:   mbed

Fork of TinyJS by Takehisa Oneta

Committer:
va009039
Date:
Wed Sep 10 08:41:53 2014 +0000
Revision:
9:f80cf055f03d
Parent:
8:819934a27c2d
for GAE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 3:f56c36ea8266 1 /*
ohneta 3:f56c36ea8266 2 * TinyJS for mbed.
ohneta 3:f56c36ea8266 3 * Mbed_Functions.cpp
ohneta 3:f56c36ea8266 4 *
ohneta 3:f56c36ea8266 5 * Authored by Takehisa Oneta (ohneta@gmail.com)
ohneta 7:40010b4dc51d 6 * 17th Jan. 2014 -
ohneta 3:f56c36ea8266 7 */
ohneta 3:f56c36ea8266 8
ohneta 3:f56c36ea8266 9 #include "mbed.h"
ohneta 3:f56c36ea8266 10 #include "TinyJS.h"
ohneta 3:f56c36ea8266 11 #include "Mbed_Functions.h"
va009039 9:f80cf055f03d 12 #include "PinNameTable.h"
ohneta 3:f56c36ea8266 13
ohneta 3:f56c36ea8266 14 //---------------------------------------------
ohneta 3:f56c36ea8266 15
ohneta 3:f56c36ea8266 16 void mbedDigitalIn(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 17 {
ohneta 3:f56c36ea8266 18 string pinNameString = c->getParameter("pinName")->getString();
ohneta 3:f56c36ea8266 19 PinName pinName = _mbedPinNameExchange(pinNameString);
ohneta 3:f56c36ea8266 20 string modeString = c->getParameter("mode")->getString();
ohneta 3:f56c36ea8266 21
ohneta 3:f56c36ea8266 22 int mode = PullDown;
ohneta 3:f56c36ea8266 23 if (modeString == "PullUp") {
ohneta 3:f56c36ea8266 24 mode = PullUp;
ohneta 3:f56c36ea8266 25 } else if (modeString == "PullNone"){
ohneta 3:f56c36ea8266 26 mode = PullNone;
ohneta 3:f56c36ea8266 27 } else if (modeString == "PullDown") {
ohneta 3:f56c36ea8266 28 mode = PullDown;
ohneta 3:f56c36ea8266 29 }
ohneta 3:f56c36ea8266 30
ohneta 3:f56c36ea8266 31 DigitalIn din = DigitalIn((PinName)pinName);
ohneta 3:f56c36ea8266 32 din.mode((PinMode)mode);
ohneta 3:f56c36ea8266 33 int val = din.read();
ohneta 3:f56c36ea8266 34 c->getReturnVar()->setInt(val);
ohneta 3:f56c36ea8266 35 }
ohneta 3:f56c36ea8266 36
ohneta 3:f56c36ea8266 37 void mbedDigitalOut(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 38 {
ohneta 3:f56c36ea8266 39 string pinNameString = c->getParameter("pinName")->getString();
ohneta 3:f56c36ea8266 40 PinName pinName = _mbedPinNameExchange(pinNameString);
ohneta 3:f56c36ea8266 41
ohneta 3:f56c36ea8266 42 int val = c->getParameter("val")->getInt();
ohneta 3:f56c36ea8266 43
ohneta 3:f56c36ea8266 44 DigitalOut dout = DigitalOut((PinName)pinName);
ohneta 3:f56c36ea8266 45 dout.write(val);
ohneta 3:f56c36ea8266 46 }
ohneta 3:f56c36ea8266 47
ohneta 3:f56c36ea8266 48 //---------------------------------------------
ohneta 3:f56c36ea8266 49
ohneta 3:f56c36ea8266 50 void mbedAnalogIn(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 51 {
ohneta 3:f56c36ea8266 52 string pinNameString = c->getParameter("pinName")->getString();
ohneta 3:f56c36ea8266 53 PinName pinName = _mbedPinNameExchange(pinNameString);
ohneta 3:f56c36ea8266 54
ohneta 3:f56c36ea8266 55 AnalogIn ain = AnalogIn((PinName)pinName);
ohneta 3:f56c36ea8266 56 float val = ain.read();
ohneta 3:f56c36ea8266 57
ohneta 3:f56c36ea8266 58 c->getReturnVar()->setDouble(val);
ohneta 3:f56c36ea8266 59 }
ohneta 3:f56c36ea8266 60
ohneta 3:f56c36ea8266 61 void mbedAnalogOut(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 62 {
ohneta 3:f56c36ea8266 63 string pinNameString = c->getParameter("pinName")->getString();
ohneta 3:f56c36ea8266 64 PinName pinName = _mbedPinNameExchange(pinNameString);
ohneta 5:b5e4fbe59746 65 float val = c->getParameter("val")->getDouble();
va009039 9:f80cf055f03d 66 #if DEVICE_ANALOGOUT
ohneta 3:f56c36ea8266 67 AnalogOut aout = AnalogOut((PinName)pinName);
ohneta 3:f56c36ea8266 68 aout.write(val);
va009039 9:f80cf055f03d 69 #endif
ohneta 3:f56c36ea8266 70 }
ohneta 3:f56c36ea8266 71
ohneta 3:f56c36ea8266 72 //---------------------------------------------
ohneta 3:f56c36ea8266 73 #define INTERRUPT_NUM 4
ohneta 6:30b4122b0ee2 74 CTinyJS *_mbed_interruptIn_tinyJS;
ohneta 6:30b4122b0ee2 75 int _mbed_interruptIn_Count = 0;
ohneta 6:30b4122b0ee2 76 string _mbed_interruptIn_callbackStrings[INTERRUPT_NUM];
ohneta 6:30b4122b0ee2 77 InterruptIn* _mbed_interrupt_array[INTERRUPT_NUM] = {NULL, NULL, NULL, NULL};
ohneta 3:f56c36ea8266 78
ohneta 6:30b4122b0ee2 79 void _interruptVector0(){
ohneta 6:30b4122b0ee2 80 _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[0]);
ohneta 3:f56c36ea8266 81 }
ohneta 6:30b4122b0ee2 82 void _interruptVector1(){
ohneta 6:30b4122b0ee2 83 _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[1]);
ohneta 3:f56c36ea8266 84 }
ohneta 6:30b4122b0ee2 85 void _interruptVector2(){
ohneta 6:30b4122b0ee2 86 _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[2]);
ohneta 3:f56c36ea8266 87 }
ohneta 6:30b4122b0ee2 88 void _interruptVector3(){
ohneta 6:30b4122b0ee2 89 _mbed_interruptIn_tinyJS->execute(_mbed_interruptIn_callbackStrings[3]);
ohneta 3:f56c36ea8266 90 }
ohneta 3:f56c36ea8266 91
ohneta 7:40010b4dc51d 92 void mbedInterruptIn(CScriptVar *c, void *data)
ohneta 3:f56c36ea8266 93 {
ohneta 3:f56c36ea8266 94 string pinNameString = c->getParameter("pinName")->getString();
ohneta 3:f56c36ea8266 95 PinName pinName = _mbedPinNameExchange(pinNameString);
ohneta 3:f56c36ea8266 96
ohneta 3:f56c36ea8266 97 string edgeString = c->getParameter("edge")->getString();
ohneta 3:f56c36ea8266 98 string modeString = c->getParameter("mode")->getString();
ohneta 3:f56c36ea8266 99 PinMode mode = PullDown;
ohneta 3:f56c36ea8266 100 if (modeString == "PullUp") {
ohneta 3:f56c36ea8266 101 mode = PullUp;
ohneta 3:f56c36ea8266 102 } else if (modeString == "PullNone"){
ohneta 3:f56c36ea8266 103 mode = PullNone;
ohneta 3:f56c36ea8266 104 } else if (modeString == "PullDown") {
ohneta 3:f56c36ea8266 105 mode = PullDown;
ohneta 3:f56c36ea8266 106 }
ohneta 3:f56c36ea8266 107
ohneta 6:30b4122b0ee2 108 _mbed_interruptIn_tinyJS = (CTinyJS *)data;
ohneta 6:30b4122b0ee2 109 _mbed_interruptIn_callbackStrings[_mbed_interruptIn_Count] = c->getParameter("callback")->getString();
ohneta 3:f56c36ea8266 110
ohneta 6:30b4122b0ee2 111 if (_mbed_interrupt_array[_mbed_interruptIn_Count] != NULL) {
ohneta 6:30b4122b0ee2 112 delete _mbed_interrupt_array[_mbed_interruptIn_Count];
ohneta 3:f56c36ea8266 113 }
ohneta 3:f56c36ea8266 114
ohneta 6:30b4122b0ee2 115 _mbed_interrupt_array[_mbed_interruptIn_Count] = new InterruptIn(pinName);
ohneta 6:30b4122b0ee2 116 _mbed_interrupt_array[_mbed_interruptIn_Count]->mode(mode);
ohneta 3:f56c36ea8266 117
ohneta 6:30b4122b0ee2 118 if (_mbed_interruptIn_Count == 0) {
ohneta 6:30b4122b0ee2 119 if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector0);
ohneta 6:30b4122b0ee2 120 else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector0);
ohneta 6:30b4122b0ee2 121 } else if (_mbed_interruptIn_Count == 1) {
ohneta 6:30b4122b0ee2 122 if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector1);
ohneta 6:30b4122b0ee2 123 else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector1);
ohneta 6:30b4122b0ee2 124 } else if (_mbed_interruptIn_Count == 2) {
ohneta 6:30b4122b0ee2 125 if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector2);
ohneta 6:30b4122b0ee2 126 else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector2);
ohneta 6:30b4122b0ee2 127 } else if (_mbed_interruptIn_Count == 3) {
ohneta 6:30b4122b0ee2 128 if (edgeString == "fall") _mbed_interrupt_array[_mbed_interruptIn_Count]->fall(_interruptVector3);
ohneta 6:30b4122b0ee2 129 else if (edgeString == "rise") _mbed_interrupt_array[_mbed_interruptIn_Count]->rise(_interruptVector3);
ohneta 3:f56c36ea8266 130 }
ohneta 3:f56c36ea8266 131
ohneta 6:30b4122b0ee2 132 c->getReturnVar()->setInt(_mbed_interruptIn_Count);
ohneta 3:f56c36ea8266 133
ohneta 6:30b4122b0ee2 134 _mbed_interruptIn_Count++;
ohneta 6:30b4122b0ee2 135 if (_mbed_interruptIn_Count >= INTERRUPT_NUM) {
ohneta 6:30b4122b0ee2 136 _mbed_interruptIn_Count = 0;
ohneta 3:f56c36ea8266 137 }
ohneta 3:f56c36ea8266 138 }
ohneta 3:f56c36ea8266 139
ohneta 6:30b4122b0ee2 140 /*
ohneta 3:f56c36ea8266 141 void mbedRemoveInterrupt(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 142 {
ohneta 6:30b4122b0ee2 143 int intrno = c->getParameter("interrupt_no")->getInt();
ohneta 6:30b4122b0ee2 144 }
ohneta 6:30b4122b0ee2 145 */
ohneta 6:30b4122b0ee2 146
ohneta 6:30b4122b0ee2 147 //---------------------------------------------
ohneta 6:30b4122b0ee2 148
ohneta 6:30b4122b0ee2 149 void mbedWait(CScriptVar *c, void *)
ohneta 6:30b4122b0ee2 150 {
ohneta 6:30b4122b0ee2 151 float val = c->getParameter("s")->getDouble();
ohneta 6:30b4122b0ee2 152 wait(val);
ohneta 3:f56c36ea8266 153 }
ohneta 3:f56c36ea8266 154
ohneta 3:f56c36ea8266 155 //---------------------------------------------
ohneta 3:f56c36ea8266 156 /**
ohneta 3:f56c36ea8266 157 *
ohneta 3:f56c36ea8266 158 */
ohneta 3:f56c36ea8266 159 void mbedMemfree(CScriptVar *c, void *)
ohneta 3:f56c36ea8266 160 {
ohneta 3:f56c36ea8266 161 int i = 0;
ohneta 3:f56c36ea8266 162 while(1) {
ohneta 3:f56c36ea8266 163 void *p = malloc(i);
ohneta 3:f56c36ea8266 164 if (p == NULL) break;
ohneta 3:f56c36ea8266 165 free(p);
ohneta 3:f56c36ea8266 166 i++;
ohneta 3:f56c36ea8266 167 }
ohneta 3:f56c36ea8266 168 c->getReturnVar()->setInt(i);
ohneta 3:f56c36ea8266 169 }
ohneta 3:f56c36ea8266 170
ohneta 3:f56c36ea8266 171 //---------------------------------------------
ohneta 3:f56c36ea8266 172 PinName _mbedPinNameExchange(string pinNameString)
ohneta 3:f56c36ea8266 173 {
va009039 9:f80cf055f03d 174 #if 0
ohneta 3:f56c36ea8266 175 if (pinNameString == "p5") return p5;
ohneta 3:f56c36ea8266 176 if (pinNameString == "p6") return p6;
ohneta 3:f56c36ea8266 177 if (pinNameString == "p7") return p7;
ohneta 3:f56c36ea8266 178 if (pinNameString == "p8") return p8;
ohneta 3:f56c36ea8266 179 if (pinNameString == "p9") return p9;
ohneta 3:f56c36ea8266 180 if (pinNameString == "p10") return p10;
ohneta 3:f56c36ea8266 181 if (pinNameString == "p11") return p11;
ohneta 3:f56c36ea8266 182 if (pinNameString == "p12") return p12;
ohneta 3:f56c36ea8266 183 if (pinNameString == "p13") return p13;
ohneta 3:f56c36ea8266 184 if (pinNameString == "p14") return p14;
ohneta 3:f56c36ea8266 185 if (pinNameString == "p15") return p15;
ohneta 3:f56c36ea8266 186 if (pinNameString == "p16") return p16;
ohneta 3:f56c36ea8266 187 if (pinNameString == "p17") return p17;
ohneta 3:f56c36ea8266 188 if (pinNameString == "p18") return p18;
ohneta 3:f56c36ea8266 189 if (pinNameString == "p19") return p19;
ohneta 3:f56c36ea8266 190 if (pinNameString == "p20") return p20;
ohneta 3:f56c36ea8266 191
ohneta 3:f56c36ea8266 192 if (pinNameString == "p21") return p21;
ohneta 3:f56c36ea8266 193 if (pinNameString == "p22") return p22;
ohneta 3:f56c36ea8266 194 if (pinNameString == "p23") return p23;
ohneta 3:f56c36ea8266 195 if (pinNameString == "p24") return p24;
ohneta 3:f56c36ea8266 196 if (pinNameString == "p25") return p25;
ohneta 3:f56c36ea8266 197 if (pinNameString == "p26") return p26;
ohneta 3:f56c36ea8266 198 if (pinNameString == "p27") return p27;
ohneta 3:f56c36ea8266 199 if (pinNameString == "p28") return p28;
ohneta 3:f56c36ea8266 200 if (pinNameString == "p29") return p29;
ohneta 3:f56c36ea8266 201 if (pinNameString == "p30") return p30;
ohneta 3:f56c36ea8266 202
ohneta 3:f56c36ea8266 203
ohneta 3:f56c36ea8266 204 if (pinNameString == "LED1") return LED1;
ohneta 3:f56c36ea8266 205 if (pinNameString == "LED2") return LED2;
ohneta 3:f56c36ea8266 206 if (pinNameString == "LED3") return LED3;
ohneta 3:f56c36ea8266 207 if (pinNameString == "LED4") return LED4;
ohneta 3:f56c36ea8266 208
ohneta 3:f56c36ea8266 209 if (pinNameString == "USBTX") return USBTX;
ohneta 3:f56c36ea8266 210 if (pinNameString == "USBRX") return USBRX;
ohneta 3:f56c36ea8266 211
ohneta 3:f56c36ea8266 212 return NC;
va009039 9:f80cf055f03d 213 #else
va009039 9:f80cf055f03d 214 int imin = 0;
va009039 9:f80cf055f03d 215 int imax = sizeof(pinname_table) / sizeof(pinNameStr) - 1;
va009039 9:f80cf055f03d 216 while(imax >= imin) {
va009039 9:f80cf055f03d 217 int i = (imin + imax) / 2;
va009039 9:f80cf055f03d 218 int c = strcmp(pinNameString.c_str(), pinname_table[i].name);
va009039 9:f80cf055f03d 219 if (c == 0) {
va009039 9:f80cf055f03d 220 return pinname_table[i].pin;
va009039 9:f80cf055f03d 221 } else if (c > 0) {
va009039 9:f80cf055f03d 222 imin = i + 1;
va009039 9:f80cf055f03d 223 } else {
va009039 9:f80cf055f03d 224 imax = i - 1;
va009039 9:f80cf055f03d 225 }
va009039 9:f80cf055f03d 226 }
va009039 9:f80cf055f03d 227 return NC;
va009039 9:f80cf055f03d 228 #endif
ohneta 3:f56c36ea8266 229 }
ohneta 3:f56c36ea8266 230
ohneta 6:30b4122b0ee2 231 //---------------------------------------------
ohneta 6:30b4122b0ee2 232 Timer _mbedTimer;
ohneta 6:30b4122b0ee2 233
ohneta 6:30b4122b0ee2 234 void mbedTimerStart(CScriptVar *c, void *) {
ohneta 6:30b4122b0ee2 235 _mbedTimer.start();
ohneta 6:30b4122b0ee2 236 }
ohneta 6:30b4122b0ee2 237
ohneta 6:30b4122b0ee2 238 void mbedTimerStop(CScriptVar *c, void *) {
ohneta 6:30b4122b0ee2 239 _mbedTimer.stop();
ohneta 6:30b4122b0ee2 240 }
ohneta 6:30b4122b0ee2 241
ohneta 6:30b4122b0ee2 242 void mbedTimerReset(CScriptVar *c, void *) {
ohneta 6:30b4122b0ee2 243 _mbedTimer.reset();
ohneta 6:30b4122b0ee2 244 }
ohneta 3:f56c36ea8266 245
ohneta 6:30b4122b0ee2 246 void mbedTimerRead(CScriptVar *c, void *) {
ohneta 6:30b4122b0ee2 247 float tm = _mbedTimer.read();
ohneta 6:30b4122b0ee2 248 c->getReturnVar()->setDouble(tm);
ohneta 6:30b4122b0ee2 249 }
ohneta 6:30b4122b0ee2 250
ohneta 6:30b4122b0ee2 251
ohneta 6:30b4122b0ee2 252 //---------------------------------------------
ohneta 6:30b4122b0ee2 253 Timeout _mbedTimeout;
ohneta 6:30b4122b0ee2 254 CTinyJS *_mbedTimeout_tinyJS;
ohneta 6:30b4122b0ee2 255 string _mbedTimeout_callbackStrings;
ohneta 3:f56c36ea8266 256
ohneta 6:30b4122b0ee2 257 void _mbedTimeoutVector() {
ohneta 6:30b4122b0ee2 258 _mbedTimeout_tinyJS->execute(_mbedTimeout_callbackStrings);
ohneta 6:30b4122b0ee2 259 }
ohneta 6:30b4122b0ee2 260
ohneta 6:30b4122b0ee2 261 void mbedTimeout(CScriptVar *c, void *data) {
ohneta 6:30b4122b0ee2 262
ohneta 6:30b4122b0ee2 263 _mbedTimeout_tinyJS = (CTinyJS *)data;
ohneta 6:30b4122b0ee2 264 _mbedTimeout_callbackStrings = c->getParameter("callback")->getString();
ohneta 6:30b4122b0ee2 265 float t = c->getParameter("t")->getDouble();
ohneta 6:30b4122b0ee2 266
ohneta 6:30b4122b0ee2 267 _mbedTimeout.attach(&_mbedTimeoutVector, t);
ohneta 3:f56c36ea8266 268 }
ohneta 3:f56c36ea8266 269
ohneta 3:f56c36ea8266 270
ohneta 3:f56c36ea8266 271 //---------------------------------------------
ohneta 3:f56c36ea8266 272 // ----------------------------------------------- Register Functions
ohneta 3:f56c36ea8266 273 void registerMbedFunctions(CTinyJS *tinyJS) {
ohneta 3:f56c36ea8266 274 tinyJS->addNative("function mbed.DigitalIn(pinName, mode)", mbedDigitalIn, 0);
ohneta 3:f56c36ea8266 275 tinyJS->addNative("function mbed.DigitalOut(pinName, val)", mbedDigitalOut, 0);
ohneta 3:f56c36ea8266 276
ohneta 3:f56c36ea8266 277 tinyJS->addNative("function mbed.AnalogIn(pinName)", mbedAnalogIn, 0);
ohneta 3:f56c36ea8266 278 tinyJS->addNative("function mbed.AnalogOut(pinName, val)", mbedAnalogOut, 0);
ohneta 3:f56c36ea8266 279
ohneta 8:819934a27c2d 280 tinyJS->addNative("function mbed.InterruptIn(pinName, edge, mode, callback)", mbedInterruptIn, tinyJS);
ohneta 6:30b4122b0ee2 281 tinyJS->addNative("function mbed.wait(s)", mbedWait, 0);
ohneta 8:819934a27c2d 282 tinyJS->addNative("function mbed.TimerStart", mbedTimerStart, 0);
ohneta 8:819934a27c2d 283 tinyJS->addNative("function mbed.TimerStop", mbedTimerStop, 0);
ohneta 8:819934a27c2d 284 tinyJS->addNative("function mbed.TimerReset", mbedTimerReset, 0);
ohneta 8:819934a27c2d 285 tinyJS->addNative("function mbed.TimerRead", mbedTimerRead, 0);
ohneta 6:30b4122b0ee2 286 tinyJS->addNative("function mbed.Timeout(callback, t)", mbedTimeout, tinyJS);
ohneta 6:30b4122b0ee2 287
ohneta 3:f56c36ea8266 288 tinyJS->addNative("function mbed.memfree()", mbedMemfree, 0);
ohneta 3:f56c36ea8266 289 }
ohneta 3:f56c36ea8266 290
ohneta 3:f56c36ea8266 291