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:
Fri Dec 06 03:59:01 2013 +0000
Revision:
2:5c9ce3b50de6
Parent:
1:64f023138627
Publishing project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsteiert 0:28bc7ce77e20 1 #include "mbed.h"
gsteiert 1:64f023138627 2 #include "rtos.h"
gsteiert 0:28bc7ce77e20 3 #include "muri.h"
gsteiert 0:28bc7ce77e20 4
gsteiert 0:28bc7ce77e20 5 I2C i2c(p28, p27);
gsteiert 1:64f023138627 6 //PwmOut pwm1(p26);
gsteiert 1:64f023138627 7 PwmOut pwm(p25);
gsteiert 1:64f023138627 8 DigitalInOut pmd1(p14);
gsteiert 1:64f023138627 9 DigitalInOut pmd2(p11);
gsteiert 1:64f023138627 10 DigitalInOut pmd3(p12);
gsteiert 1:64f023138627 11 DigitalInOut pmd4(p13);
gsteiert 1:64f023138627 12 DigitalInOut pmd7(p24);
gsteiert 1:64f023138627 13 DigitalInOut pmd8(p23);
gsteiert 1:64f023138627 14 DigitalInOut pmd9(p22);
gsteiert 1:64f023138627 15 DigitalInOut pmd10(p21);
gsteiert 0:28bc7ce77e20 16
gsteiert 1:64f023138627 17 osTimerDef(poff, pwm_off);
gsteiert 1:64f023138627 18 osTimerId off_timer;
gsteiert 1:64f023138627 19
gsteiert 1:64f023138627 20 void init_dio()
gsteiert 1:64f023138627 21 {
gsteiert 1:64f023138627 22 pmd1.mode(PullNone);
gsteiert 1:64f023138627 23 pmd1.mode(OpenDrain);
gsteiert 1:64f023138627 24 pmd1.write(1);
gsteiert 1:64f023138627 25 pmd1.output();
gsteiert 1:64f023138627 26 pmd2.mode(PullNone);
gsteiert 1:64f023138627 27 pmd2.mode(OpenDrain);
gsteiert 1:64f023138627 28 pmd2.write(1);
gsteiert 1:64f023138627 29 pmd2.output();
gsteiert 1:64f023138627 30 pmd3.mode(PullNone);
gsteiert 1:64f023138627 31 pmd3.mode(OpenDrain);
gsteiert 1:64f023138627 32 pmd3.write(1);
gsteiert 1:64f023138627 33 pmd3.output();
gsteiert 1:64f023138627 34 pmd4.mode(PullNone);
gsteiert 1:64f023138627 35 pmd4.mode(OpenDrain);
gsteiert 1:64f023138627 36 pmd4.write(1);
gsteiert 1:64f023138627 37 pmd4.output();
gsteiert 1:64f023138627 38 pmd7.mode(PullNone);
gsteiert 1:64f023138627 39 pmd7.mode(OpenDrain);
gsteiert 1:64f023138627 40 pmd7.write(1);
gsteiert 1:64f023138627 41 pmd7.output();
gsteiert 1:64f023138627 42 pmd8.mode(PullNone);
gsteiert 1:64f023138627 43 pmd8.mode(OpenDrain);
gsteiert 1:64f023138627 44 pmd8.write(1);
gsteiert 1:64f023138627 45 pmd8.output();
gsteiert 1:64f023138627 46 pmd9.mode(PullNone);
gsteiert 1:64f023138627 47 pmd9.mode(OpenDrain);
gsteiert 1:64f023138627 48 pmd9.write(1);
gsteiert 1:64f023138627 49 pmd9.output();
gsteiert 1:64f023138627 50 pmd10.mode(PullNone);
gsteiert 1:64f023138627 51 pmd10.mode(OpenDrain);
gsteiert 1:64f023138627 52 pmd10.write(1);
gsteiert 1:64f023138627 53 pmd10.output();
gsteiert 1:64f023138627 54 off_timer = osTimerCreate(osTimer(poff), osTimerOnce, NULL);
gsteiert 1:64f023138627 55 }
gsteiert 0:28bc7ce77e20 56
gsteiert 0:28bc7ce77e20 57 void cmd_i2c_write(char* qry, char* data, char* resp)
gsteiert 0:28bc7ce77e20 58 {
gsteiert 0:28bc7ce77e20 59 int addr = 0;
gsteiert 0:28bc7ce77e20 60 int dlen = 0;
gsteiert 0:28bc7ce77e20 61 int dtmp = 0;
gsteiert 0:28bc7ce77e20 62 if (sscanf(qry, "?%2x", &addr) == 1) {
gsteiert 0:28bc7ce77e20 63 qry += 3;
gsteiert 0:28bc7ce77e20 64 while (sscanf(qry, "&%2x", &dtmp) == 1) {
gsteiert 0:28bc7ce77e20 65 data[dlen] = dtmp;
gsteiert 0:28bc7ce77e20 66 qry +=3;
gsteiert 0:28bc7ce77e20 67 dlen +=1;
gsteiert 0:28bc7ce77e20 68 }
gsteiert 0:28bc7ce77e20 69 } else {
gsteiert 0:28bc7ce77e20 70 dlen = -1;
gsteiert 0:28bc7ce77e20 71 }
gsteiert 0:28bc7ce77e20 72 if (dlen > 0 ) {
gsteiert 0:28bc7ce77e20 73 i2c.write(addr, data, dlen);
gsteiert 0:28bc7ce77e20 74 sprintf(resp,"200 %d\r\n", dlen);
gsteiert 0:28bc7ce77e20 75 } else {
gsteiert 0:28bc7ce77e20 76 if (dlen == 0) {
gsteiert 0:28bc7ce77e20 77 sprintf(resp,"204 No data to write: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 78 } else {
gsteiert 0:28bc7ce77e20 79 sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 80
gsteiert 0:28bc7ce77e20 81 }
gsteiert 0:28bc7ce77e20 82 }
gsteiert 0:28bc7ce77e20 83 }
gsteiert 0:28bc7ce77e20 84
gsteiert 0:28bc7ce77e20 85 void cmd_i2c_read(char* qry, char* data, char* resp)
gsteiert 0:28bc7ce77e20 86 {
gsteiert 0:28bc7ce77e20 87 int addr = 0;
gsteiert 0:28bc7ce77e20 88 int dlen = 0;
gsteiert 0:28bc7ce77e20 89 int dcnt = 0;
gsteiert 0:28bc7ce77e20 90 if (sscanf(qry, "?%2x", &addr) == 1) {
gsteiert 0:28bc7ce77e20 91 qry += 3;
gsteiert 0:28bc7ce77e20 92 if (sscanf(qry, "&%2x", &dlen) == 1) {
gsteiert 0:28bc7ce77e20 93 if (i2c.read(addr, data, dlen)!=0) {
gsteiert 0:28bc7ce77e20 94 dlen = -1;
gsteiert 0:28bc7ce77e20 95 sprintf(resp, "500 I2C read failed\r\n");
gsteiert 0:28bc7ce77e20 96 }
gsteiert 0:28bc7ce77e20 97 } else {
gsteiert 0:28bc7ce77e20 98 sprintf(resp, "400 Invalid data length: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 99 }
gsteiert 0:28bc7ce77e20 100 } else {
gsteiert 0:28bc7ce77e20 101 dlen = -1;
gsteiert 0:28bc7ce77e20 102 sprintf(resp, "400 Invalid address: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 103 }
gsteiert 0:28bc7ce77e20 104 if (dlen > 0) {
gsteiert 0:28bc7ce77e20 105 sprintf(resp,"200");
gsteiert 0:28bc7ce77e20 106 resp += 3;
gsteiert 0:28bc7ce77e20 107 for (dcnt = 0; dcnt < dlen; dcnt++) {
gsteiert 0:28bc7ce77e20 108 sprintf(resp," %02x", data[dcnt]);
gsteiert 0:28bc7ce77e20 109 resp +=3;
gsteiert 0:28bc7ce77e20 110 }
gsteiert 0:28bc7ce77e20 111 }
gsteiert 0:28bc7ce77e20 112 }
gsteiert 0:28bc7ce77e20 113
gsteiert 0:28bc7ce77e20 114 void cmd_i2c_addr_read(char* qry, char* data, char* resp)
gsteiert 0:28bc7ce77e20 115 {
gsteiert 0:28bc7ce77e20 116 int addr = 0;
gsteiert 0:28bc7ce77e20 117 int radd = 0;
gsteiert 0:28bc7ce77e20 118 int dlen = 0;
gsteiert 0:28bc7ce77e20 119 int dcnt = 0;
gsteiert 0:28bc7ce77e20 120 if (sscanf(qry, "?%2x", &addr) == 1) {
gsteiert 0:28bc7ce77e20 121 qry += 3;
gsteiert 0:28bc7ce77e20 122 if (sscanf(qry, "&%2x", &radd) == 1) {
gsteiert 0:28bc7ce77e20 123 qry += 3;
gsteiert 0:28bc7ce77e20 124 if (sscanf(qry, "&%2x", &dlen) == 1) {
gsteiert 0:28bc7ce77e20 125 data[0] = radd;
gsteiert 0:28bc7ce77e20 126 i2c.write(addr, data, 1, false);
gsteiert 0:28bc7ce77e20 127 if (i2c.read(addr, data, dlen)!=0) {
gsteiert 0:28bc7ce77e20 128 dlen = -1;
gsteiert 0:28bc7ce77e20 129 sprintf(resp, "500 I2C read failed\r\n");
gsteiert 0:28bc7ce77e20 130 }
gsteiert 0:28bc7ce77e20 131 } else {
gsteiert 0:28bc7ce77e20 132 sprintf(resp, "400 Invalid data length: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 133 }
gsteiert 0:28bc7ce77e20 134 } else {
gsteiert 0:28bc7ce77e20 135 dlen = -1;
gsteiert 0:28bc7ce77e20 136 sprintf(resp, "400 Invalid register address: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 137 }
gsteiert 0:28bc7ce77e20 138 } else {
gsteiert 0:28bc7ce77e20 139 dlen = -1;
gsteiert 0:28bc7ce77e20 140 sprintf(resp, "400 Invalid address: %s\r\n", qry);
gsteiert 0:28bc7ce77e20 141 }
gsteiert 0:28bc7ce77e20 142 if (dlen > 0) {
gsteiert 0:28bc7ce77e20 143 sprintf(resp,"200");
gsteiert 0:28bc7ce77e20 144 resp += 3;
gsteiert 0:28bc7ce77e20 145 for (dcnt = 0; dcnt < dlen; dcnt++) {
gsteiert 0:28bc7ce77e20 146 sprintf(resp," %02x", data[dcnt]);
gsteiert 0:28bc7ce77e20 147 resp +=3;
gsteiert 0:28bc7ce77e20 148 }
gsteiert 0:28bc7ce77e20 149 }
gsteiert 0:28bc7ce77e20 150 }
gsteiert 0:28bc7ce77e20 151
gsteiert 1:64f023138627 152 void cmd_pmd_setio(char* qry, char* data, char* resp)
gsteiert 1:64f023138627 153 {
gsteiert 1:64f023138627 154 int pdir = -1;
gsteiert 1:64f023138627 155 int pdata = -1;
gsteiert 1:64f023138627 156 if (sscanf(qry, "?%2x", &pdir) == 1) {
gsteiert 1:64f023138627 157 if (pdir == 0) {
gsteiert 1:64f023138627 158 pmd1.mode(PullNone);
gsteiert 1:64f023138627 159 pmd2.mode(PullNone);
gsteiert 1:64f023138627 160 pmd3.mode(PullNone);
gsteiert 1:64f023138627 161 pmd4.mode(PullNone);
gsteiert 1:64f023138627 162 pmd7.mode(PullNone);
gsteiert 1:64f023138627 163 pmd8.mode(PullNone);
gsteiert 1:64f023138627 164 pmd9.mode(PullNone);
gsteiert 1:64f023138627 165 pmd10.mode(PullNone);
gsteiert 1:64f023138627 166 } else {
gsteiert 1:64f023138627 167 if (sscanf(qry+3, "&%2x", &pdata) == 1) {
gsteiert 1:64f023138627 168 if (pdir & (1 << 0)) {
gsteiert 1:64f023138627 169 if (pdata & (1 << 0)) pmd1.mode(PullUp);
gsteiert 1:64f023138627 170 else pmd1.mode(PullDown);
gsteiert 1:64f023138627 171 } else {
gsteiert 1:64f023138627 172 pmd1.mode(PullNone);
gsteiert 1:64f023138627 173 }
gsteiert 1:64f023138627 174 if (pdir & (1 << 1)) {
gsteiert 1:64f023138627 175 if (pdata & (1 << 1)) pmd2.mode(PullUp);
gsteiert 1:64f023138627 176 else pmd2.mode(PullDown);
gsteiert 1:64f023138627 177 } else {
gsteiert 1:64f023138627 178 pmd2.mode(PullNone);
gsteiert 1:64f023138627 179 }
gsteiert 1:64f023138627 180 if (pdir & (1 << 2)) {
gsteiert 1:64f023138627 181 if (pdata & (1 << 2)) pmd3.mode(PullUp);
gsteiert 1:64f023138627 182 else pmd3.mode(PullDown);
gsteiert 1:64f023138627 183 } else {
gsteiert 1:64f023138627 184 pmd3.mode(PullNone);
gsteiert 1:64f023138627 185 }
gsteiert 1:64f023138627 186 if (pdir & (1 << 3)) {
gsteiert 1:64f023138627 187 if (pdata & (1 << 3)) pmd4.mode(PullUp);
gsteiert 1:64f023138627 188 else pmd4.mode(PullDown);
gsteiert 1:64f023138627 189 } else {
gsteiert 1:64f023138627 190 pmd4.mode(PullNone);
gsteiert 1:64f023138627 191 }
gsteiert 1:64f023138627 192 if (pdir & (1 << 4)) {
gsteiert 1:64f023138627 193 if (pdata & (1 << 4)) pmd7.mode(PullUp);
gsteiert 1:64f023138627 194 else pmd7.mode(PullDown);
gsteiert 1:64f023138627 195 } else {
gsteiert 1:64f023138627 196 pmd7.mode(PullNone);
gsteiert 1:64f023138627 197 }
gsteiert 1:64f023138627 198 if (pdir & (1 << 5)) {
gsteiert 1:64f023138627 199 if (pdata & (1 << 5)) pmd8.mode(PullUp);
gsteiert 1:64f023138627 200 else pmd8.mode(PullDown);
gsteiert 1:64f023138627 201 } else {
gsteiert 1:64f023138627 202 pmd8.mode(PullNone);
gsteiert 1:64f023138627 203 }
gsteiert 1:64f023138627 204 if (pdir & (1 << 6)) {
gsteiert 1:64f023138627 205 if (pdata & (1 << 6)) pmd9.mode(PullUp);
gsteiert 1:64f023138627 206 else pmd9.mode(PullDown);
gsteiert 1:64f023138627 207 } else {
gsteiert 1:64f023138627 208 pmd9.mode(PullNone);
gsteiert 1:64f023138627 209 }
gsteiert 1:64f023138627 210 if (pdir & (1 << 7)) {
gsteiert 1:64f023138627 211 if (pdata & (1 << 7)) pmd10.mode(PullUp);
gsteiert 1:64f023138627 212 else pmd10.mode(PullDown);
gsteiert 1:64f023138627 213 } else {
gsteiert 1:64f023138627 214 pmd10.mode(PullNone);
gsteiert 1:64f023138627 215 }
gsteiert 1:64f023138627 216 }
gsteiert 1:64f023138627 217 }
gsteiert 1:64f023138627 218
gsteiert 1:64f023138627 219 pdata = 0;
gsteiert 1:64f023138627 220 pdata += (pmd1 << 0);
gsteiert 1:64f023138627 221 pdata += (pmd2 << 1);
gsteiert 1:64f023138627 222 pdata += (pmd3 << 2);
gsteiert 1:64f023138627 223 pdata += (pmd4 << 3);
gsteiert 1:64f023138627 224 pdata += (pmd7 << 4);
gsteiert 1:64f023138627 225 pdata += (pmd8 << 5);
gsteiert 1:64f023138627 226 pdata += (pmd9 << 6);
gsteiert 1:64f023138627 227 pdata += (pmd10 << 7);
gsteiert 1:64f023138627 228 sprintf(resp,"200 %02x", pdata);
gsteiert 1:64f023138627 229 } else {
gsteiert 1:64f023138627 230 sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
gsteiert 1:64f023138627 231 }
gsteiert 1:64f023138627 232 }
gsteiert 1:64f023138627 233
gsteiert 1:64f023138627 234 void cmd_pmd_write(char* qry, char* data, char* resp)
gsteiert 1:64f023138627 235 {
gsteiert 1:64f023138627 236 int pdata = -1;
gsteiert 1:64f023138627 237 if (sscanf(qry, "?%2x", &pdata) == 1) {
gsteiert 1:64f023138627 238 pmd1 = pdata & (1 << 0);
gsteiert 1:64f023138627 239 pmd2 = pdata & (1 << 1);
gsteiert 1:64f023138627 240 pmd3 = pdata & (1 << 2);
gsteiert 1:64f023138627 241 pmd4 = pdata & (1 << 3);
gsteiert 1:64f023138627 242 pmd7 = pdata & (1 << 4);
gsteiert 1:64f023138627 243 pmd8 = pdata & (1 << 5);
gsteiert 1:64f023138627 244 pmd9 = pdata & (1 << 6);
gsteiert 1:64f023138627 245 pmd10 = pdata & (1 << 7);
gsteiert 1:64f023138627 246 pdata = 0;
gsteiert 1:64f023138627 247 pdata += (pmd1 << 0);
gsteiert 1:64f023138627 248 pdata += (pmd2 << 1);
gsteiert 1:64f023138627 249 pdata += (pmd3 << 2);
gsteiert 1:64f023138627 250 pdata += (pmd4 << 3);
gsteiert 1:64f023138627 251 pdata += (pmd7 << 4);
gsteiert 1:64f023138627 252 pdata += (pmd8 << 5);
gsteiert 1:64f023138627 253 pdata += (pmd9 << 6);
gsteiert 1:64f023138627 254 pdata += (pmd10 << 7);
gsteiert 1:64f023138627 255 sprintf(resp,"200 %02x", pdata);
gsteiert 1:64f023138627 256 } else {
gsteiert 1:64f023138627 257 sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
gsteiert 1:64f023138627 258
gsteiert 1:64f023138627 259 }
gsteiert 1:64f023138627 260 }
gsteiert 1:64f023138627 261
gsteiert 1:64f023138627 262 void cmd_pmd_read(char* qry, char* data, char* resp)
gsteiert 1:64f023138627 263 {
gsteiert 1:64f023138627 264 int pdata = 0;
gsteiert 1:64f023138627 265 pdata += (pmd1 << 0);
gsteiert 1:64f023138627 266 pdata += (pmd2 << 1);
gsteiert 1:64f023138627 267 pdata += (pmd3 << 2);
gsteiert 1:64f023138627 268 pdata += (pmd4 << 3);
gsteiert 1:64f023138627 269 pdata += (pmd7 << 4);
gsteiert 1:64f023138627 270 pdata += (pmd8 << 5);
gsteiert 1:64f023138627 271 pdata += (pmd9 << 6);
gsteiert 1:64f023138627 272 pdata += (pmd10 << 7);
gsteiert 1:64f023138627 273 sprintf(resp,"200 %02x", pdata);
gsteiert 1:64f023138627 274 }
gsteiert 1:64f023138627 275
gsteiert 1:64f023138627 276 void pwm_off(void const *arg)
gsteiert 1:64f023138627 277 {
gsteiert 1:64f023138627 278 // pwm.period_us(0);
gsteiert 1:64f023138627 279 pwm.pulsewidth_us(0);
gsteiert 1:64f023138627 280 }
gsteiert 1:64f023138627 281
gsteiert 1:64f023138627 282 void cmd_pwm_set(char* qry, char* data, char* resp)
gsteiert 1:64f023138627 283 {
gsteiert 1:64f023138627 284 int pwmP = 0;
gsteiert 1:64f023138627 285 int pwmW = 0;
gsteiert 1:64f023138627 286 int pwmD = 0;
gsteiert 1:64f023138627 287 if (sscanf(qry, "?%4x&%4x&%4x", &pwmP, &pwmW, &pwmD) == 3) {
gsteiert 1:64f023138627 288 pwm.period_us(pwmP);
gsteiert 1:64f023138627 289 pwm.pulsewidth_us(pwmW);
gsteiert 1:64f023138627 290 osTimerStart(off_timer, pwmD);
gsteiert 1:64f023138627 291 sprintf(resp,"200 %04x %04x %04x", pwmP, pwmW, pwmD);
gsteiert 1:64f023138627 292 } else {
gsteiert 1:64f023138627 293 sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
gsteiert 1:64f023138627 294
gsteiert 1:64f023138627 295 }
gsteiert 1:64f023138627 296 }
gsteiert 0:28bc7ce77e20 297
gsteiert 0:28bc7ce77e20 298 void muri(char* uri, char* data, char* resp)
gsteiert 0:28bc7ce77e20 299 {
gsteiert 0:28bc7ce77e20 300 // sprintf(resp, "501 %s", uri);
gsteiert 0:28bc7ce77e20 301 //}
gsteiert 0:28bc7ce77e20 302 //void get_cgi(char* uri, char* qry)
gsteiert 0:28bc7ce77e20 303 //{
gsteiert 0:28bc7ce77e20 304 char *qry;
gsteiert 0:28bc7ce77e20 305 printf("muri uri: %s\n", uri);
gsteiert 0:28bc7ce77e20 306 qry = strstr(uri, "?");
gsteiert 1:64f023138627 307 if (!strncmp(uri, "i2cw?", 5)) { // i2cw [addr] [data] [data] [data] ...
gsteiert 0:28bc7ce77e20 308 cmd_i2c_write(qry, data, resp);
gsteiert 1:64f023138627 309 } else if (!strncmp(uri, "i2cr?", 5)) { // i2cr [addr] [count]
gsteiert 0:28bc7ce77e20 310 cmd_i2c_read(qry, data, resp);
gsteiert 1:64f023138627 311 } else if (!strncmp(uri, "i2car?", 6)) { // i2car [addr] [radd] [count]
gsteiert 0:28bc7ce77e20 312 cmd_i2c_addr_read(qry, data, resp);
gsteiert 1:64f023138627 313 } else if (!strncmp(uri, "pmdio?", 6)) { // pmdio [dir] [data]
gsteiert 1:64f023138627 314 cmd_pmd_setio(qry, data, resp);
gsteiert 1:64f023138627 315 } else if (!strncmp(uri, "pmdw?", 5)) { // pmdw [data]
gsteiert 1:64f023138627 316 cmd_pmd_write(qry, data, resp);
gsteiert 1:64f023138627 317 } else if (!strncmp(uri, "pmdr", 4)) { // pmdr
gsteiert 1:64f023138627 318 cmd_pmd_read(qry, data, resp);
gsteiert 1:64f023138627 319 } else if (!strncmp(uri, "pwmd?", 5)) { // pwmd [period] [width] [duration]
gsteiert 1:64f023138627 320 cmd_pwm_set(qry, data, resp);
gsteiert 0:28bc7ce77e20 321 } else {
gsteiert 0:28bc7ce77e20 322 sprintf(resp, "501 %s", uri);
gsteiert 0:28bc7ce77e20 323 }
gsteiert 0:28bc7ce77e20 324 printf("muri resp: %s\n", resp);
gsteiert 0:28bc7ce77e20 325 }
gsteiert 0:28bc7ce77e20 326
gsteiert 0:28bc7ce77e20 327