IPS(Interpreter for Process Structures) for mbed
Dependencies: ConfigFile FATFileSystem mbed
IPS port from linux/unix version.
mbed_blinky.ips
0 VAR led1 " LED1 " DigitalOut led1 ! : main ANFANG 1 JA? 1 led1 @ write 200 wait_ms 0 led1 @ write 200 wait_ms DANN/NOCHMAL ; main
- ips-02.tgz - ips for linux/unix
- ipsdoc.zip - document
- https://bitbucket.org/va009039/ips/
Diff: mbedAPI.cpp
- Revision:
- 2:908338b1151a
- Child:
- 4:b62b40563944
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbedAPI.cpp Sat May 23 16:50:59 2015 +0900 @@ -0,0 +1,278 @@ +// mbedAPI.cpp 2015/5/22 +#include <algorithm> +#include "mbed.h" +#include "mbedAPI.h" +#include "PinNameTable.h" + +// $MBEDAPI +#define mbed_wait 1 +#define mbed_wait_ms 2 +#define mbed_DigitalOut 3 +#define mbed_DigitalIn 4 +#define mbed_DigitalInOut 5 +#define mbed_Timer 6 +#define mbed_RawSerial 7 +#define mbed_read 8 +#define mbed_write 9 +#define mbed_putc 10 +#define mbed_getc 11 +#define mbed_readable 12 +#define mbed_baud 13 +#define mbed_SPI 14 +#define mbed_I2C 15 +#define mbed_start 16 +#define mbed_stop 17 +#define mbed_reset 18 +#define mbed_read_ms 19 +#define mbed_read_us 20 +#define mbed_PwmOut 21 +#define mbed_period_ms 22 +#define mbed_period_us 23 +#define mbed_pulsewidth_ms 24 +#define mbed_pulsewidth_us 25 +#define mbed_AnalogIn 26 +#define mbed_read_u16 27 + +void mbedAPI::code() { + int f = ips.pull_ps(); + uint16_t a1; + switch(f) { + case mbed_wait_ms: + a1 = ips.pull_ps(); + wait_ms(a1); + break; + case mbed_Timer: + init<Timer>(f); + break; + case mbed_DigitalOut: + init<DigitalOut, PinName>(f); + break; + case mbed_DigitalIn: + init<DigitalIn, PinName>(f); + break; + case mbed_DigitalInOut: + init<DigitalInOut, PinName>(f); + break; + case mbed_AnalogIn: + init<AnalogIn, PinName>(f); + break; + case mbed_PwmOut: + init<PwmOut, PinName>(f); + break; + case mbed_RawSerial: + init<RawSerial, PinName, PinName>(f); + break; + case mbed_SPI: + init<SPI, PinName, PinName, PinName>(f); + break; + case mbed_I2C: + init<I2C, PinName, PinName>(f); + break; + default: + code_method(f); + break; + } +} + +void mbedAPI::code_method(int f) { + mbedObj obj = pull_ps_obj(); + uint16_t a1; + switch(obj.ct) { + case mbed_DigitalOut: + switch(f) { + case mbed_write: + method<DigitalOut, int, &DigitalOut::write>(obj.p); + break; + case mbed_read: + method<int, DigitalOut, &DigitalOut::read>(obj.p); + break; + default: + break; + } + break; + case mbed_DigitalInOut: + switch(f) { + case mbed_write: + method<DigitalInOut, int, &DigitalInOut::write>(obj.p); + break; + case mbed_read: + method<int, DigitalInOut, &DigitalInOut::read>(obj.p); + break; + default: + break; + } + break; + case mbed_AnalogIn: + switch(f) { + case mbed_read_u16: + method<unsigned short, AnalogIn, &AnalogIn::read_u16>(obj.p); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + case mbed_PwmOut: + switch(f) { + case mbed_period_ms: + method<PwmOut, int, &PwmOut::period_ms>(obj.p); + break; + case mbed_period_us: + method<PwmOut, int, &PwmOut::period_us>(obj.p); + break; + case mbed_pulsewidth_ms: + method<PwmOut, int, &PwmOut::pulsewidth_ms>(obj.p); + break; + case mbed_pulsewidth_us: + method<PwmOut, int, &PwmOut::pulsewidth_us>(obj.p); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + case mbed_Timer: + switch(f) { + case mbed_start: + method<Timer, &Timer::start>(obj.p); + break; + case mbed_stop: + method<Timer, &Timer::stop>(obj.p); + break; + case mbed_reset: + method<Timer, &Timer::reset>(obj.p); + break; + case mbed_read_ms: + method<int, Timer, &Timer::read_ms>(obj.p); + break; + case mbed_read_us: + method<int, Timer, &Timer::read_us>(obj.p); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + case mbed_DigitalIn: + switch(f) { + case mbed_read: + method<int, DigitalIn, &DigitalIn::read>(obj.p); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + case mbed_SPI: + switch(f) { + case mbed_write: + method<int, SPI, int, &SPI::write>(obj.p); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + case mbed_I2C: + code_method_I2C(f, obj); + break; + case mbed_RawSerial: + switch(f) { + case mbed_putc: + a1 = ips.pull_ps(); + reinterpret_cast<RawSerial*>(obj.p)->putc(a1); + break; + case mbed_getc: + method<int, RawSerial, &RawSerial::getc>(obj.p); + break; + case mbed_readable: + ips.push_ps(reinterpret_cast<RawSerial*>(obj.p)->readable()); + break; + case mbed_baud: + a1 = ips.pull_ps(); + reinterpret_cast<RawSerial*>(obj.p)->baud(a1); + break; + default: + error("%s %d", __LINE__, f); + break; + } + break; + default: + break; + } +} + +void mbedAPI::code_method_I2C(int f, mbedObj& obj) { + if (f == mbed_read) { + uint16_t a3 = ips.pull_ps(); // addr + uint16_t a2 = ips.pull_ps(); // data length + uint16_t a1 = ips.pull_ps(); // data pointer + char buf[a2]; + reinterpret_cast<I2C*>(obj.p)->read(a3, buf, a1); + for(int i = 0; i < a2; i++) { + ips.pokeB(a1 + i, buf[i]); + } + } else if (f == mbed_write) { + uint16_t a3 = ips.pull_ps(); // addr + uint16_t a2 = ips.pull_ps(); // data length + uint16_t a1 = ips.pull_ps(); // data pointer + char buf[a2]; + for(int i = 0; i < a2; i++) { + buf[i] = ips.peekB(a1 + i); + } + reinterpret_cast<I2C*>(obj.p)->write(a3, buf, a1); + } else { + error("%s %d", __LINE__, f); + } +} + +template<> +PinName mbedAPI::pull_ps<PinName>() { + char buf[64]; + pull_ps_string(buf, sizeof(buf)); + return findPinName(buf); +} + +mbedObj mbedAPI::pull_ps_obj() { + int i = ips.pull_ps(); + return objs[i]; +} + +void mbedAPI::pull_ps_string(char* buf, size_t size) { + size_t s_len = ips.pull_ps(); + int s_start = ips.pull_ps(); + s_len = std::min(s_len, size-1); + for(size_t i = 0; i < s_len; i++) { + buf[i] = ips.peekB(s_start + i); + } + buf[s_len] = '\0'; +} + +PinName mbedAPI::findPinName(const char* name) const { + int imin = 0; + int imax = sizeof(pinname_table) / sizeof(pinNameStr) - 1; + while(imax >= imin) { + int i = (imin + imax) / 2; + int c = strcmp(name, pinname_table[i].name); + if (c == 0) { + return pinname_table[i].pin; + } else if (c > 0) { + imin = i + 1; + } else { + imax = i - 1; + } + } + return NC; +} + +void mbedAPI::push_ps_obj(void* p, int ct) { + mbedObj obj; + obj.p = p; + obj.ct = ct; + objs.push_back(obj); + uint16_t r1 = objs.size() - 1; + ips.push_ps(r1); +} + + +