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
Diff: httpd_service.cpp
- Revision:
- 0:2ffd10976643
- Child:
- 2:d7ffadba49b9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/httpd_service.cpp Wed Mar 25 21:56:51 2015 +0000 @@ -0,0 +1,82 @@ +/* +* @file httpd_task.h +* +* @brief HTTPD service task +* +*/ + +#include "mbed.h" +#include "rtos.h" +#include "EthernetInterface.h" +#include "mbed_rpc.h" +#include "HTTPD.h" +#include "httpd_service.h" + +HTTPD *httpd; + +//LocalFileSystem local("local"); +DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4); + +void callback_cgi (int id) +{ + int i, n; + char buf[256]; + + strcpy(buf, httpd->getFilename(id)); + strcat(buf, "\r\n"); + strcat(buf, httpd->getQueryString(id)); + strcat(buf, "\r\n"); + n = strlen(buf); + + i = httpd->receive(id, &buf[n], sizeof(buf) - n); + if (i < 0) return; + i += n; + buf[i] = 0; + + printf("CGI %d %s\r\n", id, buf); + httpd->send(id, buf, i, "Content-Type: text/plain\r\n"); +} + +void callback_ws (int id) +{ + int i; + char buf[256]; + + i = httpd->receive(id, buf, sizeof(buf)); + if (i < 0) return; + buf[i] = 0; + + printf("WS %d %s\r\n", id, buf); + httpd->sendWebsocket(id, buf, i); +} + +void callback_rpc (int id) +{ + char buf[40], outbuf[40]; + + strcpy(buf, "/"); + httpd->urldecode(httpd->getFilename(id), &buf[1], sizeof(buf) - 2); + RPC::call(buf, outbuf); + + printf("RPC id %d '%s' '%s'\r\n", id, buf, outbuf); + httpd->send(id, outbuf, strlen(outbuf), "Content-Type: text/plain\r\n"); +} + +void httpd_start(int port) +{ +// RPC::add_rpc_class<RpcAnalogIn>(); +// RPC::add_rpc_class<RpcAnalogOut>(); + RPC::add_rpc_class<RpcDigitalIn>(); + RPC::add_rpc_class<RpcDigitalOut>(); + RPC::add_rpc_class<RpcDigitalInOut>(); + RPC::add_rpc_class<RpcPwmOut>(); + + httpd = new HTTPD; + httpd->attach("/cgi-bin/", &callback_cgi); + httpd->attach("/ws/", &callback_ws); + httpd->attach("/rpc/", &callback_rpc); + httpd->attach("/", "/local/"); + httpd->start(port); + printf("httpd ready\r\n"); +} +