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

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?

UserRevisionLine numberNew 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