/* Copyright (C) 2016 Buxtronix and Alexander Pruss
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#include
#ifndef SETTINGS_H
#define SETTINGS_H
#define EEPROM_WIFI_SIZE 512
#define EEPROM_MAGIC "NtPc"
#define EEPROM_MAGIC_OFFSET 0
#define EEPROM_MAGIC_LENGTH 4
#define EEPROM_SSID_OFFSET EEPROM_MAGIC_OFFSET + EEPROM_MAGIC_LENGTH
#define EEPROM_SSID_LENGTH 32
#define EEPROM_PSK_OFFSET EEPROM_SSID_OFFSET + EEPROM_SSID_LENGTH
#define EEPROM_PSK_LENGTH 64
#define EEPROM_TZ_OFFSET EEPROM_PSK_OFFSET + EEPROM_PSK_LENGTH
#define EEPROM_TZ_LENGTH 2
#define EEPROM_USDST_OFFSET EEPROM_TZ_OFFSET + EEPROM_TZ_LENGTH
#define EEPROM_USDST_LENGTH 1
#define EEPROM_TIMESERVER_OFFSET EEPROM_USDST_OFFSET + EEPROM_USDST_LENGTH
#define EEPROM_TIMESERVER_LENGTH 32
#define EEPROM_INTERVAL_OFFSET EEPROM_TIMESERVER_OFFSET + EEPROM_TIMESERVER_LENGTH
#define EEPROM_INTERVAL_LENGTH 2
#define EEPROM_NAME_OFFSET EEPROM_INTERVAL_OFFSET + EEPROM_INTERVAL_LENGTH
#define EEPROM_NAME_LENGTH 32
#define DEFAULT_TIMESERVER "time.nist.gov"
#define MINIMUM_INTERVAL 60
#define DEFAULT_INTERVAL (60*60)
#define DEFAULT_TIMEZONE 360
#define SSID_LENGTH EEPROM_SSID_LENGTH
#define PSK_LENGTH EEPROM_PSK_LENGTH
//#include "c:/users/alexander/Documents/Arduino/private-default.h"
char my_default_ssid[SSID_LENGTH] = "";
char my_default_psk[PSK_LENGTH] = "";
#define CLOCK_NAME "ESP-TEMP"
#define WIFI_AP_NAME CLOCK_NAME
class Settings {
public:
Settings() {};
void Load() {
char buffer[EEPROM_WIFI_SIZE];
EEPROM.begin(EEPROM_WIFI_SIZE);
for (int i = 0 ; i < EEPROM_WIFI_SIZE ; i++) {
buffer[i] = EEPROM.read(i);
}
EEPROM.end();
// Verify magic;
String magic;
for (int i = EEPROM_MAGIC_OFFSET ; i < EEPROM_MAGIC_OFFSET+EEPROM_MAGIC_LENGTH ; i++) {
magic += buffer[i];
}
if (magic != EEPROM_MAGIC) {
interval = DEFAULT_INTERVAL;
timezone = 360;
strcpy(timeserver, DEFAULT_TIMESERVER);
usdst = 1;
ssid = String(my_default_ssid);
psk = String(my_default_psk);
return;
}
// Read SSID
ssid = "";
for (int i = EEPROM_SSID_OFFSET ; i < EEPROM_SSID_OFFSET+EEPROM_SSID_LENGTH ; i++) {
if (buffer[i]) ssid += buffer[i];
}
// Read PSK
psk = "";
for (int i = EEPROM_PSK_OFFSET ; i < EEPROM_PSK_OFFSET+EEPROM_PSK_LENGTH ; i++) {
if (buffer[i]) psk += buffer[i];
}
timezone = int16_t(buffer[EEPROM_TZ_OFFSET]) << 8;
timezone |= buffer[EEPROM_TZ_OFFSET+1];
usdst = buffer[EEPROM_USDST_OFFSET];
strncpy(timeserver, &buffer[EEPROM_TIMESERVER_OFFSET], EEPROM_TIMESERVER_LENGTH);
if (strlen(timeserver) < 1) {
strcpy(timeserver, DEFAULT_TIMESERVER);
}
interval = time_t(buffer[EEPROM_INTERVAL_OFFSET]) << 8;
interval |= buffer[EEPROM_INTERVAL_OFFSET+1];
if (interval < 0) {
interval = DEFAULT_INTERVAL;
}
if (interval < MINIMUM_INTERVAL) {
interval = MINIMUM_INTERVAL;
}
// Clock name.
name = "";
for (int i = EEPROM_NAME_OFFSET ; i < EEPROM_NAME_OFFSET+EEPROM_NAME_LENGTH ; i++) {
if (buffer[i]) name += buffer[i];
}
}
void Save() {
unsigned char buffer[EEPROM_WIFI_SIZE];
memset(buffer, 0, EEPROM_WIFI_SIZE);
// Copy magic to buffer;
strncpy((char *)buffer, EEPROM_MAGIC, EEPROM_MAGIC_LENGTH);
// Copy SSID to buffer;
ssid.getBytes(&buffer[EEPROM_SSID_OFFSET], EEPROM_SSID_LENGTH, 0);
// Copy PSK to buffer.
psk.getBytes(&buffer[EEPROM_PSK_OFFSET], EEPROM_PSK_LENGTH, 0);
// Copy timezone.
buffer[EEPROM_TZ_OFFSET] = timezone >> 8;
buffer[EEPROM_TZ_OFFSET+1] = timezone & 0xFF;
buffer[EEPROM_USDST_OFFSET] = usdst;
// Copy timeserver.
strncpy((char *)&buffer[EEPROM_TIMESERVER_OFFSET], (char *)timeserver, EEPROM_TIMESERVER_LENGTH);
// Copy interval.
buffer[EEPROM_INTERVAL_OFFSET] = interval >> 8;
buffer[EEPROM_INTERVAL_OFFSET+1] = interval & 0xff;
// Copy clock name.
name.getBytes(&buffer[EEPROM_NAME_OFFSET], EEPROM_NAME_LENGTH, 0);
// Write to EEPROM.
EEPROM.begin(EEPROM_WIFI_SIZE);
for (int i = 0 ; i < EEPROM_WIFI_SIZE ; i++) {
EEPROM.write(i, buffer[i]);
}
EEPROM.commit();
EEPROM.end();
}
String ssid;
String psk;
int16_t timezone;
char usdst;
char timeserver[64];
int interval;
String name;
};
Settings settings;
#endif