Lisp Interpreter for mbed LPC1768
Lisp Interpreter
(Marc Adler Lisp Interpreter, malisp)
mbed LPC1768 port by Takehisa Oneta (ohneta@gmail.com)
Diff: mbed_functions.cpp
- Revision:
- 0:e9a7a38d9ad3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_functions.cpp Sun Apr 17 11:59:13 2016 +0000 @@ -0,0 +1,225 @@ +/** + * + */ + +#include "mbed.h" +#include "mbed_functions.h" +#include "malisp.h" + +extern LIST *TRU; + +//---------------------------------------------------------------------- +// +size_t _getFreeMemorySize() +{ + size_t i = 0; + while(1) { + void *p = malloc(i); + if (p == NULL) { + break; + } + free(p); + i++; + } + + return i; +} + +LIST *memfreesize() +{ + //work_garbageCollect(NULL); + + size_t memsize = _getFreeMemorySize(); + + LIST *res = cons(NULL, NULL); + + res->u.num = memsize; + rplact(res, IATOM); + + return res; +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + +PinName _mbed_pinNameExchange(char *pinNameString) +{ + if (strcmp(pinNameString, "p5") == 0) return p5; + if (strcmp(pinNameString, "p6") == 0) return p6; + if (strcmp(pinNameString, "p7") == 0) return p7; + if (strcmp(pinNameString, "p8") == 0) return p8; + if (strcmp(pinNameString, "p9") == 0) return p9; + if (strcmp(pinNameString, "p10") == 0) return p10; + if (strcmp(pinNameString, "p11") == 0) return p11; + if (strcmp(pinNameString, "p12") == 0) return p12; + if (strcmp(pinNameString, "p13") == 0) return p13; + if (strcmp(pinNameString, "p14") == 0) return p14; + if (strcmp(pinNameString, "p15") == 0) return p15; + if (strcmp(pinNameString, "p16") == 0) return p16; + if (strcmp(pinNameString, "p17") == 0) return p17; + if (strcmp(pinNameString, "p18") == 0) return p18; + if (strcmp(pinNameString, "p19") == 0) return p19; + if (strcmp(pinNameString, "p20") == 0) return p20; + + if (strcmp(pinNameString, "p21") == 0) return p21; + if (strcmp(pinNameString, "p22") == 0) return p22; + if (strcmp(pinNameString, "p23") == 0) return p23; + if (strcmp(pinNameString, "p24") == 0) return p24; + if (strcmp(pinNameString, "p25") == 0) return p25; + if (strcmp(pinNameString, "p26") == 0) return p26; + if (strcmp(pinNameString, "p27") == 0) return p27; + if (strcmp(pinNameString, "p28") == 0) return p28; + if (strcmp(pinNameString, "p29") == 0) return p29; + if (strcmp(pinNameString, "p30") == 0) return p30; + + if (strcmp(pinNameString, "LED1") == 0) return LED1; + if (strcmp(pinNameString, "LED2") == 0) return LED2; + if (strcmp(pinNameString, "LED3") == 0) return LED3; + if (strcmp(pinNameString, "LED4") == 0) return LED4; + + if (strcmp(pinNameString, "USBTX") == 0) return USBTX; + if (strcmp(pinNameString, "USBRX") == 0) return USBRX; + + return NC; +} + +PinMode _digitalPinMode(char *modeString) +{ + PinMode mode = PullDown; + if ( (strcmp(modeString, "PullUp") == 0) || + (strcmp(modeString, "PU") == 0) ) { + mode = PullUp; + } else if ( (strcmp(modeString, "PullNone") == 0) || + (strcmp(modeString, "PN") == 0) ) { + mode = PullNone; + } else if ( (strcmp(modeString, "PullDown") == 0) || + (strcmp(modeString, "PD") == 0) ) { + mode = PullDown; + } else if ( (strcmp(modeString, "OpenDrain") == 0) || + (strcmp(modeString, "OD") == 0) ) { + mode = OpenDrain; + } + + return mode; +} + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +/** + * wait + */ +LIST *mbed_wait(LIST *sec) +{ + int t = type(sec); + if (t != IATOM) + return NULL; + + wait(sec->u.num); + + return TRU; +} + +//---------------------------------------------------------------------- +/** + * DigitalOut + * lisp: (dout pinName data mode) + */ +LIST *mbed_digitalout(LIST *pin, LIST *data) +{ + PinName pinName = _mbed_pinNameExchange(getname(car(pin))); + if (pinName == NC) { + return NULL; + } + DigitalOut dout = DigitalOut(pinName); + dout.write((int)data->u.num); + + return TRU; +} + +//---------------------------------------------------------------------- +/** + * DigitalIn + * lisp: (din pinName mode) + */ +LIST *mbed_digitalin(LIST *pin, LIST *mode) +{ + PinName pinName = _mbed_pinNameExchange(getname(car(pin))); + if (pinName == NC) { + return NULL; + } + char *pinModeStr = NULL; + + if (mode != NULL) { + pinModeStr = getname(car(mode)); + } + PinMode pinMode = _digitalPinMode(pinModeStr); + + DigitalIn din = DigitalIn(pinName, pinMode); + int v = din.read(); + + LIST *p = cons(NULL, NULL); + + p->u.num = v; + rplact(p, IATOM); + + return p; +} + +//---------------------------------------------------------------------- +/** + * AnalogOut + * lisp: (aout pinName data) + */ +LIST *mbed_analogout(LIST *pin, LIST *data) +{ + PinName pinName = _mbed_pinNameExchange(getname(car(pin))); + if (pinName == NC) { + return NULL; + } + AnalogOut aout = AnalogOut(pinName); + aout.write(data->u.num); + + return TRU; +} + +//---------------------------------------------------------------------- +/** + * AnalogIn + * lisp: (ain pinName) + */ +LIST *mbed_analogin(LIST *pin) +{ + PinName pinName = _mbed_pinNameExchange(getname(car(pin))); + if (pinName == NC) { + return NULL; + } + AnalogIn ain = AnalogIn(pinName); + float v = ain.read(); + + LIST *p = cons(NULL, NULL); + p->u.num = v; + rplact(p, RATOM); + + return p; +} + +//---------------------------------------------------------------------- +/** + * PwmOut + * lisp: (pwmout pinName period duty-cycle) + */ +LIST *mbed_pwmout(LIST *pin, LIST *period, LIST *dcperc) +{ + PinName pinName = _mbed_pinNameExchange(getname(car(pin))); + if (pinName == NC) { + return NULL; + } + PwmOut pwmout = PwmOut(pinName); + + pwmout.period(period->u.num); + pwmout.write(dcperc->u.num); + + return TRU; +} + +//----------------------------------------------------------------------