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
main.cpp@3:df8a882e33a6, 2015-07-03 (annotated)
- Committer:
- hillkim7
- Date:
- Fri Jul 03 11:53:23 2015 +0000
- Revision:
- 3:df8a882e33a6
- Parent:
- 0:2ffd10976643
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 | Typical controller demo program based on Seeed Arch Max. |
hillkim7 | 0:2ffd10976643 | 3 | The mbed has potential power by combining variable library, this program unveils that kind of thing. |
hillkim7 | 0:2ffd10976643 | 4 | Features: |
hillkim7 | 0:2ffd10976643 | 5 | - Multi-thread architecture |
hillkim7 | 0:2ffd10976643 | 6 | - Inter-thread message communication |
hillkim7 | 0:2ffd10976643 | 7 | - Independent command shell using thread |
hillkim7 | 0:2ffd10976643 | 8 | - HTTPD with CGI, WS, RPC |
hillkim7 | 0:2ffd10976643 | 9 | - Key & value pair configuration load/save |
hillkim7 | 0:2ffd10976643 | 10 | */ |
hillkim7 | 0:2ffd10976643 | 11 | |
hillkim7 | 0:2ffd10976643 | 12 | #include "mbed.h" |
hillkim7 | 0:2ffd10976643 | 13 | #include "rtos.h" |
hillkim7 | 0:2ffd10976643 | 14 | #include "console.h" |
hillkim7 | 0:2ffd10976643 | 15 | #include "httpd_service.h" |
hillkim7 | 0:2ffd10976643 | 16 | #include "util.h" |
hillkim7 | 0:2ffd10976643 | 17 | #include "EthernetInterface.h" |
hillkim7 | 0:2ffd10976643 | 18 | #include "main.h" |
hillkim7 | 0:2ffd10976643 | 19 | |
hillkim7 | 0:2ffd10976643 | 20 | #define SUPPORT_CONSOLE 1 |
hillkim7 | 0:2ffd10976643 | 21 | #define SUPPORT_ETH 1 |
hillkim7 | 0:2ffd10976643 | 22 | #define SUPPORT_HTTPD 1 |
hillkim7 | 0:2ffd10976643 | 23 | |
hillkim7 | 0:2ffd10976643 | 24 | const unsigned connect_timeout_ms = 2000; |
hillkim7 | 0:2ffd10976643 | 25 | |
hillkim7 | 0:2ffd10976643 | 26 | static Mail<MainMessage_t, 5> _mainq; |
hillkim7 | 0:2ffd10976643 | 27 | |
hillkim7 | 0:2ffd10976643 | 28 | static DigitalOut _alive_led(LED1); |
hillkim7 | 0:2ffd10976643 | 29 | |
hillkim7 | 0:2ffd10976643 | 30 | EthernetInterface _eth; |
hillkim7 | 0:2ffd10976643 | 31 | MainConfig _config; |
hillkim7 | 0:2ffd10976643 | 32 | |
hillkim7 | 0:2ffd10976643 | 33 | static void eth_up_dhcp() |
hillkim7 | 0:2ffd10976643 | 34 | { |
hillkim7 | 0:2ffd10976643 | 35 | |
hillkim7 | 0:2ffd10976643 | 36 | printf("eth_up_dhcp: init()\r\n"); |
hillkim7 | 0:2ffd10976643 | 37 | _eth.init(); |
hillkim7 | 0:2ffd10976643 | 38 | _eth.connect(connect_timeout_ms); |
hillkim7 | 0:2ffd10976643 | 39 | } |
hillkim7 | 0:2ffd10976643 | 40 | |
hillkim7 | 0:2ffd10976643 | 41 | static void eth_up_static(const char *ip, const char *netmask, const char *gateway) |
hillkim7 | 0:2ffd10976643 | 42 | { |
hillkim7 | 0:2ffd10976643 | 43 | const unsigned static_connect_timeout_ms = 3; |
hillkim7 | 0:2ffd10976643 | 44 | |
hillkim7 | 0:2ffd10976643 | 45 | printf("eth_up_static: init('%s', '%s', '%s')\r\n", ip, netmask, gateway); |
hillkim7 | 0:2ffd10976643 | 46 | _eth.init(ip, netmask, gateway); |
hillkim7 | 0:2ffd10976643 | 47 | _eth.connect(static_connect_timeout_ms); |
hillkim7 | 0:2ffd10976643 | 48 | } |
hillkim7 | 0:2ffd10976643 | 49 | |
hillkim7 | 0:2ffd10976643 | 50 | static void eth_up() |
hillkim7 | 0:2ffd10976643 | 51 | { |
hillkim7 | 0:2ffd10976643 | 52 | _config.lock_config(); |
hillkim7 | 0:2ffd10976643 | 53 | if (_config.lookup("eth") == "dhcp") |
hillkim7 | 0:2ffd10976643 | 54 | eth_up_dhcp(); |
hillkim7 | 0:2ffd10976643 | 55 | else |
hillkim7 | 0:2ffd10976643 | 56 | eth_up_static(_config.lookup_as_cstr("ip", ""), _config.lookup_as_cstr("mask", ""), _config.lookup_as_cstr("gw", "")); |
hillkim7 | 0:2ffd10976643 | 57 | _config.unlock_config(); |
hillkim7 | 0:2ffd10976643 | 58 | } |
hillkim7 | 0:2ffd10976643 | 59 | |
hillkim7 | 0:2ffd10976643 | 60 | static void eth_stat() |
hillkim7 | 0:2ffd10976643 | 61 | { |
hillkim7 | 0:2ffd10976643 | 62 | printf("eth '%s', '%s', '%s'\r\n", _eth.getIPAddress(), _eth.getNetworkMask(), _eth.getGateway()); |
hillkim7 | 0:2ffd10976643 | 63 | } |
hillkim7 | 0:2ffd10976643 | 64 | |
hillkim7 | 0:2ffd10976643 | 65 | |
hillkim7 | 0:2ffd10976643 | 66 | bool send_main_message(MainMessageId msg_id, uint32_t msg_p1, uint32_t msg_p2) |
hillkim7 | 0:2ffd10976643 | 67 | { |
hillkim7 | 0:2ffd10976643 | 68 | MainMessage_t *msg = (MainMessage_t*)_mainq.alloc(); |
hillkim7 | 0:2ffd10976643 | 69 | |
hillkim7 | 0:2ffd10976643 | 70 | if (msg) { |
hillkim7 | 0:2ffd10976643 | 71 | msg->msg_id = msg_id; |
hillkim7 | 0:2ffd10976643 | 72 | msg->msg_p1 = msg_p1; |
hillkim7 | 0:2ffd10976643 | 73 | msg->msg_p2 = msg_p2; |
hillkim7 | 0:2ffd10976643 | 74 | _mainq.put(msg); |
hillkim7 | 0:2ffd10976643 | 75 | return true; |
hillkim7 | 0:2ffd10976643 | 76 | } else { |
hillkim7 | 0:2ffd10976643 | 77 | printf("_mainq.alloc fail\r\n"); |
hillkim7 | 0:2ffd10976643 | 78 | return false; |
hillkim7 | 0:2ffd10976643 | 79 | } |
hillkim7 | 0:2ffd10976643 | 80 | } |
hillkim7 | 0:2ffd10976643 | 81 | |
hillkim7 | 0:2ffd10976643 | 82 | static void on_main_message(MainMessageId msg_id, uint32_t msg_p1, uint32_t msg_p2) |
hillkim7 | 0:2ffd10976643 | 83 | { |
hillkim7 | 0:2ffd10976643 | 84 | switch (msg_id) { |
hillkim7 | 0:2ffd10976643 | 85 | case MSG_IFUP: |
hillkim7 | 0:2ffd10976643 | 86 | printf("eth connect: %d\r\n", _eth.connect(1000)); |
hillkim7 | 0:2ffd10976643 | 87 | break; |
hillkim7 | 0:2ffd10976643 | 88 | case MSG_IFDOWN: |
hillkim7 | 0:2ffd10976643 | 89 | printf("eth disconnect\r\n"); |
hillkim7 | 0:2ffd10976643 | 90 | _eth.disconnect(); |
hillkim7 | 0:2ffd10976643 | 91 | break; |
hillkim7 | 0:2ffd10976643 | 92 | case MSG_IFSTAT: |
hillkim7 | 0:2ffd10976643 | 93 | eth_stat(); |
hillkim7 | 0:2ffd10976643 | 94 | break; |
hillkim7 | 0:2ffd10976643 | 95 | } |
hillkim7 | 0:2ffd10976643 | 96 | } |
hillkim7 | 0:2ffd10976643 | 97 | |
hillkim7 | 0:2ffd10976643 | 98 | int main() |
hillkim7 | 0:2ffd10976643 | 99 | { |
hillkim7 | 0:2ffd10976643 | 100 | Serial pc(USBTX, USBRX); |
hillkim7 | 0:2ffd10976643 | 101 | |
hillkim7 | 0:2ffd10976643 | 102 | pc.baud(115200); |
hillkim7 | 0:2ffd10976643 | 103 | pc.printf("built at " __DATE__ " " __TIME__ "\r\n"); |
hillkim7 | 0:2ffd10976643 | 104 | pc.printf("memory stat:\r\n"); |
hillkim7 | 0:2ffd10976643 | 105 | print_memstat(); |
hillkim7 | 0:2ffd10976643 | 106 | |
hillkim7 | 0:2ffd10976643 | 107 | if (!_config.load_config()) { |
hillkim7 | 0:2ffd10976643 | 108 | printf("load_config fail: reset_default()\r\n"); |
hillkim7 | 0:2ffd10976643 | 109 | _config.reset_default(); |
hillkim7 | 0:2ffd10976643 | 110 | } |
hillkim7 | 0:2ffd10976643 | 111 | |
hillkim7 | 0:2ffd10976643 | 112 | #if SUPPORT_CONSOLE |
hillkim7 | 0:2ffd10976643 | 113 | printf("SUPPORT_CONSOLE\r\n"); |
hillkim7 | 0:2ffd10976643 | 114 | Thread console(console_thread, &pc, osPriorityNormal, CONSOLE_STACK_SIZE); |
hillkim7 | 0:2ffd10976643 | 115 | #endif |
hillkim7 | 0:2ffd10976643 | 116 | |
hillkim7 | 0:2ffd10976643 | 117 | #if SUPPORT_ETH |
hillkim7 | 0:2ffd10976643 | 118 | printf("SUPPORT_ETH\r\n"); |
hillkim7 | 0:2ffd10976643 | 119 | eth_up(); |
hillkim7 | 0:2ffd10976643 | 120 | |
hillkim7 | 0:2ffd10976643 | 121 | #if SUPPORT_HTTPD |
hillkim7 | 0:2ffd10976643 | 122 | httpd_start(80); |
hillkim7 | 0:2ffd10976643 | 123 | #endif |
hillkim7 | 0:2ffd10976643 | 124 | #endif |
hillkim7 | 0:2ffd10976643 | 125 | |
hillkim7 | 0:2ffd10976643 | 126 | while (1) { |
hillkim7 | 0:2ffd10976643 | 127 | const uint32_t wait_ms = 100; |
hillkim7 | 0:2ffd10976643 | 128 | osEvent evt = _mainq.get(wait_ms); |
hillkim7 | 0:2ffd10976643 | 129 | |
hillkim7 | 0:2ffd10976643 | 130 | if (evt.status == osEventMail) { |
hillkim7 | 0:2ffd10976643 | 131 | MainMessage_t *msg = (MainMessage_t*)evt.value.p; |
hillkim7 | 0:2ffd10976643 | 132 | |
hillkim7 | 0:2ffd10976643 | 133 | on_main_message(msg->msg_id, msg->msg_p1, msg->msg_p2); |
hillkim7 | 0:2ffd10976643 | 134 | _mainq.free(msg); |
hillkim7 | 0:2ffd10976643 | 135 | } |
hillkim7 | 0:2ffd10976643 | 136 | |
hillkim7 | 0:2ffd10976643 | 137 | _alive_led = !_alive_led; |
hillkim7 | 0:2ffd10976643 | 138 | } |
hillkim7 | 0:2ffd10976643 | 139 | |
hillkim7 | 0:2ffd10976643 | 140 | return 0; |
hillkim7 | 0:2ffd10976643 | 141 | } |
hillkim7 | 0:2ffd10976643 | 142 | |
hillkim7 | 0:2ffd10976643 | 143 | /** |
hillkim7 | 0:2ffd10976643 | 144 | * Overriding MAC address |
hillkim7 | 0:2ffd10976643 | 145 | */ |
hillkim7 | 0:2ffd10976643 | 146 | void mbed_mac_address(char *mac) |
hillkim7 | 0:2ffd10976643 | 147 | { |
hillkim7 | 0:2ffd10976643 | 148 | // Change ethernet mac address of device. |
hillkim7 | 0:2ffd10976643 | 149 | mac[0] = 0x00; |
hillkim7 | 0:2ffd10976643 | 150 | mac[1] = 0x80; |
hillkim7 | 0:2ffd10976643 | 151 | mac[2] = 0xE1; |
hillkim7 | 0:2ffd10976643 | 152 | mac[3] = 0x00; |
hillkim7 | 0:2ffd10976643 | 153 | mac[4] = 0x02; |
hillkim7 | 0:2ffd10976643 | 154 | mac[5] = 0x01; |
hillkim7 | 0:2ffd10976643 | 155 | } |