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:
0:2ffd10976643
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 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 }