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

Committer:
olympux
Date:
Tue Jul 19 07:50:53 2016 +0000
Revision:
45:8d18a95fcf8a
Parent:
44:4e8a9b466695
Child:
46:971bdaa3507c
Tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 0:c2eac797face 1 #include "mbed.h"
olympux 27:22f289beceb8 2 #include "rtos.h"
olympux 27:22f289beceb8 3 #include "mbed_rpc.h"
olympux 27:22f289beceb8 4 #include "Arguments.h"
olympux 27:22f289beceb8 5
olympux 12:7c152c0ca4d8 6 #include "eeprom.h"
olympux 0:c2eac797face 7 #include "EthernetInterface.h"
olympux 9:d2534ecf88c6 8 #include "NTPClient.h"
olympux 0:c2eac797face 9
olympux 12:7c152c0ca4d8 10 #include "my_eeprom_funcs.h"
olympux 20:71c7950fdd91 11 #include "Watchdog.h"
olympux 12:7c152c0ca4d8 12
olympux 40:c966abbe2d62 13 #include "RPCCommand.h"
olympux 40:c966abbe2d62 14 #include "HTTPServer.h"
olympux 40:c966abbe2d62 15 #include "Formatter.h"
olympux 40:c966abbe2d62 16 #include "RequestHandler.h"
olympux 40:c966abbe2d62 17 #include "RPCType.h"
olympux 40:c966abbe2d62 18
olympux 40:c966abbe2d62 19 #define SERVER_PORT 80
olympux 40:c966abbe2d62 20
olympux 0:c2eac797face 21
olympux 42:d0ff08711ca5 22 /*
olympux 42:d0ff08711ca5 23 * Debug option
olympux 31:2e4b6de6c2f3 24 */
olympux 25:48dd18cc147c 25 #if 1
olympux 16:84a5bf7285d0 26 //Enable debug
olympux 16:84a5bf7285d0 27 #include <cstdio>
olympux 31:2e4b6de6c2f3 28 #define DBG(x, ...) std::printf("[main : DBG]"x"\r\n", ##__VA_ARGS__);
olympux 31:2e4b6de6c2f3 29 #define WARN(x, ...) std::printf("[main : WARN]"x"\r\n", ##__VA_ARGS__);
olympux 31:2e4b6de6c2f3 30 #define ERR(x, ...) std::printf("[main : ERR]"x"\r\n", ##__VA_ARGS__);
olympux 16:84a5bf7285d0 31 #else
olympux 16:84a5bf7285d0 32 //Disable debug
olympux 31:2e4b6de6c2f3 33 #define DBG(x, ...)
olympux 16:84a5bf7285d0 34 #define WARN(x, ...)
olympux 31:2e4b6de6c2f3 35 #define ERR(x, ...)
olympux 16:84a5bf7285d0 36 #endif
olympux 16:84a5bf7285d0 37
olympux 16:84a5bf7285d0 38
olympux 2:18f10e7209f4 39 /*
olympux 45:8d18a95fcf8a 40 * Hardware defines
olympux 45:8d18a95fcf8a 41 */
olympux 9:d2534ecf88c6 42 // Ethernet
olympux 0:c2eac797face 43 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
olympux 11:709f90a3b599 44 EthernetInterface eth(&spi, PA_4, PC_9); // spi, cs, reset
olympux 40:c966abbe2d62 45 int ethernet_init(void);
olympux 30:15e23257e786 46
olympux 30:15e23257e786 47 /*
olympux 45:8d18a95fcf8a 48 * EEPROM section
olympux 45:8d18a95fcf8a 49 */
olympux 30:15e23257e786 50 // Virtual address defined by the user: 0xFFFF value is prohibited
olympux 30:15e23257e786 51 uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr
olympux 30:15e23257e786 52 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet
olympux 30:15e23257e786 53 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway
olympux 30:15e23257e786 54 0x4212, // TCP server port, not used
olympux 30:15e23257e786 55 0x5212, // UDP server port, not used
olympux 42:d0ff08711ca5 56 0x8888, // 1st run? 0xA5A5 = static IP has been configured
olympux 30:15e23257e786 57 0x6212, 0x6313, 0x6414, // MAC
olympux 31:2e4b6de6c2f3 58
olympux 30:15e23257e786 59 // this section is for the TCP server that this device connects to in TCP client mode
olympux 30:15e23257e786 60 0x7212, 0x7313, // 0xA5A5 = auto transmit status, time period
olympux 30:15e23257e786 61 0x8212, 0x8313,0x8414, 0x8515, // TCP server IP address
olympux 30:15e23257e786 62 0x9212, // TCP server port
olympux 31:2e4b6de6c2f3 63
olympux 30:15e23257e786 64 // this section is for selecting protocol, not used
olympux 30:15e23257e786 65 0xA212, // 0xA5A5 = enable TCP server
olympux 30:15e23257e786 66 0xA313, // 0xA5A5 = eanble TCP client
olympux 42:d0ff08711ca5 67 0xA414 // 0xA5A5 = enable UDP server, always enabled for configuration
olympux 31:2e4b6de6c2f3 68 };
olympux 31:2e4b6de6c2f3 69
olympux 30:15e23257e786 70
olympux 30:15e23257e786 71 /*
olympux 42:d0ff08711ca5 72 * Variables for network configuration, TCP server
olympux 42:d0ff08711ca5 73 */
olympux 42:d0ff08711ca5 74 // Device configuration
olympux 45:8d18a95fcf8a 75 uint16_t u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4], u16mac_addr[3]; // 16-bits variables to be compatible with eeprom functions
olympux 45:8d18a95fcf8a 76 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
olympux 45:8d18a95fcf8a 77 uint8_t u8ip_addr[4]; // keep ip address in 8-bits
olympux 42:d0ff08711ca5 78 uint16_t configured_ip = 0; // flag indicates a static ip has been configured 0xA5A5
olympux 42:d0ff08711ca5 79 uint8_t u8mac[6]; // mac in 8-bits
olympux 30:15e23257e786 80
olympux 42:d0ff08711ca5 81 // TCP/UDP server
olympux 42:d0ff08711ca5 82 uint16_t tcp_server_local_port = 10000; // change to 7000 if internet required
olympux 42:d0ff08711ca5 83 uint16_t udp_server_local_port = 11000;
olympux 30:15e23257e786 84
olympux 45:8d18a95fcf8a 85 // Used for TCP client mode
olympux 42:d0ff08711ca5 86 // this section is used to set the TCP server that this device connects to in TCP client mode.
olympux 42:d0ff08711ca5 87 // this device will update its status to the server every transmit_time_period.
olympux 30:15e23257e786 88 uint16_t auto_transmit_flag = 0, transmit_time_period = 1000; // auto transmit status, time period = 1s
olympux 45:8d18a95fcf8a 89 uint16_t u16server_ip_addr[4]; // 16-bit variable to be compatible with eeprom functions
olympux 30:15e23257e786 90 uint8_t u8server_ip_addr[4]; // server ip address in 8-bits
olympux 45:8d18a95fcf8a 91 char str_server_ip_addr[16]; // RPC variable, converted from 16-bits u16server_ip_addr
olympux 45:8d18a95fcf8a 92 uint16_t u16tcp_server_port; // 16-bit variable to be compatible with eeprom functions
olympux 45:8d18a95fcf8a 93 uint16_t u16enable_tcp_server, u16enable_tcp_client; // flags for enabling TCP client or TCP server
olympux 42:d0ff08711ca5 94
olympux 42:d0ff08711ca5 95 // Corresponding RPC variables
olympux 42:d0ff08711ca5 96 RPCVariable<char*> rpcIPAddress(str_ip_addr, 16, "ipaddr");
olympux 42:d0ff08711ca5 97 RPCVariable<char*> rpcSubnet(str_ip_subnet, 16, "subnet");
olympux 42:d0ff08711ca5 98 RPCVariable<char*> rpcGateway(str_ip_gateway, 16, "gateway");
olympux 43:48ca8c6f6f49 99 RPCVariable<char*> rpcMac(str_mac_addr, 20, "mac");
olympux 45:8d18a95fcf8a 100 //RPCVariable<unsigned short> rpcLocalTCPServerPort(&tcp_server_local_port, "localtcpserverport");
olympux 42:d0ff08711ca5 101 RPCVariable<unsigned short> rpcLocalUDPPort(&udp_server_local_port, "localudpport");
olympux 45:8d18a95fcf8a 102 //RPCVariable<unsigned short> rpcEnableTCPServer(&u16enable_tcp_server, "enabletcpserver");
olympux 30:15e23257e786 103
olympux 43:48ca8c6f6f49 104 // RPC function definitions
olympux 45:8d18a95fcf8a 105 // save ip address only
olympux 45:8d18a95fcf8a 106 void set_ip_addr(Arguments* args, Reply* rep){
olympux 43:48ca8c6f6f49 107 int b[4], n, i;
olympux 43:48ca8c6f6f49 108 char ipaddr[4];
olympux 43:48ca8c6f6f49 109
olympux 43:48ca8c6f6f49 110 n = sscanf(str_ip_addr, "%d.%d.%d.%d", &b[0], &b[1], &b[2], &b[3]);
olympux 43:48ca8c6f6f49 111 if (n == 4) {
olympux 43:48ca8c6f6f49 112 DBG("%d.%d.%d.%d",b[0],b[1],b[2],b[3]);
olympux 43:48ca8c6f6f49 113 for (i = 0; i < 4; i++) {
olympux 43:48ca8c6f6f49 114 ipaddr[i] = b[i] & 0x00FF;
olympux 43:48ca8c6f6f49 115 }
olympux 43:48ca8c6f6f49 116 save_ip_addr(ipaddr);
olympux 43:48ca8c6f6f49 117 NVIC_SystemReset();
olympux 43:48ca8c6f6f49 118 }
olympux 43:48ca8c6f6f49 119 else {
olympux 43:48ca8c6f6f49 120 DBG("Saving IP address failed");
olympux 43:48ca8c6f6f49 121 }
olympux 43:48ca8c6f6f49 122 }
olympux 45:8d18a95fcf8a 123
olympux 45:8d18a95fcf8a 124 // set configuration flag
olympux 45:8d18a95fcf8a 125 void set_configuration_flag(Arguments* args, Reply* rep){
olympux 44:4e8a9b466695 126 set_conf();
olympux 44:4e8a9b466695 127 }
olympux 45:8d18a95fcf8a 128
olympux 45:8d18a95fcf8a 129 // reset configuration flag
olympux 45:8d18a95fcf8a 130 void reset_configuration_flag(Arguments* args, Reply* rep){
olympux 43:48ca8c6f6f49 131 reset_conf();
olympux 43:48ca8c6f6f49 132 }
olympux 45:8d18a95fcf8a 133
olympux 45:8d18a95fcf8a 134 // Attach eeprom functions to RPC functions
olympux 45:8d18a95fcf8a 135 RPCFunction rpcSaveIPAddr(&set_ip_addr, "saveipaddr");
olympux 45:8d18a95fcf8a 136 RPCFunction rpcSetConfiguration(&set_configuration_flag, "setconf");
olympux 45:8d18a95fcf8a 137 RPCFunction rpcResetConfiguration(&reset_configuration_flag, "resetconf");
olympux 45:8d18a95fcf8a 138
olympux 30:15e23257e786 139
olympux 45:8d18a95fcf8a 140 /*
olympux 45:8d18a95fcf8a 141 * RPC Protocol
olympux 45:8d18a95fcf8a 142 * Use the RPC enabled wrapped class - see RpcClasses.h for more info
olympux 45:8d18a95fcf8a 143 */
olympux 45:8d18a95fcf8a 144 // DigitalIn
olympux 45:8d18a95fcf8a 145 RpcDigitalIn di0(PB_14, "di0");
olympux 45:8d18a95fcf8a 146 RpcDigitalIn di1(PB_12, "di1");
olympux 45:8d18a95fcf8a 147 RpcDigitalIn di2(PB_10, "di2");
olympux 45:8d18a95fcf8a 148 RpcDigitalIn di3(PB_1, "di3");
olympux 45:8d18a95fcf8a 149 RpcDigitalIn di4(PB_15, "di4");
olympux 45:8d18a95fcf8a 150 RpcDigitalIn di5(PB_13, "di5");
olympux 45:8d18a95fcf8a 151 RpcDigitalIn di6(PB_11, "di6");
olympux 45:8d18a95fcf8a 152 RpcDigitalIn di7(PB_2, "di7");
olympux 45:8d18a95fcf8a 153 DigitalIn din0(PB_14);
olympux 45:8d18a95fcf8a 154 DigitalIn din1(PB_12);
olympux 45:8d18a95fcf8a 155 DigitalIn din2(PB_10);
olympux 45:8d18a95fcf8a 156 DigitalIn din3(PB_1);
olympux 45:8d18a95fcf8a 157 DigitalIn din4(PB_15);
olympux 45:8d18a95fcf8a 158 DigitalIn din5(PB_13);
olympux 45:8d18a95fcf8a 159 DigitalIn din6(PB_11);
olympux 45:8d18a95fcf8a 160 DigitalIn din7(PB_2);
olympux 45:8d18a95fcf8a 161 // DigitalOut
olympux 45:8d18a95fcf8a 162 RpcDigitalOut do0(PB_3, "do0");
olympux 45:8d18a95fcf8a 163 RpcDigitalOut do1(PB_5, "do1");
olympux 45:8d18a95fcf8a 164 RpcDigitalOut do2(PB_7, "do2");
olympux 45:8d18a95fcf8a 165 RpcDigitalOut do3(PB_9, "do3");
olympux 45:8d18a95fcf8a 166 RpcDigitalOut do4(PD_2, "do4");
olympux 45:8d18a95fcf8a 167 RpcDigitalOut do5(PB_4, "do5");
olympux 45:8d18a95fcf8a 168 RpcDigitalOut do6(PB_6, "do6");
olympux 45:8d18a95fcf8a 169 RpcDigitalOut do7(PB_8, "do7");
olympux 45:8d18a95fcf8a 170 DigitalOut dout0(PB_3);
olympux 45:8d18a95fcf8a 171 DigitalOut dout1(PB_5);
olympux 45:8d18a95fcf8a 172 DigitalOut dout2(PB_7);
olympux 45:8d18a95fcf8a 173 DigitalOut dout3(PB_9);
olympux 45:8d18a95fcf8a 174 DigitalOut dout4(PD_2);
olympux 45:8d18a95fcf8a 175 DigitalOut dout5(PB_4);
olympux 45:8d18a95fcf8a 176 DigitalOut dout6(PB_6);
olympux 45:8d18a95fcf8a 177 DigitalOut dout7(PB_8);
olympux 45:8d18a95fcf8a 178 // AnalogIn
olympux 45:8d18a95fcf8a 179 RpcAnalogIn adc10(PC_0, "ai0"); // adc10
olympux 45:8d18a95fcf8a 180 RpcAnalogIn adc11(PC_1, "ai1"); // adc11
olympux 45:8d18a95fcf8a 181 AnalogIn ain0(PC_0);
olympux 45:8d18a95fcf8a 182 AnalogIn ain1(PC_1);
olympux 45:8d18a95fcf8a 183 // AnalogOut, PWM
olympux 45:8d18a95fcf8a 184 RpcPwmOut pwm11(PA_8, "pwm0"); // pwm11
olympux 45:8d18a95fcf8a 185 RpcPwmOut pwm21(PA_15, "pwm1"); // pwm21
olympux 27:22f289beceb8 186 // Serial
olympux 45:8d18a95fcf8a 187 RpcSerial rpcUsart(USBTX, USBRX, "uart"); // usart2
olympux 27:22f289beceb8 188 Serial uart(USBTX,USBRX);
olympux 45:8d18a95fcf8a 189 // Timer
olympux 45:8d18a95fcf8a 190 RpcTimer timer1("tmr1");
olympux 20:71c7950fdd91 191 // Watchdog
olympux 20:71c7950fdd91 192 Watchdog wdt;
olympux 20:71c7950fdd91 193
olympux 26:09e0dd020900 194
olympux 45:8d18a95fcf8a 195 // Some variable types that can be modified through RPC.
olympux 45:8d18a95fcf8a 196 //int wheelsOn;
olympux 45:8d18a95fcf8a 197 //char lcdBannerMessage;
olympux 45:8d18a95fcf8a 198 //float speed;
olympux 45:8d18a95fcf8a 199 int current_time;
olympux 45:8d18a95fcf8a 200 int enable_onoff_dout = 0; // 8-bit LSB
olympux 45:8d18a95fcf8a 201 int do0OnTime = 64800, do0OffTime = 21600; //default ON = 18:00, OFF = 6:00
olympux 45:8d18a95fcf8a 202 int do1OnTime = 64800, do1OffTime = 21600;
olympux 45:8d18a95fcf8a 203 int do2OnTime = 64800, do2OffTime = 21600;
olympux 45:8d18a95fcf8a 204 int do3OnTime = 64800, do3OffTime = 21600;
olympux 45:8d18a95fcf8a 205 int do4OnTime = 64800, do4OffTime = 21600;
olympux 45:8d18a95fcf8a 206 int do5OnTime = 64800, do5OffTime = 21600;
olympux 45:8d18a95fcf8a 207 int do6OnTime = 64800, do6OffTime = 21600;
olympux 45:8d18a95fcf8a 208 int do7OnTime = 64800, do7OffTime = 21600;
olympux 45:8d18a95fcf8a 209
olympux 45:8d18a95fcf8a 210 //RPCVariable<int> rpcLights(&wheelsOn, "wheels");
olympux 45:8d18a95fcf8a 211 //RPCVariable<char> rpcBanner(&lcdBannerMessage, "banner");
olympux 45:8d18a95fcf8a 212 //RPCVariable<float> rpcSpeed(&speed, "speed");
olympux 45:8d18a95fcf8a 213 RPCVariable<int> rpcCurrentTime(&current_time, "Time");
olympux 45:8d18a95fcf8a 214 RPCVariable<int> rpcEnableOnOffDout(&enable_onoff_dout, "EnableOnOffDout");
olympux 45:8d18a95fcf8a 215 RPCVariable<int> rpcdo0OnTime(&do0OnTime, "do0OnTime");
olympux 45:8d18a95fcf8a 216 RPCVariable<int> rpcdo0OffTime(&do0OffTime, "do0OffTime");
olympux 45:8d18a95fcf8a 217 RPCVariable<int> rpcdo1OnTime(&do1OnTime, "do1OnTime");
olympux 45:8d18a95fcf8a 218 RPCVariable<int> rpcdo1OffTime(&do1OffTime, "do1OffTime");
olympux 45:8d18a95fcf8a 219 RPCVariable<int> rpcdo2OnTime(&do2OnTime, "do2OnTime");
olympux 45:8d18a95fcf8a 220 RPCVariable<int> rpcdo2OffTime(&do2OffTime, "do2OffTime");
olympux 45:8d18a95fcf8a 221 RPCVariable<int> rpcdo3OnTime(&do3OnTime, "do3OnTime");
olympux 45:8d18a95fcf8a 222 RPCVariable<int> rpcdo3OffTime(&do3OffTime, "do3OffTime");
olympux 45:8d18a95fcf8a 223 RPCVariable<int> rpcdo4OnTime(&do4OnTime, "do4OnTime");
olympux 45:8d18a95fcf8a 224 RPCVariable<int> rpcdo4OffTime(&do4OffTime, "do4OffTime");
olympux 45:8d18a95fcf8a 225 RPCVariable<int> rpcdo5OnTime(&do5OnTime, "do5OnTime");
olympux 45:8d18a95fcf8a 226 RPCVariable<int> rpcdo5OffTime(&do5OffTime, "do5OffTime");
olympux 45:8d18a95fcf8a 227 RPCVariable<int> rpcdo6OnTime(&do6OnTime, "do6OnTime");
olympux 45:8d18a95fcf8a 228 RPCVariable<int> rpcdo6OffTime(&do6OffTime, "do6OffTime");
olympux 45:8d18a95fcf8a 229 RPCVariable<int> rpcdo7OnTime(&do7OnTime, "do7OnTime");
olympux 45:8d18a95fcf8a 230 RPCVariable<int> rpcdo7OffTime(&do7OffTime, "do7OffTime");
olympux 45:8d18a95fcf8a 231
olympux 45:8d18a95fcf8a 232 // RPC function definitions
olympux 45:8d18a95fcf8a 233 // Create a function of the required format
olympux 45:8d18a95fcf8a 234 void set_current_time(Arguments* args, Reply* rep);
olympux 45:8d18a95fcf8a 235 void set_current_time(Arguments* args, Reply* rep){
olympux 45:8d18a95fcf8a 236 time_t ct = (time_t)current_time; // convert
olympux 45:8d18a95fcf8a 237 struct tm *st = localtime(&ct);
olympux 45:8d18a95fcf8a 238
olympux 45:8d18a95fcf8a 239 set_time(ct); // set time
olympux 45:8d18a95fcf8a 240
olympux 45:8d18a95fcf8a 241 DBG("Set current time to: %s", ctime(&ct));
olympux 45:8d18a95fcf8a 242 DBG("Time only: %d:%d:%d", st->tm_hour, st->tm_min, st->tm_sec);
olympux 45:8d18a95fcf8a 243 }
olympux 45:8d18a95fcf8a 244 // Attach it to an RPC object
olympux 45:8d18a95fcf8a 245 RPCFunction rpcSetCurrentTime(&set_current_time, "SetTime");
olympux 45:8d18a95fcf8a 246
olympux 26:09e0dd020900 247
olympux 2:18f10e7209f4 248 /*
olympux 42:d0ff08711ca5 249 * Threads
olympux 42:d0ff08711ca5 250 */
olympux 20:71c7950fdd91 251 // WDT reset
olympux 31:2e4b6de6c2f3 252 void wdt_reset_thread(void const* args)
olympux 31:2e4b6de6c2f3 253 {
olympux 20:71c7950fdd91 254 while (true)
olympux 20:71c7950fdd91 255 wdt.Service();
olympux 20:71c7950fdd91 256 }
olympux 20:71c7950fdd91 257
olympux 40:c966abbe2d62 258
olympux 40:c966abbe2d62 259 HTTPServer create_simple_server()
olympux 40:c966abbe2d62 260 {
olympux 40:c966abbe2d62 261 HTTPServer srv;
olympux 40:c966abbe2d62 262 srv.add_request_handler("DELETE", new DeleteRequestHandler());
olympux 40:c966abbe2d62 263 srv.add_request_handler("GET", new GetRequestHandler());
olympux 40:c966abbe2d62 264 srv.add_request_handler("PUT", new PutRequestHandler());
olympux 40:c966abbe2d62 265 return srv;
olympux 40:c966abbe2d62 266 }
olympux 40:c966abbe2d62 267
olympux 40:c966abbe2d62 268 HTTPServer create_interactive_server()
olympux 39:083cf93121a9 269 {
olympux 40:c966abbe2d62 270 HTTPServer srv(new InteractiveHTMLFormatter());
olympux 40:c966abbe2d62 271 srv.add_request_handler("GET", new ComplexRequestHandler());
olympux 40:c966abbe2d62 272 return srv;
olympux 38:f8735ae519aa 273 }
olympux 38:f8735ae519aa 274
olympux 45:8d18a95fcf8a 275 // Prototypes
olympux 45:8d18a95fcf8a 276 void digital_outputs_timer_thread(void const* args);
olympux 45:8d18a95fcf8a 277
olympux 38:f8735ae519aa 278 // Main code
olympux 4:568c97f2a407 279 int main()
olympux 4:568c97f2a407 280 {
olympux 42:d0ff08711ca5 281 int ret;
olympux 42:d0ff08711ca5 282
olympux 20:71c7950fdd91 283 Thread::wait(500); // turn on delay
olympux 31:2e4b6de6c2f3 284
olympux 4:568c97f2a407 285 /*
olympux 9:d2534ecf88c6 286 * Configure
olympux 4:568c97f2a407 287 */
olympux 11:709f90a3b599 288 uart.baud(115200);
olympux 36:dc6f079777bb 289 DBG("Starting...");
olympux 31:2e4b6de6c2f3 290
olympux 31:2e4b6de6c2f3 291 // check watchdog
olympux 20:71c7950fdd91 292 if (wdt.WatchdogCausedReset())
olympux 20:71c7950fdd91 293 DBG("Watchdog caused reset.");
olympux 20:71c7950fdd91 294 wdt.Configure(4);
olympux 31:2e4b6de6c2f3 295
olympux 6:d054e394fba3 296 /*
olympux 6:d054e394fba3 297 * FLASH
olympux 6:d054e394fba3 298 */
olympux 12:7c152c0ca4d8 299 load_eeprom_network();
olympux 15:edeb0aed160d 300 load_eeprom_tcpserver();
olympux 31:2e4b6de6c2f3 301
olympux 20:71c7950fdd91 302 /*
olympux 20:71c7950fdd91 303 * UI threads
olympux 20:71c7950fdd91 304 */
olympux 20:71c7950fdd91 305 Thread t3(wdt_reset_thread);
olympux 45:8d18a95fcf8a 306 Thread t4(digital_outputs_timer_thread);
olympux 40:c966abbe2d62 307
olympux 40:c966abbe2d62 308 // rpc
olympux 40:c966abbe2d62 309 RPCType::instance().register_types();
olympux 31:2e4b6de6c2f3 310
olympux 4:568c97f2a407 311 /*
olympux 4:568c97f2a407 312 * Ethernet
olympux 4:568c97f2a407 313 */
olympux 6:d054e394fba3 314 ret = ethernet_init();
olympux 4:568c97f2a407 315 if (ret) {
olympux 18:ca499a2e7da6 316 ERR("Ethernet initialisation failed. App halted.");
olympux 4:568c97f2a407 317 while (true) {};
olympux 4:568c97f2a407 318 }
olympux 31:2e4b6de6c2f3 319
olympux 23:47ee805435b1 320 Thread::wait(2000); // TCP/UDP stack delay
olympux 31:2e4b6de6c2f3 321
olympux 40:c966abbe2d62 322 // create rpc http server
olympux 40:c966abbe2d62 323 HTTPServer srv = create_interactive_server();
olympux 26:09e0dd020900 324
olympux 40:c966abbe2d62 325 if(!srv.init(SERVER_PORT))
olympux 40:c966abbe2d62 326 {
olympux 40:c966abbe2d62 327 eth.disconnect();
olympux 40:c966abbe2d62 328 return -1;
olympux 27:22f289beceb8 329 }
olympux 31:2e4b6de6c2f3 330
olympux 40:c966abbe2d62 331 srv.run();
olympux 26:09e0dd020900 332 }
olympux 26:09e0dd020900 333
olympux 26:09e0dd020900 334
olympux 26:09e0dd020900 335 /*
olympux 42:d0ff08711ca5 336 * W5500 Ethernet init
olympux 42:d0ff08711ca5 337 */
olympux 31:2e4b6de6c2f3 338 int ethernet_init(void)
olympux 31:2e4b6de6c2f3 339 {
olympux 26:09e0dd020900 340 int dhcp_ret, ret;
olympux 31:2e4b6de6c2f3 341
olympux 27:22f289beceb8 342 DBG("Initialising ethernet...");
olympux 31:2e4b6de6c2f3 343
olympux 26:09e0dd020900 344 // if not configured, try dhcp
olympux 26:09e0dd020900 345 dhcp_ret = -1;
olympux 26:09e0dd020900 346 if (configured_ip != DEFAULT_ENABLE_FLAG_VALUE) {
olympux 27:22f289beceb8 347 DBG("Connecting to DHCP server...");
olympux 26:09e0dd020900 348 dhcp_ret = eth.init(u8mac);
olympux 26:09e0dd020900 349 if (dhcp_ret == 0)
olympux 26:09e0dd020900 350 dhcp_ret = eth.connect();
olympux 26:09e0dd020900 351 }
olympux 31:2e4b6de6c2f3 352
olympux 26:09e0dd020900 353 if (dhcp_ret != 0) {
olympux 26:09e0dd020900 354 DBG("No DHCP, load static IP configuration");
olympux 26:09e0dd020900 355 ret = eth.init(u8mac, str_ip_addr, str_ip_subnet, str_ip_gateway); // static
olympux 26:09e0dd020900 356 } else {
olympux 26:09e0dd020900 357 snprintf(str_ip_addr, 16, "%s", eth.getIPAddress());
olympux 26:09e0dd020900 358 snprintf(str_ip_subnet, 16, "%s", eth.getNetworkMask());
olympux 26:09e0dd020900 359 snprintf(str_ip_gateway, 16, "%s", eth.getGateway());
olympux 26:09e0dd020900 360 ret = 0;
olympux 26:09e0dd020900 361 }
olympux 26:09e0dd020900 362
olympux 26:09e0dd020900 363 if (ret == 0) {
olympux 26:09e0dd020900 364 DBG("Initialized, MAC: %s", eth.getMACAddress());
olympux 26:09e0dd020900 365 } else {
olympux 26:09e0dd020900 366 ERR("Error eth.init() - ret = %d", ret);
olympux 26:09e0dd020900 367 return -1;
olympux 26:09e0dd020900 368 }
olympux 26:09e0dd020900 369
olympux 26:09e0dd020900 370 ret = eth.connect();
olympux 26:09e0dd020900 371 if (!ret) {
olympux 26:09e0dd020900 372 DBG("IP: %s, MASK: %s, GW: %s", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
olympux 26:09e0dd020900 373 } else {
olympux 26:09e0dd020900 374 ERR("Error eth.connect() - ret = %d", ret);
olympux 26:09e0dd020900 375 return -1;
olympux 26:09e0dd020900 376 }
olympux 31:2e4b6de6c2f3 377
olympux 26:09e0dd020900 378 return 0;
olympux 26:09e0dd020900 379 }
olympux 26:09e0dd020900 380
olympux 45:8d18a95fcf8a 381 // Timer thread to check on/off time of digital outputs
olympux 45:8d18a95fcf8a 382 void digital_outputs_timer_thread(void const* args)
olympux 45:8d18a95fcf8a 383 {
olympux 45:8d18a95fcf8a 384 Thread::wait(700);
olympux 45:8d18a95fcf8a 385
olympux 45:8d18a95fcf8a 386 while(true) {
olympux 45:8d18a95fcf8a 387 // read current time
olympux 45:8d18a95fcf8a 388 time_t seconds = time(NULL);
olympux 45:8d18a95fcf8a 389 struct tm *st = localtime(&seconds);
olympux 45:8d18a95fcf8a 390 int current_time_in_seconds = 3600*(st->tm_hour) + 60*(st->tm_min) + st->tm_sec;
olympux 45:8d18a95fcf8a 391 DBG("Current time: %d:%d:%d", st->tm_hour, st->tm_min, st->tm_sec);
olympux 45:8d18a95fcf8a 392
olympux 45:8d18a95fcf8a 393 // check do0
olympux 45:8d18a95fcf8a 394 if ((enable_onoff_dout && 0x01) == 0x01) {
olympux 45:8d18a95fcf8a 395 if (do0OnTime < do0OffTime) {
olympux 45:8d18a95fcf8a 396 if ((current_time_in_seconds >= do0OnTime) && (current_time_in_seconds < do0OffTime)){
olympux 45:8d18a95fcf8a 397 if (dout0 == 0) {
olympux 45:8d18a95fcf8a 398 dout0 = 1;
olympux 45:8d18a95fcf8a 399 DBG("do0 ON");
olympux 45:8d18a95fcf8a 400 }
olympux 45:8d18a95fcf8a 401 else {
olympux 45:8d18a95fcf8a 402 DBG("do0 ON'ed");
olympux 45:8d18a95fcf8a 403 }
olympux 45:8d18a95fcf8a 404 }
olympux 45:8d18a95fcf8a 405 else {
olympux 45:8d18a95fcf8a 406 if (dout0 == 1) {
olympux 45:8d18a95fcf8a 407 dout0 = 0;
olympux 45:8d18a95fcf8a 408 DBG("do0 OFF'ed");
olympux 45:8d18a95fcf8a 409 }
olympux 45:8d18a95fcf8a 410 else {
olympux 45:8d18a95fcf8a 411 DBG("do0 OFF");
olympux 45:8d18a95fcf8a 412 }
olympux 45:8d18a95fcf8a 413 }
olympux 45:8d18a95fcf8a 414 }
olympux 45:8d18a95fcf8a 415 else {
olympux 45:8d18a95fcf8a 416 if ((current_time_in_seconds >= do0OffTime) && ((current_time_in_seconds < do0OnTime))) {
olympux 45:8d18a95fcf8a 417 if (dout0 == 1) {
olympux 45:8d18a95fcf8a 418 dout0 = 0;
olympux 45:8d18a95fcf8a 419 DBG("do0 OFF");
olympux 45:8d18a95fcf8a 420 }
olympux 45:8d18a95fcf8a 421 else {
olympux 45:8d18a95fcf8a 422 DBG("do0 OFF'ed");
olympux 45:8d18a95fcf8a 423 }
olympux 45:8d18a95fcf8a 424 }
olympux 45:8d18a95fcf8a 425 else {
olympux 45:8d18a95fcf8a 426 if (dout0 == 0) {
olympux 45:8d18a95fcf8a 427 dout0 = 1;
olympux 45:8d18a95fcf8a 428 DBG("do0 ON");
olympux 45:8d18a95fcf8a 429 }
olympux 45:8d18a95fcf8a 430 else {
olympux 45:8d18a95fcf8a 431 DBG("do0 ON'ed");
olympux 45:8d18a95fcf8a 432 }
olympux 45:8d18a95fcf8a 433 }
olympux 45:8d18a95fcf8a 434 }
olympux 45:8d18a95fcf8a 435 } // end check do0
olympux 45:8d18a95fcf8a 436
olympux 45:8d18a95fcf8a 437 // check do1
olympux 45:8d18a95fcf8a 438 if ((enable_onoff_dout && 0x02) == 0x02) {
olympux 45:8d18a95fcf8a 439 if (do1OnTime < do1OffTime) {
olympux 45:8d18a95fcf8a 440 if ((current_time_in_seconds >= do1OnTime) && (current_time_in_seconds < do1OffTime)){
olympux 45:8d18a95fcf8a 441 if (dout1 == 0) {
olympux 45:8d18a95fcf8a 442 dout1 = 1;
olympux 45:8d18a95fcf8a 443 DBG("do1 ON");
olympux 45:8d18a95fcf8a 444 }
olympux 45:8d18a95fcf8a 445 else {
olympux 45:8d18a95fcf8a 446 DBG("do1 ON'ed");
olympux 45:8d18a95fcf8a 447 }
olympux 45:8d18a95fcf8a 448 }
olympux 45:8d18a95fcf8a 449 else {
olympux 45:8d18a95fcf8a 450 if (dout1 == 1) {
olympux 45:8d18a95fcf8a 451 dout1 = 0;
olympux 45:8d18a95fcf8a 452 DBG("do1 OFF");
olympux 45:8d18a95fcf8a 453 }
olympux 45:8d18a95fcf8a 454 else {
olympux 45:8d18a95fcf8a 455 DBG("do1 OFF'ed");
olympux 45:8d18a95fcf8a 456 }
olympux 45:8d18a95fcf8a 457 }
olympux 45:8d18a95fcf8a 458 }
olympux 45:8d18a95fcf8a 459 else {
olympux 45:8d18a95fcf8a 460 if ((current_time_in_seconds >= do1OffTime) && ((current_time_in_seconds < do1OnTime))) {
olympux 45:8d18a95fcf8a 461 if (dout1 == 1) {
olympux 45:8d18a95fcf8a 462 dout1 = 0;
olympux 45:8d18a95fcf8a 463 DBG("do1 OFF");
olympux 45:8d18a95fcf8a 464 }
olympux 45:8d18a95fcf8a 465 else {
olympux 45:8d18a95fcf8a 466 DBG("do1 OFF'ed");
olympux 45:8d18a95fcf8a 467 }
olympux 45:8d18a95fcf8a 468 }
olympux 45:8d18a95fcf8a 469 else {
olympux 45:8d18a95fcf8a 470 if (dout1 == 0) {
olympux 45:8d18a95fcf8a 471 dout1 = 1;
olympux 45:8d18a95fcf8a 472 DBG("do1 ON");
olympux 45:8d18a95fcf8a 473 }
olympux 45:8d18a95fcf8a 474 else {
olympux 45:8d18a95fcf8a 475 DBG("do1 ON'ed");
olympux 45:8d18a95fcf8a 476 }
olympux 45:8d18a95fcf8a 477 }
olympux 45:8d18a95fcf8a 478 }
olympux 45:8d18a95fcf8a 479 } // end check do1
olympux 45:8d18a95fcf8a 480
olympux 45:8d18a95fcf8a 481 // check do2
olympux 45:8d18a95fcf8a 482 if ((enable_onoff_dout && 0x04) == 0x04) {
olympux 45:8d18a95fcf8a 483 if (do2OnTime < do2OffTime) {
olympux 45:8d18a95fcf8a 484 if ((current_time_in_seconds >= do2OnTime) && (current_time_in_seconds < do2OffTime)){
olympux 45:8d18a95fcf8a 485 if (dout2 == 0) {
olympux 45:8d18a95fcf8a 486 dout2 = 1;
olympux 45:8d18a95fcf8a 487 DBG("do2 ON");
olympux 45:8d18a95fcf8a 488 }
olympux 45:8d18a95fcf8a 489 else {
olympux 45:8d18a95fcf8a 490 DBG("do2 ON'ed");
olympux 45:8d18a95fcf8a 491 }
olympux 45:8d18a95fcf8a 492 }
olympux 45:8d18a95fcf8a 493 else {
olympux 45:8d18a95fcf8a 494 if (dout2 == 1) {
olympux 45:8d18a95fcf8a 495 dout2 = 0;
olympux 45:8d18a95fcf8a 496 DBG("do2 OFF");
olympux 45:8d18a95fcf8a 497 }
olympux 45:8d18a95fcf8a 498 else {
olympux 45:8d18a95fcf8a 499 DBG("do2 OFF'ed");
olympux 45:8d18a95fcf8a 500 }
olympux 45:8d18a95fcf8a 501 }
olympux 45:8d18a95fcf8a 502 }
olympux 45:8d18a95fcf8a 503 else {
olympux 45:8d18a95fcf8a 504 if ((current_time_in_seconds >= do2OffTime) && ((current_time_in_seconds < do2OnTime))) {
olympux 45:8d18a95fcf8a 505 if (dout2 == 1) {
olympux 45:8d18a95fcf8a 506 dout2 = 0;
olympux 45:8d18a95fcf8a 507 DBG("do2 OFF");
olympux 45:8d18a95fcf8a 508 }
olympux 45:8d18a95fcf8a 509 else {
olympux 45:8d18a95fcf8a 510 DBG("do2 OFF'ed");
olympux 45:8d18a95fcf8a 511 }
olympux 45:8d18a95fcf8a 512 }
olympux 45:8d18a95fcf8a 513 else {
olympux 45:8d18a95fcf8a 514 if (dout2 == 0) {
olympux 45:8d18a95fcf8a 515 dout2 = 1;
olympux 45:8d18a95fcf8a 516 DBG("do2 ON");
olympux 45:8d18a95fcf8a 517 }
olympux 45:8d18a95fcf8a 518 else {
olympux 45:8d18a95fcf8a 519 DBG("do2 ON'ed");
olympux 45:8d18a95fcf8a 520 }
olympux 45:8d18a95fcf8a 521 }
olympux 45:8d18a95fcf8a 522 }
olympux 45:8d18a95fcf8a 523 } // end check do2
olympux 45:8d18a95fcf8a 524
olympux 45:8d18a95fcf8a 525 // check do3
olympux 45:8d18a95fcf8a 526 if ((enable_onoff_dout && 0x08) == 0x08) {
olympux 45:8d18a95fcf8a 527 if (do3OnTime < do3OffTime) {
olympux 45:8d18a95fcf8a 528 if ((current_time_in_seconds >= do3OnTime) && (current_time_in_seconds < do3OffTime)){
olympux 45:8d18a95fcf8a 529 if (dout3 == 0) {
olympux 45:8d18a95fcf8a 530 dout3 = 1;
olympux 45:8d18a95fcf8a 531 DBG("do3 ON");
olympux 45:8d18a95fcf8a 532 }
olympux 45:8d18a95fcf8a 533 else {
olympux 45:8d18a95fcf8a 534 DBG("do3 ON'ed");
olympux 45:8d18a95fcf8a 535 }
olympux 45:8d18a95fcf8a 536 }
olympux 45:8d18a95fcf8a 537 else {
olympux 45:8d18a95fcf8a 538 if (dout3 == 1) {
olympux 45:8d18a95fcf8a 539 dout3 = 0;
olympux 45:8d18a95fcf8a 540 DBG("do3 OFF");
olympux 45:8d18a95fcf8a 541 }
olympux 45:8d18a95fcf8a 542 else {
olympux 45:8d18a95fcf8a 543 DBG("do3 OFF'ed");
olympux 45:8d18a95fcf8a 544 }
olympux 45:8d18a95fcf8a 545 }
olympux 45:8d18a95fcf8a 546 }
olympux 45:8d18a95fcf8a 547 else {
olympux 45:8d18a95fcf8a 548 if ((current_time_in_seconds >= do3OffTime) && ((current_time_in_seconds < do3OnTime))) {
olympux 45:8d18a95fcf8a 549 if (dout3 == 1) {
olympux 45:8d18a95fcf8a 550 dout3 = 0;
olympux 45:8d18a95fcf8a 551 DBG("do3 OFF");
olympux 45:8d18a95fcf8a 552 }
olympux 45:8d18a95fcf8a 553 else {
olympux 45:8d18a95fcf8a 554 DBG("do3 OFF'ed");
olympux 45:8d18a95fcf8a 555 }
olympux 45:8d18a95fcf8a 556 }
olympux 45:8d18a95fcf8a 557 else {
olympux 45:8d18a95fcf8a 558 if (dout3 == 0) {
olympux 45:8d18a95fcf8a 559 dout3 = 1;
olympux 45:8d18a95fcf8a 560 DBG("do3 ON");
olympux 45:8d18a95fcf8a 561 }
olympux 45:8d18a95fcf8a 562 else {
olympux 45:8d18a95fcf8a 563 DBG("do3 ON'ed");
olympux 45:8d18a95fcf8a 564 }
olympux 45:8d18a95fcf8a 565 }
olympux 45:8d18a95fcf8a 566 }
olympux 45:8d18a95fcf8a 567 } // end check do3
olympux 45:8d18a95fcf8a 568
olympux 45:8d18a95fcf8a 569 // check do4
olympux 45:8d18a95fcf8a 570 if ((enable_onoff_dout && 0x10) == 0x10) {
olympux 45:8d18a95fcf8a 571 if (do4OnTime < do4OffTime) {
olympux 45:8d18a95fcf8a 572 if ((current_time_in_seconds >= do4OnTime) && (current_time_in_seconds < do4OffTime)){
olympux 45:8d18a95fcf8a 573 if (dout4 == 0) {
olympux 45:8d18a95fcf8a 574 dout4 = 1;
olympux 45:8d18a95fcf8a 575 DBG("do4 ON");
olympux 45:8d18a95fcf8a 576 }
olympux 45:8d18a95fcf8a 577 else {
olympux 45:8d18a95fcf8a 578 DBG("do4 ON'ed");
olympux 45:8d18a95fcf8a 579 }
olympux 45:8d18a95fcf8a 580 }
olympux 45:8d18a95fcf8a 581 else {
olympux 45:8d18a95fcf8a 582 if (dout4 == 1) {
olympux 45:8d18a95fcf8a 583 dout4 = 0;
olympux 45:8d18a95fcf8a 584 DBG("do4 OFF");
olympux 45:8d18a95fcf8a 585 }
olympux 45:8d18a95fcf8a 586 else {
olympux 45:8d18a95fcf8a 587 DBG("do4 OFF'ed");
olympux 45:8d18a95fcf8a 588 }
olympux 45:8d18a95fcf8a 589 }
olympux 45:8d18a95fcf8a 590 }
olympux 45:8d18a95fcf8a 591 else {
olympux 45:8d18a95fcf8a 592 if ((current_time_in_seconds >= do4OffTime) && ((current_time_in_seconds < do4OnTime))) {
olympux 45:8d18a95fcf8a 593 if (dout4 == 1) {
olympux 45:8d18a95fcf8a 594 dout4 = 0;
olympux 45:8d18a95fcf8a 595 DBG("do4 OFF");
olympux 45:8d18a95fcf8a 596 }
olympux 45:8d18a95fcf8a 597 else {
olympux 45:8d18a95fcf8a 598 DBG("do4 OFF'ed");
olympux 45:8d18a95fcf8a 599 }
olympux 45:8d18a95fcf8a 600 }
olympux 45:8d18a95fcf8a 601 else {
olympux 45:8d18a95fcf8a 602 if (dout4 == 0) {
olympux 45:8d18a95fcf8a 603 dout4 = 1;
olympux 45:8d18a95fcf8a 604 DBG("do4 ON");
olympux 45:8d18a95fcf8a 605 }
olympux 45:8d18a95fcf8a 606 else {
olympux 45:8d18a95fcf8a 607 DBG("do4 ON'ed");
olympux 45:8d18a95fcf8a 608 }
olympux 45:8d18a95fcf8a 609 }
olympux 45:8d18a95fcf8a 610 }
olympux 45:8d18a95fcf8a 611 } // end check do4
olympux 45:8d18a95fcf8a 612
olympux 45:8d18a95fcf8a 613 // check do5
olympux 45:8d18a95fcf8a 614 if ((enable_onoff_dout && 0x20) == 0x20) {
olympux 45:8d18a95fcf8a 615 if (do5OnTime < do5OffTime) {
olympux 45:8d18a95fcf8a 616 if ((current_time_in_seconds >= do5OnTime) && (current_time_in_seconds < do5OffTime)){
olympux 45:8d18a95fcf8a 617 if (dout5 == 0) {
olympux 45:8d18a95fcf8a 618 dout5 = 1;
olympux 45:8d18a95fcf8a 619 DBG("do5 ON");
olympux 45:8d18a95fcf8a 620 }
olympux 45:8d18a95fcf8a 621 else {
olympux 45:8d18a95fcf8a 622 DBG("do5 ON'ed");
olympux 45:8d18a95fcf8a 623 }
olympux 45:8d18a95fcf8a 624 }
olympux 45:8d18a95fcf8a 625 else {
olympux 45:8d18a95fcf8a 626 if (dout5 == 1) {
olympux 45:8d18a95fcf8a 627 dout5 = 0;
olympux 45:8d18a95fcf8a 628 DBG("do5 OFF");
olympux 45:8d18a95fcf8a 629 }
olympux 45:8d18a95fcf8a 630 else {
olympux 45:8d18a95fcf8a 631 DBG("do5 OFF'ed");
olympux 45:8d18a95fcf8a 632 }
olympux 45:8d18a95fcf8a 633 }
olympux 45:8d18a95fcf8a 634 }
olympux 45:8d18a95fcf8a 635 else {
olympux 45:8d18a95fcf8a 636 if ((current_time_in_seconds >= do5OffTime) && ((current_time_in_seconds < do5OnTime))) {
olympux 45:8d18a95fcf8a 637 if (dout5 == 1) {
olympux 45:8d18a95fcf8a 638 dout5 = 0;
olympux 45:8d18a95fcf8a 639 DBG("do5 OFF");
olympux 45:8d18a95fcf8a 640 }
olympux 45:8d18a95fcf8a 641 else {
olympux 45:8d18a95fcf8a 642 DBG("do5 OFF'ed");
olympux 45:8d18a95fcf8a 643 }
olympux 45:8d18a95fcf8a 644 }
olympux 45:8d18a95fcf8a 645 else {
olympux 45:8d18a95fcf8a 646 if (dout5 == 0) {
olympux 45:8d18a95fcf8a 647 dout5 = 1;
olympux 45:8d18a95fcf8a 648 DBG("do5 ON");
olympux 45:8d18a95fcf8a 649 }
olympux 45:8d18a95fcf8a 650 else {
olympux 45:8d18a95fcf8a 651 DBG("do5 ON'ed");
olympux 45:8d18a95fcf8a 652 }
olympux 45:8d18a95fcf8a 653 }
olympux 45:8d18a95fcf8a 654 }
olympux 45:8d18a95fcf8a 655 } // end check do5
olympux 45:8d18a95fcf8a 656
olympux 45:8d18a95fcf8a 657 // check do6
olympux 45:8d18a95fcf8a 658 if ((enable_onoff_dout && 0x40) == 0x40) {
olympux 45:8d18a95fcf8a 659 if (do6OnTime < do6OffTime) {
olympux 45:8d18a95fcf8a 660 if ((current_time_in_seconds >= do6OnTime) && (current_time_in_seconds < do6OffTime)){
olympux 45:8d18a95fcf8a 661 if (dout6 == 0) {
olympux 45:8d18a95fcf8a 662 dout6 = 1;
olympux 45:8d18a95fcf8a 663 DBG("do6 ON");
olympux 45:8d18a95fcf8a 664 }
olympux 45:8d18a95fcf8a 665 else {
olympux 45:8d18a95fcf8a 666 DBG("do6 ON'ed");
olympux 45:8d18a95fcf8a 667 }
olympux 45:8d18a95fcf8a 668 }
olympux 45:8d18a95fcf8a 669 else {
olympux 45:8d18a95fcf8a 670 if (dout6 == 1) {
olympux 45:8d18a95fcf8a 671 dout6 = 0;
olympux 45:8d18a95fcf8a 672 DBG("do6 OFF");
olympux 45:8d18a95fcf8a 673 }
olympux 45:8d18a95fcf8a 674 else {
olympux 45:8d18a95fcf8a 675 DBG("do6 OFF'ed");
olympux 45:8d18a95fcf8a 676 }
olympux 45:8d18a95fcf8a 677 }
olympux 45:8d18a95fcf8a 678 }
olympux 45:8d18a95fcf8a 679 else {
olympux 45:8d18a95fcf8a 680 if ((current_time_in_seconds >= do6OffTime) && ((current_time_in_seconds < do6OnTime))) {
olympux 45:8d18a95fcf8a 681 if (dout6 == 1) {
olympux 45:8d18a95fcf8a 682 dout6 = 0;
olympux 45:8d18a95fcf8a 683 DBG("do6 OFF");
olympux 45:8d18a95fcf8a 684 }
olympux 45:8d18a95fcf8a 685 else {
olympux 45:8d18a95fcf8a 686 DBG("do6 OFF'ed");
olympux 45:8d18a95fcf8a 687 }
olympux 45:8d18a95fcf8a 688 }
olympux 45:8d18a95fcf8a 689 else {
olympux 45:8d18a95fcf8a 690 if (dout6 == 0) {
olympux 45:8d18a95fcf8a 691 dout6 = 1;
olympux 45:8d18a95fcf8a 692 DBG("do6 ON");
olympux 45:8d18a95fcf8a 693 }
olympux 45:8d18a95fcf8a 694 else {
olympux 45:8d18a95fcf8a 695 DBG("do6 ON'ed");
olympux 45:8d18a95fcf8a 696 }
olympux 45:8d18a95fcf8a 697 }
olympux 45:8d18a95fcf8a 698 }
olympux 45:8d18a95fcf8a 699 } // end check do6
olympux 45:8d18a95fcf8a 700
olympux 45:8d18a95fcf8a 701 // check do7
olympux 45:8d18a95fcf8a 702 if ((enable_onoff_dout && 0x80) == 0x80) {
olympux 45:8d18a95fcf8a 703 if (do7OnTime < do7OffTime) {
olympux 45:8d18a95fcf8a 704 if ((current_time_in_seconds >= do7OnTime) && (current_time_in_seconds < do7OffTime)){
olympux 45:8d18a95fcf8a 705 if (dout7 == 0) {
olympux 45:8d18a95fcf8a 706 dout7 = 1;
olympux 45:8d18a95fcf8a 707 DBG("do7 ON");
olympux 45:8d18a95fcf8a 708 }
olympux 45:8d18a95fcf8a 709 else {
olympux 45:8d18a95fcf8a 710 DBG("do7 ON'ed");
olympux 45:8d18a95fcf8a 711 }
olympux 45:8d18a95fcf8a 712 }
olympux 45:8d18a95fcf8a 713 else {
olympux 45:8d18a95fcf8a 714 if (dout7 == 1) {
olympux 45:8d18a95fcf8a 715 dout7 = 0;
olympux 45:8d18a95fcf8a 716 DBG("do7 OFF");
olympux 45:8d18a95fcf8a 717 }
olympux 45:8d18a95fcf8a 718 else {
olympux 45:8d18a95fcf8a 719 DBG("do7 OFF'ed");
olympux 45:8d18a95fcf8a 720 }
olympux 45:8d18a95fcf8a 721 }
olympux 45:8d18a95fcf8a 722 }
olympux 45:8d18a95fcf8a 723 else {
olympux 45:8d18a95fcf8a 724 if ((current_time_in_seconds >= do7OffTime) && ((current_time_in_seconds < do7OnTime))) {
olympux 45:8d18a95fcf8a 725 if (dout7 == 1) {
olympux 45:8d18a95fcf8a 726 dout7 = 0;
olympux 45:8d18a95fcf8a 727 DBG("do7 OFF");
olympux 45:8d18a95fcf8a 728 }
olympux 45:8d18a95fcf8a 729 else {
olympux 45:8d18a95fcf8a 730 DBG("do7 OFF'ed");
olympux 45:8d18a95fcf8a 731 }
olympux 45:8d18a95fcf8a 732 }
olympux 45:8d18a95fcf8a 733 else {
olympux 45:8d18a95fcf8a 734 if (dout7 == 0) {
olympux 45:8d18a95fcf8a 735 dout7 = 1;
olympux 45:8d18a95fcf8a 736 DBG("do7 ON");
olympux 45:8d18a95fcf8a 737 }
olympux 45:8d18a95fcf8a 738 else {
olympux 45:8d18a95fcf8a 739 DBG("do7 ON'ed");
olympux 45:8d18a95fcf8a 740 }
olympux 45:8d18a95fcf8a 741 }
olympux 45:8d18a95fcf8a 742 }
olympux 45:8d18a95fcf8a 743 } // end check do7
olympux 45:8d18a95fcf8a 744
olympux 45:8d18a95fcf8a 745
olympux 45:8d18a95fcf8a 746 // wait 1s
olympux 45:8d18a95fcf8a 747 Thread::wait(10000); // Thread::wait() in ms
olympux 45:8d18a95fcf8a 748 }
olympux 45:8d18a95fcf8a 749 }