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
httpd_service.cpp@3:df8a882e33a6, 2015-07-03 (annotated)
- 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?
User | Revision | Line number | New 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 |