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:
Fri Sep 26 20:07:34 2014 +0000
Revision:
9:d2534ecf88c6
Parent:
8:64848959adb9
Child:
10:4cd965d79de0
Added & tested NTP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 0:c2eac797face 1 /*
olympux 0:c2eac797face 2 *
olympux 2:18f10e7209f4 3 * Alarm and Monitoring application
olympux 0:c2eac797face 4
olympux 0:c2eac797face 5 */
olympux 0:c2eac797face 6 #include "mbed.h"
olympux 6:d054e394fba3 7 //#include "eeprom.h"
olympux 0:c2eac797face 8 #include "EthernetInterface.h"
olympux 9:d2534ecf88c6 9 #include "NTPClient.h"
olympux 0:c2eac797face 10 #include "rtos.h"
olympux 0:c2eac797face 11
olympux 0:c2eac797face 12
olympux 2:18f10e7209f4 13 /*
olympux 2:18f10e7209f4 14 * Hardware defines
olympux 0:c2eac797face 15 */
olympux 2:18f10e7209f4 16 #define ST_NUCLEO // hardware pin mapping
olympux 0:c2eac797face 17
olympux 0:c2eac797face 18 #ifdef ST_NUCLEO
olympux 9:d2534ecf88c6 19 // Ethernet
olympux 0:c2eac797face 20 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
olympux 0:c2eac797face 21 EthernetInterface eth(&spi, PC_8, PC_9); // spi, cs, reset
olympux 0:c2eac797face 22 #endif
olympux 0:c2eac797face 23
olympux 9:d2534ecf88c6 24 // Serial
olympux 2:18f10e7209f4 25 Serial uart(USBTX,USBRX);
olympux 2:18f10e7209f4 26
olympux 9:d2534ecf88c6 27 // Digital inputs
olympux 9:d2534ecf88c6 28 // Digital outputs
olympux 9:d2534ecf88c6 29 // Analog inputs
olympux 9:d2534ecf88c6 30 // Analog outputs
olympux 9:d2534ecf88c6 31 //AnalogOut ano0(p18);
olympux 9:d2534ecf88c6 32
olympux 9:d2534ecf88c6 33
olympux 9:d2534ecf88c6 34 // eeprom
olympux 9:d2534ecf88c6 35 #define NumbOfVar ((uint8_t)0x80) // REMEMBER: update this variable in eeprom.h too
olympux 9:d2534ecf88c6 36 #define IP_ADDRESS_POS 0
olympux 9:d2534ecf88c6 37 #define IP_SUBNET_POS 4
olympux 9:d2534ecf88c6 38 #define IP_GATEWAY_POS 8
olympux 9:d2534ecf88c6 39 #define TCP_SERVER_PORT_POS 12
olympux 9:d2534ecf88c6 40 #define UDP_SERVER_PORT_POS 13
olympux 9:d2534ecf88c6 41 #define FIRST_RUN_FLAG_POS 14
olympux 9:d2534ecf88c6 42 #define MAC_ADDRESS_POS 15
olympux 6:d054e394fba3 43 // Virtual address defined by the user: 0xFFFF value is prohibited
olympux 6:d054e394fba3 44 uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr
olympux 6:d054e394fba3 45 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet
olympux 6:d054e394fba3 46 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway
olympux 6:d054e394fba3 47 0x4212, // TCP server port, not used
olympux 8:64848959adb9 48 0x5212, // UDP server port, not used
olympux 9:d2534ecf88c6 49 0x8888, // 1st run?
olympux 9:d2534ecf88c6 50 0x6212, 0x6313, 0x6414 // MAC
olympux 6:d054e394fba3 51 };
olympux 6:d054e394fba3 52 extern "C" uint16_t EE_Init(void);
olympux 6:d054e394fba3 53 extern "C" uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data);
olympux 6:d054e394fba3 54 extern "C" uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data);
olympux 4:568c97f2a407 55
olympux 0:c2eac797face 56
olympux 2:18f10e7209f4 57 /*
olympux 2:18f10e7209f4 58 * Network configuration
olympux 2:18f10e7209f4 59 */
olympux 4:568c97f2a407 60 #define TCP_SERVER
olympux 4:568c97f2a407 61 //#define TCP_CLIENT
olympux 4:568c97f2a407 62 #define UDP_SERVER
olympux 4:568c97f2a407 63 //#define UDP_CLIENT
olympux 4:568c97f2a407 64 //#define NTP
olympux 4:568c97f2a407 65
olympux 8:64848959adb9 66 #define DEFAULT_IP_ADDRESS "192.168.0.249"
olympux 8:64848959adb9 67 #define DEFAULT_IP_SUBNET "255.255.255.0"
olympux 8:64848959adb9 68 #define DEFAULT_IP_GATEWAY "192.168.0.1"
olympux 9:d2534ecf88c6 69 #define DEFAULT_MAC3 0x00
olympux 9:d2534ecf88c6 70 #define DEFAULT_MAC4 0x00
olympux 9:d2534ecf88c6 71 #define DEFAULT_MAC5 0x01
olympux 8:64848959adb9 72
olympux 4:568c97f2a407 73 #define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200
olympux 4:568c97f2a407 74 #define TCP_SERVER_RECEIVE_TIMEOUT 3000
olympux 4:568c97f2a407 75 #define UDP_SERVER_RECEIVE_TIMEOUT 200
olympux 4:568c97f2a407 76
olympux 0:c2eac797face 77 // for static IP setting
olympux 9:d2534ecf88c6 78 uint8_t mac[6];
olympux 9:d2534ecf88c6 79 char * IP_Addr; // pointers to
olympux 7:d45bd480e90f 80 char * IP_Subnet;
olympux 7:d45bd480e90f 81 char * IP_Gateway;
olympux 6:d054e394fba3 82
olympux 9:d2534ecf88c6 83 uint16_t u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4]; // directly loaded from eeprom
olympux 9:d2534ecf88c6 84 uint16_t first_run = 0; // first run flag
olympux 9:d2534ecf88c6 85 uint16_t u16mac_addr[3]; // loaded from eeprom
olympux 9:d2534ecf88c6 86 char ip_addr[16], ip_subnet[16], ip_gateway[16]; // chars, converted from u16ip_xxx
olympux 9:d2534ecf88c6 87
olympux 9:d2534ecf88c6 88 const uint16_t tcp_server_port = 10000; // fixed
olympux 9:d2534ecf88c6 89 const uint16_t udp_server_port = 11000; // fixed
olympux 0:c2eac797face 90
olympux 3:972ed747474c 91 char buffer[256]; // socket buffer
olympux 3:972ed747474c 92
olympux 9:d2534ecf88c6 93 NTPClient ntp;
olympux 9:d2534ecf88c6 94
olympux 9:d2534ecf88c6 95 // Commands
olympux 9:d2534ecf88c6 96 #define DEVICE_ID "NNIO"
olympux 9:d2534ecf88c6 97 #define DISCOVERY_COMMAND "NNIODS"
olympux 9:d2534ecf88c6 98 #define TCP_SERVER_PORT_COMAMND "NNIOTP"
olympux 9:d2534ecf88c6 99 #define UDP_SERVER_PORT_COMAMND "NNIOUP"
olympux 9:d2534ecf88c6 100 #define QUERY_STATUS_COMMAND (uint8_t)'Q'
olympux 9:d2534ecf88c6 101
olympux 9:d2534ecf88c6 102
olympux 9:d2534ecf88c6 103 // Positions
olympux 9:d2534ecf88c6 104 #define RECEIVING_PROTOCOL_OP_POS 4
olympux 9:d2534ecf88c6 105 #define RECEIVING_PROTOCOL_EN_DO_POS RECEIVING_PROTOCOL_OP_POS + 0
olympux 9:d2534ecf88c6 106 #define RECEIVING_PROTOCOL_EN_A0O_POS RECEIVING_PROTOCOL_OP_POS + 1
olympux 9:d2534ecf88c6 107 #define RECEIVING_PROTOCOL_EN_A1O_POS RECEIVING_PROTOCOL_OP_POS + 2
olympux 9:d2534ecf88c6 108 #define RECEIVING_PROTOCOL_EN_UART_POS RECEIVING_PROTOCOL_OP_POS + 3
olympux 9:d2534ecf88c6 109 #define RECEIVING_PROTOCOL_COMMAND_POS RECEIVING_PROTOCOL_OP_POS + 4
olympux 9:d2534ecf88c6 110 #define RECEIVING_PROTOCOL_ENABLE_OUTPUT (uint8_t)'O'
olympux 9:d2534ecf88c6 111
olympux 9:d2534ecf88c6 112
olympux 9:d2534ecf88c6 113 #define RECEIVING_PROTOCOL_POS_IP 9
olympux 9:d2534ecf88c6 114 #define RECEIVING_PROTOCOL_POS_DO 13
olympux 9:d2534ecf88c6 115 #define RECEIVING_PROTOCOL_POS_A0O 21
olympux 9:d2534ecf88c6 116 #define RECEIVING_PROTOCOL_POS_A01 23
olympux 9:d2534ecf88c6 117 #define RECEIVING_PROTOCOL_POS_UART 25
olympux 9:d2534ecf88c6 118
olympux 0:c2eac797face 119
olympux 2:18f10e7209f4 120
olympux 2:18f10e7209f4 121 /*
olympux 2:18f10e7209f4 122 * RTOS
olympux 2:18f10e7209f4 123 */
olympux 2:18f10e7209f4 124 struct message_t {
olympux 2:18f10e7209f4 125 int len;
olympux 2:18f10e7209f4 126 char *msg;
olympux 2:18f10e7209f4 127 };
olympux 3:972ed747474c 128 Queue<message_t, 16> uart_queue;
olympux 2:18f10e7209f4 129
olympux 3:972ed747474c 130 Mutex uart_mutex;
olympux 2:18f10e7209f4 131
olympux 2:18f10e7209f4 132
olympux 2:18f10e7209f4 133 /*
olympux 2:18f10e7209f4 134 * Threads
olympux 2:18f10e7209f4 135 */
olympux 0:c2eac797face 136 void uart_thread(void const *args) {
olympux 2:18f10e7209f4 137 message_t *p_message;
olympux 0:c2eac797face 138
olympux 0:c2eac797face 139 while (true) {
olympux 3:972ed747474c 140 osEvent evt = uart_queue.get();
olympux 2:18f10e7209f4 141 if (evt.status == osEventMessage) {
olympux 2:18f10e7209f4 142 p_message = (message_t*)evt.value.p;
olympux 3:972ed747474c 143 uart_mutex.lock();
olympux 3:972ed747474c 144 //uart.printf("len=%d\n", p_message->len);
olympux 3:972ed747474c 145 uart.printf("%s\n", p_message->msg);
olympux 3:972ed747474c 146 uart_mutex.unlock();
olympux 2:18f10e7209f4 147 }
olympux 0:c2eac797face 148 }
olympux 0:c2eac797face 149 }
olympux 0:c2eac797face 150
olympux 0:c2eac797face 151
olympux 6:d054e394fba3 152 /*
olympux 6:d054e394fba3 153 * Ethernet init
olympux 6:d054e394fba3 154 */
olympux 4:568c97f2a407 155 int ethernet_init(void) {
olympux 7:d45bd480e90f 156 //printf("Start\n");
olympux 6:d054e394fba3 157 int ret = eth.init(mac, IP_Addr, IP_Subnet, IP_Gateway); // static
olympux 0:c2eac797face 158
olympux 0:c2eac797face 159 if (!ret) {
olympux 9:d2534ecf88c6 160 uart.printf("Initialized, MAC: %s\n", eth.getMACAddress());
olympux 0:c2eac797face 161 } else {
olympux 2:18f10e7209f4 162 uart.printf("Error eth.init() - ret = %d\n", ret);
olympux 0:c2eac797face 163 return -1;
olympux 0:c2eac797face 164 }
olympux 0:c2eac797face 165
olympux 0:c2eac797face 166 ret = eth.connect();
olympux 0:c2eac797face 167 if (!ret) {
olympux 8:64848959adb9 168 uart.printf("IP: %s, MASK: %s, GW: %s\n", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway());
olympux 0:c2eac797face 169 } else {
olympux 2:18f10e7209f4 170 uart.printf("Error eth.connect() - ret = %d\n", ret);
olympux 0:c2eac797face 171 return -1;
olympux 0:c2eac797face 172 }
olympux 3:972ed747474c 173
olympux 4:568c97f2a407 174 return 0;
olympux 4:568c97f2a407 175 }
olympux 4:568c97f2a407 176
olympux 4:568c97f2a407 177
olympux 6:d054e394fba3 178 /*
olympux 6:d054e394fba3 179 * EEPROM functions
olympux 6:d054e394fba3 180 */
olympux 6:d054e394fba3 181 void write_eeprom(char *buffer) {
olympux 9:d2534ecf88c6 182 // Write network configuration
olympux 9:d2534ecf88c6 183 // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
olympux 9:d2534ecf88c6 184
olympux 6:d054e394fba3 185 // Unlock the Flash Program Erase controller */
olympux 6:d054e394fba3 186 FLASH_Unlock();
olympux 6:d054e394fba3 187 // EEPROM Init
olympux 6:d054e394fba3 188 EE_Init();
olympux 6:d054e394fba3 189 // IP address
olympux 9:d2534ecf88c6 190 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buffer++);
olympux 9:d2534ecf88c6 191 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buffer++);
olympux 9:d2534ecf88c6 192 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buffer++);
olympux 9:d2534ecf88c6 193 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buffer++);
olympux 9:d2534ecf88c6 194
olympux 6:d054e394fba3 195 // IP subnet
olympux 9:d2534ecf88c6 196 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buffer++);
olympux 9:d2534ecf88c6 197 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buffer++);
olympux 9:d2534ecf88c6 198 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buffer++);
olympux 9:d2534ecf88c6 199 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buffer++);
olympux 9:d2534ecf88c6 200
olympux 6:d054e394fba3 201 // IP gateway
olympux 9:d2534ecf88c6 202 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buffer++);
olympux 9:d2534ecf88c6 203 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buffer++);
olympux 9:d2534ecf88c6 204 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buffer++);
olympux 9:d2534ecf88c6 205 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buffer++);
olympux 9:d2534ecf88c6 206
olympux 9:d2534ecf88c6 207 //// TCP server port, not used
olympux 9:d2534ecf88c6 208 //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], *buffer++);
olympux 9:d2534ecf88c6 209 //// UDP server port, not used
olympux 9:d2534ecf88c6 210 //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_PORT_POS], *buffer++);
olympux 8:64848959adb9 211
olympux 8:64848959adb9 212 // erase first_run flag
olympux 9:d2534ecf88c6 213 EE_WriteVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], 0xA5A5);
olympux 9:d2534ecf88c6 214
olympux 9:d2534ecf88c6 215 // MAC address
olympux 9:d2534ecf88c6 216 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buffer++);
olympux 9:d2534ecf88c6 217 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buffer++);
olympux 9:d2534ecf88c6 218 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buffer++);
olympux 6:d054e394fba3 219 FLASH_Lock();
olympux 6:d054e394fba3 220 }
olympux 6:d054e394fba3 221
olympux 6:d054e394fba3 222
olympux 6:d054e394fba3 223 void load_eeprom(void) {
olympux 9:d2534ecf88c6 224 mbed_mac_address((char *)mac);
olympux 8:64848959adb9 225
olympux 6:d054e394fba3 226 EE_Init();
olympux 8:64848959adb9 227
olympux 8:64848959adb9 228 // check if 1st run
olympux 9:d2534ecf88c6 229 EE_ReadVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], &first_run);
olympux 8:64848959adb9 230 // if not first run, load network config
olympux 8:64848959adb9 231 if (first_run == 0xA5A5) {
olympux 8:64848959adb9 232 // IP address
olympux 9:d2534ecf88c6 233 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
olympux 9:d2534ecf88c6 234 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
olympux 9:d2534ecf88c6 235 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
olympux 9:d2534ecf88c6 236 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
olympux 9:d2534ecf88c6 237
olympux 8:64848959adb9 238 // IP subnet
olympux 9:d2534ecf88c6 239 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
olympux 9:d2534ecf88c6 240 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
olympux 9:d2534ecf88c6 241 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
olympux 9:d2534ecf88c6 242 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
olympux 9:d2534ecf88c6 243
olympux 8:64848959adb9 244 // IP gateway
olympux 9:d2534ecf88c6 245 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
olympux 9:d2534ecf88c6 246 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
olympux 9:d2534ecf88c6 247 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
olympux 9:d2534ecf88c6 248 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
olympux 9:d2534ecf88c6 249
olympux 8:64848959adb9 250 //// TCP server port
olympux 9:d2534ecf88c6 251 //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &tcp_server_port);
olympux 8:64848959adb9 252 //// UDP server port
olympux 9:d2534ecf88c6 253 //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_PORT_POS], &udp_server_port);
olympux 9:d2534ecf88c6 254
olympux 9:d2534ecf88c6 255 // First run flag, already read above
olympux 9:d2534ecf88c6 256
olympux 9:d2534ecf88c6 257 // MAC address
olympux 9:d2534ecf88c6 258 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
olympux 9:d2534ecf88c6 259 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
olympux 9:d2534ecf88c6 260 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
olympux 9:d2534ecf88c6 261 mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
olympux 9:d2534ecf88c6 262 mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
olympux 9:d2534ecf88c6 263 mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
olympux 8:64848959adb9 264 //FLASH_Lock();
olympux 9:d2534ecf88c6 265
olympux 8:64848959adb9 266 sprintf(ip_addr, "%d.%d.%d.%d", (uint8_t)u16ip_addr[0], (uint8_t)u16ip_addr[1], (uint8_t)u16ip_addr[2], (uint8_t)u16ip_addr[3]);
olympux 8:64848959adb9 267 sprintf(ip_subnet, "%d.%d.%d.%d", (uint8_t)u16ip_subnet[0], (uint8_t)u16ip_subnet[1], (uint8_t)u16ip_subnet[2], (uint8_t)u16ip_subnet[3]);
olympux 8:64848959adb9 268 sprintf(ip_gateway, "%d.%d.%d.%d", (uint8_t)u16ip_gateway[0], (uint8_t)u16ip_gateway[1], (uint8_t)u16ip_gateway[2], (uint8_t)u16ip_gateway[3]);
olympux 8:64848959adb9 269 }
olympux 8:64848959adb9 270 // if 1st run, use default addresses
olympux 8:64848959adb9 271 else {
olympux 9:d2534ecf88c6 272 mac[0] = 0x00; mac[1] = 0x08; mac[2] = 0xDC;
olympux 9:d2534ecf88c6 273 mac[3] = DEFAULT_MAC3; mac[4] = DEFAULT_MAC4; mac[5] = DEFAULT_MAC5;
olympux 8:64848959adb9 274 sprintf(ip_addr, DEFAULT_IP_ADDRESS);
olympux 8:64848959adb9 275 sprintf(ip_subnet, DEFAULT_IP_SUBNET);
olympux 8:64848959adb9 276 sprintf(ip_gateway, DEFAULT_IP_GATEWAY);
olympux 8:64848959adb9 277 }
olympux 7:d45bd480e90f 278 //printf("IP: %s\n", ip_addr);
olympux 7:d45bd480e90f 279 //printf("MASK: %s\n", ip_subnet);
olympux 7:d45bd480e90f 280 //printf("GW: %s\n", ip_gateway);
olympux 7:d45bd480e90f 281 //printf("TCP: %d\n", tcp_server_port);
olympux 7:d45bd480e90f 282 //printf("UDP: %d\n", udp_server_port);
olympux 6:d054e394fba3 283 }
olympux 6:d054e394fba3 284
olympux 6:d054e394fba3 285
olympux 4:568c97f2a407 286
olympux 4:568c97f2a407 287 int main()
olympux 4:568c97f2a407 288 {
olympux 4:568c97f2a407 289 message_t message;
olympux 9:d2534ecf88c6 290 int n, ret;
olympux 4:568c97f2a407 291
olympux 4:568c97f2a407 292 /*
olympux 9:d2534ecf88c6 293 * Configure
olympux 4:568c97f2a407 294 */
olympux 9:d2534ecf88c6 295 //uart.baud(115200);
olympux 4:568c97f2a407 296
olympux 4:568c97f2a407 297
olympux 4:568c97f2a407 298 /*
olympux 4:568c97f2a407 299 * UI threads
olympux 4:568c97f2a407 300 */
olympux 4:568c97f2a407 301 Thread t1(uart_thread);
olympux 4:568c97f2a407 302
olympux 6:d054e394fba3 303
olympux 6:d054e394fba3 304 /*
olympux 6:d054e394fba3 305 * FLASH
olympux 6:d054e394fba3 306 */
olympux 6:d054e394fba3 307 load_eeprom();
olympux 6:d054e394fba3 308 IP_Addr = ip_addr;
olympux 6:d054e394fba3 309 IP_Subnet = ip_subnet;
olympux 6:d054e394fba3 310 IP_Gateway = ip_gateway;
olympux 6:d054e394fba3 311
olympux 4:568c97f2a407 312
olympux 4:568c97f2a407 313 /*
olympux 4:568c97f2a407 314 * Ethernet
olympux 4:568c97f2a407 315 */
olympux 6:d054e394fba3 316 ret = ethernet_init();
olympux 4:568c97f2a407 317 if (ret) {
olympux 4:568c97f2a407 318 printf("App halted\n");
olympux 4:568c97f2a407 319 while (true) {};
olympux 4:568c97f2a407 320 }
olympux 4:568c97f2a407 321
olympux 3:972ed747474c 322
olympux 3:972ed747474c 323 #ifdef TCP_SERVER
olympux 3:972ed747474c 324 TCPSocketServer tcp_server;
olympux 3:972ed747474c 325 TCPSocketConnection tcp_client;
olympux 3:972ed747474c 326
olympux 6:d054e394fba3 327 tcp_server.bind(tcp_server_port);
olympux 3:972ed747474c 328 tcp_server.listen();
olympux 7:d45bd480e90f 329 //uart.printf("\nWait for new connection...\n");
olympux 4:568c97f2a407 330 tcp_server.set_blocking(false, TCP_SERVER_WAIT_CLIENT_TIMEOUT);
olympux 3:972ed747474c 331 #endif
olympux 3:972ed747474c 332
olympux 3:972ed747474c 333 #ifdef UDP_SERVER
olympux 3:972ed747474c 334 UDPSocket udp_server;
olympux 3:972ed747474c 335 Endpoint ep_udp_client;
olympux 3:972ed747474c 336
olympux 6:d054e394fba3 337 ret = udp_server.bind(udp_server_port);
olympux 7:d45bd480e90f 338 //printf("sock.bind = %d\n", ret);
olympux 4:568c97f2a407 339 udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT);
olympux 3:972ed747474c 340 #endif
olympux 3:972ed747474c 341
olympux 3:972ed747474c 342
olympux 4:568c97f2a407 343 // Network processor
olympux 0:c2eac797face 344 while (true) {
olympux 9:d2534ecf88c6 345 #ifdef NTP
olympux 9:d2534ecf88c6 346 printf("Trying to update time...\r\n");
olympux 9:d2534ecf88c6 347 if (ntp.setTime("0.pool.ntp.org") == 0)
olympux 9:d2534ecf88c6 348 {
olympux 9:d2534ecf88c6 349 printf("Set time successfully\r\n");
olympux 9:d2534ecf88c6 350 time_t ctTime;
olympux 9:d2534ecf88c6 351 ctTime = time(NULL);
olympux 9:d2534ecf88c6 352 printf("Time is set to (UTC): %s\r\n", ctime(&ctTime));
olympux 9:d2534ecf88c6 353 }
olympux 9:d2534ecf88c6 354 else
olympux 9:d2534ecf88c6 355 {
olympux 9:d2534ecf88c6 356 printf("Error\r\n");
olympux 9:d2534ecf88c6 357 }
olympux 9:d2534ecf88c6 358 #endif
olympux 9:d2534ecf88c6 359
olympux 9:d2534ecf88c6 360
olympux 9:d2534ecf88c6 361 // FOR INTERFACING
olympux 4:568c97f2a407 362 #ifdef TCP_SERVER
olympux 4:568c97f2a407 363 // no tcp client connected
olympux 4:568c97f2a407 364 if (!tcp_client.is_connected())
olympux 4:568c97f2a407 365 {
olympux 4:568c97f2a407 366 // wait for client within timeout
olympux 4:568c97f2a407 367 ret = tcp_server.accept(tcp_client);
olympux 2:18f10e7209f4 368
olympux 4:568c97f2a407 369 // tcp client connected
olympux 4:568c97f2a407 370 if (ret > -1) {
olympux 7:d45bd480e90f 371 //uart.printf("Connection from: %s\n", tcp_client.get_address());
olympux 4:568c97f2a407 372
olympux 4:568c97f2a407 373 // loop waiting and receiving data within timeout
olympux 4:568c97f2a407 374 tcp_client.set_blocking(false, TCP_SERVER_RECEIVE_TIMEOUT); // Timeout after x seconds
olympux 4:568c97f2a407 375 while (true) {
olympux 9:d2534ecf88c6 376 n = tcp_client.receive(buffer, sizeof(buffer));
olympux 4:568c97f2a407 377 if (n <= 0) break;
olympux 4:568c97f2a407 378
olympux 9:d2534ecf88c6 379 // got some data, test it
olympux 9:d2534ecf88c6 380 //// send to uart
olympux 9:d2534ecf88c6 381 //buffer[n] = '\0';
olympux 9:d2534ecf88c6 382 //message.len = n;
olympux 9:d2534ecf88c6 383 //message.msg = buffer;
olympux 9:d2534ecf88c6 384 //uart_queue.put(&message);
olympux 9:d2534ecf88c6 385 //// echo to tcp client
olympux 9:d2534ecf88c6 386 //tcp_client.send_all(buffer, n);
olympux 9:d2534ecf88c6 387 //if (n <= 0) break;
olympux 4:568c97f2a407 388
olympux 9:d2534ecf88c6 389 // process received data
olympux 9:d2534ecf88c6 390 switch (n) {
olympux 9:d2534ecf88c6 391 // length 58-bytes, Receiving protocol
olympux 9:d2534ecf88c6 392 case 58: {
olympux 9:d2534ecf88c6 393 // check device id
olympux 9:d2534ecf88c6 394 char* id = strstr(buffer, DEVICE_ID);
olympux 9:d2534ecf88c6 395 if (id == NULL)
olympux 9:d2534ecf88c6 396 break;
olympux 9:d2534ecf88c6 397 else if ((id - buffer) > 0)
olympux 9:d2534ecf88c6 398 break;
olympux 9:d2534ecf88c6 399
olympux 9:d2534ecf88c6 400
olympux 9:d2534ecf88c6 401 // firstly, update outputs if required
olympux 9:d2534ecf88c6 402 // digital outputs
olympux 9:d2534ecf88c6 403 if (((uint8_t)buffer[RECEIVING_PROTOCOL_EN_DO_POS] - RECEIVING_PROTOCOL_ENABLE_OUTPUT) == 0) {
olympux 9:d2534ecf88c6 404 }
olympux 9:d2534ecf88c6 405 // analog output 0
olympux 9:d2534ecf88c6 406 if (((uint8_t)buffer[RECEIVING_PROTOCOL_EN_A0O_POS] - RECEIVING_PROTOCOL_ENABLE_OUTPUT) == 0) {
olympux 9:d2534ecf88c6 407 }
olympux 9:d2534ecf88c6 408 // analog output 0
olympux 9:d2534ecf88c6 409 if (((uint8_t)buffer[RECEIVING_PROTOCOL_EN_A1O_POS] - RECEIVING_PROTOCOL_ENABLE_OUTPUT) == 0) {
olympux 9:d2534ecf88c6 410 }
olympux 9:d2534ecf88c6 411 // UART
olympux 9:d2534ecf88c6 412 if (((uint8_t)buffer[RECEIVING_PROTOCOL_EN_UART_POS] - RECEIVING_PROTOCOL_ENABLE_OUTPUT) == 0) {
olympux 9:d2534ecf88c6 413 }
olympux 9:d2534ecf88c6 414
olympux 9:d2534ecf88c6 415 // then, check query status command and sending protocol if required
olympux 9:d2534ecf88c6 416 if (((uint8_t)buffer[RECEIVING_PROTOCOL_COMMAND_POS] - QUERY_STATUS_COMMAND) == 0) {
olympux 9:d2534ecf88c6 417 // sending protocol
olympux 9:d2534ecf88c6 418 }
olympux 9:d2534ecf88c6 419
olympux 9:d2534ecf88c6 420 break;
olympux 9:d2534ecf88c6 421 }
olympux 9:d2534ecf88c6 422 default:
olympux 9:d2534ecf88c6 423 break;
olympux 9:d2534ecf88c6 424 }
olympux 9:d2534ecf88c6 425
olympux 4:568c97f2a407 426 } // end loop if no data received within timeout
olympux 4:568c97f2a407 427 tcp_client.close();
olympux 4:568c97f2a407 428 } // if client connected
olympux 4:568c97f2a407 429 } // if no client connected
olympux 3:972ed747474c 430 #endif
olympux 3:972ed747474c 431
olympux 9:d2534ecf88c6 432
olympux 9:d2534ecf88c6 433
olympux 9:d2534ecf88c6 434 // ONLY FOR CONFIGRATION
olympux 9:d2534ecf88c6 435 #ifdef UDP_SERVER
olympux 4:568c97f2a407 436 // wait for udp packet within timeout
olympux 9:d2534ecf88c6 437 n = udp_server.receiveFrom(ep_udp_client, buffer, sizeof(buffer));
olympux 9:d2534ecf88c6 438 if (n <= 0) continue;
olympux 3:972ed747474c 439
olympux 9:d2534ecf88c6 440 // got some data, test it
olympux 9:d2534ecf88c6 441 //// send to uart
olympux 7:d45bd480e90f 442 //buffer[n] = '\0';
olympux 7:d45bd480e90f 443 //message.len = n;
olympux 7:d45bd480e90f 444 //message.msg = buffer;
olympux 7:d45bd480e90f 445 //uart_queue.put(&message);
olympux 9:d2534ecf88c6 446 //// echo
olympux 3:972ed747474c 447 //printf("Received packet from: %s\n", client.get_address());
olympux 7:d45bd480e90f 448 //udp_server.sendTo(ep_udp_client, buffer, n);
olympux 4:568c97f2a407 449
olympux 6:d054e394fba3 450 // process received data
olympux 6:d054e394fba3 451 switch (n) {
olympux 9:d2534ecf88c6 452 // length = 6, a CONFIGURATION command (discovery command, TCP port, or UDP port)
olympux 9:d2534ecf88c6 453 // Format: NNIODS, NNIOTP or NNIOUP
olympux 9:d2534ecf88c6 454 case 6:
olympux 7:d45bd480e90f 455 // discovery command
olympux 9:d2534ecf88c6 456 if (strstr(buffer, "NNIODS") != NULL) {
olympux 7:d45bd480e90f 457 udp_server.sendTo(ep_udp_client, ip_addr, strlen(ip_addr));
olympux 7:d45bd480e90f 458 }
olympux 7:d45bd480e90f 459 // ask for TCP server port
olympux 9:d2534ecf88c6 460 else if (strstr(buffer, "NNIOTP") != NULL) {
olympux 7:d45bd480e90f 461 char port[5];
olympux 7:d45bd480e90f 462 sprintf(port, "%5d", tcp_server_port);
olympux 7:d45bd480e90f 463 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 7:d45bd480e90f 464 }
olympux 7:d45bd480e90f 465 // ask for UDP server port
olympux 9:d2534ecf88c6 466 else if (strstr(buffer, "NNIOUP") != NULL) {
olympux 7:d45bd480e90f 467 char port[5];
olympux 7:d45bd480e90f 468 sprintf(port, "%5d", udp_server_port);
olympux 7:d45bd480e90f 469 udp_server.sendTo(ep_udp_client, port, strlen(port));
olympux 7:d45bd480e90f 470 }
olympux 7:d45bd480e90f 471 break;
olympux 9:d2534ecf88c6 472 // length = 19, SET NETWORK CONFIGURATION
olympux 9:d2534ecf88c6 473 // Format: 4E 4E 49 4F C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01
olympux 9:d2534ecf88c6 474 // (NNIO; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1)
olympux 9:d2534ecf88c6 475 case 19:{
olympux 9:d2534ecf88c6 476 // check device id
olympux 9:d2534ecf88c6 477 char* id = strstr(buffer, DEVICE_ID);
olympux 9:d2534ecf88c6 478 if (id == NULL)
olympux 9:d2534ecf88c6 479 break;
olympux 9:d2534ecf88c6 480 else if ((id - buffer) > 0)
olympux 9:d2534ecf88c6 481 break;
olympux 9:d2534ecf88c6 482
olympux 9:d2534ecf88c6 483 //printf("Received new network configuration\n");
olympux 9:d2534ecf88c6 484 write_eeprom(&buffer[4]); // parameters from 3rd char, 15-bytes
olympux 6:d054e394fba3 485 break;
olympux 9:d2534ecf88c6 486 }
olympux 6:d054e394fba3 487 default:
olympux 6:d054e394fba3 488 break;
olympux 4:568c97f2a407 489 }
olympux 3:972ed747474c 490 #endif
olympux 4:568c97f2a407 491 } // network processor
olympux 4:568c97f2a407 492 }