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@0:28bc7ce77e20, 2013-09-07 (annotated)
- Committer:
- gsteiert
- Date:
- Sat Sep 07 04:43:57 2013 +0000
- Revision:
- 0:28bc7ce77e20
- Child:
- 1:64f023138627
Basic I2C functionality
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gsteiert | 0:28bc7ce77e20 | 1 | #include "mbed.h" |
gsteiert | 0:28bc7ce77e20 | 2 | #include "muri.h" |
gsteiert | 0:28bc7ce77e20 | 3 | |
gsteiert | 0:28bc7ce77e20 | 4 | I2C i2c(p28, p27); |
gsteiert | 0:28bc7ce77e20 | 5 | |
gsteiert | 0:28bc7ce77e20 | 6 | |
gsteiert | 0:28bc7ce77e20 | 7 | void cmd_i2c_write(char* qry, char* data, char* resp) |
gsteiert | 0:28bc7ce77e20 | 8 | { |
gsteiert | 0:28bc7ce77e20 | 9 | int addr = 0; |
gsteiert | 0:28bc7ce77e20 | 10 | int dlen = 0; |
gsteiert | 0:28bc7ce77e20 | 11 | int dtmp = 0; |
gsteiert | 0:28bc7ce77e20 | 12 | if (sscanf(qry, "?%2x", &addr) == 1) { |
gsteiert | 0:28bc7ce77e20 | 13 | qry += 3; |
gsteiert | 0:28bc7ce77e20 | 14 | while (sscanf(qry, "&%2x", &dtmp) == 1) { |
gsteiert | 0:28bc7ce77e20 | 15 | data[dlen] = dtmp; |
gsteiert | 0:28bc7ce77e20 | 16 | qry +=3; |
gsteiert | 0:28bc7ce77e20 | 17 | dlen +=1; |
gsteiert | 0:28bc7ce77e20 | 18 | } |
gsteiert | 0:28bc7ce77e20 | 19 | } else { |
gsteiert | 0:28bc7ce77e20 | 20 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 21 | } |
gsteiert | 0:28bc7ce77e20 | 22 | if (dlen > 0 ) { |
gsteiert | 0:28bc7ce77e20 | 23 | i2c.write(addr, data, dlen); |
gsteiert | 0:28bc7ce77e20 | 24 | sprintf(resp,"200 %d\r\n", dlen); |
gsteiert | 0:28bc7ce77e20 | 25 | } else { |
gsteiert | 0:28bc7ce77e20 | 26 | if (dlen == 0) { |
gsteiert | 0:28bc7ce77e20 | 27 | sprintf(resp,"204 No data to write: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 28 | } else { |
gsteiert | 0:28bc7ce77e20 | 29 | sprintf(resp,"400 Invalid parameters: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 30 | |
gsteiert | 0:28bc7ce77e20 | 31 | } |
gsteiert | 0:28bc7ce77e20 | 32 | } |
gsteiert | 0:28bc7ce77e20 | 33 | } |
gsteiert | 0:28bc7ce77e20 | 34 | |
gsteiert | 0:28bc7ce77e20 | 35 | void cmd_i2c_read(char* qry, char* data, char* resp) |
gsteiert | 0:28bc7ce77e20 | 36 | { |
gsteiert | 0:28bc7ce77e20 | 37 | int addr = 0; |
gsteiert | 0:28bc7ce77e20 | 38 | int dlen = 0; |
gsteiert | 0:28bc7ce77e20 | 39 | int dcnt = 0; |
gsteiert | 0:28bc7ce77e20 | 40 | if (sscanf(qry, "?%2x", &addr) == 1) { |
gsteiert | 0:28bc7ce77e20 | 41 | qry += 3; |
gsteiert | 0:28bc7ce77e20 | 42 | if (sscanf(qry, "&%2x", &dlen) == 1) { |
gsteiert | 0:28bc7ce77e20 | 43 | if (i2c.read(addr, data, dlen)!=0) { |
gsteiert | 0:28bc7ce77e20 | 44 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 45 | sprintf(resp, "500 I2C read failed\r\n"); |
gsteiert | 0:28bc7ce77e20 | 46 | } |
gsteiert | 0:28bc7ce77e20 | 47 | } else { |
gsteiert | 0:28bc7ce77e20 | 48 | sprintf(resp, "400 Invalid data length: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 49 | } |
gsteiert | 0:28bc7ce77e20 | 50 | } else { |
gsteiert | 0:28bc7ce77e20 | 51 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 52 | sprintf(resp, "400 Invalid address: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 53 | } |
gsteiert | 0:28bc7ce77e20 | 54 | if (dlen > 0) { |
gsteiert | 0:28bc7ce77e20 | 55 | sprintf(resp,"200"); |
gsteiert | 0:28bc7ce77e20 | 56 | resp += 3; |
gsteiert | 0:28bc7ce77e20 | 57 | for (dcnt = 0; dcnt < dlen; dcnt++) { |
gsteiert | 0:28bc7ce77e20 | 58 | sprintf(resp," %02x", data[dcnt]); |
gsteiert | 0:28bc7ce77e20 | 59 | resp +=3; |
gsteiert | 0:28bc7ce77e20 | 60 | } |
gsteiert | 0:28bc7ce77e20 | 61 | } |
gsteiert | 0:28bc7ce77e20 | 62 | } |
gsteiert | 0:28bc7ce77e20 | 63 | |
gsteiert | 0:28bc7ce77e20 | 64 | void cmd_i2c_addr_read(char* qry, char* data, char* resp) |
gsteiert | 0:28bc7ce77e20 | 65 | { |
gsteiert | 0:28bc7ce77e20 | 66 | int addr = 0; |
gsteiert | 0:28bc7ce77e20 | 67 | int radd = 0; |
gsteiert | 0:28bc7ce77e20 | 68 | int dlen = 0; |
gsteiert | 0:28bc7ce77e20 | 69 | int dcnt = 0; |
gsteiert | 0:28bc7ce77e20 | 70 | if (sscanf(qry, "?%2x", &addr) == 1) { |
gsteiert | 0:28bc7ce77e20 | 71 | qry += 3; |
gsteiert | 0:28bc7ce77e20 | 72 | if (sscanf(qry, "&%2x", &radd) == 1) { |
gsteiert | 0:28bc7ce77e20 | 73 | qry += 3; |
gsteiert | 0:28bc7ce77e20 | 74 | if (sscanf(qry, "&%2x", &dlen) == 1) { |
gsteiert | 0:28bc7ce77e20 | 75 | data[0] = radd; |
gsteiert | 0:28bc7ce77e20 | 76 | i2c.write(addr, data, 1, false); |
gsteiert | 0:28bc7ce77e20 | 77 | if (i2c.read(addr, data, dlen)!=0) { |
gsteiert | 0:28bc7ce77e20 | 78 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 79 | sprintf(resp, "500 I2C read failed\r\n"); |
gsteiert | 0:28bc7ce77e20 | 80 | } |
gsteiert | 0:28bc7ce77e20 | 81 | } else { |
gsteiert | 0:28bc7ce77e20 | 82 | sprintf(resp, "400 Invalid data length: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 83 | } |
gsteiert | 0:28bc7ce77e20 | 84 | } else { |
gsteiert | 0:28bc7ce77e20 | 85 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 86 | sprintf(resp, "400 Invalid register address: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 87 | } |
gsteiert | 0:28bc7ce77e20 | 88 | } else { |
gsteiert | 0:28bc7ce77e20 | 89 | dlen = -1; |
gsteiert | 0:28bc7ce77e20 | 90 | sprintf(resp, "400 Invalid address: %s\r\n", qry); |
gsteiert | 0:28bc7ce77e20 | 91 | } |
gsteiert | 0:28bc7ce77e20 | 92 | if (dlen > 0) { |
gsteiert | 0:28bc7ce77e20 | 93 | sprintf(resp,"200"); |
gsteiert | 0:28bc7ce77e20 | 94 | resp += 3; |
gsteiert | 0:28bc7ce77e20 | 95 | for (dcnt = 0; dcnt < dlen; dcnt++) { |
gsteiert | 0:28bc7ce77e20 | 96 | sprintf(resp," %02x", data[dcnt]); |
gsteiert | 0:28bc7ce77e20 | 97 | resp +=3; |
gsteiert | 0:28bc7ce77e20 | 98 | } |
gsteiert | 0:28bc7ce77e20 | 99 | } |
gsteiert | 0:28bc7ce77e20 | 100 | } |
gsteiert | 0:28bc7ce77e20 | 101 | |
gsteiert | 0:28bc7ce77e20 | 102 | |
gsteiert | 0:28bc7ce77e20 | 103 | void muri(char* uri, char* data, char* resp) |
gsteiert | 0:28bc7ce77e20 | 104 | { |
gsteiert | 0:28bc7ce77e20 | 105 | // sprintf(resp, "501 %s", uri); |
gsteiert | 0:28bc7ce77e20 | 106 | //} |
gsteiert | 0:28bc7ce77e20 | 107 | //void get_cgi(char* uri, char* qry) |
gsteiert | 0:28bc7ce77e20 | 108 | //{ |
gsteiert | 0:28bc7ce77e20 | 109 | char *qry; |
gsteiert | 0:28bc7ce77e20 | 110 | printf("muri uri: %s\n", uri); |
gsteiert | 0:28bc7ce77e20 | 111 | qry = strstr(uri, "?"); |
gsteiert | 0:28bc7ce77e20 | 112 | if (!strncmp(uri, "i2cw?", 5)) { // i2cW [addr] [data] [data] [data] ... |
gsteiert | 0:28bc7ce77e20 | 113 | cmd_i2c_write(qry, data, resp); |
gsteiert | 0:28bc7ce77e20 | 114 | } else if (!strncmp(uri, "i2cr?", 5)) { // i2cR [addr] [count] |
gsteiert | 0:28bc7ce77e20 | 115 | cmd_i2c_read(qry, data, resp); |
gsteiert | 0:28bc7ce77e20 | 116 | } else if (!strncmp(uri, "i2car?", 6)) { // i2cAR [addr] [radd] [count] |
gsteiert | 0:28bc7ce77e20 | 117 | cmd_i2c_addr_read(qry, data, resp); |
gsteiert | 0:28bc7ce77e20 | 118 | } else { |
gsteiert | 0:28bc7ce77e20 | 119 | sprintf(resp, "501 %s", uri); |
gsteiert | 0:28bc7ce77e20 | 120 | } |
gsteiert | 0:28bc7ce77e20 | 121 | printf("muri resp: %s\n", resp); |
gsteiert | 0:28bc7ce77e20 | 122 | } |
gsteiert | 0:28bc7ce77e20 | 123 | |
gsteiert | 0:28bc7ce77e20 | 124 |