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
muri.cpp
- Committer:
- gsteiert
- Date:
- 2013-09-07
- Revision:
- 0:28bc7ce77e20
- Child:
- 1:64f023138627
File content as of revision 0:28bc7ce77e20:
#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); }