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@9:d2534ecf88c6, 2014-09-26 (annotated)
- 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?
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 | 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 | } |