Webserver only w/o any other functions, single thread. Running on STM32F013+W5500

Dependencies:   NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed

Fork of F103-Serial-to-Ethernet by Chau Vo

Files at this revision

API Documentation at this revision

Comitter:
olympux
Date:
Sun Aug 14 11:06:53 2016 +0000
Parent:
45:8d18a95fcf8a
Child:
47:d92d2c5b8073
Commit message:
Initial version, support RPC over HTTP with new eeprom emulation

Changed in this revision

Formatter.cpp Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
device_configuration.lib Show annotated file Show diff for this revision Revisions of this file
eeprom.lib Show diff for this revision Revisions of this file
eeprom_flash.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-src.lib Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
my_eeprom_funcs.lib Show diff for this revision Revisions of this file
--- a/Formatter.cpp	Tue Jul 19 07:50:53 2016 +0000
+++ b/Formatter.cpp	Sun Aug 14 11:06:53 2016 +0000
@@ -140,7 +140,7 @@
 
 const char* INTERACTIVE_HTML_CODE_2 = "<h3>Device Configuration (not yet)</h3>\
 <form>\
-IP (x.x.x.x): <input type=\"text\" id=\"ipadd\"><br>\
+IP (x.x.x.x): <input type=\"text\" id=\"ipaddr\"><br>\
 Subnet (x.x.x.x): <input type=\"text\" id=\"subnet\"><br>\
 Gateway (x.x.x.x): <input type=\"text\" id=\"gateway\"><br>\
 MAC (x.x.x): <input type=\"text\" id=\"mac\">\
--- a/README.md	Tue Jul 19 07:50:53 2016 +0000
+++ b/README.md	Sun Aug 14 11:06:53 2016 +0000
@@ -1,34 +1,18 @@
-Forked of NNIO-8822
-Combined with "RPC over HTTP server" and "Improved mbed RPC" projects
-
-# Modifications
+# Features
 
-1. Updated Formatter.c to use eth.getIPAddress()
-2. Added creating RPC object AnalogIn
-  - to HTML code in Formatter.c
-  - to RPCType.c
-3. Added read/write RPC string variable over HTTP
+## RPC function over HTTP
+
+Run by for example `/showdevconf/run`
 
 # Releases
 
-## v1.0.0 (16/06/2016)
+## v0.1.0 (14/08/2016)
 
-Initial version
-
-Features
+Initial
 
-- Use eeprom for device configuration
-- HTTP server
-- RPC over HTTP:
-  + Support creating objects including AnalogIn
-  + Support RPC string variable
-- Additional RPC commands:
-  + Set ip address: /ipaddr/write 192.168.0.121
-  + Save ip address: /saveipaddr/run
-  + Enable configured flag: /setconf/run
-  + Disable configured flag: /resetconf/run
-  
+- New eeprom emulation functions
+- Support RPC over HTTP, [here](https://developer.mbed.org/teams/smdiotkitch/code/HTTPServerUI/) or [here](https://developer.mbed.org/users/feb11/code/HTTP-Server/)
 
-Bug fixes
+Issues
 
-- Creating RPC object AnalogIn at PC_0 caused watchdog resets. FIXED in rev41
\ No newline at end of file
+- HTTP server must always run, which makes TCP/UDP impossible
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/device_configuration.lib	Sun Aug 14 11:06:53 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/olympux/code/device_configuration/#700377cd9d29
--- a/eeprom.lib	Tue Jul 19 07:50:53 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/olympux/code/eeprom/#535d7082fbb2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eeprom_flash.lib	Sun Aug 14 11:06:53 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/users/olympux/code/eeprom_flash/#ea2bec485611
--- a/main.cpp	Tue Jul 19 07:50:53 2016 +0000
+++ b/main.cpp	Sun Aug 14 11:06:53 2016 +0000
@@ -1,14 +1,14 @@
 #include "mbed.h"
 #include "rtos.h"
-#include "mbed_rpc.h"
+//#include "mbed_rpc.h"
 #include "Arguments.h"
 
-#include "eeprom.h"
 #include "EthernetInterface.h"
 #include "NTPClient.h"
+#include "Watchdog.h"
 
-#include "my_eeprom_funcs.h"
-#include "Watchdog.h"
+#include "eeprom_flash.h"
+#include "device_configuration.h"
 
 #include "RPCCommand.h"
 #include "HTTPServer.h"
@@ -34,7 +34,7 @@
 #define WARN(x, ...)
 #define ERR(x, ...)
 #endif
-
+                                
 
 /*
  * Hardware defines
@@ -44,206 +44,61 @@
 EthernetInterface eth(&spi, PA_4, PC_9); // spi, cs, reset
 int ethernet_init(void);
 
-/*
- * EEPROM section
- */
-// Virtual address defined by the user: 0xFFFF value is prohibited
-uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr
-                                     0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet
-                                     0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway
-                                     0x4212, // TCP server port, not used
-                                     0x5212, // UDP server port, not used
-                                     0x8888, // 1st run? 0xA5A5 = static IP has been configured
-                                     0x6212, 0x6313, 0x6414, // MAC
-
-                                     // this section is for the TCP server that this device connects to in TCP client mode
-                                     0x7212, 0x7313, // 0xA5A5 = auto transmit status, time period
-                                     0x8212, 0x8313,0x8414, 0x8515, // TCP server IP address
-                                     0x9212, // TCP server port
-
-                                     // this section is for selecting protocol, not used
-                                     0xA212, // 0xA5A5 = enable TCP server
-                                     0xA313, // 0xA5A5 = eanble TCP client
-                                     0xA414  // 0xA5A5 = enable UDP server, always enabled for configuration
-                                    };
-
-
-/*
- * Variables for network configuration, TCP server
- */
-// Device configuration
-uint16_t u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4], u16mac_addr[3]; // 16-bits variables to be compatible with eeprom functions
-char str_ip_addr[16], str_ip_subnet[16], str_ip_gateway[16], str_mac_addr[20]; // RPC variables, converted from 16-bits u16ip_xxx
-uint8_t u8ip_addr[4]; // keep ip address in 8-bits
-uint16_t configured_ip = 0;  // flag indicates a static ip has been configured 0xA5A5
-uint8_t u8mac[6]; // mac in 8-bits
-
-// TCP/UDP server
-uint16_t tcp_server_local_port = 10000; // change to 7000 if internet required
-uint16_t udp_server_local_port = 11000;
-
-// Used for TCP client mode
-// this section is used to set the TCP server that this device connects to in TCP client mode.
-// this device will update its status to the server every transmit_time_period.
-uint16_t auto_transmit_flag = 0, transmit_time_period = 1000; // auto transmit status, time period = 1s
-uint16_t u16server_ip_addr[4]; // 16-bit variable to be compatible with eeprom functions
-uint8_t u8server_ip_addr[4]; // server ip address in 8-bits
-char str_server_ip_addr[16]; // RPC variable, converted from 16-bits u16server_ip_addr
-uint16_t u16tcp_server_port; // 16-bit variable to be compatible with eeprom functions
-uint16_t u16enable_tcp_server, u16enable_tcp_client; // flags for enabling TCP client or TCP server
-
-// Corresponding RPC variables
-RPCVariable<char*> rpcIPAddress(str_ip_addr, 16, "ipaddr");
-RPCVariable<char*> rpcSubnet(str_ip_subnet, 16, "subnet");
-RPCVariable<char*> rpcGateway(str_ip_gateway, 16, "gateway");
-RPCVariable<char*> rpcMac(str_mac_addr, 20, "mac");
-//RPCVariable<unsigned short> rpcLocalTCPServerPort(&tcp_server_local_port, "localtcpserverport");
-RPCVariable<unsigned short> rpcLocalUDPPort(&udp_server_local_port, "localudpport");
-//RPCVariable<unsigned short> rpcEnableTCPServer(&u16enable_tcp_server, "enabletcpserver");
-
-// RPC function definitions
-// save ip address only
-void set_ip_addr(Arguments* args, Reply* rep){
-    int b[4], n, i;
-    char ipaddr[4];
-    
-    n = sscanf(str_ip_addr, "%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3]);
-    if (n == 4) {
-        DBG("%d.%d.%d.%d",b[0],b[1],b[2],b[3]);
-        for (i = 0; i < 4; i++) {
-            ipaddr[i] = b[i] & 0x00FF;
-        }
-        save_ip_addr(ipaddr);
-        NVIC_SystemReset();
-    }
-    else {
-        DBG("Saving IP address failed");
-    }
-}
-
-// set configuration flag
-void set_configuration_flag(Arguments* args, Reply* rep){
-    set_conf();
-}
-
-// reset configuration flag
-void reset_configuration_flag(Arguments* args, Reply* rep){
-    reset_conf();
-}
-
-// Attach eeprom functions to RPC functions
-RPCFunction rpcSaveIPAddr(&set_ip_addr, "saveipaddr");
-RPCFunction rpcSetConfiguration(&set_configuration_flag, "setconf");
-RPCFunction rpcResetConfiguration(&reset_configuration_flag, "resetconf");
+Serial pc(USBTX,USBRX);
+Watchdog wdt;
 
 
 /*
- * RPC Protocol
- * Use the RPC enabled wrapped class  - see RpcClasses.h for more info
+ * Variables for network configuration
  */
-// DigitalIn
-RpcDigitalIn di0(PB_14, "di0");
-RpcDigitalIn di1(PB_12, "di1");
-RpcDigitalIn di2(PB_10, "di2");
-RpcDigitalIn di3(PB_1, "di3");
-RpcDigitalIn di4(PB_15, "di4");
-RpcDigitalIn di5(PB_13, "di5");
-RpcDigitalIn di6(PB_11, "di6");
-RpcDigitalIn di7(PB_2, "di7");
-DigitalIn din0(PB_14);
-DigitalIn din1(PB_12);
-DigitalIn din2(PB_10);
-DigitalIn din3(PB_1);
-DigitalIn din4(PB_15);
-DigitalIn din5(PB_13);
-DigitalIn din6(PB_11);
-DigitalIn din7(PB_2);
-// DigitalOut
-RpcDigitalOut do0(PB_3, "do0");
-RpcDigitalOut do1(PB_5, "do1");
-RpcDigitalOut do2(PB_7, "do2");
-RpcDigitalOut do3(PB_9, "do3");
-RpcDigitalOut do4(PD_2, "do4");
-RpcDigitalOut do5(PB_4, "do5");
-RpcDigitalOut do6(PB_6, "do6");
-RpcDigitalOut do7(PB_8, "do7");
-DigitalOut dout0(PB_3);
-DigitalOut dout1(PB_5);
-DigitalOut dout2(PB_7);
-DigitalOut dout3(PB_9);
-DigitalOut dout4(PD_2);
-DigitalOut dout5(PB_4);
-DigitalOut dout6(PB_6);
-DigitalOut dout7(PB_8);
-// AnalogIn
-RpcAnalogIn adc10(PC_0, "ai0"); // adc10
-RpcAnalogIn adc11(PC_1, "ai1"); // adc11
-AnalogIn ain0(PC_0);
-AnalogIn ain1(PC_1);
-// AnalogOut, PWM
-RpcPwmOut pwm11(PA_8, "pwm0"); // pwm11
-RpcPwmOut pwm21(PA_15, "pwm1"); // pwm21
-// Serial
-RpcSerial rpcUsart(USBTX, USBRX, "uart"); // usart2
-Serial uart(USBTX,USBRX);
-// Timer
-RpcTimer timer1("tmr1");
-// Watchdog
-Watchdog wdt;
+// Device configuration
+extern uint16_t u16IpAddr[4], u16IpSubnet[4], u16IpGateway[4], u16MacAddr[3]; // 16-bits variables to be compatible with eeprom functions
+extern char strIpAddr[16], strIpSubnet[16], strIpGateway[16], strMacAddr[20]; // RPC variables, converted from 16-bits u16ip_xxx
+extern uint16_t u16DeviceConfiguredFlag;  // flag indicates whether device has been configured (0xA5A5) or not
+// TCP server/UDP
+extern uint16_t u16LocalTcpServerPort;
+extern uint16_t u16LocalUdpPort;
+// TCP client mode, set parameters of the remote TCP server this device connects to.
+// When enabled, this device will send its status to the server every transmit_time_period.
+extern uint16_t u16RemoteTcpServerIpAddr[4]; // 16-bit variable to be compatible with eeprom functions
+extern char strRemoteTcpServerIpAddr[16]; // RPC variable, converted from 16-bits u16server_ip_addr
+extern uint16_t u16RemoteTcpServerPort; // 16-bit variable to be compatible with eeprom functions
+extern uint16_t u16AutoTransmitFlag, u16TransmitPeriod; // auto transmit status, time period = 1s
+// enable modes
+extern uint16_t u16EnableTcpServer, u16EnableTcpClient, u16EnableUdp; // flags for enabling TCP server/client and UDP (UDP is always on for configuration)
+// extra
+extern uint8_t u8IpAddr[4]; // keep device ip address in 8-bits
+extern uint8_t u8MacAddr[6]; // keep mac in 8-bits
+extern uint8_t u8RemoteTcpServerIpAddr[4]; // remote TCP server ip address in 8-bits
 
 
-// Some variable types that can be modified through RPC.
-//int wheelsOn;
-//char lcdBannerMessage;
-//float speed;
-int current_time;
-int enable_onoff_dout = 0; // 8-bit LSB
-int do0OnTime = 64800, do0OffTime = 21600; //default ON = 18:00, OFF = 6:00
-int do1OnTime = 64800, do1OffTime = 21600;
-int do2OnTime = 64800, do2OffTime = 21600;
-int do3OnTime = 64800, do3OffTime = 21600;
-int do4OnTime = 64800, do4OffTime = 21600;
-int do5OnTime = 64800, do5OffTime = 21600;
-int do6OnTime = 64800, do6OffTime = 21600;
-int do7OnTime = 64800, do7OffTime = 21600;
- 
-//RPCVariable<int> rpcLights(&wheelsOn, "wheels");
-//RPCVariable<char> rpcBanner(&lcdBannerMessage, "banner");
-//RPCVariable<float> rpcSpeed(&speed, "speed");
-RPCVariable<int> rpcCurrentTime(&current_time, "Time");
-RPCVariable<int> rpcEnableOnOffDout(&enable_onoff_dout, "EnableOnOffDout");
-RPCVariable<int> rpcdo0OnTime(&do0OnTime, "do0OnTime");
-RPCVariable<int> rpcdo0OffTime(&do0OffTime, "do0OffTime");
-RPCVariable<int> rpcdo1OnTime(&do1OnTime, "do1OnTime");
-RPCVariable<int> rpcdo1OffTime(&do1OffTime, "do1OffTime");
-RPCVariable<int> rpcdo2OnTime(&do2OnTime, "do2OnTime");
-RPCVariable<int> rpcdo2OffTime(&do2OffTime, "do2OffTime");
-RPCVariable<int> rpcdo3OnTime(&do3OnTime, "do3OnTime");
-RPCVariable<int> rpcdo3OffTime(&do3OffTime, "do3OffTime");
-RPCVariable<int> rpcdo4OnTime(&do4OnTime, "do4OnTime");
-RPCVariable<int> rpcdo4OffTime(&do4OffTime, "do4OffTime");
-RPCVariable<int> rpcdo5OnTime(&do5OnTime, "do5OnTime");
-RPCVariable<int> rpcdo5OffTime(&do5OffTime, "do5OffTime");
-RPCVariable<int> rpcdo6OnTime(&do6OnTime, "do6OnTime");
-RPCVariable<int> rpcdo6OffTime(&do6OffTime, "do6OffTime");
-RPCVariable<int> rpcdo7OnTime(&do7OnTime, "do7OnTime");
-RPCVariable<int> rpcdo7OffTime(&do7OffTime, "do7OffTime");
+// Corresponding RPC variables
+RPCVariable<char*> rpcIPAddress(strIpAddr, 16, "ipaddr");
+RPCVariable<char*> rpcSubnet(strIpSubnet, 16, "subnet");
+RPCVariable<char*> rpcGateway(strIpGateway, 16, "gateway");
+RPCVariable<char*> rpcMac(strMacAddr, 20, "mac");
+RPCVariable<unsigned short> rpcLocalTCPServerPort(&u16LocalTcpServerPort, "localtcpserverport");
+RPCVariable<unsigned short> rpcLocalUDPPort(&u16LocalUdpPort, "localudpport");
+
+RPCVariable<unsigned short> rpcEnableTCPServer(&u16EnableTcpServer, "enabletcpserver");
+RPCVariable<unsigned short> rpcEnableTCPClient(&u16EnableTcpClient, "enabletcpclient");
+RPCVariable<unsigned short> rpcEnableUDP(&u16EnableUdp, "enableudp");
+
+RPCVariable<char*> rpcRemoteTCPServerIPAddress(strRemoteTcpServerIpAddr, 16, "remotetcpserveripaddr");
+RPCVariable<unsigned short> rpcRemoteTCPServerPort(&u16RemoteTcpServerPort, "remotetcpserverport");
+RPCVariable<unsigned short> rpcAutoTransmit(&u16AutoTransmitFlag, "autotransmit");
+RPCVariable<unsigned short> rpcTransmitPeriod(&u16TransmitPeriod, "transmitperiod");
 
 // RPC function definitions
-// Create a function of the required format
-void set_current_time(Arguments* args, Reply* rep);
-void set_current_time(Arguments* args, Reply* rep){
-    time_t ct = (time_t)current_time; // convert
-    struct tm *st = localtime(&ct);
-    
-    set_time(ct); // set time
-    
-    DBG("Set current time to: %s", ctime(&ct));
-    DBG("Time only: %d:%d:%d", st->tm_hour, st->tm_min, st->tm_sec);
+// save ip address only
+void show_device_config(Arguments* args, Reply* rep){
+    DBG("IP: %s", strIpAddr);
+    DBG("Subnet: %s", strIpSubnet);
+    DBG("Gateway: %s", strIpGateway);
+    DBG("MAC: %s", strMacAddr);
 }
-// Attach it to an RPC object
-RPCFunction rpcSetCurrentTime(&set_current_time, "SetTime");
-
+// Attach eeprom functions to RPC functions
+RPCFunction rpcShowConfig(&show_device_config, "showdevconf");
 
 /*
  * Threads
@@ -255,7 +110,6 @@
         wdt.Service();
 }
 
-
 HTTPServer create_simple_server()
 {    
     HTTPServer srv;
@@ -272,8 +126,6 @@
     return srv;
 }
 
-// Prototypes
-void digital_outputs_timer_thread(void const* args);
 
 // Main code
 int main()
@@ -283,31 +135,47 @@
     Thread::wait(500); // turn on delay
 
     /*
-    * Configure
-    */
-    uart.baud(115200);
+     * Configure
+     */
+    pc.baud(115200);
     DBG("Starting...");
 
     // check watchdog
     if (wdt.WatchdogCausedReset())
         DBG("Watchdog caused reset.");
     wdt.Configure(4);
-
+    
+    /*reset_device_configuration();
+    uint16_t ip[4] = {192,168,0,120};
+    uint16_t subnet[4] = {255,255,255,0};
+    uint16_t gateway[4] = {192,168,0,1};
+    uint16_t mac[3] = {0,0,1};
+    uint16_t tcp_port = DEFAULT_LOCAL_TCP_SERVER_PORT;
+    uint16_t udp_port = DEFAULT_LOCAL_UDP_PORT;
+    uint16_t remote_ip[4] = {0,0,0,0};
+    uint16_t remote_port = 12000;
+    uint16_t auto_transmit = DEFAULT_DISABLE_FLAG_VALUE;
+    uint16_t transmit_period = 1000;
+    uint16_t enable_tcp_server = DEFAULT_DISABLE_FLAG_VALUE;
+    uint16_t enable_tcp_client = DEFAULT_DISABLE_FLAG_VALUE;
+    uint16_t enable_udp = DEFAULT_ENABLE_FLAG_VALUE;
+    
+    write_device_configuration(ip, subnet, gateway, mac,
+            tcp_port, udp_port,
+            remote_ip, remote_port, auto_transmit, transmit_period,
+            enable_tcp_server, enable_tcp_client, enable_udp);*/
+    
+    read_device_configuration();
+    
+    
     /*
-    * FLASH
-    */
-    load_eeprom_network();
-    load_eeprom_tcpserver();
-
-    /*
-    * UI threads
-    */
-    Thread t3(wdt_reset_thread);
-    Thread t4(digital_outputs_timer_thread);
+     * UI threads
+     */
+    Thread t0(wdt_reset_thread);
     
     // rpc
     RPCType::instance().register_types();
-
+    
     /*
     * Ethernet
     */
@@ -318,7 +186,7 @@
     }
 
     Thread::wait(2000); // TCP/UDP stack delay
-
+    
     // create rpc http server
     HTTPServer srv = create_interactive_server();
 
@@ -328,10 +196,9 @@
         return -1;
     }
 
-    srv.run();
+    srv.run();  
 }
 
-
 /*
  * W5500 Ethernet init
  */
@@ -343,20 +210,20 @@
 
     // if not configured, try dhcp
     dhcp_ret = -1;
-    if (configured_ip != DEFAULT_ENABLE_FLAG_VALUE) {
+    if (u16DeviceConfiguredFlag != DEFAULT_ENABLE_FLAG_VALUE) {
         DBG("Connecting to DHCP server...");
-        dhcp_ret = eth.init(u8mac);
+        dhcp_ret = eth.init(u8MacAddr);
         if (dhcp_ret == 0)
             dhcp_ret = eth.connect();
     }
 
     if (dhcp_ret != 0) {
         DBG("No DHCP, load static IP configuration");
-        ret = eth.init(u8mac, str_ip_addr, str_ip_subnet, str_ip_gateway); // static
+        ret = eth.init(u8MacAddr, strIpAddr, strIpSubnet, strIpGateway); // static
     } else {
-        snprintf(str_ip_addr, 16, "%s", eth.getIPAddress());
-        snprintf(str_ip_subnet, 16, "%s", eth.getNetworkMask());
-        snprintf(str_ip_gateway, 16, "%s", eth.getGateway());
+        snprintf(strIpAddr, 16, "%s", eth.getIPAddress());
+        snprintf(strIpSubnet, 16, "%s", eth.getNetworkMask());
+        snprintf(strIpGateway, 16, "%s", eth.getGateway());
         ret = 0;
     }
 
@@ -378,372 +245,3 @@
     return 0;
 }
 
-// Timer thread to check on/off time of digital outputs
-void digital_outputs_timer_thread(void const* args)
-{
-    Thread::wait(700);
-    
-    while(true) {
-        // read current time
-        time_t seconds = time(NULL);
-        struct tm *st = localtime(&seconds);
-        int current_time_in_seconds = 3600*(st->tm_hour) + 60*(st->tm_min) + st->tm_sec;
-        DBG("Current time: %d:%d:%d", st->tm_hour, st->tm_min, st->tm_sec);
-        
-        // check do0
-        if ((enable_onoff_dout && 0x01) == 0x01) {
-            if (do0OnTime < do0OffTime) {
-                if ((current_time_in_seconds >= do0OnTime) && (current_time_in_seconds < do0OffTime)){
-                    if (dout0 == 0) {
-                        dout0 = 1;
-                        DBG("do0 ON");
-                    }
-                    else {
-                        DBG("do0 ON'ed");
-                    }
-                }
-                else {
-                    if (dout0 == 1) {
-                        dout0 = 0;
-                        DBG("do0 OFF'ed");
-                    }
-                    else {
-                        DBG("do0 OFF");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do0OffTime) && ((current_time_in_seconds < do0OnTime))) {
-                    if (dout0 == 1) {
-                        dout0 = 0;
-                        DBG("do0 OFF");
-                    }
-                    else {
-                        DBG("do0 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout0 == 0) {
-                        dout0 = 1;
-                        DBG("do0 ON");
-                    }
-                    else {
-                        DBG("do0 ON'ed");
-                    }
-                }
-            }
-        } // end check do0
-        
-        // check do1
-        if ((enable_onoff_dout && 0x02) == 0x02) {
-            if (do1OnTime < do1OffTime) {
-                if ((current_time_in_seconds >= do1OnTime) && (current_time_in_seconds < do1OffTime)){
-                    if (dout1 == 0) {
-                        dout1 = 1;
-                        DBG("do1 ON");
-                    }
-                    else {
-                        DBG("do1 ON'ed");
-                    }
-                }
-                else {
-                    if (dout1 == 1) {
-                        dout1 = 0;
-                        DBG("do1 OFF");
-                    }
-                    else {
-                        DBG("do1 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do1OffTime) && ((current_time_in_seconds < do1OnTime))) {
-                    if (dout1 == 1) {
-                        dout1 = 0;
-                        DBG("do1 OFF");
-                    }
-                    else {
-                        DBG("do1 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout1 == 0) {
-                        dout1 = 1;
-                        DBG("do1 ON");
-                    }
-                    else {
-                        DBG("do1 ON'ed");
-                    }
-                }
-            }
-        } // end check do1
-        
-        // check do2
-        if ((enable_onoff_dout && 0x04) == 0x04) {
-            if (do2OnTime < do2OffTime) {
-                if ((current_time_in_seconds >= do2OnTime) && (current_time_in_seconds < do2OffTime)){
-                    if (dout2 == 0) {
-                        dout2 = 1;
-                        DBG("do2 ON");
-                    }
-                    else {
-                        DBG("do2 ON'ed");
-                    }
-                }
-                else {
-                    if (dout2 == 1) {
-                        dout2 = 0;
-                        DBG("do2 OFF");
-                    }
-                    else {
-                        DBG("do2 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do2OffTime) && ((current_time_in_seconds < do2OnTime))) {
-                    if (dout2 == 1) {
-                        dout2 = 0;
-                        DBG("do2 OFF");
-                    }
-                    else {
-                        DBG("do2 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout2 == 0) {
-                        dout2 = 1;
-                        DBG("do2 ON");
-                    }
-                    else {
-                        DBG("do2 ON'ed");
-                    }
-                }
-            }
-        } // end check do2
-        
-        // check do3
-        if ((enable_onoff_dout && 0x08) == 0x08) {
-            if (do3OnTime < do3OffTime) {
-                if ((current_time_in_seconds >= do3OnTime) && (current_time_in_seconds < do3OffTime)){
-                    if (dout3 == 0) {
-                        dout3 = 1;
-                        DBG("do3 ON");
-                    }
-                    else {
-                        DBG("do3 ON'ed");
-                    }
-                }
-                else {
-                    if (dout3 == 1) {
-                        dout3 = 0;
-                        DBG("do3 OFF");
-                    }
-                    else {
-                        DBG("do3 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do3OffTime) && ((current_time_in_seconds < do3OnTime))) {
-                    if (dout3 == 1) {
-                        dout3 = 0;
-                        DBG("do3 OFF");
-                    }
-                    else {
-                        DBG("do3 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout3 == 0) {
-                        dout3 = 1;
-                        DBG("do3 ON");
-                    }
-                    else {
-                        DBG("do3 ON'ed");
-                    }
-                }
-            }
-        } // end check do3
-        
-        // check do4
-        if ((enable_onoff_dout && 0x10) == 0x10) {
-            if (do4OnTime < do4OffTime) {
-                if ((current_time_in_seconds >= do4OnTime) && (current_time_in_seconds < do4OffTime)){
-                    if (dout4 == 0) {
-                        dout4 = 1;
-                        DBG("do4 ON");
-                    }
-                    else {
-                        DBG("do4 ON'ed");
-                    }
-                }
-                else {
-                    if (dout4 == 1) {
-                        dout4 = 0;
-                        DBG("do4 OFF");
-                    }
-                    else {
-                        DBG("do4 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do4OffTime) && ((current_time_in_seconds < do4OnTime))) {
-                    if (dout4 == 1) {
-                        dout4 = 0;
-                        DBG("do4 OFF");
-                    }
-                    else {
-                        DBG("do4 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout4 == 0) {
-                        dout4 = 1;
-                        DBG("do4 ON");
-                    }
-                    else {
-                        DBG("do4 ON'ed");
-                    }
-                }
-            }
-        } // end check do4
-        
-        // check do5
-        if ((enable_onoff_dout && 0x20) == 0x20) {
-            if (do5OnTime < do5OffTime) {
-                if ((current_time_in_seconds >= do5OnTime) && (current_time_in_seconds < do5OffTime)){
-                    if (dout5 == 0) {
-                        dout5 = 1;
-                        DBG("do5 ON");
-                    }
-                    else {
-                        DBG("do5 ON'ed");
-                    }
-                }
-                else {
-                    if (dout5 == 1) {
-                        dout5 = 0;
-                        DBG("do5 OFF");
-                    }
-                    else {
-                        DBG("do5 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do5OffTime) && ((current_time_in_seconds < do5OnTime))) {
-                    if (dout5 == 1) {
-                        dout5 = 0;
-                        DBG("do5 OFF");
-                    }
-                    else {
-                        DBG("do5 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout5 == 0) {
-                        dout5 = 1;
-                        DBG("do5 ON");
-                    }
-                    else {
-                        DBG("do5 ON'ed");
-                    }
-                }
-            }
-        } // end check do5
-        
-        // check do6
-        if ((enable_onoff_dout && 0x40) == 0x40) {
-            if (do6OnTime < do6OffTime) {
-                if ((current_time_in_seconds >= do6OnTime) && (current_time_in_seconds < do6OffTime)){
-                    if (dout6 == 0) {
-                        dout6 = 1;
-                        DBG("do6 ON");
-                    }
-                    else {
-                        DBG("do6 ON'ed");
-                    }
-                }
-                else {
-                    if (dout6 == 1) {
-                        dout6 = 0;
-                        DBG("do6 OFF");
-                    }
-                    else {
-                        DBG("do6 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do6OffTime) && ((current_time_in_seconds < do6OnTime))) {
-                    if (dout6 == 1) {
-                        dout6 = 0;
-                        DBG("do6 OFF");
-                    }
-                    else {
-                        DBG("do6 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout6 == 0) {
-                        dout6 = 1;
-                        DBG("do6 ON");
-                    }
-                    else {
-                        DBG("do6 ON'ed");
-                    }
-                }
-            }
-        } // end check do6
-        
-        // check do7
-        if ((enable_onoff_dout && 0x80) == 0x80) {
-            if (do7OnTime < do7OffTime) {
-                if ((current_time_in_seconds >= do7OnTime) && (current_time_in_seconds < do7OffTime)){
-                    if (dout7 == 0) {
-                        dout7 = 1;
-                        DBG("do7 ON");
-                    }
-                    else {
-                        DBG("do7 ON'ed");
-                    }
-                }
-                else {
-                    if (dout7 == 1) {
-                        dout7 = 0;
-                        DBG("do7 OFF");
-                    }
-                    else {
-                        DBG("do7 OFF'ed");
-                    }
-                }
-            }
-            else {
-                if ((current_time_in_seconds >= do7OffTime) && ((current_time_in_seconds < do7OnTime))) {
-                    if (dout7 == 1) {
-                        dout7 = 0;
-                        DBG("do7 OFF");
-                    }
-                    else {
-                        DBG("do7 OFF'ed");
-                    }
-                }
-                else {
-                    if (dout7 == 0) {
-                        dout7 = 1;
-                        DBG("do7 ON");
-                    }
-                    else {
-                        DBG("do7 ON'ed");
-                    }
-                }
-            }
-        } // end check do7
-        
-        
-        // wait 1s
-        Thread::wait(10000); // Thread::wait() in ms
-    }
-}
\ No newline at end of file
--- a/mbed-src.lib	Tue Jul 19 07:50:53 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/rs27/code/mbed-src/#8a0b45cd594f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sun Aug 14 11:06:53 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/b0220dba8be7
\ No newline at end of file
--- a/my_eeprom_funcs.lib	Tue Jul 19 07:50:53 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/olympux/code/my_eeprom_funcs/#126b1eb74709