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

Revision:
0:2ffd10976643
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Mar 25 21:56:51 2015 +0000
@@ -0,0 +1,155 @@
+/**
+Typical controller demo program based on Seeed Arch Max.
+The mbed has potential power by combining variable library, this program unveils that kind of thing.
+Features:
+- Multi-thread architecture
+- Inter-thread message communication
+- Independent command shell using thread
+- HTTPD with CGI, WS, RPC
+- Key & value pair configuration load/save
+*/
+
+#include "mbed.h"
+#include "rtos.h"
+#include "console.h"
+#include "httpd_service.h"
+#include "util.h"
+#include "EthernetInterface.h"
+#include "main.h"
+
+#define SUPPORT_CONSOLE			1
+#define SUPPORT_ETH				1
+#define SUPPORT_HTTPD			1
+
+const unsigned connect_timeout_ms = 2000;
+
+static Mail<MainMessage_t, 5> _mainq;
+
+static DigitalOut _alive_led(LED1);
+
+EthernetInterface _eth;
+MainConfig _config;
+
+static void eth_up_dhcp()
+{
+
+    printf("eth_up_dhcp: init()\r\n");
+    _eth.init();
+    _eth.connect(connect_timeout_ms);
+}
+
+static void eth_up_static(const char *ip, const char *netmask, const char *gateway)
+{
+    const unsigned static_connect_timeout_ms = 3;
+
+    printf("eth_up_static: init('%s', '%s', '%s')\r\n", ip, netmask, gateway);
+    _eth.init(ip, netmask, gateway);
+    _eth.connect(static_connect_timeout_ms);
+}
+
+static void eth_up()
+{
+    _config.lock_config();
+    if (_config.lookup("eth") == "dhcp")
+        eth_up_dhcp();
+    else
+        eth_up_static(_config.lookup_as_cstr("ip", ""), _config.lookup_as_cstr("mask", ""), _config.lookup_as_cstr("gw", ""));
+    _config.unlock_config();
+}
+
+static void eth_stat()
+{
+    printf("eth '%s', '%s', '%s'\r\n", _eth.getIPAddress(), _eth.getNetworkMask(), _eth.getGateway());
+}
+
+
+bool send_main_message(MainMessageId msg_id, uint32_t msg_p1, uint32_t msg_p2)
+{
+    MainMessage_t *msg = (MainMessage_t*)_mainq.alloc();
+
+    if (msg) {
+        msg->msg_id = msg_id;
+        msg->msg_p1 = msg_p1;
+        msg->msg_p2 = msg_p2;
+        _mainq.put(msg);
+        return true;
+    } else {
+        printf("_mainq.alloc fail\r\n");
+        return false;
+    }
+}
+
+static void on_main_message(MainMessageId msg_id, uint32_t msg_p1, uint32_t msg_p2)
+{
+    switch (msg_id) {
+        case MSG_IFUP:
+            printf("eth connect: %d\r\n", _eth.connect(1000));
+            break;
+        case MSG_IFDOWN:
+            printf("eth disconnect\r\n");
+            _eth.disconnect();
+            break;
+        case MSG_IFSTAT:
+            eth_stat();
+            break;
+    }
+}
+
+int main()
+{
+    Serial pc(USBTX, USBRX);
+
+    pc.baud(115200);
+    pc.printf("built at " __DATE__ " " __TIME__ "\r\n");
+    pc.printf("memory stat:\r\n");
+    print_memstat();
+
+    if (!_config.load_config()) {
+        printf("load_config fail: reset_default()\r\n");
+        _config.reset_default();
+    }
+
+#if SUPPORT_CONSOLE
+    printf("SUPPORT_CONSOLE\r\n");
+    Thread console(console_thread, &pc, osPriorityNormal, CONSOLE_STACK_SIZE);
+#endif
+
+#if SUPPORT_ETH
+    printf("SUPPORT_ETH\r\n");
+    eth_up();
+
+#if SUPPORT_HTTPD
+    httpd_start(80);
+#endif
+#endif
+
+    while (1) {
+        const uint32_t wait_ms = 100;
+        osEvent evt = _mainq.get(wait_ms);
+
+        if (evt.status == osEventMail) {
+            MainMessage_t *msg = (MainMessage_t*)evt.value.p;
+
+            on_main_message(msg->msg_id, msg->msg_p1, msg->msg_p2);
+            _mainq.free(msg);
+        }
+
+        _alive_led = !_alive_led;
+    }
+
+    return 0;
+}
+
+/**
+ * Overriding MAC address
+ */
+void mbed_mac_address(char *mac)
+{
+    // Change ethernet mac address of device.
+    mac[0] = 0x00;
+    mac[1] = 0x80;
+    mac[2] = 0xE1;
+    mac[3] = 0x00;
+    mac[4] = 0x02;
+    mac[5] = 0x01;
+}