Chau Vo / device_configuration

Dependents:   F103-Web-Server

Fork of my_eeprom_funcs by Chau Vo

Committer:
olympux
Date:
Sat Jan 10 16:13:11 2015 +0000
Revision:
10:f37acffddef9
Parent:
9:b5fbb35bbc02
Child:
11:250b05a5266d
Update API documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olympux 1:6bdc99dd8e0a 1 #include "mbed.h"
olympux 1:6bdc99dd8e0a 2 #include "my_eeprom_funcs.h"
olympux 1:6bdc99dd8e0a 3
olympux 1:6bdc99dd8e0a 4
olympux 10:f37acffddef9 5 /*!
olympux 10:f37acffddef9 6 * Debug option
olympux 10:f37acffddef9 7 */
olympux 4:944a4646b825 8 #if 1
olympux 4:944a4646b825 9 //Enable debug
olympux 4:944a4646b825 10 #include <cstdio>
olympux 4:944a4646b825 11 #define DBG(x, ...) std::printf("[eeprom : DBG]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 12 #define WARN(x, ...) std::printf("[eeprom : WARN]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 13 #define ERR(x, ...) std::printf("[eeprom : ERR]"x"\r\n", ##__VA_ARGS__);
olympux 4:944a4646b825 14
olympux 4:944a4646b825 15 #else
olympux 4:944a4646b825 16 //Disable debug
olympux 4:944a4646b825 17 #define DBG(x, ...)
olympux 4:944a4646b825 18 #define WARN(x, ...)
olympux 4:944a4646b825 19 #define ERR(x, ...)
olympux 4:944a4646b825 20
olympux 4:944a4646b825 21 #endif
olympux 4:944a4646b825 22
olympux 4:944a4646b825 23
olympux 10:f37acffddef9 24 /*!
olympux 10:f37acffddef9 25 * Function to write module network configuration
olympux 10:f37acffddef9 26 * @param <char *buf> configuration buffer
olympux 10:f37acffddef9 27 * @note 4-byte IP address
olympux 10:f37acffddef9 28 * @note 4-byte subnet
olympux 10:f37acffddef9 29 * @note 4-byte gateway
olympux 10:f37acffddef9 30 * @note 3-byte MAC
olympux 10:f37acffddef9 31 */
olympux 1:6bdc99dd8e0a 32 void write_eeprom_network(char *buf) {
olympux 1:6bdc99dd8e0a 33 // Write network configuration
olympux 1:6bdc99dd8e0a 34 // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
olympux 1:6bdc99dd8e0a 35
olympux 5:eea03d0eb95a 36 DBG("Saving network configuration for this device...");
olympux 1:6bdc99dd8e0a 37
olympux 1:6bdc99dd8e0a 38 // Unlock the Flash Program Erase controller */
olympux 1:6bdc99dd8e0a 39 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 40 // EEPROM Init
olympux 1:6bdc99dd8e0a 41 EE_Init();
olympux 6:241d1539914a 42
olympux 6:241d1539914a 43 // erase first_run flag
olympux 8:4fc4b1b5509b 44 EE_WriteVariable(VirtAddVarTab[CONFIGURED_IP_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 6:241d1539914a 45
olympux 1:6bdc99dd8e0a 46 // IP address
olympux 1:6bdc99dd8e0a 47 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 48 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 49 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 50 EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 51
olympux 1:6bdc99dd8e0a 52 // IP subnet
olympux 1:6bdc99dd8e0a 53 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 54 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 55 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 56 EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 57
olympux 1:6bdc99dd8e0a 58 // IP gateway
olympux 1:6bdc99dd8e0a 59 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 60 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 61 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 62 EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 63
olympux 1:6bdc99dd8e0a 64 //// TCP server port, not used
olympux 1:6bdc99dd8e0a 65 //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 66 //// UDP server port, not used
olympux 1:6bdc99dd8e0a 67 //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], *buf++);
olympux 1:6bdc99dd8e0a 68
olympux 1:6bdc99dd8e0a 69 // MAC address
olympux 1:6bdc99dd8e0a 70 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 71 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 72 EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 73 FLASH_Lock();
olympux 1:6bdc99dd8e0a 74
olympux 6:241d1539914a 75 DBG("Successful");
olympux 1:6bdc99dd8e0a 76 }
olympux 1:6bdc99dd8e0a 77
olympux 10:f37acffddef9 78 /*!
olympux 10:f37acffddef9 79 * Function to load module network configuration
olympux 10:f37acffddef9 80 */
olympux 1:6bdc99dd8e0a 81 void load_eeprom_network(void) {
olympux 1:6bdc99dd8e0a 82 mbed_mac_address((char *)u8mac);
olympux 1:6bdc99dd8e0a 83
olympux 5:eea03d0eb95a 84 DBG("Loading network configuration...");
olympux 1:6bdc99dd8e0a 85
olympux 1:6bdc99dd8e0a 86 EE_Init();
olympux 1:6bdc99dd8e0a 87
olympux 1:6bdc99dd8e0a 88 // check if 1st run
olympux 8:4fc4b1b5509b 89 EE_ReadVariable(VirtAddVarTab[CONFIGURED_IP_FLAG_POS], &configured_ip);
olympux 1:6bdc99dd8e0a 90 // if not first run, load network config
olympux 8:4fc4b1b5509b 91 if (configured_ip == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 5:eea03d0eb95a 92 DBG("User settings");
olympux 1:6bdc99dd8e0a 93
olympux 1:6bdc99dd8e0a 94 // IP address
olympux 1:6bdc99dd8e0a 95 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
olympux 1:6bdc99dd8e0a 96 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
olympux 1:6bdc99dd8e0a 97 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
olympux 1:6bdc99dd8e0a 98 EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
olympux 1:6bdc99dd8e0a 99 u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 100 u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 101 u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 102 u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 103
olympux 1:6bdc99dd8e0a 104 // IP subnet
olympux 1:6bdc99dd8e0a 105 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
olympux 1:6bdc99dd8e0a 106 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
olympux 1:6bdc99dd8e0a 107 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
olympux 1:6bdc99dd8e0a 108 EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
olympux 1:6bdc99dd8e0a 109
olympux 1:6bdc99dd8e0a 110 // IP gateway
olympux 1:6bdc99dd8e0a 111 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
olympux 1:6bdc99dd8e0a 112 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
olympux 1:6bdc99dd8e0a 113 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
olympux 1:6bdc99dd8e0a 114 EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
olympux 1:6bdc99dd8e0a 115
olympux 1:6bdc99dd8e0a 116 //// TCP server port
olympux 2:57d40eaa1b1b 117 //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], &tcp_server_local_port);
olympux 1:6bdc99dd8e0a 118 //// UDP server port
olympux 2:57d40eaa1b1b 119 //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_local_port);
olympux 1:6bdc99dd8e0a 120
olympux 1:6bdc99dd8e0a 121 // MAC address
olympux 1:6bdc99dd8e0a 122 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
olympux 1:6bdc99dd8e0a 123 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
olympux 1:6bdc99dd8e0a 124 EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
olympux 1:6bdc99dd8e0a 125 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 126 u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 127 u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 128 u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 129 //FLASH_Lock();
olympux 1:6bdc99dd8e0a 130
olympux 1:6bdc99dd8e0a 131 sprintf(str_ip_addr, "%d.%d.%d.%d", u8ip_addr[0], u8ip_addr[1], u8ip_addr[2], u8ip_addr[3]);
olympux 1:6bdc99dd8e0a 132 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 1:6bdc99dd8e0a 133 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 1:6bdc99dd8e0a 134 }
olympux 8:4fc4b1b5509b 135 // if ip is not configured, use default addresses
olympux 1:6bdc99dd8e0a 136 else {
olympux 5:eea03d0eb95a 137 DBG("No user settings, load defaults");
olympux 1:6bdc99dd8e0a 138 u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
olympux 1:6bdc99dd8e0a 139 u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5;
olympux 1:6bdc99dd8e0a 140 sprintf(str_ip_addr, DEFAULT_IP_ADDRESS);
olympux 1:6bdc99dd8e0a 141 sprintf(str_ip_subnet, DEFAULT_IP_SUBNET);
olympux 1:6bdc99dd8e0a 142 sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY);
olympux 1:6bdc99dd8e0a 143 }
olympux 1:6bdc99dd8e0a 144
olympux 6:241d1539914a 145 DBG("Successful");
olympux 5:eea03d0eb95a 146 DBG("IP: %s", str_ip_addr);
olympux 5:eea03d0eb95a 147 DBG("MASK: %s", str_ip_subnet);
olympux 5:eea03d0eb95a 148 DBG("GW: %s", str_ip_gateway);
olympux 5:eea03d0eb95a 149 DBG("TCP server local port: %d", tcp_server_local_port);
olympux 5:eea03d0eb95a 150 DBG("UDP server local port: %d", udp_server_local_port);
olympux 1:6bdc99dd8e0a 151 }
olympux 1:6bdc99dd8e0a 152
olympux 1:6bdc99dd8e0a 153
olympux 10:f37acffddef9 154 /*!
olympux 10:f37acffddef9 155 * Function to write settings of remote TCP server. It is only used when this device in TCP client mode.
olympux 10:f37acffddef9 156 * When enabled, this device will periodically transmit data to TCP server.
olympux 10:f37acffddef9 157 * @param <char* buf> buffer as following
olympux 10:f37acffddef9 158 * 1-byte Auto transmit flag: 'Y'
olympux 10:f37acffddef9 159 * 1-byte Auto transmit period: in seconds
olympux 10:f37acffddef9 160 * 4-byte TCP server IP address
olympux 10:f37acffddef9 161 * 2-byte TCP server port (LSB MSB)
olympux 10:f37acffddef9 162 */
olympux 1:6bdc99dd8e0a 163 void write_eeprom_tcpserver(char* buf) {
olympux 1:6bdc99dd8e0a 164 // Write network configuration
olympux 2:57d40eaa1b1b 165 // 1-byte Auto transmit flag + 1-byte Auto transmit period + 4-byte TCP server IP address + 2-byte TCP server port (LSB msb)
olympux 1:6bdc99dd8e0a 166
olympux 6:241d1539914a 167 DBG("Saving TCP server settings...");
olympux 1:6bdc99dd8e0a 168
olympux 1:6bdc99dd8e0a 169 // Unlock the Flash Program Erase controller
olympux 1:6bdc99dd8e0a 170 FLASH_Unlock();
olympux 1:6bdc99dd8e0a 171 // EEPROM Init
olympux 1:6bdc99dd8e0a 172 EE_Init();
olympux 1:6bdc99dd8e0a 173
olympux 6:241d1539914a 174 // Auto transmit flag
olympux 5:eea03d0eb95a 175 if (*buf == 'Y') {
olympux 6:241d1539914a 176 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_ENABLE_FLAG_VALUE);
olympux 5:eea03d0eb95a 177 }
olympux 5:eea03d0eb95a 178 else {
olympux 6:241d1539914a 179 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], DEFAULT_DISABLE_FLAG_VALUE);
olympux 5:eea03d0eb95a 180 }
olympux 3:69e1c4ed69e1 181 buf++;
olympux 6:241d1539914a 182 // Auto transmit period
olympux 1:6bdc99dd8e0a 183 EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], *buf++);
olympux 1:6bdc99dd8e0a 184 // IP address
olympux 1:6bdc99dd8e0a 185 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], *buf++);
olympux 1:6bdc99dd8e0a 186 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], *buf++);
olympux 1:6bdc99dd8e0a 187 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], *buf++);
olympux 1:6bdc99dd8e0a 188 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], *buf++);
olympux 1:6bdc99dd8e0a 189 // TCP server port
olympux 2:57d40eaa1b1b 190 uint16_t port;
olympux 2:57d40eaa1b1b 191 memcpy(&port, buf, 2);
olympux 2:57d40eaa1b1b 192 EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], port);
olympux 1:6bdc99dd8e0a 193
olympux 1:6bdc99dd8e0a 194 FLASH_Lock();
olympux 1:6bdc99dd8e0a 195
olympux 6:241d1539914a 196 DBG("Successful");
olympux 1:6bdc99dd8e0a 197 }
olympux 1:6bdc99dd8e0a 198
olympux 10:f37acffddef9 199 /*!
olympux 10:f37acffddef9 200 * Function to load remote TCP server configuration
olympux 10:f37acffddef9 201 */
olympux 1:6bdc99dd8e0a 202 void load_eeprom_tcpserver(void) {
olympux 5:eea03d0eb95a 203 DBG("Checking auto update mode...");
olympux 1:6bdc99dd8e0a 204
olympux 1:6bdc99dd8e0a 205 EE_Init();
olympux 1:6bdc99dd8e0a 206
olympux 1:6bdc99dd8e0a 207 // check if 1st run
olympux 1:6bdc99dd8e0a 208 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], &auto_transmit_flag);
olympux 1:6bdc99dd8e0a 209 // if not auto transmit, exit
olympux 6:241d1539914a 210 if (auto_transmit_flag == DEFAULT_ENABLE_FLAG_VALUE) {
olympux 1:6bdc99dd8e0a 211 // Time period for transmitting to server
olympux 1:6bdc99dd8e0a 212 EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], &transmit_time_period);
olympux 6:241d1539914a 213 // TCP server/client enable flags, not in used
olympux 10:f37acffddef9 214 EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_CLIENT], &u16enable_tcp_client);
olympux 10:f37acffddef9 215 EE_ReadVariable(VirtAddVarTab[ENABLE_TCP_SERVER], &u16enable_tcp_server);
olympux 1:6bdc99dd8e0a 216 // IP address
olympux 1:6bdc99dd8e0a 217 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], &u16server_ip_addr[0]);
olympux 1:6bdc99dd8e0a 218 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], &u16server_ip_addr[1]);
olympux 1:6bdc99dd8e0a 219 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], &u16server_ip_addr[2]);
olympux 1:6bdc99dd8e0a 220 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], &u16server_ip_addr[3]);
olympux 1:6bdc99dd8e0a 221 u8server_ip_addr[0] = (uint8_t)(u16server_ip_addr[0] & 0x00FF);
olympux 1:6bdc99dd8e0a 222 u8server_ip_addr[1] = (uint8_t)(u16server_ip_addr[1] & 0x00FF);
olympux 1:6bdc99dd8e0a 223 u8server_ip_addr[2] = (uint8_t)(u16server_ip_addr[2] & 0x00FF);
olympux 1:6bdc99dd8e0a 224 u8server_ip_addr[3] = (uint8_t)(u16server_ip_addr[3] & 0x00FF);
olympux 1:6bdc99dd8e0a 225 // TCP server port
olympux 1:6bdc99dd8e0a 226 EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &u16tcp_server_port);
olympux 1:6bdc99dd8e0a 227
olympux 1:6bdc99dd8e0a 228 sprintf(str_server_ip_addr, "%d.%d.%d.%d", u8server_ip_addr[0], u8server_ip_addr[1], u8server_ip_addr[2], u8server_ip_addr[3]);
olympux 6:241d1539914a 229 DBG("Enabled auto update, module is a TCP client");
olympux 5:eea03d0eb95a 230 DBG("Update every %ds to TCP server %s on port %d", transmit_time_period, str_server_ip_addr, u16tcp_server_port);
olympux 1:6bdc99dd8e0a 231 }
olympux 1:6bdc99dd8e0a 232 // if 1st run, use default addresses
olympux 1:6bdc99dd8e0a 233 else {
olympux 9:b5fbb35bbc02 234 DBG("No auto update using TCP client");
olympux 1:6bdc99dd8e0a 235 }
olympux 1:6bdc99dd8e0a 236 }