Webserver only w/o any other functions, single thread. Running on STM32F013+W5500

Dependencies:   NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed

Fork of F103-Serial-to-Ethernet by Chau Vo

Committer:
olympux
Date:
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?

UserRevisionLine numberNew contents of line
olympux 0:c2eac797face 1 /*
olympux 0:c2eac797face 2 *
olympux 2:18f10e7209f4 3 * Alarm and Monitoring application
olympux 0:c2eac797face 4
olympux 0:c2eac797face 5 */
olympux 0:c2eac797face 6 #include "mbed.h"
olympux 6:d054e394fba3 7 //#include "eeprom.h"
olympux 0:c2eac797face 8 #include "EthernetInterface.h"
olympux 9:d2534ecf88c6 9 #include "NTPClient.h"
olympux 0:c2eac797face 10 #include "rtos.h"
olympux 0:c2eac797face 11
olympux 0:c2eac797face 12
olympux 2:18f10e7209f4 13 /*
olympux 2:18f10e7209f4 14 * Hardware defines
olympux 0:c2eac797face 15 */
olympux 2:18f10e7209f4 16 #define ST_NUCLEO // hardware pin mapping
olympux 0:c2eac797face 17
olympux 0:c2eac797face 18 #ifdef ST_NUCLEO
olympux 9:d2534ecf88c6 19 // Ethernet
olympux 0:c2eac797face 20 SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk
olympux 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 }