Typical controller demo program based on Seeed Arch Max. Features: - Multi-thread architecture - Inter-thread message communication - Independent command shell using thread - HTTPD with CGI, WS, RPC - Key & value pair configuration load/save

Dependencies:   CMDB EthernetInterface HTTPD dconfig mbed-rpc mbed-rtos mbed storage_on_flash

Committer:
hillkim7
Date:
Fri Jul 03 11:53:23 2015 +0000
Revision:
3:df8a882e33a6
Parent:
2:d7ffadba49b9
Fix stack overflow problem in console task.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hillkim7 0:2ffd10976643 1 /*
hillkim7 0:2ffd10976643 2 * @file httpd_task.h
hillkim7 0:2ffd10976643 3 *
hillkim7 0:2ffd10976643 4 * @brief HTTPD service task
hillkim7 0:2ffd10976643 5 *
hillkim7 0:2ffd10976643 6 */
hillkim7 0:2ffd10976643 7
hillkim7 0:2ffd10976643 8 #include "mbed.h"
hillkim7 0:2ffd10976643 9 #include "rtos.h"
hillkim7 0:2ffd10976643 10 #include "EthernetInterface.h"
hillkim7 0:2ffd10976643 11 #include "mbed_rpc.h"
hillkim7 0:2ffd10976643 12 #include "HTTPD.h"
hillkim7 0:2ffd10976643 13 #include "httpd_service.h"
hillkim7 0:2ffd10976643 14
hillkim7 0:2ffd10976643 15 HTTPD *httpd;
hillkim7 0:2ffd10976643 16
hillkim7 0:2ffd10976643 17 //LocalFileSystem local("local");
hillkim7 0:2ffd10976643 18 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
hillkim7 0:2ffd10976643 19
hillkim7 0:2ffd10976643 20 void callback_cgi (int id)
hillkim7 0:2ffd10976643 21 {
hillkim7 0:2ffd10976643 22 int i, n;
hillkim7 0:2ffd10976643 23 char buf[256];
hillkim7 0:2ffd10976643 24
hillkim7 0:2ffd10976643 25 strcpy(buf, httpd->getFilename(id));
hillkim7 0:2ffd10976643 26 strcat(buf, "\r\n");
hillkim7 0:2ffd10976643 27 strcat(buf, httpd->getQueryString(id));
hillkim7 0:2ffd10976643 28 strcat(buf, "\r\n");
hillkim7 0:2ffd10976643 29 n = strlen(buf);
hillkim7 0:2ffd10976643 30
hillkim7 0:2ffd10976643 31 i = httpd->receive(id, &buf[n], sizeof(buf) - n);
hillkim7 0:2ffd10976643 32 if (i < 0) return;
hillkim7 0:2ffd10976643 33 i += n;
hillkim7 0:2ffd10976643 34 buf[i] = 0;
hillkim7 0:2ffd10976643 35
hillkim7 0:2ffd10976643 36 printf("CGI %d %s\r\n", id, buf);
hillkim7 0:2ffd10976643 37 httpd->send(id, buf, i, "Content-Type: text/plain\r\n");
hillkim7 0:2ffd10976643 38 }
hillkim7 0:2ffd10976643 39
hillkim7 0:2ffd10976643 40 void callback_ws (int id)
hillkim7 0:2ffd10976643 41 {
hillkim7 0:2ffd10976643 42 int i;
hillkim7 0:2ffd10976643 43 char buf[256];
hillkim7 0:2ffd10976643 44
hillkim7 2:d7ffadba49b9 45 i = httpd->receive(id, buf, sizeof(buf)-1);
hillkim7 0:2ffd10976643 46 if (i < 0) return;
hillkim7 0:2ffd10976643 47 buf[i] = 0;
hillkim7 0:2ffd10976643 48
hillkim7 2:d7ffadba49b9 49 //printf("WS %d %s\r\n", id, buf);
hillkim7 2:d7ffadba49b9 50 printf("WS%d %d\r\n", id, i);
hillkim7 0:2ffd10976643 51 httpd->sendWebsocket(id, buf, i);
hillkim7 0:2ffd10976643 52 }
hillkim7 0:2ffd10976643 53
hillkim7 0:2ffd10976643 54 void callback_rpc (int id)
hillkim7 0:2ffd10976643 55 {
hillkim7 0:2ffd10976643 56 char buf[40], outbuf[40];
hillkim7 0:2ffd10976643 57
hillkim7 0:2ffd10976643 58 strcpy(buf, "/");
hillkim7 0:2ffd10976643 59 httpd->urldecode(httpd->getFilename(id), &buf[1], sizeof(buf) - 2);
hillkim7 0:2ffd10976643 60 RPC::call(buf, outbuf);
hillkim7 0:2ffd10976643 61
hillkim7 0:2ffd10976643 62 printf("RPC id %d '%s' '%s'\r\n", id, buf, outbuf);
hillkim7 0:2ffd10976643 63 httpd->send(id, outbuf, strlen(outbuf), "Content-Type: text/plain\r\n");
hillkim7 0:2ffd10976643 64 }
hillkim7 0:2ffd10976643 65
hillkim7 0:2ffd10976643 66 void httpd_start(int port)
hillkim7 0:2ffd10976643 67 {
hillkim7 0:2ffd10976643 68 // RPC::add_rpc_class<RpcAnalogIn>();
hillkim7 0:2ffd10976643 69 // RPC::add_rpc_class<RpcAnalogOut>();
hillkim7 0:2ffd10976643 70 RPC::add_rpc_class<RpcDigitalIn>();
hillkim7 0:2ffd10976643 71 RPC::add_rpc_class<RpcDigitalOut>();
hillkim7 0:2ffd10976643 72 RPC::add_rpc_class<RpcDigitalInOut>();
hillkim7 0:2ffd10976643 73 RPC::add_rpc_class<RpcPwmOut>();
hillkim7 0:2ffd10976643 74
hillkim7 0:2ffd10976643 75 httpd = new HTTPD;
hillkim7 0:2ffd10976643 76 httpd->attach("/cgi-bin/", &callback_cgi);
hillkim7 0:2ffd10976643 77 httpd->attach("/ws/", &callback_ws);
hillkim7 0:2ffd10976643 78 httpd->attach("/rpc/", &callback_rpc);
hillkim7 0:2ffd10976643 79 httpd->attach("/", "/local/");
hillkim7 0:2ffd10976643 80 httpd->start(port);
hillkim7 0:2ffd10976643 81 printf("httpd ready\r\n");
hillkim7 0:2ffd10976643 82 }
hillkim7 0:2ffd10976643 83
hillkim7 2:d7ffadba49b9 84