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
main.cpp@8:64848959adb9, 2014-09-21 (annotated)
- Committer:
- olympux
- Date:
- Sun Sep 21 20:25:35 2014 +0000
- Revision:
- 8:64848959adb9
- Parent:
- 7:d45bd480e90f
- Child:
- 9:d2534ecf88c6
Added first run flag (0xA5A5 at 15th variable in eeprom)
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:c2eac797face | 9 | #include "rtos.h" |
olympux | 0:c2eac797face | 10 | |
olympux | 0:c2eac797face | 11 | |
olympux | 2:18f10e7209f4 | 12 | /* |
olympux | 2:18f10e7209f4 | 13 | * Hardware defines |
olympux | 0:c2eac797face | 14 | */ |
olympux | 2:18f10e7209f4 | 15 | #define ST_NUCLEO // hardware pin mapping |
olympux | 0:c2eac797face | 16 | |
olympux | 0:c2eac797face | 17 | #ifdef ST_NUCLEO |
olympux | 0:c2eac797face | 18 | // ST Nucleo |
olympux | 0:c2eac797face | 19 | SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk |
olympux | 0:c2eac797face | 20 | EthernetInterface eth(&spi, PC_8, PC_9); // spi, cs, reset |
olympux | 0:c2eac797face | 21 | #endif |
olympux | 0:c2eac797face | 22 | |
olympux | 2:18f10e7209f4 | 23 | Serial uart(USBTX,USBRX); |
olympux | 2:18f10e7209f4 | 24 | |
olympux | 6:d054e394fba3 | 25 | // Variables' number |
olympux | 8:64848959adb9 | 26 | #define NumbOfVar ((uint8_t)0x0F) // REMEMBER: update this variable in eeprom.h too |
olympux | 6:d054e394fba3 | 27 | // Virtual address defined by the user: 0xFFFF value is prohibited |
olympux | 6:d054e394fba3 | 28 | uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr |
olympux | 6:d054e394fba3 | 29 | 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet |
olympux | 6:d054e394fba3 | 30 | 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway |
olympux | 6:d054e394fba3 | 31 | 0x4212, // TCP server port, not used |
olympux | 8:64848959adb9 | 32 | 0x5212, // UDP server port, not used |
olympux | 8:64848959adb9 | 33 | 0x8888 // 1st run? |
olympux | 6:d054e394fba3 | 34 | }; |
olympux | 6:d054e394fba3 | 35 | extern "C" uint16_t EE_Init(void); |
olympux | 6:d054e394fba3 | 36 | extern "C" uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); |
olympux | 6:d054e394fba3 | 37 | extern "C" uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); |
olympux | 4:568c97f2a407 | 38 | |
olympux | 0:c2eac797face | 39 | |
olympux | 2:18f10e7209f4 | 40 | /* |
olympux | 2:18f10e7209f4 | 41 | * Network configuration |
olympux | 2:18f10e7209f4 | 42 | */ |
olympux | 4:568c97f2a407 | 43 | #define TCP_SERVER |
olympux | 4:568c97f2a407 | 44 | //#define TCP_CLIENT |
olympux | 4:568c97f2a407 | 45 | #define UDP_SERVER |
olympux | 4:568c97f2a407 | 46 | //#define UDP_CLIENT |
olympux | 4:568c97f2a407 | 47 | //#define NTP |
olympux | 4:568c97f2a407 | 48 | |
olympux | 8:64848959adb9 | 49 | #define DEFAULT_IP_ADDRESS "192.168.0.249" |
olympux | 8:64848959adb9 | 50 | #define DEFAULT_IP_SUBNET "255.255.255.0" |
olympux | 8:64848959adb9 | 51 | #define DEFAULT_IP_GATEWAY "192.168.0.1" |
olympux | 8:64848959adb9 | 52 | |
olympux | 4:568c97f2a407 | 53 | #define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200 |
olympux | 4:568c97f2a407 | 54 | #define TCP_SERVER_RECEIVE_TIMEOUT 3000 |
olympux | 4:568c97f2a407 | 55 | #define UDP_SERVER_RECEIVE_TIMEOUT 200 |
olympux | 4:568c97f2a407 | 56 | |
olympux | 0:c2eac797face | 57 | // for static IP setting |
olympux | 7:d45bd480e90f | 58 | char * IP_Addr; |
olympux | 7:d45bd480e90f | 59 | char * IP_Subnet; |
olympux | 7:d45bd480e90f | 60 | char * IP_Gateway; |
olympux | 6:d054e394fba3 | 61 | char ip_addr[16], ip_subnet[16], ip_gateway[16]; // loaded from eeprom |
olympux | 6:d054e394fba3 | 62 | |
olympux | 6:d054e394fba3 | 63 | uint16_t tcp_server_port = 10000; // fixed |
olympux | 6:d054e394fba3 | 64 | uint16_t udp_server_port = 11000; // fixed |
olympux | 0:c2eac797face | 65 | |
olympux | 3:972ed747474c | 66 | char buffer[256]; // socket buffer |
olympux | 3:972ed747474c | 67 | |
olympux | 0:c2eac797face | 68 | |
olympux | 2:18f10e7209f4 | 69 | |
olympux | 2:18f10e7209f4 | 70 | /* |
olympux | 2:18f10e7209f4 | 71 | * RTOS |
olympux | 2:18f10e7209f4 | 72 | */ |
olympux | 2:18f10e7209f4 | 73 | struct message_t { |
olympux | 2:18f10e7209f4 | 74 | int len; |
olympux | 2:18f10e7209f4 | 75 | char *msg; |
olympux | 2:18f10e7209f4 | 76 | }; |
olympux | 3:972ed747474c | 77 | Queue<message_t, 16> uart_queue; |
olympux | 2:18f10e7209f4 | 78 | |
olympux | 3:972ed747474c | 79 | Mutex uart_mutex; |
olympux | 2:18f10e7209f4 | 80 | |
olympux | 2:18f10e7209f4 | 81 | |
olympux | 2:18f10e7209f4 | 82 | /* |
olympux | 2:18f10e7209f4 | 83 | * Threads |
olympux | 2:18f10e7209f4 | 84 | */ |
olympux | 0:c2eac797face | 85 | void uart_thread(void const *args) { |
olympux | 2:18f10e7209f4 | 86 | message_t *p_message; |
olympux | 0:c2eac797face | 87 | |
olympux | 0:c2eac797face | 88 | while (true) { |
olympux | 3:972ed747474c | 89 | osEvent evt = uart_queue.get(); |
olympux | 2:18f10e7209f4 | 90 | if (evt.status == osEventMessage) { |
olympux | 2:18f10e7209f4 | 91 | p_message = (message_t*)evt.value.p; |
olympux | 3:972ed747474c | 92 | uart_mutex.lock(); |
olympux | 3:972ed747474c | 93 | //uart.printf("len=%d\n", p_message->len); |
olympux | 3:972ed747474c | 94 | uart.printf("%s\n", p_message->msg); |
olympux | 3:972ed747474c | 95 | uart_mutex.unlock(); |
olympux | 2:18f10e7209f4 | 96 | } |
olympux | 0:c2eac797face | 97 | } |
olympux | 0:c2eac797face | 98 | } |
olympux | 0:c2eac797face | 99 | |
olympux | 0:c2eac797face | 100 | |
olympux | 6:d054e394fba3 | 101 | /* |
olympux | 6:d054e394fba3 | 102 | * Ethernet init |
olympux | 6:d054e394fba3 | 103 | */ |
olympux | 4:568c97f2a407 | 104 | int ethernet_init(void) { |
olympux | 3:972ed747474c | 105 | uint8_t mac[6]; |
olympux | 3:972ed747474c | 106 | |
olympux | 0:c2eac797face | 107 | mbed_mac_address((char *)mac); // using the MAC address in LPC11U24 or LPC1178 |
olympux | 0:c2eac797face | 108 | mac[0] = 0x00; mac[1] = 0x08; mac[2] = 0xDC; mac[3] = 0x00; mac[4] = 0x00; mac[5] = 0x00; |
olympux | 0:c2eac797face | 109 | |
olympux | 4:568c97f2a407 | 110 | |
olympux | 7:d45bd480e90f | 111 | //printf("Start\n"); |
olympux | 6:d054e394fba3 | 112 | int ret = eth.init(mac, IP_Addr, IP_Subnet, IP_Gateway); // static |
olympux | 0:c2eac797face | 113 | |
olympux | 0:c2eac797face | 114 | if (!ret) { |
olympux | 7:d45bd480e90f | 115 | //uart.printf("Initialized, MAC: %s\n", eth.getMACAddress()); |
olympux | 0:c2eac797face | 116 | } else { |
olympux | 2:18f10e7209f4 | 117 | uart.printf("Error eth.init() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 118 | return -1; |
olympux | 0:c2eac797face | 119 | } |
olympux | 0:c2eac797face | 120 | |
olympux | 0:c2eac797face | 121 | ret = eth.connect(); |
olympux | 0:c2eac797face | 122 | if (!ret) { |
olympux | 8:64848959adb9 | 123 | uart.printf("IP: %s, MASK: %s, GW: %s\n", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway()); |
olympux | 0:c2eac797face | 124 | } else { |
olympux | 2:18f10e7209f4 | 125 | uart.printf("Error eth.connect() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 126 | return -1; |
olympux | 0:c2eac797face | 127 | } |
olympux | 3:972ed747474c | 128 | |
olympux | 4:568c97f2a407 | 129 | return 0; |
olympux | 4:568c97f2a407 | 130 | } |
olympux | 4:568c97f2a407 | 131 | |
olympux | 4:568c97f2a407 | 132 | |
olympux | 6:d054e394fba3 | 133 | /* |
olympux | 6:d054e394fba3 | 134 | * EEPROM functions |
olympux | 6:d054e394fba3 | 135 | */ |
olympux | 6:d054e394fba3 | 136 | void write_eeprom(char *buffer) { |
olympux | 6:d054e394fba3 | 137 | // Unlock the Flash Program Erase controller */ |
olympux | 6:d054e394fba3 | 138 | FLASH_Unlock(); |
olympux | 6:d054e394fba3 | 139 | // EEPROM Init |
olympux | 6:d054e394fba3 | 140 | EE_Init(); |
olympux | 6:d054e394fba3 | 141 | // IP address |
olympux | 6:d054e394fba3 | 142 | EE_WriteVariable(VirtAddVarTab[0], *buffer++); |
olympux | 6:d054e394fba3 | 143 | EE_WriteVariable(VirtAddVarTab[1], *buffer++); |
olympux | 6:d054e394fba3 | 144 | EE_WriteVariable(VirtAddVarTab[2], *buffer++); |
olympux | 6:d054e394fba3 | 145 | EE_WriteVariable(VirtAddVarTab[3], *buffer++); |
olympux | 6:d054e394fba3 | 146 | // IP subnet |
olympux | 6:d054e394fba3 | 147 | EE_WriteVariable(VirtAddVarTab[4], *buffer++); |
olympux | 6:d054e394fba3 | 148 | EE_WriteVariable(VirtAddVarTab[5], *buffer++); |
olympux | 6:d054e394fba3 | 149 | EE_WriteVariable(VirtAddVarTab[6], *buffer++); |
olympux | 6:d054e394fba3 | 150 | EE_WriteVariable(VirtAddVarTab[7], *buffer++); |
olympux | 6:d054e394fba3 | 151 | // IP gateway |
olympux | 6:d054e394fba3 | 152 | EE_WriteVariable(VirtAddVarTab[8], *buffer++); |
olympux | 6:d054e394fba3 | 153 | EE_WriteVariable(VirtAddVarTab[9], *buffer++); |
olympux | 6:d054e394fba3 | 154 | EE_WriteVariable(VirtAddVarTab[10], *buffer++); |
olympux | 6:d054e394fba3 | 155 | EE_WriteVariable(VirtAddVarTab[11], *buffer++); |
olympux | 6:d054e394fba3 | 156 | //// TCP server port |
olympux | 6:d054e394fba3 | 157 | //EE_WriteVariable(VirtAddVarTab[12], *buffer++); |
olympux | 6:d054e394fba3 | 158 | //// UDP server port |
olympux | 6:d054e394fba3 | 159 | //EE_WriteVariable(VirtAddVarTab[13], *buffer++); |
olympux | 8:64848959adb9 | 160 | |
olympux | 8:64848959adb9 | 161 | // erase first_run flag |
olympux | 8:64848959adb9 | 162 | EE_WriteVariable(VirtAddVarTab[14], 0xA5A5); |
olympux | 6:d054e394fba3 | 163 | FLASH_Lock(); |
olympux | 6:d054e394fba3 | 164 | } |
olympux | 6:d054e394fba3 | 165 | |
olympux | 6:d054e394fba3 | 166 | |
olympux | 6:d054e394fba3 | 167 | void load_eeprom(void) { |
olympux | 6:d054e394fba3 | 168 | uint16_t u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4]; |
olympux | 8:64848959adb9 | 169 | uint16_t first_run = 0; |
olympux | 8:64848959adb9 | 170 | |
olympux | 6:d054e394fba3 | 171 | EE_Init(); |
olympux | 8:64848959adb9 | 172 | |
olympux | 8:64848959adb9 | 173 | // check if 1st run |
olympux | 8:64848959adb9 | 174 | EE_ReadVariable(VirtAddVarTab[14], &first_run); |
olympux | 8:64848959adb9 | 175 | // if not first run, load network config |
olympux | 8:64848959adb9 | 176 | if (first_run == 0xA5A5) { |
olympux | 8:64848959adb9 | 177 | // IP address |
olympux | 8:64848959adb9 | 178 | EE_ReadVariable(VirtAddVarTab[0], &u16ip_addr[0]); |
olympux | 8:64848959adb9 | 179 | EE_ReadVariable(VirtAddVarTab[1], &u16ip_addr[1]); |
olympux | 8:64848959adb9 | 180 | EE_ReadVariable(VirtAddVarTab[2], &u16ip_addr[2]); |
olympux | 8:64848959adb9 | 181 | EE_ReadVariable(VirtAddVarTab[3], &u16ip_addr[3]); |
olympux | 8:64848959adb9 | 182 | // IP subnet |
olympux | 8:64848959adb9 | 183 | EE_ReadVariable(VirtAddVarTab[4], &u16ip_subnet[0]); |
olympux | 8:64848959adb9 | 184 | EE_ReadVariable(VirtAddVarTab[5], &u16ip_subnet[1]); |
olympux | 8:64848959adb9 | 185 | EE_ReadVariable(VirtAddVarTab[6], &u16ip_subnet[2]); |
olympux | 8:64848959adb9 | 186 | EE_ReadVariable(VirtAddVarTab[7], &u16ip_subnet[3]); |
olympux | 8:64848959adb9 | 187 | // IP gateway |
olympux | 8:64848959adb9 | 188 | EE_ReadVariable(VirtAddVarTab[8], &u16ip_gateway[0]); |
olympux | 8:64848959adb9 | 189 | EE_ReadVariable(VirtAddVarTab[9], &u16ip_gateway[1]); |
olympux | 8:64848959adb9 | 190 | EE_ReadVariable(VirtAddVarTab[10], &u16ip_gateway[2]); |
olympux | 8:64848959adb9 | 191 | EE_ReadVariable(VirtAddVarTab[11], &u16ip_gateway[3]); |
olympux | 8:64848959adb9 | 192 | //// TCP server port |
olympux | 8:64848959adb9 | 193 | //EE_ReadVariable(VirtAddVarTab[12], &tcp_server_port); |
olympux | 8:64848959adb9 | 194 | //// UDP server port |
olympux | 8:64848959adb9 | 195 | //EE_ReadVariable(VirtAddVarTab[13], &udp_server_port); |
olympux | 8:64848959adb9 | 196 | //FLASH_Lock(); |
olympux | 8:64848959adb9 | 197 | 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 | 198 | 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 | 199 | 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 | 200 | } |
olympux | 8:64848959adb9 | 201 | // if 1st run, use default addresses |
olympux | 8:64848959adb9 | 202 | else { |
olympux | 8:64848959adb9 | 203 | sprintf(ip_addr, DEFAULT_IP_ADDRESS); |
olympux | 8:64848959adb9 | 204 | sprintf(ip_subnet, DEFAULT_IP_SUBNET); |
olympux | 8:64848959adb9 | 205 | sprintf(ip_gateway, DEFAULT_IP_GATEWAY); |
olympux | 8:64848959adb9 | 206 | } |
olympux | 7:d45bd480e90f | 207 | //printf("IP: %s\n", ip_addr); |
olympux | 7:d45bd480e90f | 208 | //printf("MASK: %s\n", ip_subnet); |
olympux | 7:d45bd480e90f | 209 | //printf("GW: %s\n", ip_gateway); |
olympux | 7:d45bd480e90f | 210 | //printf("TCP: %d\n", tcp_server_port); |
olympux | 7:d45bd480e90f | 211 | //printf("UDP: %d\n", udp_server_port); |
olympux | 6:d054e394fba3 | 212 | } |
olympux | 6:d054e394fba3 | 213 | |
olympux | 6:d054e394fba3 | 214 | |
olympux | 4:568c97f2a407 | 215 | |
olympux | 4:568c97f2a407 | 216 | int main() |
olympux | 4:568c97f2a407 | 217 | { |
olympux | 4:568c97f2a407 | 218 | message_t message; |
olympux | 6:d054e394fba3 | 219 | int ret; |
olympux | 4:568c97f2a407 | 220 | |
olympux | 4:568c97f2a407 | 221 | /* |
olympux | 4:568c97f2a407 | 222 | * configure |
olympux | 4:568c97f2a407 | 223 | */ |
olympux | 4:568c97f2a407 | 224 | uart.baud(115200); |
olympux | 4:568c97f2a407 | 225 | |
olympux | 4:568c97f2a407 | 226 | |
olympux | 4:568c97f2a407 | 227 | /* |
olympux | 4:568c97f2a407 | 228 | * UI threads |
olympux | 4:568c97f2a407 | 229 | */ |
olympux | 4:568c97f2a407 | 230 | Thread t1(uart_thread); |
olympux | 4:568c97f2a407 | 231 | |
olympux | 6:d054e394fba3 | 232 | |
olympux | 6:d054e394fba3 | 233 | /* |
olympux | 6:d054e394fba3 | 234 | * FLASH |
olympux | 6:d054e394fba3 | 235 | */ |
olympux | 6:d054e394fba3 | 236 | load_eeprom(); |
olympux | 6:d054e394fba3 | 237 | IP_Addr = ip_addr; |
olympux | 6:d054e394fba3 | 238 | IP_Subnet = ip_subnet; |
olympux | 6:d054e394fba3 | 239 | IP_Gateway = ip_gateway; |
olympux | 6:d054e394fba3 | 240 | |
olympux | 4:568c97f2a407 | 241 | |
olympux | 4:568c97f2a407 | 242 | /* |
olympux | 4:568c97f2a407 | 243 | * Ethernet |
olympux | 4:568c97f2a407 | 244 | */ |
olympux | 6:d054e394fba3 | 245 | ret = ethernet_init(); |
olympux | 4:568c97f2a407 | 246 | if (ret) { |
olympux | 4:568c97f2a407 | 247 | printf("App halted\n"); |
olympux | 4:568c97f2a407 | 248 | while (true) {}; |
olympux | 4:568c97f2a407 | 249 | } |
olympux | 4:568c97f2a407 | 250 | |
olympux | 3:972ed747474c | 251 | |
olympux | 3:972ed747474c | 252 | #ifdef TCP_SERVER |
olympux | 3:972ed747474c | 253 | TCPSocketServer tcp_server; |
olympux | 3:972ed747474c | 254 | TCPSocketConnection tcp_client; |
olympux | 3:972ed747474c | 255 | |
olympux | 6:d054e394fba3 | 256 | tcp_server.bind(tcp_server_port); |
olympux | 3:972ed747474c | 257 | tcp_server.listen(); |
olympux | 7:d45bd480e90f | 258 | //uart.printf("\nWait for new connection...\n"); |
olympux | 4:568c97f2a407 | 259 | tcp_server.set_blocking(false, TCP_SERVER_WAIT_CLIENT_TIMEOUT); |
olympux | 3:972ed747474c | 260 | #endif |
olympux | 3:972ed747474c | 261 | |
olympux | 3:972ed747474c | 262 | #ifdef UDP_SERVER |
olympux | 3:972ed747474c | 263 | UDPSocket udp_server; |
olympux | 3:972ed747474c | 264 | Endpoint ep_udp_client; |
olympux | 3:972ed747474c | 265 | |
olympux | 6:d054e394fba3 | 266 | ret = udp_server.bind(udp_server_port); |
olympux | 7:d45bd480e90f | 267 | //printf("sock.bind = %d\n", ret); |
olympux | 4:568c97f2a407 | 268 | udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT); |
olympux | 3:972ed747474c | 269 | #endif |
olympux | 3:972ed747474c | 270 | |
olympux | 3:972ed747474c | 271 | |
olympux | 4:568c97f2a407 | 272 | // Network processor |
olympux | 0:c2eac797face | 273 | while (true) { |
olympux | 4:568c97f2a407 | 274 | #ifdef TCP_SERVER |
olympux | 4:568c97f2a407 | 275 | // no tcp client connected |
olympux | 4:568c97f2a407 | 276 | if (!tcp_client.is_connected()) |
olympux | 4:568c97f2a407 | 277 | { |
olympux | 4:568c97f2a407 | 278 | // wait for client within timeout |
olympux | 4:568c97f2a407 | 279 | ret = tcp_server.accept(tcp_client); |
olympux | 2:18f10e7209f4 | 280 | |
olympux | 4:568c97f2a407 | 281 | // tcp client connected |
olympux | 4:568c97f2a407 | 282 | if (ret > -1) { |
olympux | 7:d45bd480e90f | 283 | //uart.printf("Connection from: %s\n", tcp_client.get_address()); |
olympux | 4:568c97f2a407 | 284 | |
olympux | 4:568c97f2a407 | 285 | // loop waiting and receiving data within timeout |
olympux | 4:568c97f2a407 | 286 | tcp_client.set_blocking(false, TCP_SERVER_RECEIVE_TIMEOUT); // Timeout after x seconds |
olympux | 4:568c97f2a407 | 287 | while (true) { |
olympux | 4:568c97f2a407 | 288 | int n = tcp_client.receive(buffer, sizeof(buffer)); |
olympux | 4:568c97f2a407 | 289 | if (n <= 0) break; |
olympux | 4:568c97f2a407 | 290 | |
olympux | 4:568c97f2a407 | 291 | // got data, process it |
olympux | 4:568c97f2a407 | 292 | // send to uart |
olympux | 4:568c97f2a407 | 293 | buffer[n] = '\0'; |
olympux | 4:568c97f2a407 | 294 | message.len = n; |
olympux | 4:568c97f2a407 | 295 | message.msg = buffer; |
olympux | 4:568c97f2a407 | 296 | uart_queue.put(&message); |
olympux | 4:568c97f2a407 | 297 | |
olympux | 4:568c97f2a407 | 298 | // echo to tcp client |
olympux | 4:568c97f2a407 | 299 | tcp_client.send_all(buffer, n); |
olympux | 4:568c97f2a407 | 300 | if (n <= 0) break; |
olympux | 4:568c97f2a407 | 301 | } // end loop if no data received within timeout |
olympux | 4:568c97f2a407 | 302 | tcp_client.close(); |
olympux | 4:568c97f2a407 | 303 | } // if client connected |
olympux | 4:568c97f2a407 | 304 | } // if no client connected |
olympux | 3:972ed747474c | 305 | #endif |
olympux | 3:972ed747474c | 306 | |
olympux | 4:568c97f2a407 | 307 | |
olympux | 7:d45bd480e90f | 308 | #ifdef UDP_SERVER // used for setting configuration |
olympux | 4:568c97f2a407 | 309 | // wait for udp packet within timeout |
olympux | 3:972ed747474c | 310 | int n = udp_server.receiveFrom(ep_udp_client, buffer, sizeof(buffer)); |
olympux | 3:972ed747474c | 311 | if (n < 0) continue; |
olympux | 3:972ed747474c | 312 | |
olympux | 4:568c97f2a407 | 313 | // got some data, process it |
olympux | 3:972ed747474c | 314 | // send to uart |
olympux | 7:d45bd480e90f | 315 | //buffer[n] = '\0'; |
olympux | 7:d45bd480e90f | 316 | //message.len = n; |
olympux | 7:d45bd480e90f | 317 | //message.msg = buffer; |
olympux | 7:d45bd480e90f | 318 | //uart_queue.put(&message); |
olympux | 3:972ed747474c | 319 | |
olympux | 3:972ed747474c | 320 | // echo |
olympux | 3:972ed747474c | 321 | //printf("Received packet from: %s\n", client.get_address()); |
olympux | 7:d45bd480e90f | 322 | //udp_server.sendTo(ep_udp_client, buffer, n); |
olympux | 4:568c97f2a407 | 323 | |
olympux | 6:d054e394fba3 | 324 | // process received data |
olympux | 6:d054e394fba3 | 325 | switch (n) { |
olympux | 7:d45bd480e90f | 326 | // length = 4, may be this is a discovery command, TCP port, or UDP port |
olympux | 7:d45bd480e90f | 327 | // Format: NNDS, NNTP or NNUP |
olympux | 7:d45bd480e90f | 328 | case 4: |
olympux | 7:d45bd480e90f | 329 | // discovery command |
olympux | 7:d45bd480e90f | 330 | if (strstr(buffer, "NNDS") != NULL) { |
olympux | 7:d45bd480e90f | 331 | udp_server.sendTo(ep_udp_client, ip_addr, strlen(ip_addr)); |
olympux | 7:d45bd480e90f | 332 | } |
olympux | 7:d45bd480e90f | 333 | // ask for TCP server port |
olympux | 7:d45bd480e90f | 334 | else if (strstr(buffer, "NNTP") != NULL) { |
olympux | 7:d45bd480e90f | 335 | char port[5]; |
olympux | 7:d45bd480e90f | 336 | sprintf(port, "%5d", tcp_server_port); |
olympux | 7:d45bd480e90f | 337 | udp_server.sendTo(ep_udp_client, port, strlen(port)); |
olympux | 7:d45bd480e90f | 338 | } |
olympux | 7:d45bd480e90f | 339 | // ask for UDP server port |
olympux | 7:d45bd480e90f | 340 | else if (strstr(buffer, "NNUP") != NULL) { |
olympux | 7:d45bd480e90f | 341 | char port[5]; |
olympux | 7:d45bd480e90f | 342 | sprintf(port, "%5d", udp_server_port); |
olympux | 7:d45bd480e90f | 343 | udp_server.sendTo(ep_udp_client, port, strlen(port)); |
olympux | 7:d45bd480e90f | 344 | } |
olympux | 7:d45bd480e90f | 345 | break; |
olympux | 6:d054e394fba3 | 346 | // length = 14, maybe this is a command to set network configuration |
olympux | 6:d054e394fba3 | 347 | // Format: 4E 4E C0 A8 00 78 FF FF FF 00 C0 A8 0 1 (NN 192.168.0.120; 255.255.255.0; 192.168.0.1) |
olympux | 6:d054e394fba3 | 348 | case 14: |
olympux | 6:d054e394fba3 | 349 | // check if two first chars = NN |
olympux | 6:d054e394fba3 | 350 | if (strstr(buffer, "NN") != NULL) { |
olympux | 7:d45bd480e90f | 351 | //printf("Received new network configuration\n"); |
olympux | 6:d054e394fba3 | 352 | write_eeprom(&buffer[2]); // parameters from 3rd char |
olympux | 6:d054e394fba3 | 353 | } |
olympux | 6:d054e394fba3 | 354 | break; |
olympux | 6:d054e394fba3 | 355 | default: |
olympux | 6:d054e394fba3 | 356 | break; |
olympux | 4:568c97f2a407 | 357 | } |
olympux | 3:972ed747474c | 358 | #endif |
olympux | 4:568c97f2a407 | 359 | } // network processor |
olympux | 4:568c97f2a407 | 360 | } |