Lisp Interpreter for mbed LPC1768

Dependencies:   mbed

Lisp Interpreter

(Marc Adler Lisp Interpreter, malisp)

mbed LPC1768 port by Takehisa Oneta (ohneta@gmail.com)

Committer:
ohneta
Date:
Sun Apr 17 11:59:13 2016 +0000
Revision:
0:e9a7a38d9ad3
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ohneta 0:e9a7a38d9ad3 1 /**
ohneta 0:e9a7a38d9ad3 2 *
ohneta 0:e9a7a38d9ad3 3 */
ohneta 0:e9a7a38d9ad3 4
ohneta 0:e9a7a38d9ad3 5 #include "mbed.h"
ohneta 0:e9a7a38d9ad3 6 #include "mbed_functions.h"
ohneta 0:e9a7a38d9ad3 7 #include "malisp.h"
ohneta 0:e9a7a38d9ad3 8
ohneta 0:e9a7a38d9ad3 9 extern LIST *TRU;
ohneta 0:e9a7a38d9ad3 10
ohneta 0:e9a7a38d9ad3 11 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 12 //
ohneta 0:e9a7a38d9ad3 13 size_t _getFreeMemorySize()
ohneta 0:e9a7a38d9ad3 14 {
ohneta 0:e9a7a38d9ad3 15 size_t i = 0;
ohneta 0:e9a7a38d9ad3 16 while(1) {
ohneta 0:e9a7a38d9ad3 17 void *p = malloc(i);
ohneta 0:e9a7a38d9ad3 18 if (p == NULL) {
ohneta 0:e9a7a38d9ad3 19 break;
ohneta 0:e9a7a38d9ad3 20 }
ohneta 0:e9a7a38d9ad3 21 free(p);
ohneta 0:e9a7a38d9ad3 22 i++;
ohneta 0:e9a7a38d9ad3 23 }
ohneta 0:e9a7a38d9ad3 24
ohneta 0:e9a7a38d9ad3 25 return i;
ohneta 0:e9a7a38d9ad3 26 }
ohneta 0:e9a7a38d9ad3 27
ohneta 0:e9a7a38d9ad3 28 LIST *memfreesize()
ohneta 0:e9a7a38d9ad3 29 {
ohneta 0:e9a7a38d9ad3 30 //work_garbageCollect(NULL);
ohneta 0:e9a7a38d9ad3 31
ohneta 0:e9a7a38d9ad3 32 size_t memsize = _getFreeMemorySize();
ohneta 0:e9a7a38d9ad3 33
ohneta 0:e9a7a38d9ad3 34 LIST *res = cons(NULL, NULL);
ohneta 0:e9a7a38d9ad3 35
ohneta 0:e9a7a38d9ad3 36 res->u.num = memsize;
ohneta 0:e9a7a38d9ad3 37 rplact(res, IATOM);
ohneta 0:e9a7a38d9ad3 38
ohneta 0:e9a7a38d9ad3 39 return res;
ohneta 0:e9a7a38d9ad3 40 }
ohneta 0:e9a7a38d9ad3 41
ohneta 0:e9a7a38d9ad3 42 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 43 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 44
ohneta 0:e9a7a38d9ad3 45 PinName _mbed_pinNameExchange(char *pinNameString)
ohneta 0:e9a7a38d9ad3 46 {
ohneta 0:e9a7a38d9ad3 47 if (strcmp(pinNameString, "p5") == 0) return p5;
ohneta 0:e9a7a38d9ad3 48 if (strcmp(pinNameString, "p6") == 0) return p6;
ohneta 0:e9a7a38d9ad3 49 if (strcmp(pinNameString, "p7") == 0) return p7;
ohneta 0:e9a7a38d9ad3 50 if (strcmp(pinNameString, "p8") == 0) return p8;
ohneta 0:e9a7a38d9ad3 51 if (strcmp(pinNameString, "p9") == 0) return p9;
ohneta 0:e9a7a38d9ad3 52 if (strcmp(pinNameString, "p10") == 0) return p10;
ohneta 0:e9a7a38d9ad3 53 if (strcmp(pinNameString, "p11") == 0) return p11;
ohneta 0:e9a7a38d9ad3 54 if (strcmp(pinNameString, "p12") == 0) return p12;
ohneta 0:e9a7a38d9ad3 55 if (strcmp(pinNameString, "p13") == 0) return p13;
ohneta 0:e9a7a38d9ad3 56 if (strcmp(pinNameString, "p14") == 0) return p14;
ohneta 0:e9a7a38d9ad3 57 if (strcmp(pinNameString, "p15") == 0) return p15;
ohneta 0:e9a7a38d9ad3 58 if (strcmp(pinNameString, "p16") == 0) return p16;
ohneta 0:e9a7a38d9ad3 59 if (strcmp(pinNameString, "p17") == 0) return p17;
ohneta 0:e9a7a38d9ad3 60 if (strcmp(pinNameString, "p18") == 0) return p18;
ohneta 0:e9a7a38d9ad3 61 if (strcmp(pinNameString, "p19") == 0) return p19;
ohneta 0:e9a7a38d9ad3 62 if (strcmp(pinNameString, "p20") == 0) return p20;
ohneta 0:e9a7a38d9ad3 63
ohneta 0:e9a7a38d9ad3 64 if (strcmp(pinNameString, "p21") == 0) return p21;
ohneta 0:e9a7a38d9ad3 65 if (strcmp(pinNameString, "p22") == 0) return p22;
ohneta 0:e9a7a38d9ad3 66 if (strcmp(pinNameString, "p23") == 0) return p23;
ohneta 0:e9a7a38d9ad3 67 if (strcmp(pinNameString, "p24") == 0) return p24;
ohneta 0:e9a7a38d9ad3 68 if (strcmp(pinNameString, "p25") == 0) return p25;
ohneta 0:e9a7a38d9ad3 69 if (strcmp(pinNameString, "p26") == 0) return p26;
ohneta 0:e9a7a38d9ad3 70 if (strcmp(pinNameString, "p27") == 0) return p27;
ohneta 0:e9a7a38d9ad3 71 if (strcmp(pinNameString, "p28") == 0) return p28;
ohneta 0:e9a7a38d9ad3 72 if (strcmp(pinNameString, "p29") == 0) return p29;
ohneta 0:e9a7a38d9ad3 73 if (strcmp(pinNameString, "p30") == 0) return p30;
ohneta 0:e9a7a38d9ad3 74
ohneta 0:e9a7a38d9ad3 75 if (strcmp(pinNameString, "LED1") == 0) return LED1;
ohneta 0:e9a7a38d9ad3 76 if (strcmp(pinNameString, "LED2") == 0) return LED2;
ohneta 0:e9a7a38d9ad3 77 if (strcmp(pinNameString, "LED3") == 0) return LED3;
ohneta 0:e9a7a38d9ad3 78 if (strcmp(pinNameString, "LED4") == 0) return LED4;
ohneta 0:e9a7a38d9ad3 79
ohneta 0:e9a7a38d9ad3 80 if (strcmp(pinNameString, "USBTX") == 0) return USBTX;
ohneta 0:e9a7a38d9ad3 81 if (strcmp(pinNameString, "USBRX") == 0) return USBRX;
ohneta 0:e9a7a38d9ad3 82
ohneta 0:e9a7a38d9ad3 83 return NC;
ohneta 0:e9a7a38d9ad3 84 }
ohneta 0:e9a7a38d9ad3 85
ohneta 0:e9a7a38d9ad3 86 PinMode _digitalPinMode(char *modeString)
ohneta 0:e9a7a38d9ad3 87 {
ohneta 0:e9a7a38d9ad3 88 PinMode mode = PullDown;
ohneta 0:e9a7a38d9ad3 89 if ( (strcmp(modeString, "PullUp") == 0) ||
ohneta 0:e9a7a38d9ad3 90 (strcmp(modeString, "PU") == 0) ) {
ohneta 0:e9a7a38d9ad3 91 mode = PullUp;
ohneta 0:e9a7a38d9ad3 92 } else if ( (strcmp(modeString, "PullNone") == 0) ||
ohneta 0:e9a7a38d9ad3 93 (strcmp(modeString, "PN") == 0) ) {
ohneta 0:e9a7a38d9ad3 94 mode = PullNone;
ohneta 0:e9a7a38d9ad3 95 } else if ( (strcmp(modeString, "PullDown") == 0) ||
ohneta 0:e9a7a38d9ad3 96 (strcmp(modeString, "PD") == 0) ) {
ohneta 0:e9a7a38d9ad3 97 mode = PullDown;
ohneta 0:e9a7a38d9ad3 98 } else if ( (strcmp(modeString, "OpenDrain") == 0) ||
ohneta 0:e9a7a38d9ad3 99 (strcmp(modeString, "OD") == 0) ) {
ohneta 0:e9a7a38d9ad3 100 mode = OpenDrain;
ohneta 0:e9a7a38d9ad3 101 }
ohneta 0:e9a7a38d9ad3 102
ohneta 0:e9a7a38d9ad3 103 return mode;
ohneta 0:e9a7a38d9ad3 104 }
ohneta 0:e9a7a38d9ad3 105
ohneta 0:e9a7a38d9ad3 106 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 107 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 108 /**
ohneta 0:e9a7a38d9ad3 109 * wait
ohneta 0:e9a7a38d9ad3 110 */
ohneta 0:e9a7a38d9ad3 111 LIST *mbed_wait(LIST *sec)
ohneta 0:e9a7a38d9ad3 112 {
ohneta 0:e9a7a38d9ad3 113 int t = type(sec);
ohneta 0:e9a7a38d9ad3 114 if (t != IATOM)
ohneta 0:e9a7a38d9ad3 115 return NULL;
ohneta 0:e9a7a38d9ad3 116
ohneta 0:e9a7a38d9ad3 117 wait(sec->u.num);
ohneta 0:e9a7a38d9ad3 118
ohneta 0:e9a7a38d9ad3 119 return TRU;
ohneta 0:e9a7a38d9ad3 120 }
ohneta 0:e9a7a38d9ad3 121
ohneta 0:e9a7a38d9ad3 122 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 123 /**
ohneta 0:e9a7a38d9ad3 124 * DigitalOut
ohneta 0:e9a7a38d9ad3 125 * lisp: (dout pinName data mode)
ohneta 0:e9a7a38d9ad3 126 */
ohneta 0:e9a7a38d9ad3 127 LIST *mbed_digitalout(LIST *pin, LIST *data)
ohneta 0:e9a7a38d9ad3 128 {
ohneta 0:e9a7a38d9ad3 129 PinName pinName = _mbed_pinNameExchange(getname(car(pin)));
ohneta 0:e9a7a38d9ad3 130 if (pinName == NC) {
ohneta 0:e9a7a38d9ad3 131 return NULL;
ohneta 0:e9a7a38d9ad3 132 }
ohneta 0:e9a7a38d9ad3 133 DigitalOut dout = DigitalOut(pinName);
ohneta 0:e9a7a38d9ad3 134 dout.write((int)data->u.num);
ohneta 0:e9a7a38d9ad3 135
ohneta 0:e9a7a38d9ad3 136 return TRU;
ohneta 0:e9a7a38d9ad3 137 }
ohneta 0:e9a7a38d9ad3 138
ohneta 0:e9a7a38d9ad3 139 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 140 /**
ohneta 0:e9a7a38d9ad3 141 * DigitalIn
ohneta 0:e9a7a38d9ad3 142 * lisp: (din pinName mode)
ohneta 0:e9a7a38d9ad3 143 */
ohneta 0:e9a7a38d9ad3 144 LIST *mbed_digitalin(LIST *pin, LIST *mode)
ohneta 0:e9a7a38d9ad3 145 {
ohneta 0:e9a7a38d9ad3 146 PinName pinName = _mbed_pinNameExchange(getname(car(pin)));
ohneta 0:e9a7a38d9ad3 147 if (pinName == NC) {
ohneta 0:e9a7a38d9ad3 148 return NULL;
ohneta 0:e9a7a38d9ad3 149 }
ohneta 0:e9a7a38d9ad3 150 char *pinModeStr = NULL;
ohneta 0:e9a7a38d9ad3 151
ohneta 0:e9a7a38d9ad3 152 if (mode != NULL) {
ohneta 0:e9a7a38d9ad3 153 pinModeStr = getname(car(mode));
ohneta 0:e9a7a38d9ad3 154 }
ohneta 0:e9a7a38d9ad3 155 PinMode pinMode = _digitalPinMode(pinModeStr);
ohneta 0:e9a7a38d9ad3 156
ohneta 0:e9a7a38d9ad3 157 DigitalIn din = DigitalIn(pinName, pinMode);
ohneta 0:e9a7a38d9ad3 158 int v = din.read();
ohneta 0:e9a7a38d9ad3 159
ohneta 0:e9a7a38d9ad3 160 LIST *p = cons(NULL, NULL);
ohneta 0:e9a7a38d9ad3 161
ohneta 0:e9a7a38d9ad3 162 p->u.num = v;
ohneta 0:e9a7a38d9ad3 163 rplact(p, IATOM);
ohneta 0:e9a7a38d9ad3 164
ohneta 0:e9a7a38d9ad3 165 return p;
ohneta 0:e9a7a38d9ad3 166 }
ohneta 0:e9a7a38d9ad3 167
ohneta 0:e9a7a38d9ad3 168 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 169 /**
ohneta 0:e9a7a38d9ad3 170 * AnalogOut
ohneta 0:e9a7a38d9ad3 171 * lisp: (aout pinName data)
ohneta 0:e9a7a38d9ad3 172 */
ohneta 0:e9a7a38d9ad3 173 LIST *mbed_analogout(LIST *pin, LIST *data)
ohneta 0:e9a7a38d9ad3 174 {
ohneta 0:e9a7a38d9ad3 175 PinName pinName = _mbed_pinNameExchange(getname(car(pin)));
ohneta 0:e9a7a38d9ad3 176 if (pinName == NC) {
ohneta 0:e9a7a38d9ad3 177 return NULL;
ohneta 0:e9a7a38d9ad3 178 }
ohneta 0:e9a7a38d9ad3 179 AnalogOut aout = AnalogOut(pinName);
ohneta 0:e9a7a38d9ad3 180 aout.write(data->u.num);
ohneta 0:e9a7a38d9ad3 181
ohneta 0:e9a7a38d9ad3 182 return TRU;
ohneta 0:e9a7a38d9ad3 183 }
ohneta 0:e9a7a38d9ad3 184
ohneta 0:e9a7a38d9ad3 185 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 186 /**
ohneta 0:e9a7a38d9ad3 187 * AnalogIn
ohneta 0:e9a7a38d9ad3 188 * lisp: (ain pinName)
ohneta 0:e9a7a38d9ad3 189 */
ohneta 0:e9a7a38d9ad3 190 LIST *mbed_analogin(LIST *pin)
ohneta 0:e9a7a38d9ad3 191 {
ohneta 0:e9a7a38d9ad3 192 PinName pinName = _mbed_pinNameExchange(getname(car(pin)));
ohneta 0:e9a7a38d9ad3 193 if (pinName == NC) {
ohneta 0:e9a7a38d9ad3 194 return NULL;
ohneta 0:e9a7a38d9ad3 195 }
ohneta 0:e9a7a38d9ad3 196 AnalogIn ain = AnalogIn(pinName);
ohneta 0:e9a7a38d9ad3 197 float v = ain.read();
ohneta 0:e9a7a38d9ad3 198
ohneta 0:e9a7a38d9ad3 199 LIST *p = cons(NULL, NULL);
ohneta 0:e9a7a38d9ad3 200 p->u.num = v;
ohneta 0:e9a7a38d9ad3 201 rplact(p, RATOM);
ohneta 0:e9a7a38d9ad3 202
ohneta 0:e9a7a38d9ad3 203 return p;
ohneta 0:e9a7a38d9ad3 204 }
ohneta 0:e9a7a38d9ad3 205
ohneta 0:e9a7a38d9ad3 206 //----------------------------------------------------------------------
ohneta 0:e9a7a38d9ad3 207 /**
ohneta 0:e9a7a38d9ad3 208 * PwmOut
ohneta 0:e9a7a38d9ad3 209 * lisp: (pwmout pinName period duty-cycle)
ohneta 0:e9a7a38d9ad3 210 */
ohneta 0:e9a7a38d9ad3 211 LIST *mbed_pwmout(LIST *pin, LIST *period, LIST *dcperc)
ohneta 0:e9a7a38d9ad3 212 {
ohneta 0:e9a7a38d9ad3 213 PinName pinName = _mbed_pinNameExchange(getname(car(pin)));
ohneta 0:e9a7a38d9ad3 214 if (pinName == NC) {
ohneta 0:e9a7a38d9ad3 215 return NULL;
ohneta 0:e9a7a38d9ad3 216 }
ohneta 0:e9a7a38d9ad3 217 PwmOut pwmout = PwmOut(pinName);
ohneta 0:e9a7a38d9ad3 218
ohneta 0:e9a7a38d9ad3 219 pwmout.period(period->u.num);
ohneta 0:e9a7a38d9ad3 220 pwmout.write(dcperc->u.num);
ohneta 0:e9a7a38d9ad3 221
ohneta 0:e9a7a38d9ad3 222 return TRU;
ohneta 0:e9a7a38d9ad3 223 }
ohneta 0:e9a7a38d9ad3 224
ohneta 0:e9a7a38d9ad3 225 //----------------------------------------------------------------------