Update EEPROM content for new settings

Modify EEPROM content to reflect the possible settings
Add a buffer format function to query/write EEPROM instead of always
using string function to save space.
Update Reset/Print Configuration with new settings
Code Cleaning
Some settings stay default as no real add value currently to allow to
change them
This commit is contained in:
luc 2015-05-13 21:58:26 +08:00
parent e73b2e372d
commit 364e37f5ba
6 changed files with 161 additions and 97 deletions

View File

@ -20,8 +20,8 @@
#include "config.h"
#include <EEPROM.h>
//read a string or a unique byte/flag
//a flag is 1 byte, a string is multibyte + \0, this is won't work if 1 char is multibyte like chinese char
//read a string
//a string is multibyte + \0, this is won't work if 1 char is multibyte like chinese char
bool CONFIG::read_string(word pos, char byte_buffer[], word size_max)
{
//check if parameters are acceptable
@ -43,6 +43,22 @@ bool CONFIG::read_string(word pos, char byte_buffer[], word size_max)
if (b!=0)byte_buffer[i-1]=0x00;
return true;
}
//read a buffer of size_buffer
bool CONFIG::read_buffer(word pos, byte byte_buffer[], word size_buffer)
{
//check if parameters are acceptable
if (size_buffer==0 || pos+size_buffer > EEPROM_SIZE || byte_buffer== NULL)return false;
word i=0;
//read until max size is reached
while (i<size_buffer )
{
byte_buffer[i]=EEPROM.read(pos+i);
i++;
}
return true;
}
//read a flag / byte
bool CONFIG::read_byte(word pos, byte * value)
{
@ -68,6 +84,19 @@ bool CONFIG::write_string(word pos, const char * byte_buffer, word size_buffer)
return true;
}
//write a buffer
bool CONFIG::write_buffer(word pos, const byte * byte_buffer, word size_buffer)
{
//check if parameters are acceptable
if (size_buffer==0 || pos+size_buffer > EEPROM_SIZE || byte_buffer== NULL)return false;
//copy the value(s)
for (word i = 0; i < size_buffer; i++) {
EEPROM.write(pos + i, byte_buffer[i]);
}
EEPROM.commit();
return true;
}
//read a flag / byte
bool CONFIG::write_byte(word pos, const byte value)
{
@ -84,23 +113,35 @@ bool CONFIG::reset_config()
if(!CONFIG::write_string(EP_SSID,DEFAULT_SSID,strlen(DEFAULT_SSID)))return false;
if(!CONFIG::write_string(EP_PASSWORD,DEFAULT_PASSWORD,strlen(DEFAULT_PASSWORD)))return false;
if(!CONFIG::write_byte(EP_IP_MODE,DEFAULT_IP_MODE))return false;
if(!CONFIG::write_string(EP_IP_VALUE,DEFAULT_IP_VALUE,strlen(DEFAULT_IP_VALUE)))return false;
if(!CONFIG::write_string(EP_MASK_VALUE,DEFAULT_MASK_VALUE,strlen(DEFAULT_MASK_VALUE)))return false;
if(!CONFIG::write_string(EP_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,strlen(DEFAULT_GATEWAY_VALUE)))return false;
if(!CONFIG::write_string(EP_BAUD_RATE,DEFAULT_BAUD_RATE,strlen(DEFAULT_BAUD_RATE)))return false;
if(!CONFIG::write_buffer(EP_IP_VALUE,DEFAULT_IP_VALUE,IP_LENGH))return false;
if(!CONFIG::write_buffer(EP_MASK_VALUE,DEFAULT_MASK_VALUE,IP_LENGH))return false;
if(!CONFIG::write_buffer(EP_GATEWAY_VALUE,DEFAULT_GATEWAY_VALUE,IP_LENGH))return false;
if(!CONFIG::write_buffer(EP_BAUD_RATE,(const byte *)&DEFAULT_BAUD_RATE,BAUD_LENGH))return false;
if(!CONFIG::write_byte(EP_PHY_MODE,DEFAULT_PHY_MODE))return false;
if(!CONFIG::write_byte(EP_SLEEP_MODE,DEFAULT_SLEEP_MODE))return false;
if(!CONFIG::write_byte(EP_CHANNEL,DEFAULT_CHANNEL))return false;
if(!CONFIG::write_byte(EP_AUTH_TYPE,DEFAULT_AUTH_TYPE))return false;
if(!CONFIG::write_byte(EP_SSID_VISIBLE,DEFAULT_SSID_VISIBLE))return false;
return true;
}
void CONFIG::print_config()
{
char sbuf[70];
//use bigest size for buffer
char sbuf[MAX_PASSWORD_LENGH+1];
byte bbuf=0;
int ibuf=0;
if (CONFIG::read_byte(EP_WIFI_MODE, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGH))Serial.println(sbuf);
if (CONFIG::read_string(EP_PASSWORD, sbuf , MAX_PASSWORD_LENGH))Serial.println(sbuf);
if (CONFIG::read_byte(EP_IP_MODE, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_string(EP_IP_VALUE, sbuf , MAX_IP_LENGH))Serial.println(sbuf);
if (CONFIG::read_string(EP_MASK_VALUE, sbuf , MAX_IP_LENGH))Serial.println(sbuf);
if (CONFIG::read_string(EP_GATEWAY_VALUE, sbuf , MAX_IP_LENGH))Serial.println(sbuf);
if (CONFIG::read_string(EP_BAUD_RATE, sbuf , MAX_BAUD_LENGH))Serial.println(sbuf);
if (CONFIG::read_buffer(EP_IP_VALUE,(byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf));
if (CONFIG::read_buffer(EP_MASK_VALUE, (byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf));
if (CONFIG::read_buffer(EP_GATEWAY_VALUE, (byte *)sbuf , IP_LENGH))Serial.println(wifi_config.ip2str((byte *)sbuf));
if (CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&ibuf , BAUD_LENGH))Serial.println(ibuf);
if (CONFIG::read_byte(EP_PHY_MODE, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_byte(EP_SLEEP_MODE, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_byte(EP_CHANNEL, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_byte(EP_AUTH_TYPE, &bbuf ))Serial.println(byte(bbuf));
if (CONFIG::read_byte(EP_SSID_VISIBLE, &bbuf ))Serial.println(byte(bbuf));
}

View File

@ -18,15 +18,22 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
//comment to disable
#define MDNS_FEATURE
#ifndef CONFIG_h
#define CONFIG_h
#include <Arduino.h>
#include "wifi.h"
extern "C" {
#include "user_interface.h"
}
//version and sources location
#define FW_VERSION "V0.1"
#define REPOSITORY "https://github.com/luc-github/ESP8266"
#define MDNS_FEATURE 1
//pin used to reset setting
#define RESET_CONFIG_PIN 2
@ -43,36 +50,51 @@
#define EP_SSID 1 //33 bytes 32+1 = string ; warning does not support multibyte char like chinese
#define EP_PASSWORD 34 //65 bytes 64 +1 = string ;warning does not support multibyte char like chinese
#define EP_IP_MODE 99 //1 byte = flag
#define EP_IP_VALUE 100 //16 bytes xxx.xxx.xxx\0 = string
#define EP_MASK_VALUE 116 //16 bytes xxx.xxx.xxx\0 = string
#define EP_GATEWAY_VALUE 132 //16 bytes xxx.xxx.xxx\0 = string
#define EP_BAUD_RATE 151 //7 bytes = string (if integer value => save 4 bytes but need to create new integer function for eeprom that will take more than 4 bytes)
#define EP_IP_VALUE 100 //4 bytes xxx.xxx.xxx.xxx
#define EP_MASK_VALUE 104 //4 bytes xxx.xxx.xxx.xxx
#define EP_GATEWAY_VALUE 108 //4 bytes xxx.xxx.xxx.xxx
#define EP_BAUD_RATE 112 //4 bytes = int
#define EP_PHY_MODE 116 //1 byte = flag
#define EP_SLEEP_MODE 117 //1 byte = flag
#define EP_CHANNEL 118 //1 byte = flag
#define EP_AUTH_TYPE 119 //1 byte = flag
#define EP_SSID_VISIBLE 120 //1 byte = flag
//default values
#define DEFAULT_WIFI_MODE AP_MODE
const char DEFAULT_SSID [] PROGMEM = "ESP8266";
const char DEFAULT_PASSWORD [] PROGMEM = "12345678";
#define DEFAULT_IP_MODE STATIC_IP_MODE
const char DEFAULT_IP_VALUE[] PROGMEM = "192.168.0.1";
const char DEFAULT_MASK_VALUE[] PROGMEM = "255.255.255.0";
const byte DEFAULT_IP_VALUE[] PROGMEM = {192,168,0,1};
const byte DEFAULT_MASK_VALUE[] PROGMEM = {255,255,255,0};
#define DEFAULT_GATEWAY_VALUE DEFAULT_IP_VALUE
const char DEFAULT_BAUD_RATE[] PROGMEM = "9600";
#if MDNS_FEATURE
const int DEFAULT_BAUD_RATE = 9600;
#ifdef MDNS_FEATURE
const char LOCAL_NAME[] PROGMEM = "esp8266";
#endif
#define DEFAULT_PHY_MODE PHY_MODE_11G
#define DEFAULT_SLEEP_MODE MODEM_SLEEP_T
#define DEFAULT_CHANNEL 11
#define DEFAULT_AUTH_TYPE AUTH_WPA_PSK
#define DEFAULT_SSID_VISIBLE 1
#define DEFAULT_MAX_CONNECTIONS 4
#define DEFAULT_BEACON_INTERVAL 100
//sizes
#define EEPROM_SIZE 256 //max is 512
#define MAX_SSID_LENGH 32
#define MAX_PASSWORD_LENGH 64
#define MAX_IP_LENGH 17
#define MAX_BAUD_LENGH 6
#define IP_LENGH 4
#define BAUD_LENGH 4
class CONFIG
{
public:
static bool read_string(word pos, char byte_buffer[], word size_max);
static bool read_buffer(word pos, byte byte_buffer[], word size_buffer);
static bool read_byte(word pos, byte * value);
static bool write_string(word pos, const char * byte_buffer, word size_buffer);
static bool write_buffer(word pos, const byte * byte_buffer, word size_buffer);
static bool write_byte(word pos, const byte value);
static bool reset_config();
static void print_config();

View File

@ -37,7 +37,7 @@
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
#include <ESP8266mDNS.h>
#endif
extern "C" {
@ -53,15 +53,12 @@ void setup() {
pinMode(RESET_CONFIG_PIN, INPUT);
if (digitalRead(RESET_CONFIG_PIN)==0)breset_config=true;//if requested =>reset settings
//default baud rate
word baud_rate;
char sbuf[7];
int baud_rate=0;
//check if EEPROM has value
if ( CONFIG::read_string(EP_BAUD_RATE, sbuf , MAX_BAUD_LENGH))
if ( CONFIG::read_buffer(EP_BAUD_RATE, (byte *)&baud_rate , BAUD_LENGH))
{
word baud_tmp = atoi(sbuf);
//check if baud value is one of allowed ones
if (baud_tmp==9600 || baud_tmp==19200 ||baud_tmp==38400 ||baud_tmp==57600 ||baud_tmp==115200 ||baud_tmp==230400) baud_rate=baud_tmp;
else breset_config=true;//baud rate is incorrect =>reset settings
if ( ! (baud_rate==9600 || baud_rate==19200 ||baud_rate==38400 ||baud_rate==57600 ||baud_rate==115200 ||baud_rate==230400) )breset_config=true;//baud rate is incorrect =>reset settings
}
else breset_config=true;//cannot access to config settings=> reset settings
//reset is requested
@ -70,7 +67,7 @@ void setup() {
//update EEPROM with default settings
CONFIG::reset_config();
//use default baud rate
baud_rate=atol(DEFAULT_BAUD_RATE);
baud_rate=DEFAULT_BAUD_RATE;
}
//setup serial
Serial.begin(baud_rate);
@ -85,7 +82,7 @@ void setup() {
//main loop
void loop() {
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
// Check for any mDNS queries and send responses
wifi_config.mdns.update();
#endif
@ -93,6 +90,4 @@ wifi_config.mdns.update();
web_interface.WebServer.handleClient();
//TODO use a method to handle serial also in class and call it instead of this one
data_interface.WebServer.handleClient();
}

View File

@ -92,7 +92,7 @@ void handle_web_interface_root()
LABEL_UNITS(sbuf,F("CPU Frequency: "),system_get_cpu_freq(),F("Hz"))
LABEL_UNITS(sbuf,F("Free Memory: "),String(system_get_free_heap_size()),F(" octets"))
LABEL(sbuf,F("SDK Version: "),system_get_sdk_version())
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
sstatus = F("http://");
sstatus+=LOCAL_NAME;
LABEL_UNITS(sbuf,F("mDNS name: "),sstatus,F(".local"))

View File

@ -22,7 +22,7 @@
#include "config.h"
#include "ESP8266WiFi.h"
#include "IPAddress.h"
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
#include <ESP8266mDNS.h>
#endif
extern "C" {
@ -71,42 +71,54 @@ char * WIFI_CONFIG::ip2str(IPAddress Ip )
//Read configuration settings and apply them
bool WIFI_CONFIG::Setup()
{
byte bbuf;
char pwd[65];
char sbuf[35];
char pwd[MAX_PASSWORD_LENGH+1];
char sbuf[MAX_SSID_LENGH+1];
int wstatus;
byte ip[4]={0,0,0,0};
IPAddress currentIP;
byte bflag=0;
//AP or client ?
if (!CONFIG::read_byte(EP_WIFI_MODE, &bbuf ) || !CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGH) ||!CONFIG::read_string(EP_PASSWORD, pwd , MAX_PASSWORD_LENGH)) return false;
if (!CONFIG::read_byte(EP_WIFI_MODE, &bflag ) || !CONFIG::read_string(EP_SSID, sbuf , MAX_SSID_LENGH) ||!CONFIG::read_string(EP_PASSWORD, pwd , MAX_PASSWORD_LENGH)) return false;
//disconnect if connected
WiFi.disconnect();
bbuf=AP_MODE;
//this is AP mode
if (bbuf==AP_MODE)
if (bflag==AP_MODE)
{
//setup Soft AP
WiFi.mode(WIFI_AP);
WiFi.softAP(sbuf, pwd);
//setup PHY_MODE
if (!CONFIG::read_byte(EP_PHY_MODE, &bflag ))return false;
wifi_set_phy_mode((phy_mode)bflag);
//get current config
struct softap_config apconfig;
wifi_softap_get_config(&apconfig);
apconfig.channel=11;
//apconfig.authmode=AUTH_OPEN;
apconfig.ssid_hidden=0;
apconfig.max_connection=4;
apconfig.beacon_interval=100;
wifi_set_phy_mode(PHY_MODE_11G);
//set the chanel
if (!CONFIG::read_byte(EP_CHANNEL, &bflag ))return false;
apconfig.channel=bflag;
//set Authentification type
if (!CONFIG::read_byte(EP_AUTH_TYPE, &bflag ))return false;
apconfig.authmode=(AUTH_MODE)bflag;
//set the visibility of SSID
if (!CONFIG::read_byte(EP_SSID_VISIBLE, &bflag ))return false;
apconfig.ssid_hidden=!bflag;
//no need to add these settings to configuration just use default ones
apconfig.max_connection=DEFAULT_MAX_CONNECTIONS;
apconfig.beacon_interval=DEFAULT_BEACON_INTERVAL;
//apply settings to current and to default
if (!wifi_softap_set_config(&apconfig))Serial.println(F("Error Wifi AP"));
if (!wifi_softap_set_config_current(&apconfig))Serial.println(F("Error Wifi AP"));
wifi_softap_dhcps_start();
wifi_set_phy_mode(PHY_MODE_11G);
}
else
{
{//setup station mode
WiFi.mode(WIFI_STA);
WiFi.begin(sbuf, pwd);
//setup PHY_MODE
if (!CONFIG::read_byte(EP_PHY_MODE, &bflag ))return false;
wifi_set_phy_mode((phy_mode)bflag);
byte i=0;
//try to connect
while (WiFi.status() != WL_CONNECTED && i<40) {
delay(500);
Serial.println(WiFi.status());
@ -114,29 +126,23 @@ bool WIFI_CONFIG::Setup()
}
}
//DHCP or Static IP ?
if (!CONFIG::read_byte(EP_IP_MODE, &bbuf )) return false;
if (bbuf==STATIC_IP_MODE)
if (!CONFIG::read_byte(EP_IP_MODE, &bflag )) return false;
if (bflag==STATIC_IP_MODE)
{
//get the IP
if (!CONFIG::read_string(EP_IP_VALUE, sbuf , MAX_IP_LENGH))return false;
//split in 4 parts
split_ip (sbuf,ip);
IPAddress local_ip (ip[0],ip[1],ip[2],ip[3]);
if (!CONFIG::read_buffer(EP_IP_VALUE,(byte *)sbuf , IP_LENGH))return false;
IPAddress local_ip (sbuf[0],sbuf[1],sbuf[2],sbuf[3]);
//get the gateway
if (!CONFIG::read_string(EP_GATEWAY_VALUE, sbuf , MAX_IP_LENGH))return false;
//split in 4 parts
split_ip (sbuf,ip);
IPAddress gateway (ip[0],ip[1],ip[2],ip[3]);
if (!CONFIG::read_buffer(EP_GATEWAY_VALUE,(byte *)sbuf , IP_LENGH))return false;
IPAddress gateway (sbuf[0],sbuf[1],sbuf[2],sbuf[3]);
//get the mask
if (!CONFIG::read_string(EP_MASK_VALUE, sbuf , MAX_IP_LENGH))return false;
//split in 4 parts
split_ip (sbuf,ip);
IPAddress subnet (ip[0],ip[1],ip[2],ip[3]);
if (!CONFIG::read_buffer(EP_MASK_VALUE,(byte *)sbuf , IP_LENGH))return false;
IPAddress subnet (sbuf[0],sbuf[1],sbuf[2],sbuf[3]);
//apply according active wifi mode
if (wifi_get_opmode()==WIFI_AP || wifi_get_opmode()==WIFI_AP_STA) WiFi.softAPConfig( local_ip, gateway, subnet);
else WiFi.config( local_ip, gateway, subnet);
}
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
//Get IP
if (wifi_get_opmode()==WIFI_STA)currentIP=WiFi.localIP();
else currentIP=WiFi.softAPIP();
@ -150,7 +156,6 @@ bool WIFI_CONFIG::Setup()
Serial.println(F("Error setting up MDNS responder!"));
}
#endif
CONFIG::print_config();
return true;
}

View File

@ -24,7 +24,8 @@
#include "config.h"
#include "IPAddress.h"
#include <ESP8266WiFi.h>
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
#include <ESP8266mDNS.h>
#endif
@ -32,7 +33,7 @@ class WIFI_CONFIG
{
public:
// multicast DNS responder feature
#if MDNS_FEATURE
#ifdef MDNS_FEATURE
MDNSResponder mdns;
#endif
bool Setup();