Used with eeprom_flash to write network configuration to STM32F103 flash

Dependents:   F103-Web-Server

Fork of my_eeprom_funcs by Chau Vo

my_eeprom_funcs.cpp

Committer:
olympux
Date:
2014-09-30
Revision:
2:57d40eaa1b1b
Parent:
1:6bdc99dd8e0a
Child:
3:69e1c4ed69e1

File content as of revision 2:57d40eaa1b1b:

#include "mbed.h"
#include "my_eeprom_funcs.h"


/*
* EEPROM functions
*/
void write_eeprom_network(char *buf) {
    // Write network configuration
    // 4-byte IP address + 4-byte subnet + 4-byte gateway + 3-byte MAC
    
    printf("Saving network configuration for this device...\r\n");
    
    // Unlock the Flash Program Erase controller */
    FLASH_Unlock();
    // EEPROM Init
    EE_Init();
    // IP address
    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+0], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+1], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+2], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_ADDRESS_POS+3], *buf++);
    
    // IP subnet
    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+0], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+1], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+2], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_SUBNET_POS+3], *buf++);
    
    // IP gateway
    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+0], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+1], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+2], *buf++);
    EE_WriteVariable(VirtAddVarTab[IP_GATEWAY_POS+3], *buf++);
    
    //// TCP server port, not used
    //EE_WriteVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], *buf++);
    //// UDP server port, not used
    //EE_WriteVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], *buf++);
    
    // erase first_run flag
    EE_WriteVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], 0xA5A5);
    
    // MAC address
    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], *buf++);
    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], *buf++);
    EE_WriteVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], *buf++);
    FLASH_Lock();
    
    printf("Success\r\n");
}

void load_eeprom_network(void) {
    mbed_mac_address((char *)u8mac);
    
    printf("Loading network configuration...\r\n");
    
    EE_Init();
    
    // check if 1st run
    EE_ReadVariable(VirtAddVarTab[FIRST_RUN_FLAG_POS], &first_run);
    // if not first run, load network config
    if (first_run == 0xA5A5) {
        printf("User settings\r\n");
        
        // IP address
        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+0], &u16ip_addr[0]);
        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+1], &u16ip_addr[1]);
        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+2], &u16ip_addr[2]);
        EE_ReadVariable(VirtAddVarTab[IP_ADDRESS_POS+3], &u16ip_addr[3]);
        u8ip_addr[0] = (uint8_t)(u16ip_addr[0] & 0x00FF);
        u8ip_addr[1] = (uint8_t)(u16ip_addr[1] & 0x00FF);
        u8ip_addr[2] = (uint8_t)(u16ip_addr[2] & 0x00FF);
        u8ip_addr[3] = (uint8_t)(u16ip_addr[3] & 0x00FF);
        
        // IP subnet
        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+0], &u16ip_subnet[0]);
        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+1], &u16ip_subnet[1]);
        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+2], &u16ip_subnet[2]);
        EE_ReadVariable(VirtAddVarTab[IP_SUBNET_POS+3], &u16ip_subnet[3]);
        
        // IP gateway
        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+0], &u16ip_gateway[0]);
        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+1], &u16ip_gateway[1]);
        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+2], &u16ip_gateway[2]);
        EE_ReadVariable(VirtAddVarTab[IP_GATEWAY_POS+3], &u16ip_gateway[3]);
        
        //// TCP server port
        //EE_ReadVariable(VirtAddVarTab[TCP_SERVER_LOCAL_PORT_POS], &tcp_server_local_port);
        //// UDP server port
        //EE_ReadVariable(VirtAddVarTab[UDP_SERVER_LOCAL_PORT_POS], &udp_server_local_port);
        
        // First run flag, already read above

        // MAC address
        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+0], &u16mac_addr[0]);
        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+1], &u16mac_addr[1]);
        EE_ReadVariable(VirtAddVarTab[MAC_ADDRESS_POS+2], &u16mac_addr[2]);
        u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
        u8mac[3] = (uint8_t)(u16mac_addr[0] & 0x00FF);
        u8mac[4] = (uint8_t)(u16mac_addr[1] & 0x00FF);
        u8mac[5] = (uint8_t)(u16mac_addr[2] & 0x00FF);
        //FLASH_Lock();
        
        sprintf(str_ip_addr, "%d.%d.%d.%d", u8ip_addr[0], u8ip_addr[1], u8ip_addr[2], u8ip_addr[3]);
        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]);
        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]);
    }
    // if 1st run, use default addresses
    else {
        printf("No user settings, load defaults\r\n");
        u8mac[0] = DEFAULT_MAC0; u8mac[1] = DEFAULT_MAC1; u8mac[2] = DEFAULT_MAC2;
        u8mac[3] = DEFAULT_MAC3; u8mac[4] = DEFAULT_MAC4; u8mac[5] = DEFAULT_MAC5; 
        sprintf(str_ip_addr, DEFAULT_IP_ADDRESS);
        sprintf(str_ip_subnet, DEFAULT_IP_SUBNET);
        sprintf(str_ip_gateway, DEFAULT_IP_GATEWAY);
    }
    
    printf("Success\r\n");
    printf("IP: %s\r\n", str_ip_addr);
    printf("MASK: %s\r\n", str_ip_subnet);
    printf("GW: %s\r\n", str_ip_gateway);
    printf("TCP server local port: %d\r\n", tcp_server_local_port);
    printf("UDP server local port: %d\r\n", udp_server_local_port);
}


/*
* TCP server info, only when this device in TCP client mode
* This device auto transmits data to TCP server
*/
void write_eeprom_tcpserver(char* buf) {
    // Write network configuration
    // 1-byte Auto transmit flag + 1-byte Auto transmit period + 4-byte TCP server IP address + 2-byte TCP server port (LSB msb)
    
    printf("Saving TCP server info\r\n");
    
    // Unlock the Flash Program Erase controller
    FLASH_Unlock();
    // EEPROM Init
    EE_Init();
    
    // Auto transmit
    EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], *buf++);
    EE_WriteVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], *buf++);
    // IP address
    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], *buf++);
    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], *buf++);
    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], *buf++);
    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], *buf++);
    // TCP server port
    uint16_t port;
    memcpy(&port, buf, 2);
    EE_WriteVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], port);
    
    FLASH_Lock();
    
    printf("Success\r\n");
}

void load_eeprom_tcpserver(void) {
    printf("Loading tcp server info...\r\n");
    
    EE_Init();
    
    // check if 1st run
    EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_FLAG_POS], &auto_transmit_flag);
    // if not auto transmit, exit
    if (auto_transmit_flag == 0xA5) {
        // Time period for transmitting to server
        EE_ReadVariable(VirtAddVarTab[AUTO_TRANSMIT_TIME_PERIOD_POS], &transmit_time_period);
        // IP address
        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+0], &u16server_ip_addr[0]);
        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+1], &u16server_ip_addr[1]);
        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+2], &u16server_ip_addr[2]);
        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_IP_ADDR_POS+3], &u16server_ip_addr[3]);
        u8server_ip_addr[0] = (uint8_t)(u16server_ip_addr[0] & 0x00FF);
        u8server_ip_addr[1] = (uint8_t)(u16server_ip_addr[1] & 0x00FF);
        u8server_ip_addr[2] = (uint8_t)(u16server_ip_addr[2] & 0x00FF);
        u8server_ip_addr[3] = (uint8_t)(u16server_ip_addr[3] & 0x00FF);
        
        // TCP server port
        EE_ReadVariable(VirtAddVarTab[TCP_SERVER_PORT_POS], &u16tcp_server_port);
        
        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]);
    }
    // if 1st run, use default addresses
    else {
        printf("No tcp server required\r\n");
    }
    
    printf("Update every %ds to TCP server %s on port %d\r\n", transmit_time_period, str_server_ip_addr, u16tcp_server_port);
}