This is a working HTTP server with I2C, GPIO and PWM commands accessible through URLs. It also includes the ability to serve files from an SD card.
Dependencies: EthernetInterfaceMuri SDFileSystem mbed-rtos mbed
Diff: muri.cpp
- Revision:
- 0:28bc7ce77e20
- Child:
- 1:64f023138627
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/muri.cpp Sat Sep 07 04:43:57 2013 +0000 @@ -0,0 +1,124 @@ +#include "mbed.h" +#include "muri.h" + +I2C i2c(p28, p27); + + +void cmd_i2c_write(char* qry, char* data, char* resp) +{ + int addr = 0; + int dlen = 0; + int dtmp = 0; + if (sscanf(qry, "?%2x", &addr) == 1) { + qry += 3; + while (sscanf(qry, "&%2x", &dtmp) == 1) { + data[dlen] = dtmp; + qry +=3; + dlen +=1; + } + } else { + dlen = -1; + } + if (dlen > 0 ) { + i2c.write(addr, data, dlen); + sprintf(resp,"200 %d\r\n", dlen); + } else { + if (dlen == 0) { + sprintf(resp,"204 No data to write: %s\r\n", qry); + } else { + sprintf(resp,"400 Invalid parameters: %s\r\n", qry); + + } + } +} + +void cmd_i2c_read(char* qry, char* data, char* resp) +{ + int addr = 0; + int dlen = 0; + int dcnt = 0; + if (sscanf(qry, "?%2x", &addr) == 1) { + qry += 3; + if (sscanf(qry, "&%2x", &dlen) == 1) { + if (i2c.read(addr, data, dlen)!=0) { + dlen = -1; + sprintf(resp, "500 I2C read failed\r\n"); + } + } else { + sprintf(resp, "400 Invalid data length: %s\r\n", qry); + } + } else { + dlen = -1; + sprintf(resp, "400 Invalid address: %s\r\n", qry); + } + if (dlen > 0) { + sprintf(resp,"200"); + resp += 3; + for (dcnt = 0; dcnt < dlen; dcnt++) { + sprintf(resp," %02x", data[dcnt]); + resp +=3; + } + } +} + +void cmd_i2c_addr_read(char* qry, char* data, char* resp) +{ + int addr = 0; + int radd = 0; + int dlen = 0; + int dcnt = 0; + if (sscanf(qry, "?%2x", &addr) == 1) { + qry += 3; + if (sscanf(qry, "&%2x", &radd) == 1) { + qry += 3; + if (sscanf(qry, "&%2x", &dlen) == 1) { + data[0] = radd; + i2c.write(addr, data, 1, false); + if (i2c.read(addr, data, dlen)!=0) { + dlen = -1; + sprintf(resp, "500 I2C read failed\r\n"); + } + } else { + sprintf(resp, "400 Invalid data length: %s\r\n", qry); + } + } else { + dlen = -1; + sprintf(resp, "400 Invalid register address: %s\r\n", qry); + } + } else { + dlen = -1; + sprintf(resp, "400 Invalid address: %s\r\n", qry); + } + if (dlen > 0) { + sprintf(resp,"200"); + resp += 3; + for (dcnt = 0; dcnt < dlen; dcnt++) { + sprintf(resp," %02x", data[dcnt]); + resp +=3; + } + } +} + + +void muri(char* uri, char* data, char* resp) +{ +// sprintf(resp, "501 %s", uri); +//} +//void get_cgi(char* uri, char* qry) +//{ + char *qry; + printf("muri uri: %s\n", uri); + qry = strstr(uri, "?"); + 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] + cmd_i2c_read(qry, data, resp); + } else if (!strncmp(uri, "i2car?", 6)) { // i2cAR [addr] [radd] [count] + cmd_i2c_addr_read(qry, data, resp); + } else { + sprintf(resp, "501 %s", uri); + } + printf("muri resp: %s\n", resp); +} + +