ARD2PMD Web Server Web Server using the ARD2PMD adapter and the SPI2SD adapter with the Seeeduino Arch Pro to serve files from the micro SD card and provide RESTful access to the Pmod connector
Dependencies: ARD2PMD EthernetInterface MAX14661 PmodInterface SDFileSystem mbed-rtos mbed
Fork of ARD2PMD_WebServer by
Revision 1:64f023138627, committed 2013-12-06
- Comitter:
- gsteiert
- Date:
- Fri Dec 06 03:57:29 2013 +0000
- Parent:
- 0:28bc7ce77e20
- Child:
- 2:5c9ce3b50de6
- Commit message:
- Committing for publishing
Changed in this revision
--- a/EthernetInterface.lib Sat Sep 07 04:43:57 2013 +0000 +++ b/EthernetInterface.lib Fri Dec 06 03:57:29 2013 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/EthernetInterface/#b6107798aa54 +http://mbed.org/users/mbed_official/code/EthernetInterface/#cba86db5ab96
--- a/main.cpp Sat Sep 07 04:43:57 2013 +0000 +++ b/main.cpp Fri Dec 06 03:57:29 2013 +0000 @@ -105,6 +105,8 @@ // TCPSocketServer server; server.bind(HTTPD_SERVER_PORT); server.listen(); + + init_dio(); //initialize pmd digital IO while (true) { printf("\nWait for new connection...\r\n");
--- a/muri.cpp Sat Sep 07 04:43:57 2013 +0000 +++ b/muri.cpp Fri Dec 06 03:57:29 2013 +0000 @@ -1,8 +1,58 @@ #include "mbed.h" +#include "rtos.h" #include "muri.h" I2C i2c(p28, p27); +//PwmOut pwm1(p26); +PwmOut pwm(p25); +DigitalInOut pmd1(p14); +DigitalInOut pmd2(p11); +DigitalInOut pmd3(p12); +DigitalInOut pmd4(p13); +DigitalInOut pmd7(p24); +DigitalInOut pmd8(p23); +DigitalInOut pmd9(p22); +DigitalInOut pmd10(p21); +osTimerDef(poff, pwm_off); +osTimerId off_timer; + +void init_dio() +{ + pmd1.mode(PullNone); + pmd1.mode(OpenDrain); + pmd1.write(1); + pmd1.output(); + pmd2.mode(PullNone); + pmd2.mode(OpenDrain); + pmd2.write(1); + pmd2.output(); + pmd3.mode(PullNone); + pmd3.mode(OpenDrain); + pmd3.write(1); + pmd3.output(); + pmd4.mode(PullNone); + pmd4.mode(OpenDrain); + pmd4.write(1); + pmd4.output(); + pmd7.mode(PullNone); + pmd7.mode(OpenDrain); + pmd7.write(1); + pmd7.output(); + pmd8.mode(PullNone); + pmd8.mode(OpenDrain); + pmd8.write(1); + pmd8.output(); + pmd9.mode(PullNone); + pmd9.mode(OpenDrain); + pmd9.write(1); + pmd9.output(); + pmd10.mode(PullNone); + pmd10.mode(OpenDrain); + pmd10.write(1); + pmd10.output(); + off_timer = osTimerCreate(osTimer(poff), osTimerOnce, NULL); +} void cmd_i2c_write(char* qry, char* data, char* resp) { @@ -99,6 +149,151 @@ } } +void cmd_pmd_setio(char* qry, char* data, char* resp) +{ + int pdir = -1; + int pdata = -1; + if (sscanf(qry, "?%2x", &pdir) == 1) { + if (pdir == 0) { + pmd1.mode(PullNone); + pmd2.mode(PullNone); + pmd3.mode(PullNone); + pmd4.mode(PullNone); + pmd7.mode(PullNone); + pmd8.mode(PullNone); + pmd9.mode(PullNone); + pmd10.mode(PullNone); + } else { + if (sscanf(qry+3, "&%2x", &pdata) == 1) { + if (pdir & (1 << 0)) { + if (pdata & (1 << 0)) pmd1.mode(PullUp); + else pmd1.mode(PullDown); + } else { + pmd1.mode(PullNone); + } + if (pdir & (1 << 1)) { + if (pdata & (1 << 1)) pmd2.mode(PullUp); + else pmd2.mode(PullDown); + } else { + pmd2.mode(PullNone); + } + if (pdir & (1 << 2)) { + if (pdata & (1 << 2)) pmd3.mode(PullUp); + else pmd3.mode(PullDown); + } else { + pmd3.mode(PullNone); + } + if (pdir & (1 << 3)) { + if (pdata & (1 << 3)) pmd4.mode(PullUp); + else pmd4.mode(PullDown); + } else { + pmd4.mode(PullNone); + } + if (pdir & (1 << 4)) { + if (pdata & (1 << 4)) pmd7.mode(PullUp); + else pmd7.mode(PullDown); + } else { + pmd7.mode(PullNone); + } + if (pdir & (1 << 5)) { + if (pdata & (1 << 5)) pmd8.mode(PullUp); + else pmd8.mode(PullDown); + } else { + pmd8.mode(PullNone); + } + if (pdir & (1 << 6)) { + if (pdata & (1 << 6)) pmd9.mode(PullUp); + else pmd9.mode(PullDown); + } else { + pmd9.mode(PullNone); + } + if (pdir & (1 << 7)) { + if (pdata & (1 << 7)) pmd10.mode(PullUp); + else pmd10.mode(PullDown); + } else { + pmd10.mode(PullNone); + } + } + } + + pdata = 0; + pdata += (pmd1 << 0); + pdata += (pmd2 << 1); + pdata += (pmd3 << 2); + pdata += (pmd4 << 3); + pdata += (pmd7 << 4); + pdata += (pmd8 << 5); + pdata += (pmd9 << 6); + pdata += (pmd10 << 7); + sprintf(resp,"200 %02x", pdata); + } else { + sprintf(resp,"400 Invalid parameters: %s\r\n", qry); + } +} + +void cmd_pmd_write(char* qry, char* data, char* resp) +{ + int pdata = -1; + if (sscanf(qry, "?%2x", &pdata) == 1) { + pmd1 = pdata & (1 << 0); + pmd2 = pdata & (1 << 1); + pmd3 = pdata & (1 << 2); + pmd4 = pdata & (1 << 3); + pmd7 = pdata & (1 << 4); + pmd8 = pdata & (1 << 5); + pmd9 = pdata & (1 << 6); + pmd10 = pdata & (1 << 7); + pdata = 0; + pdata += (pmd1 << 0); + pdata += (pmd2 << 1); + pdata += (pmd3 << 2); + pdata += (pmd4 << 3); + pdata += (pmd7 << 4); + pdata += (pmd8 << 5); + pdata += (pmd9 << 6); + pdata += (pmd10 << 7); + sprintf(resp,"200 %02x", pdata); + } else { + sprintf(resp,"400 Invalid parameters: %s\r\n", qry); + + } +} + +void cmd_pmd_read(char* qry, char* data, char* resp) +{ + int pdata = 0; + pdata += (pmd1 << 0); + pdata += (pmd2 << 1); + pdata += (pmd3 << 2); + pdata += (pmd4 << 3); + pdata += (pmd7 << 4); + pdata += (pmd8 << 5); + pdata += (pmd9 << 6); + pdata += (pmd10 << 7); + sprintf(resp,"200 %02x", pdata); +} + +void pwm_off(void const *arg) +{ +// pwm.period_us(0); + pwm.pulsewidth_us(0); +} + +void cmd_pwm_set(char* qry, char* data, char* resp) +{ + int pwmP = 0; + int pwmW = 0; + int pwmD = 0; + if (sscanf(qry, "?%4x&%4x&%4x", &pwmP, &pwmW, &pwmD) == 3) { + pwm.period_us(pwmP); + pwm.pulsewidth_us(pwmW); + osTimerStart(off_timer, pwmD); + sprintf(resp,"200 %04x %04x %04x", pwmP, pwmW, pwmD); + } else { + sprintf(resp,"400 Invalid parameters: %s\r\n", qry); + + } +} void muri(char* uri, char* data, char* resp) { @@ -109,12 +304,20 @@ char *qry; printf("muri uri: %s\n", uri); qry = strstr(uri, "?"); - if (!strncmp(uri, "i2cw?", 5)) { // i2cW [addr] [data] [data] [data] ... + if (!strncmp(uri, "i2cw?", 5)) { // i2cw [addr] [data] [data] [data] ... cmd_i2c_write(qry, data, resp); - } else if (!strncmp(uri, "i2cr?", 5)) { // i2cR [addr] [count] + } else if (!strncmp(uri, "i2cr?", 5)) { // i2cr [addr] [count] cmd_i2c_read(qry, data, resp); - } else if (!strncmp(uri, "i2car?", 6)) { // i2cAR [addr] [radd] [count] + } else if (!strncmp(uri, "i2car?", 6)) { // i2car [addr] [radd] [count] cmd_i2c_addr_read(qry, data, resp); + } else if (!strncmp(uri, "pmdio?", 6)) { // pmdio [dir] [data] + cmd_pmd_setio(qry, data, resp); + } else if (!strncmp(uri, "pmdw?", 5)) { // pmdw [data] + cmd_pmd_write(qry, data, resp); + } else if (!strncmp(uri, "pmdr", 4)) { // pmdr + cmd_pmd_read(qry, data, resp); + } else if (!strncmp(uri, "pwmd?", 5)) { // pwmd [period] [width] [duration] + cmd_pwm_set(qry, data, resp); } else { sprintf(resp, "501 %s", uri); }
--- a/muri.h Sat Sep 07 04:43:57 2013 +0000 +++ b/muri.h Fri Dec 06 03:57:29 2013 +0000 @@ -1,8 +1,15 @@ //I2C i2c(p28, p27); +void init_dio(); +void pwm_off(void const *arg); + void cmd_i2c_write(char* qry, char* data, char* resp); void cmd_i2c_read(char* qry, char* data, char* resp); void cmd_i2c_addr_read(char* qry, char* data, char* resp); +void cmd_pmd_setio(char* qry, char* data, char* resp); +void cmd_pmd_write(char* qry, char* data, char* resp); +void cmd_pmd_read(char* qry, char* data, char* resp); +void cmd_pwm_set(char* qry, char* data, char* resp); void muri(char* uri, char* data, char* resp);