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@11:709f90a3b599, 2014-09-27 (annotated)
- Committer:
- olympux
- Date:
- Sat Sep 27 10:33:49 2014 +0000
- Revision:
- 11:709f90a3b599
- Parent:
- 10:4cd965d79de0
- Child:
- 12:7c152c0ca4d8
Added receiving & sending protocol
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 | 11:709f90a3b599 | 21 | EthernetInterface eth(&spi, PA_4, 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 | 11:709f90a3b599 | 28 | DigitalIn din0(PB_14); |
olympux | 11:709f90a3b599 | 29 | DigitalIn din1(PB_12); |
olympux | 11:709f90a3b599 | 30 | DigitalIn din2(PB_10); |
olympux | 11:709f90a3b599 | 31 | DigitalIn din3(PB_1); |
olympux | 11:709f90a3b599 | 32 | DigitalIn din4(PB_15); |
olympux | 11:709f90a3b599 | 33 | DigitalIn din5(PB_13); |
olympux | 11:709f90a3b599 | 34 | DigitalIn din6(PB_11); |
olympux | 11:709f90a3b599 | 35 | DigitalIn din7(PB_2); |
olympux | 9:d2534ecf88c6 | 36 | // Digital outputs |
olympux | 11:709f90a3b599 | 37 | DigitalOut dout0(PB_3); |
olympux | 11:709f90a3b599 | 38 | DigitalOut dout1(PB_5); |
olympux | 11:709f90a3b599 | 39 | DigitalOut dout2(PB_7); |
olympux | 11:709f90a3b599 | 40 | DigitalOut dout3(PB_9); |
olympux | 11:709f90a3b599 | 41 | DigitalOut dout4(PD_2); |
olympux | 11:709f90a3b599 | 42 | DigitalOut dout5(PB_4); |
olympux | 11:709f90a3b599 | 43 | DigitalOut dout6(PB_6); |
olympux | 11:709f90a3b599 | 44 | DigitalOut dout7(PB_8); |
olympux | 9:d2534ecf88c6 | 45 | // Analog inputs |
olympux | 11:709f90a3b599 | 46 | AnalogIn ain0(PC_0); |
olympux | 11:709f90a3b599 | 47 | AnalogIn ain1(PC_1); |
olympux | 9:d2534ecf88c6 | 48 | // Analog outputs |
olympux | 11:709f90a3b599 | 49 | //AnalogOut ano0(PA_8); |
olympux | 11:709f90a3b599 | 50 | //AnalogOut ano1(PA_15); |
olympux | 11:709f90a3b599 | 51 | |
olympux | 11:709f90a3b599 | 52 | void update_digital_outputs(void); |
olympux | 11:709f90a3b599 | 53 | |
olympux | 9:d2534ecf88c6 | 54 | |
olympux | 9:d2534ecf88c6 | 55 | |
olympux | 9:d2534ecf88c6 | 56 | // eeprom |
olympux | 9:d2534ecf88c6 | 57 | #define NumbOfVar ((uint8_t)0x80) // REMEMBER: update this variable in eeprom.h too |
olympux | 9:d2534ecf88c6 | 58 | #define IP_ADDRESS_POS 0 |
olympux | 9:d2534ecf88c6 | 59 | #define IP_SUBNET_POS 4 |
olympux | 9:d2534ecf88c6 | 60 | #define IP_GATEWAY_POS 8 |
olympux | 9:d2534ecf88c6 | 61 | #define TCP_SERVER_PORT_POS 12 |
olympux | 9:d2534ecf88c6 | 62 | #define UDP_SERVER_PORT_POS 13 |
olympux | 9:d2534ecf88c6 | 63 | #define FIRST_RUN_FLAG_POS 14 |
olympux | 9:d2534ecf88c6 | 64 | #define MAC_ADDRESS_POS 15 |
olympux | 6:d054e394fba3 | 65 | // Virtual address defined by the user: 0xFFFF value is prohibited |
olympux | 6:d054e394fba3 | 66 | uint16_t VirtAddVarTab[NumbOfVar] = {0x1212, 0x1313, 0x1414, 0x1515, // IP_Addr |
olympux | 6:d054e394fba3 | 67 | 0x2212, 0x2313, 0x2414, 0x2515, // IP_Subnet |
olympux | 6:d054e394fba3 | 68 | 0x3212, 0x3313, 0x3414, 0x3515, // IP_Gateway |
olympux | 6:d054e394fba3 | 69 | 0x4212, // TCP server port, not used |
olympux | 8:64848959adb9 | 70 | 0x5212, // UDP server port, not used |
olympux | 9:d2534ecf88c6 | 71 | 0x8888, // 1st run? |
olympux | 9:d2534ecf88c6 | 72 | 0x6212, 0x6313, 0x6414 // MAC |
olympux | 6:d054e394fba3 | 73 | }; |
olympux | 6:d054e394fba3 | 74 | extern "C" uint16_t EE_Init(void); |
olympux | 6:d054e394fba3 | 75 | extern "C" uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); |
olympux | 6:d054e394fba3 | 76 | extern "C" uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data); |
olympux | 4:568c97f2a407 | 77 | |
olympux | 0:c2eac797face | 78 | |
olympux | 2:18f10e7209f4 | 79 | /* |
olympux | 2:18f10e7209f4 | 80 | * Network configuration |
olympux | 2:18f10e7209f4 | 81 | */ |
olympux | 4:568c97f2a407 | 82 | #define TCP_SERVER |
olympux | 4:568c97f2a407 | 83 | //#define TCP_CLIENT |
olympux | 4:568c97f2a407 | 84 | #define UDP_SERVER |
olympux | 4:568c97f2a407 | 85 | //#define UDP_CLIENT |
olympux | 10:4cd965d79de0 | 86 | #define NTP |
olympux | 4:568c97f2a407 | 87 | |
olympux | 8:64848959adb9 | 88 | #define DEFAULT_IP_ADDRESS "192.168.0.249" |
olympux | 8:64848959adb9 | 89 | #define DEFAULT_IP_SUBNET "255.255.255.0" |
olympux | 8:64848959adb9 | 90 | #define DEFAULT_IP_GATEWAY "192.168.0.1" |
olympux | 11:709f90a3b599 | 91 | #define DEFAULT_MAC0 0x00 |
olympux | 11:709f90a3b599 | 92 | #define DEFAULT_MAC1 0x08 |
olympux | 11:709f90a3b599 | 93 | #define DEFAULT_MAC2 0xDC |
olympux | 9:d2534ecf88c6 | 94 | #define DEFAULT_MAC3 0x00 |
olympux | 9:d2534ecf88c6 | 95 | #define DEFAULT_MAC4 0x00 |
olympux | 9:d2534ecf88c6 | 96 | #define DEFAULT_MAC5 0x01 |
olympux | 8:64848959adb9 | 97 | |
olympux | 4:568c97f2a407 | 98 | #define TCP_SERVER_WAIT_CLIENT_TIMEOUT 200 |
olympux | 4:568c97f2a407 | 99 | #define TCP_SERVER_RECEIVE_TIMEOUT 3000 |
olympux | 4:568c97f2a407 | 100 | #define UDP_SERVER_RECEIVE_TIMEOUT 200 |
olympux | 4:568c97f2a407 | 101 | |
olympux | 0:c2eac797face | 102 | // for static IP setting |
olympux | 11:709f90a3b599 | 103 | uint8_t u8mac[6], u8ip_addr[4];// keep mac and ip address in 8-bits |
olympux | 11:709f90a3b599 | 104 | char * IP_Addr; // pointers to ip_xxx[16] |
olympux | 7:d45bd480e90f | 105 | char * IP_Subnet; |
olympux | 7:d45bd480e90f | 106 | char * IP_Gateway; |
olympux | 6:d054e394fba3 | 107 | |
olympux | 11:709f90a3b599 | 108 | uint16_t u16mac_addr[3], u16ip_addr[4], u16ip_subnet[4], u16ip_gateway[4]; // 16-bits, directly loaded from eeprom |
olympux | 11:709f90a3b599 | 109 | char str_ip_addr[16], str_ip_subnet[16], str_ip_gateway[16]; // for printf, converted from 16-bits u16ip_xxx |
olympux | 9:d2534ecf88c6 | 110 | uint16_t first_run = 0; // first run flag |
olympux | 9:d2534ecf88c6 | 111 | |
olympux | 9:d2534ecf88c6 | 112 | const uint16_t tcp_server_port = 10000; // fixed |
olympux | 9:d2534ecf88c6 | 113 | const uint16_t udp_server_port = 11000; // fixed |
olympux | 0:c2eac797face | 114 | |
olympux | 3:972ed747474c | 115 | char buffer[256]; // socket buffer |
olympux | 3:972ed747474c | 116 | |
olympux | 9:d2534ecf88c6 | 117 | NTPClient ntp; |
olympux | 9:d2534ecf88c6 | 118 | |
olympux | 9:d2534ecf88c6 | 119 | // Commands |
olympux | 9:d2534ecf88c6 | 120 | #define DEVICE_ID "NNIO" |
olympux | 9:d2534ecf88c6 | 121 | #define DISCOVERY_COMMAND "NNIODS" |
olympux | 9:d2534ecf88c6 | 122 | #define TCP_SERVER_PORT_COMAMND "NNIOTP" |
olympux | 9:d2534ecf88c6 | 123 | #define UDP_SERVER_PORT_COMAMND "NNIOUP" |
olympux | 11:709f90a3b599 | 124 | #define RECEIVING_PROTOCOL_ENABLE_OUTPUT 'O' |
olympux | 11:709f90a3b599 | 125 | #define QUERY_STATUS_COMMAND 'Q' |
olympux | 11:709f90a3b599 | 126 | #define DIGITAL_HIGH 'H' |
olympux | 11:709f90a3b599 | 127 | #define DIGITAL_LOW 'L' |
olympux | 9:d2534ecf88c6 | 128 | |
olympux | 9:d2534ecf88c6 | 129 | |
olympux | 9:d2534ecf88c6 | 130 | // Positions |
olympux | 11:709f90a3b599 | 131 | #define RECEIVING_PROTOCOL_LENGTH 58 |
olympux | 11:709f90a3b599 | 132 | #define RECEIVING_PROTOCOL_ID_POS 0 |
olympux | 9:d2534ecf88c6 | 133 | #define RECEIVING_PROTOCOL_OP_POS 4 |
olympux | 9:d2534ecf88c6 | 134 | #define RECEIVING_PROTOCOL_EN_DO_POS RECEIVING_PROTOCOL_OP_POS + 0 |
olympux | 9:d2534ecf88c6 | 135 | #define RECEIVING_PROTOCOL_EN_A0O_POS RECEIVING_PROTOCOL_OP_POS + 1 |
olympux | 9:d2534ecf88c6 | 136 | #define RECEIVING_PROTOCOL_EN_A1O_POS RECEIVING_PROTOCOL_OP_POS + 2 |
olympux | 9:d2534ecf88c6 | 137 | #define RECEIVING_PROTOCOL_EN_UART_POS RECEIVING_PROTOCOL_OP_POS + 3 |
olympux | 9:d2534ecf88c6 | 138 | #define RECEIVING_PROTOCOL_COMMAND_POS RECEIVING_PROTOCOL_OP_POS + 4 |
olympux | 11:709f90a3b599 | 139 | |
olympux | 11:709f90a3b599 | 140 | #define RECEIVING_PROTOCOL_IP_POS 9 |
olympux | 11:709f90a3b599 | 141 | #define RECEIVING_PROTOCOL_DO_POS 13 |
olympux | 11:709f90a3b599 | 142 | #define RECEIVING_PROTOCOL_A0O_POS 21 |
olympux | 11:709f90a3b599 | 143 | #define RECEIVING_PROTOCOL_A01_POS 23 |
olympux | 11:709f90a3b599 | 144 | #define RECEIVING_PROTOCOL_UART_POS 25 |
olympux | 9:d2534ecf88c6 | 145 | |
olympux | 9:d2534ecf88c6 | 146 | |
olympux | 11:709f90a3b599 | 147 | #define SENDING_PROTOCOL_LENGTH 39 |
olympux | 11:709f90a3b599 | 148 | #define SENDING_PROTOCOL_ID_POS 0 |
olympux | 11:709f90a3b599 | 149 | #define SENDING_PROTOCOL_MAC_POS 4 |
olympux | 11:709f90a3b599 | 150 | #define SENDING_PROTOCOL_IP_POS 10 |
olympux | 11:709f90a3b599 | 151 | #define SENDING_PROTOCOL_DI_POS 14 |
olympux | 11:709f90a3b599 | 152 | #define SENDING_PROTOCOL_DO_POS 22 |
olympux | 11:709f90a3b599 | 153 | #define SENDING_PROTOCOL_AI0_POS 30 |
olympux | 11:709f90a3b599 | 154 | #define SENDING_PROTOCOL_AI1_POS 32 |
olympux | 11:709f90a3b599 | 155 | #define SENDING_PROTOCOL_AO0_POS 34 |
olympux | 11:709f90a3b599 | 156 | #define SENDING_PROTOCOL_AO1_POS 36 |
olympux | 11:709f90a3b599 | 157 | #define SENDING_PROTOCOL_CR_POS 38 |
olympux | 0:c2eac797face | 158 | |
olympux | 2:18f10e7209f4 | 159 | |
olympux | 2:18f10e7209f4 | 160 | /* |
olympux | 2:18f10e7209f4 | 161 | * RTOS |
olympux | 2:18f10e7209f4 | 162 | */ |
olympux | 2:18f10e7209f4 | 163 | struct message_t { |
olympux | 2:18f10e7209f4 | 164 | int len; |
olympux | 2:18f10e7209f4 | 165 | char *msg; |
olympux | 2:18f10e7209f4 | 166 | }; |
olympux | 3:972ed747474c | 167 | Queue<message_t, 16> uart_queue; |
olympux | 2:18f10e7209f4 | 168 | |
olympux | 3:972ed747474c | 169 | Mutex uart_mutex; |
olympux | 2:18f10e7209f4 | 170 | |
olympux | 2:18f10e7209f4 | 171 | |
olympux | 2:18f10e7209f4 | 172 | /* |
olympux | 2:18f10e7209f4 | 173 | * Threads |
olympux | 2:18f10e7209f4 | 174 | */ |
olympux | 0:c2eac797face | 175 | void uart_thread(void const *args) { |
olympux | 2:18f10e7209f4 | 176 | message_t *p_message; |
olympux | 0:c2eac797face | 177 | |
olympux | 0:c2eac797face | 178 | while (true) { |
olympux | 3:972ed747474c | 179 | osEvent evt = uart_queue.get(); |
olympux | 2:18f10e7209f4 | 180 | if (evt.status == osEventMessage) { |
olympux | 2:18f10e7209f4 | 181 | p_message = (message_t*)evt.value.p; |
olympux | 11:709f90a3b599 | 182 | uart_mutex.lock(); // mutex for stdio is not neccessary |
olympux | 3:972ed747474c | 183 | //uart.printf("len=%d\n", p_message->len); |
olympux | 3:972ed747474c | 184 | uart.printf("%s\n", p_message->msg); |
olympux | 3:972ed747474c | 185 | uart_mutex.unlock(); |
olympux | 2:18f10e7209f4 | 186 | } |
olympux | 0:c2eac797face | 187 | } |
olympux | 0:c2eac797face | 188 | } |
olympux | 0:c2eac797face | 189 | |
olympux | 0:c2eac797face | 190 | |
olympux | 6:d054e394fba3 | 191 | /* |
olympux | 6:d054e394fba3 | 192 | * Ethernet init |
olympux | 6:d054e394fba3 | 193 | */ |
olympux | 4:568c97f2a407 | 194 | int ethernet_init(void) { |
olympux | 11:709f90a3b599 | 195 | printf("Start initialising ethernet\n"); |
olympux | 11:709f90a3b599 | 196 | int ret = eth.init(u8mac, IP_Addr, IP_Subnet, IP_Gateway); // static |
olympux | 0:c2eac797face | 197 | |
olympux | 0:c2eac797face | 198 | if (!ret) { |
olympux | 11:709f90a3b599 | 199 | printf("Initialized, MAC: %s\n", eth.getMACAddress()); |
olympux | 0:c2eac797face | 200 | } else { |
olympux | 11:709f90a3b599 | 201 | printf("Error eth.init() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 202 | return -1; |
olympux | 0:c2eac797face | 203 | } |
olympux | 0:c2eac797face | 204 | |
olympux | 0:c2eac797face | 205 | ret = eth.connect(); |
olympux | 0:c2eac797face | 206 | if (!ret) { |
olympux | 11:709f90a3b599 | 207 | printf("IP: %s, MASK: %s, GW: %s\n", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway()); |
olympux | 0:c2eac797face | 208 | } else { |
olympux | 11:709f90a3b599 | 209 | printf("Error eth.connect() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 210 | return -1; |
olympux | 0:c2eac797face | 211 | } |
olympux | 3:972ed747474c | 212 | |
olympux | 4:568c97f2a407 | 213 | return 0; |
olympux | 4:568c97f2a407 | 214 | } |
olympux | 4:568c97f2a407 | 215 | |
olympux | 4:568c97f2a407 | 216 | |
olympux | 6:d054e394fba3 | 217 | /* |
olympux | 6:d054e394fba3 | 218 | * EEPROM functions |
olympux | 6:d054e394fba3 | 219 | */ |
olympux | 6:d054e394fba3 | 220 | void write_eeprom(char *buffer) { |
olympux | 9:d2534ecf88c6 | 221 | // Write network configuration |
olympux | 9:d2534ecf88c6 | 222 | // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC |
olympux | 9:d2534ecf88c6 | 223 | |
olympux | 11:709f90a3b599 | 224 | printf("Saving configuration\r\n"); |
olympux | 11:709f90a3b599 | 225 | |
olympux | 6:d054e394fba3 | 226 | // Unlock the Flash Program Erase controller */ |
olympux | 6:d054e394fba3 | 227 | FLASH_Unlock(); |
olympux | 6:d054e394fba3 | 228 | // EEPROM Init |
olympux | 6:d054e394fba3 | 229 | EE_Init(); |
olympux | 6:d054e394fba3 | 230 | // IP address |
olympux | 9:d2534ecf88c6 | 231 | EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buffer++); |
olympux | 9:d2534ecf88c6 | 232 | EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buffer++); |
olympux | 9:d2534ecf88c6 | 233 | EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buffer++); |
olympux | 9:d2534ecf88c6 | 234 | EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buffer++); |
olympux | 9:d2534ecf88c6 | 235 | |
olympux | 6:d054e394fba3 | 236 | // IP subnet |
olympux | 9:d2534ecf88c6 | 237 | EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buffer++); |
olympux | 9:d2534ecf88c6 | 238 | EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buffer++); |
olympux | 9:d2534ecf88c6 | 239 | EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buffer++); |
olympux | 9:d2534ecf88c6 | 240 | EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buffer++); |
olympux | 9:d2534ecf88c6 | 241 | |
olympux | 6:d054e394fba3 | 242 | // IP gateway |
olympux | 9:d2534ecf88c6 | 243 | EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buffer++); |
olympux | 9:d2534ecf88c6 | 244 | EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buffer++); |
olympux | 9:d2534ecf88c6 | 245 | EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buffer++); |
olympux | 9:d2534ecf88c6 | 246 | EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buffer++); |
olympux | 9:d2534ecf88c6 | 247 | |
olympux | 9:d2534ecf88c6 | 248 | //// TCP server port, not used |
olympux | 9:d2534ecf88c6 | 249 | //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], *buffer++); |
olympux | 9:d2534ecf88c6 | 250 | //// UDP server port, not used |
olympux | 9:d2534ecf88c6 | 251 | //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_PORT_POS], *buffer++); |
olympux | 8:64848959adb9 | 252 | |
olympux | 8:64848959adb9 | 253 | // erase first_run flag |
olympux | 9:d2534ecf88c6 | 254 | EE_WriteVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], 0xA5A5); |
olympux | 9:d2534ecf88c6 | 255 | |
olympux | 9:d2534ecf88c6 | 256 | // MAC address |
olympux | 9:d2534ecf88c6 | 257 | EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buffer++); |
olympux | 9:d2534ecf88c6 | 258 | EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buffer++); |
olympux | 9:d2534ecf88c6 | 259 | EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buffer++); |
olympux | 6:d054e394fba3 | 260 | FLASH_Lock(); |
olympux | 11:709f90a3b599 | 261 | |
olympux | 11:709f90a3b599 | 262 | printf("Success\r\n"); |
olympux | 6:d054e394fba3 | 263 | } |
olympux | 6:d054e394fba3 | 264 | |
olympux | 6:d054e394fba3 | 265 | |
olympux | 6:d054e394fba3 | 266 | void load_eeprom(void) { |
olympux | 11:709f90a3b599 | 267 | mbed_mac_address((char *)u8mac); |
olympux | 11:709f90a3b599 | 268 | |
olympux | 11:709f90a3b599 | 269 | printf("Loading network configuration...\r\n"); |
olympux | 8:64848959adb9 | 270 | |
olympux | 6:d054e394fba3 | 271 | EE_Init(); |
olympux | 8:64848959adb9 | 272 | |
olympux | 8:64848959adb9 | 273 | // check if 1st run |
olympux | 9:d2534ecf88c6 | 274 | EE_ReadVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], &first_run); |
olympux | 8:64848959adb9 | 275 | // if not first run, load network config |
olympux | 8:64848959adb9 | 276 | if (first_run == 0xA5A5) { |
olympux | 11:709f90a3b599 | 277 | printf("User settings\r\n"); |
olympux | 11:709f90a3b599 | 278 | |
olympux | 8:64848959adb9 | 279 | // IP address |
olympux | 9:d2534ecf88c6 | 280 | EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]); |
olympux | 9:d2534ecf88c6 | 281 | EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]); |
olympux | 9:d2534ecf88c6 | 282 | EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]); |
olympux | 9:d2534ecf88c6 | 283 | EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]); |
olympux | 11:709f90a3b599 | 284 | u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF); |
olympux | 11:709f90a3b599 | 285 | u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF); |
olympux | 11:709f90a3b599 | 286 | u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF); |
olympux | 11:709f90a3b599 | 287 | u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF); |
olympux | 9:d2534ecf88c6 | 288 | |
olympux | 8:64848959adb9 | 289 | // IP subnet |
olympux | 9:d2534ecf88c6 | 290 | EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]); |
olympux | 9:d2534ecf88c6 | 291 | EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]); |
olympux | 9:d2534ecf88c6 | 292 | EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]); |
olympux | 9:d2534ecf88c6 | 293 | EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]); |
olympux | 9:d2534ecf88c6 | 294 | |
olympux | 8:64848959adb9 | 295 | // IP gateway |
olympux | 9:d2534ecf88c6 | 296 | EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]); |
olympux | 9:d2534ecf88c6 | 297 | EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]); |
olympux | 9:d2534ecf88c6 | 298 | EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]); |
olympux | 9:d2534ecf88c6 | 299 | EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]); |
olympux | 9:d2534ecf88c6 | 300 | |
olympux | 8:64848959adb9 | 301 | //// TCP server port |
olympux | 9:d2534ecf88c6 | 302 | //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &tcp_server_port); |
olympux | 8:64848959adb9 | 303 | //// UDP server port |
olympux | 9:d2534ecf88c6 | 304 | //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_PORT_POS], &udp_server_port); |
olympux | 9:d2534ecf88c6 | 305 | |
olympux | 9:d2534ecf88c6 | 306 | // First run flag, already read above |
olympux | 9:d2534ecf88c6 | 307 | |
olympux | 9:d2534ecf88c6 | 308 | // MAC address |
olympux | 9:d2534ecf88c6 | 309 | EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]); |
olympux | 9:d2534ecf88c6 | 310 | EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]); |
olympux | 9:d2534ecf88c6 | 311 | EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]); |
olympux | 11:709f90a3b599 | 312 | u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2; |
olympux | 11:709f90a3b599 | 313 | u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF); |
olympux | 11:709f90a3b599 | 314 | u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF); |
olympux | 11:709f90a3b599 | 315 | u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF); |
olympux | 8:64848959adb9 | 316 | //FLASH_Lock(); |
olympux | 9:d2534ecf88c6 | 317 | |
olympux | 11:709f90a3b599 | 318 | sprintf(str_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 | 11:709f90a3b599 | 319 | sprintf(str_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 | 11:709f90a3b599 | 320 | sprintf(str_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 | 321 | } |
olympux | 8:64848959adb9 | 322 | // if 1st run, use default addresses |
olympux | 8:64848959adb9 | 323 | else { |
olympux | 11:709f90a3b599 | 324 | printf("No user settings, load defaults\r\n"); |
olympux | 11:709f90a3b599 | 325 | u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2; |
olympux | 11:709f90a3b599 | 326 | u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5; |
olympux | 11:709f90a3b599 | 327 | sprintf(str_ip_addr, DEFAULT_IP_ADDRESS); |
olympux | 11:709f90a3b599 | 328 | sprintf(str_ip_subnet, DEFAULT_IP_SUBNET); |
olympux | 11:709f90a3b599 | 329 | sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY); |
olympux | 8:64848959adb9 | 330 | } |
olympux | 11:709f90a3b599 | 331 | |
olympux | 11:709f90a3b599 | 332 | printf("Success\r\n"); |
olympux | 11:709f90a3b599 | 333 | printf("IP: %s\r\n", str_ip_addr); |
olympux | 11:709f90a3b599 | 334 | printf("MASK: %s\r\n", str_ip_subnet); |
olympux | 11:709f90a3b599 | 335 | printf("GW: %s\r\n", str_ip_gateway); |
olympux | 11:709f90a3b599 | 336 | printf("TCP server: %d\r\n", tcp_server_port); |
olympux | 11:709f90a3b599 | 337 | printf("UDP server: %d\r\n", udp_server_port); |
olympux | 6:d054e394fba3 | 338 | } |
olympux | 6:d054e394fba3 | 339 | |
olympux | 6:d054e394fba3 | 340 | |
olympux | 4:568c97f2a407 | 341 | |
olympux | 4:568c97f2a407 | 342 | int main() |
olympux | 4:568c97f2a407 | 343 | { |
olympux | 4:568c97f2a407 | 344 | message_t message; |
olympux | 9:d2534ecf88c6 | 345 | int n, ret; |
olympux | 4:568c97f2a407 | 346 | |
olympux | 4:568c97f2a407 | 347 | /* |
olympux | 9:d2534ecf88c6 | 348 | * Configure |
olympux | 4:568c97f2a407 | 349 | */ |
olympux | 11:709f90a3b599 | 350 | uart.baud(115200); |
olympux | 4:568c97f2a407 | 351 | |
olympux | 4:568c97f2a407 | 352 | |
olympux | 4:568c97f2a407 | 353 | /* |
olympux | 4:568c97f2a407 | 354 | * UI threads |
olympux | 4:568c97f2a407 | 355 | */ |
olympux | 4:568c97f2a407 | 356 | Thread t1(uart_thread); |
olympux | 4:568c97f2a407 | 357 | |
olympux | 6:d054e394fba3 | 358 | |
olympux | 6:d054e394fba3 | 359 | /* |
olympux | 6:d054e394fba3 | 360 | * FLASH |
olympux | 6:d054e394fba3 | 361 | */ |
olympux | 6:d054e394fba3 | 362 | load_eeprom(); |
olympux | 11:709f90a3b599 | 363 | IP_Addr = str_ip_addr; |
olympux | 11:709f90a3b599 | 364 | IP_Subnet = str_ip_subnet; |
olympux | 11:709f90a3b599 | 365 | IP_Gateway = str_ip_gateway; |
olympux | 6:d054e394fba3 | 366 | |
olympux | 4:568c97f2a407 | 367 | |
olympux | 4:568c97f2a407 | 368 | /* |
olympux | 4:568c97f2a407 | 369 | * Ethernet |
olympux | 4:568c97f2a407 | 370 | */ |
olympux | 6:d054e394fba3 | 371 | ret = ethernet_init(); |
olympux | 4:568c97f2a407 | 372 | if (ret) { |
olympux | 11:709f90a3b599 | 373 | printf("Ethernet initialisation failed. App halted\r\n"); |
olympux | 4:568c97f2a407 | 374 | while (true) {}; |
olympux | 4:568c97f2a407 | 375 | } |
olympux | 4:568c97f2a407 | 376 | |
olympux | 3:972ed747474c | 377 | |
olympux | 3:972ed747474c | 378 | #ifdef TCP_SERVER |
olympux | 3:972ed747474c | 379 | TCPSocketServer tcp_server; |
olympux | 3:972ed747474c | 380 | TCPSocketConnection tcp_client; |
olympux | 3:972ed747474c | 381 | |
olympux | 6:d054e394fba3 | 382 | tcp_server.bind(tcp_server_port); |
olympux | 3:972ed747474c | 383 | tcp_server.listen(); |
olympux | 11:709f90a3b599 | 384 | printf("TCP server started...\r\n"); |
olympux | 4:568c97f2a407 | 385 | tcp_server.set_blocking(false, TCP_SERVER_WAIT_CLIENT_TIMEOUT); |
olympux | 3:972ed747474c | 386 | #endif |
olympux | 3:972ed747474c | 387 | |
olympux | 3:972ed747474c | 388 | #ifdef UDP_SERVER |
olympux | 3:972ed747474c | 389 | UDPSocket udp_server; |
olympux | 3:972ed747474c | 390 | Endpoint ep_udp_client; |
olympux | 3:972ed747474c | 391 | |
olympux | 6:d054e394fba3 | 392 | ret = udp_server.bind(udp_server_port); |
olympux | 11:709f90a3b599 | 393 | printf("UDP started (sock.bind = %d)\r\n", ret); |
olympux | 4:568c97f2a407 | 394 | udp_server.set_blocking(false, UDP_SERVER_RECEIVE_TIMEOUT); |
olympux | 3:972ed747474c | 395 | #endif |
olympux | 3:972ed747474c | 396 | |
olympux | 3:972ed747474c | 397 | |
olympux | 4:568c97f2a407 | 398 | // Network processor |
olympux | 0:c2eac797face | 399 | while (true) { |
olympux | 9:d2534ecf88c6 | 400 | // FOR INTERFACING |
olympux | 4:568c97f2a407 | 401 | #ifdef TCP_SERVER |
olympux | 4:568c97f2a407 | 402 | // no tcp client connected |
olympux | 4:568c97f2a407 | 403 | if (!tcp_client.is_connected()) |
olympux | 4:568c97f2a407 | 404 | { |
olympux | 4:568c97f2a407 | 405 | // wait for client within timeout |
olympux | 4:568c97f2a407 | 406 | ret = tcp_server.accept(tcp_client); |
olympux | 2:18f10e7209f4 | 407 | |
olympux | 4:568c97f2a407 | 408 | // tcp client connected |
olympux | 4:568c97f2a407 | 409 | if (ret > -1) { |
olympux | 11:709f90a3b599 | 410 | printf("Connection from: %s\r\n", tcp_client.get_address()); |
olympux | 4:568c97f2a407 | 411 | |
olympux | 4:568c97f2a407 | 412 | // loop waiting and receiving data within timeout |
olympux | 4:568c97f2a407 | 413 | tcp_client.set_blocking(false, TCP_SERVER_RECEIVE_TIMEOUT); // Timeout after x seconds |
olympux | 4:568c97f2a407 | 414 | while (true) { |
olympux | 9:d2534ecf88c6 | 415 | n = tcp_client.receive(buffer, sizeof(buffer)); |
olympux | 4:568c97f2a407 | 416 | if (n <= 0) break; |
olympux | 4:568c97f2a407 | 417 | |
olympux | 9:d2534ecf88c6 | 418 | // got some data, test it |
olympux | 11:709f90a3b599 | 419 | printf("TCP server received: %s\r\n", buffer); |
olympux | 11:709f90a3b599 | 420 | |
olympux | 9:d2534ecf88c6 | 421 | //// send to uart |
olympux | 9:d2534ecf88c6 | 422 | //buffer[n] = '\0'; |
olympux | 9:d2534ecf88c6 | 423 | //message.len = n; |
olympux | 9:d2534ecf88c6 | 424 | //message.msg = buffer; |
olympux | 9:d2534ecf88c6 | 425 | //uart_queue.put(&message); |
olympux | 9:d2534ecf88c6 | 426 | //// echo to tcp client |
olympux | 9:d2534ecf88c6 | 427 | //tcp_client.send_all(buffer, n); |
olympux | 9:d2534ecf88c6 | 428 | //if (n <= 0) break; |
olympux | 4:568c97f2a407 | 429 | |
olympux | 9:d2534ecf88c6 | 430 | // process received data |
olympux | 9:d2534ecf88c6 | 431 | switch (n) { |
olympux | 9:d2534ecf88c6 | 432 | // length 58-bytes, Receiving protocol |
olympux | 11:709f90a3b599 | 433 | case RECEIVING_PROTOCOL_LENGTH: { |
olympux | 11:709f90a3b599 | 434 | printf("Checking device ID..."); |
olympux | 9:d2534ecf88c6 | 435 | // check device id |
olympux | 9:d2534ecf88c6 | 436 | char* id = strstr(buffer, DEVICE_ID); |
olympux | 9:d2534ecf88c6 | 437 | if (id == NULL) |
olympux | 9:d2534ecf88c6 | 438 | break; |
olympux | 9:d2534ecf88c6 | 439 | else if ((id - buffer) > 0) |
olympux | 9:d2534ecf88c6 | 440 | break; |
olympux | 11:709f90a3b599 | 441 | printf("Correct.\r\n"); |
olympux | 9:d2534ecf88c6 | 442 | |
olympux | 9:d2534ecf88c6 | 443 | // firstly, update outputs if required |
olympux | 9:d2534ecf88c6 | 444 | // digital outputs |
olympux | 11:709f90a3b599 | 445 | if (buffer[RECEIVING_PROTOCOL_EN_DO_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) { |
olympux | 11:709f90a3b599 | 446 | printf("Update digital outputs\r\n"); |
olympux | 11:709f90a3b599 | 447 | update_digital_outputs(); |
olympux | 9:d2534ecf88c6 | 448 | } |
olympux | 9:d2534ecf88c6 | 449 | // analog output 0 |
olympux | 11:709f90a3b599 | 450 | if (buffer[RECEIVING_PROTOCOL_EN_A0O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) { |
olympux | 11:709f90a3b599 | 451 | printf("Update analog output 0\r\n"); |
olympux | 9:d2534ecf88c6 | 452 | } |
olympux | 11:709f90a3b599 | 453 | // analog output 1 |
olympux | 11:709f90a3b599 | 454 | if (buffer[RECEIVING_PROTOCOL_EN_A1O_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) { |
olympux | 11:709f90a3b599 | 455 | printf("Update analog output 1\r\n"); |
olympux | 9:d2534ecf88c6 | 456 | } |
olympux | 9:d2534ecf88c6 | 457 | // UART |
olympux | 11:709f90a3b599 | 458 | if (buffer[RECEIVING_PROTOCOL_EN_UART_POS] == RECEIVING_PROTOCOL_ENABLE_OUTPUT) { |
olympux | 11:709f90a3b599 | 459 | printf("UART data: "); |
olympux | 11:709f90a3b599 | 460 | char str_uart[33]; |
olympux | 11:709f90a3b599 | 461 | memcpy(str_uart, &buffer[RECEIVING_PROTOCOL_UART_POS], 32); |
olympux | 11:709f90a3b599 | 462 | str_uart[32] = '\0'; |
olympux | 11:709f90a3b599 | 463 | printf("%s\r\n", str_uart); |
olympux | 9:d2534ecf88c6 | 464 | } |
olympux | 9:d2534ecf88c6 | 465 | |
olympux | 9:d2534ecf88c6 | 466 | // then, check query status command and sending protocol if required |
olympux | 11:709f90a3b599 | 467 | if (buffer[RECEIVING_PROTOCOL_COMMAND_POS] == QUERY_STATUS_COMMAND) { |
olympux | 11:709f90a3b599 | 468 | printf("Sent device status through TCP\r\n"); |
olympux | 9:d2534ecf88c6 | 469 | // sending protocol |
olympux | 11:709f90a3b599 | 470 | memcpy(&buffer[SENDING_PROTOCOL_ID_POS], DEVICE_ID, 4); // device id |
olympux | 11:709f90a3b599 | 471 | memcpy(&buffer[SENDING_PROTOCOL_MAC_POS], &u8mac, 6); |
olympux | 11:709f90a3b599 | 472 | memcpy(&buffer[SENDING_PROTOCOL_IP_POS], &u8ip_addr, 4); |
olympux | 11:709f90a3b599 | 473 | //memcpy(&buffer[SENDING_PROTOCOL_DI_POS], |
olympux | 11:709f90a3b599 | 474 | //memcpy(&buffer[SENDING_PROTOCOL_D0_POS], |
olympux | 11:709f90a3b599 | 475 | //memcpy(&buffer[SENDING_PROTOCOL_AI0_POS], |
olympux | 11:709f90a3b599 | 476 | //memcpy(&buffer[SENDING_PROTOCOL_AI1_POS], |
olympux | 11:709f90a3b599 | 477 | //memcpy(&buffer[SENDING_PROTOCOL_AO0_POS], |
olympux | 11:709f90a3b599 | 478 | //memcpy(&buffer[SENDING_PROTOCOL_AO1_POS], |
olympux | 11:709f90a3b599 | 479 | buffer[SENDING_PROTOCOL_CR_POS] = 0x0D; |
olympux | 11:709f90a3b599 | 480 | buffer[SENDING_PROTOCOL_CR_POS+1] = '\0'; |
olympux | 11:709f90a3b599 | 481 | tcp_client.send_all(buffer, SENDING_PROTOCOL_LENGTH); |
olympux | 9:d2534ecf88c6 | 482 | } |
olympux | 9:d2534ecf88c6 | 483 | |
olympux | 9:d2534ecf88c6 | 484 | break; |
olympux | 9:d2534ecf88c6 | 485 | } |
olympux | 9:d2534ecf88c6 | 486 | default: |
olympux | 9:d2534ecf88c6 | 487 | break; |
olympux | 9:d2534ecf88c6 | 488 | } |
olympux | 9:d2534ecf88c6 | 489 | |
olympux | 4:568c97f2a407 | 490 | } // end loop if no data received within timeout |
olympux | 4:568c97f2a407 | 491 | tcp_client.close(); |
olympux | 4:568c97f2a407 | 492 | } // if client connected |
olympux | 4:568c97f2a407 | 493 | } // if no client connected |
olympux | 3:972ed747474c | 494 | #endif |
olympux | 3:972ed747474c | 495 | |
olympux | 9:d2534ecf88c6 | 496 | |
olympux | 9:d2534ecf88c6 | 497 | |
olympux | 9:d2534ecf88c6 | 498 | // ONLY FOR CONFIGRATION |
olympux | 9:d2534ecf88c6 | 499 | #ifdef UDP_SERVER |
olympux | 4:568c97f2a407 | 500 | // wait for udp packet within timeout |
olympux | 9:d2534ecf88c6 | 501 | n = udp_server.receiveFrom(ep_udp_client, buffer, sizeof(buffer)); |
olympux | 9:d2534ecf88c6 | 502 | if (n <= 0) continue; |
olympux | 3:972ed747474c | 503 | |
olympux | 9:d2534ecf88c6 | 504 | // got some data, test it |
olympux | 11:709f90a3b599 | 505 | printf("UDP received: %s\r\n", buffer); |
olympux | 11:709f90a3b599 | 506 | |
olympux | 9:d2534ecf88c6 | 507 | //// send to uart |
olympux | 7:d45bd480e90f | 508 | //buffer[n] = '\0'; |
olympux | 7:d45bd480e90f | 509 | //message.len = n; |
olympux | 7:d45bd480e90f | 510 | //message.msg = buffer; |
olympux | 7:d45bd480e90f | 511 | //uart_queue.put(&message); |
olympux | 9:d2534ecf88c6 | 512 | //// echo |
olympux | 11:709f90a3b599 | 513 | //printf("Received packet from: %s\r\n", client.get_address()); |
olympux | 7:d45bd480e90f | 514 | //udp_server.sendTo(ep_udp_client, buffer, n); |
olympux | 4:568c97f2a407 | 515 | |
olympux | 6:d054e394fba3 | 516 | // process received data |
olympux | 6:d054e394fba3 | 517 | switch (n) { |
olympux | 9:d2534ecf88c6 | 518 | // length = 6, a CONFIGURATION command (discovery command, TCP port, or UDP port) |
olympux | 9:d2534ecf88c6 | 519 | // Format: NNIODS, NNIOTP or NNIOUP |
olympux | 9:d2534ecf88c6 | 520 | case 6: |
olympux | 7:d45bd480e90f | 521 | // discovery command |
olympux | 9:d2534ecf88c6 | 522 | if (strstr(buffer, "NNIODS") != NULL) { |
olympux | 11:709f90a3b599 | 523 | udp_server.sendTo(ep_udp_client, str_ip_addr, strlen(str_ip_addr)); |
olympux | 10:4cd965d79de0 | 524 | } // NNIODS |
olympux | 7:d45bd480e90f | 525 | // ask for TCP server port |
olympux | 9:d2534ecf88c6 | 526 | else if (strstr(buffer, "NNIOTP") != NULL) { |
olympux | 7:d45bd480e90f | 527 | char port[5]; |
olympux | 7:d45bd480e90f | 528 | sprintf(port, "%5d", tcp_server_port); |
olympux | 7:d45bd480e90f | 529 | udp_server.sendTo(ep_udp_client, port, strlen(port)); |
olympux | 10:4cd965d79de0 | 530 | } // NNIOTP |
olympux | 7:d45bd480e90f | 531 | // ask for UDP server port |
olympux | 9:d2534ecf88c6 | 532 | else if (strstr(buffer, "NNIOUP") != NULL) { |
olympux | 7:d45bd480e90f | 533 | char port[5]; |
olympux | 7:d45bd480e90f | 534 | sprintf(port, "%5d", udp_server_port); |
olympux | 7:d45bd480e90f | 535 | udp_server.sendTo(ep_udp_client, port, strlen(port)); |
olympux | 10:4cd965d79de0 | 536 | } // NNIOUP |
olympux | 10:4cd965d79de0 | 537 | else if (strstr(buffer, "NNIOTM") != NULL) { |
olympux | 10:4cd965d79de0 | 538 | #ifdef NTP |
olympux | 10:4cd965d79de0 | 539 | char str_time[50]; |
olympux | 10:4cd965d79de0 | 540 | |
olympux | 11:709f90a3b599 | 541 | printf("Trying to update time...\r\n"); |
olympux | 10:4cd965d79de0 | 542 | if (ntp.setTime("0.pool.ntp.org") == 0) { |
olympux | 11:709f90a3b599 | 543 | printf("Set time successfully\r\n"); |
olympux | 10:4cd965d79de0 | 544 | time_t ctTime; |
olympux | 10:4cd965d79de0 | 545 | ctTime = time(NULL); |
olympux | 10:4cd965d79de0 | 546 | |
olympux | 11:709f90a3b599 | 547 | printf("Time is set to (UTC): %s\r\n", ctime(&ctTime)); |
olympux | 10:4cd965d79de0 | 548 | sprintf(str_time, "%s", ctime(&ctTime)); |
olympux | 10:4cd965d79de0 | 549 | udp_server.sendTo(ep_udp_client, str_time, strlen(str_time)); |
olympux | 10:4cd965d79de0 | 550 | } |
olympux | 10:4cd965d79de0 | 551 | else { |
olympux | 11:709f90a3b599 | 552 | printf("Error\r\n"); |
olympux | 10:4cd965d79de0 | 553 | sprintf(str_time, "ERR"); |
olympux | 10:4cd965d79de0 | 554 | udp_server.sendTo(ep_udp_client, str_time, strlen(str_time)); |
olympux | 10:4cd965d79de0 | 555 | } |
olympux | 10:4cd965d79de0 | 556 | #elif |
olympux | 11:709f90a3b599 | 557 | printf("NTP disabled\r\n"); |
olympux | 10:4cd965d79de0 | 558 | sprintf(str_time, "DIS"); |
olympux | 10:4cd965d79de0 | 559 | udp_server.sendTo(ep_udp_client, str_time, strlen(str_time)); |
olympux | 10:4cd965d79de0 | 560 | #endif |
olympux | 10:4cd965d79de0 | 561 | } // NNIOTM |
olympux | 10:4cd965d79de0 | 562 | |
olympux | 7:d45bd480e90f | 563 | break; |
olympux | 9:d2534ecf88c6 | 564 | // length = 19, SET NETWORK CONFIGURATION |
olympux | 9:d2534ecf88c6 | 565 | // Format: 4E 4E 49 4F C0 A8 00 78 FF FF FF 00 C0 A8 00 01 00 00 01 |
olympux | 9:d2534ecf88c6 | 566 | // (NNIO; IP: 192.168.0.120; Subnet: 255.255.255.0; GW: 192.168.0.1; MAC: 0 0 1) |
olympux | 9:d2534ecf88c6 | 567 | case 19:{ |
olympux | 9:d2534ecf88c6 | 568 | // check device id |
olympux | 9:d2534ecf88c6 | 569 | char* id = strstr(buffer, DEVICE_ID); |
olympux | 9:d2534ecf88c6 | 570 | if (id == NULL) |
olympux | 9:d2534ecf88c6 | 571 | break; |
olympux | 9:d2534ecf88c6 | 572 | else if ((id - buffer) > 0) |
olympux | 9:d2534ecf88c6 | 573 | break; |
olympux | 9:d2534ecf88c6 | 574 | |
olympux | 11:709f90a3b599 | 575 | printf("Received user configuration\r\n"); |
olympux | 9:d2534ecf88c6 | 576 | write_eeprom(&buffer[4]); // parameters from 3rd char, 15-bytes |
olympux | 6:d054e394fba3 | 577 | break; |
olympux | 9:d2534ecf88c6 | 578 | } |
olympux | 6:d054e394fba3 | 579 | default: |
olympux | 6:d054e394fba3 | 580 | break; |
olympux | 4:568c97f2a407 | 581 | } |
olympux | 3:972ed747474c | 582 | #endif |
olympux | 4:568c97f2a407 | 583 | } // network processor |
olympux | 11:709f90a3b599 | 584 | } |
olympux | 11:709f90a3b599 | 585 | |
olympux | 11:709f90a3b599 | 586 | void update_digital_outputs(void) { |
olympux | 11:709f90a3b599 | 587 | char dat = buffer[RECEIVING_PROTOCOL_DO_POS+0]; |
olympux | 11:709f90a3b599 | 588 | switch (dat) { |
olympux | 11:709f90a3b599 | 589 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 590 | dout0 = 1; |
olympux | 11:709f90a3b599 | 591 | break; |
olympux | 11:709f90a3b599 | 592 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 593 | dout0 = 0; |
olympux | 11:709f90a3b599 | 594 | break; |
olympux | 11:709f90a3b599 | 595 | default: |
olympux | 11:709f90a3b599 | 596 | break; |
olympux | 11:709f90a3b599 | 597 | } |
olympux | 11:709f90a3b599 | 598 | |
olympux | 11:709f90a3b599 | 599 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+1]; |
olympux | 11:709f90a3b599 | 600 | switch (dat) { |
olympux | 11:709f90a3b599 | 601 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 602 | dout1 = 1; |
olympux | 11:709f90a3b599 | 603 | break; |
olympux | 11:709f90a3b599 | 604 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 605 | dout1 = 0; |
olympux | 11:709f90a3b599 | 606 | break; |
olympux | 11:709f90a3b599 | 607 | default: |
olympux | 11:709f90a3b599 | 608 | break; |
olympux | 11:709f90a3b599 | 609 | } |
olympux | 11:709f90a3b599 | 610 | |
olympux | 11:709f90a3b599 | 611 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+2]; |
olympux | 11:709f90a3b599 | 612 | switch (dat) { |
olympux | 11:709f90a3b599 | 613 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 614 | dout2 = 1; |
olympux | 11:709f90a3b599 | 615 | break; |
olympux | 11:709f90a3b599 | 616 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 617 | dout2 = 0; |
olympux | 11:709f90a3b599 | 618 | break; |
olympux | 11:709f90a3b599 | 619 | default: |
olympux | 11:709f90a3b599 | 620 | break; |
olympux | 11:709f90a3b599 | 621 | } |
olympux | 11:709f90a3b599 | 622 | |
olympux | 11:709f90a3b599 | 623 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+3]; |
olympux | 11:709f90a3b599 | 624 | switch (dat) { |
olympux | 11:709f90a3b599 | 625 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 626 | dout3 = 1; |
olympux | 11:709f90a3b599 | 627 | break; |
olympux | 11:709f90a3b599 | 628 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 629 | dout3 = 0; |
olympux | 11:709f90a3b599 | 630 | break; |
olympux | 11:709f90a3b599 | 631 | default: |
olympux | 11:709f90a3b599 | 632 | break; |
olympux | 11:709f90a3b599 | 633 | } |
olympux | 11:709f90a3b599 | 634 | |
olympux | 11:709f90a3b599 | 635 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+4]; |
olympux | 11:709f90a3b599 | 636 | switch (dat) { |
olympux | 11:709f90a3b599 | 637 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 638 | dout1 = 4; |
olympux | 11:709f90a3b599 | 639 | break; |
olympux | 11:709f90a3b599 | 640 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 641 | dout1 = 4; |
olympux | 11:709f90a3b599 | 642 | break; |
olympux | 11:709f90a3b599 | 643 | default: |
olympux | 11:709f90a3b599 | 644 | break; |
olympux | 11:709f90a3b599 | 645 | } |
olympux | 11:709f90a3b599 | 646 | |
olympux | 11:709f90a3b599 | 647 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+5]; |
olympux | 11:709f90a3b599 | 648 | switch (dat) { |
olympux | 11:709f90a3b599 | 649 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 650 | dout5 = 1; |
olympux | 11:709f90a3b599 | 651 | break; |
olympux | 11:709f90a3b599 | 652 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 653 | dout5 = 0; |
olympux | 11:709f90a3b599 | 654 | break; |
olympux | 11:709f90a3b599 | 655 | default: |
olympux | 11:709f90a3b599 | 656 | break; |
olympux | 11:709f90a3b599 | 657 | } |
olympux | 11:709f90a3b599 | 658 | |
olympux | 11:709f90a3b599 | 659 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+6]; |
olympux | 11:709f90a3b599 | 660 | switch (dat) { |
olympux | 11:709f90a3b599 | 661 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 662 | dout6 = 1; |
olympux | 11:709f90a3b599 | 663 | break; |
olympux | 11:709f90a3b599 | 664 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 665 | dout6 = 0; |
olympux | 11:709f90a3b599 | 666 | break; |
olympux | 11:709f90a3b599 | 667 | default: |
olympux | 11:709f90a3b599 | 668 | break; |
olympux | 11:709f90a3b599 | 669 | } |
olympux | 11:709f90a3b599 | 670 | |
olympux | 11:709f90a3b599 | 671 | dat = buffer[RECEIVING_PROTOCOL_DO_POS+7]; |
olympux | 11:709f90a3b599 | 672 | switch (dat) { |
olympux | 11:709f90a3b599 | 673 | case DIGITAL_HIGH: |
olympux | 11:709f90a3b599 | 674 | dout7 = 1; |
olympux | 11:709f90a3b599 | 675 | break; |
olympux | 11:709f90a3b599 | 676 | case DIGITAL_LOW: |
olympux | 11:709f90a3b599 | 677 | dout7 = 0; |
olympux | 11:709f90a3b599 | 678 | break; |
olympux | 11:709f90a3b599 | 679 | default: |
olympux | 11:709f90a3b599 | 680 | break; |
olympux | 11:709f90a3b599 | 681 | } |
olympux | 4:568c97f2a407 | 682 | } |