You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

95 lines
2.8 KiB

#include <EEPROM.h>
#include <ELClientWebServer.h>
#define MAGIC 0xABEF
#define MAX_STR_LEN 32
// EEPROM content
#define EEPROM_POS_MAGIC 0
#define EEPROM_POS_FIRST_NAME (EEPROM_POS_MAGIC + 2)
#define EEPROM_POS_LAST_NAME (EEPROM_POS_FIRST_NAME + MAX_STR_LEN)
#define EEPROM_POS_AGE (EEPROM_POS_LAST_NAME + MAX_STR_LEN)
#define EEPROM_POS_GENDER (EEPROM_POS_AGE+1)
#define EEPROM_POS_NOTIFICATIONS (EEPROM_POS_GENDER+1)
// write a string to EEPROM
void userWriteStr(char * str, int ndx)
{
for(uint8_t i=0; i < MAX_STR_LEN-1; i++)
{
EEPROM.update(ndx + i, str[i]);
if( str[i] == 0 )
break;
}
EEPROM.update(ndx + MAX_STR_LEN - 1, 0);
}
// read a string from EEPROM
void userReadStr(char * str, int ndx)
{
for(uint8_t i=0; i < MAX_STR_LEN; i++)
{
str[i] = EEPROM[ndx + i];
}
}
// setting the value of a field
//
// handle data as fast as possible
// - huge HTML forms can arrive in multiple packets
// - if this method is slow, UART receive buffer may overrun
void userSetFieldCb(const char * field)
{
String fld = field;
if( fld == F("first_name"))
userWriteStr(webServer.getArgString(), EEPROM_POS_FIRST_NAME);
else if( fld == F("last_name"))
userWriteStr(webServer.getArgString(), EEPROM_POS_LAST_NAME);
else if( fld == F("age"))
EEPROM.update(EEPROM_POS_AGE, (uint8_t)webServer.getArgInt());
else if( fld == F("gender"))
{
String gender = webServer.getArgString();
EEPROM.update(EEPROM_POS_GENDER, (gender == F("male")) ? 'm' : 'f');
}
else if( fld == F("notifications"))
EEPROM.update(EEPROM_POS_NOTIFICATIONS, webServer.getArgBoolean());
}
// called at page loading
void userLoadCb(const char * url)
{
char buf[MAX_STR_LEN];
userReadStr( buf, EEPROM_POS_FIRST_NAME );
webServer.setArgString(F("first_name"), buf);
userReadStr( buf, EEPROM_POS_LAST_NAME );
webServer.setArgString(F("last_name"), buf);
webServer.setArgInt(F("age"), (uint8_t)EEPROM[EEPROM_POS_AGE]);
webServer.setArgString(F("gender"), (EEPROM[EEPROM_POS_GENDER] == 'm') ? F("male") : F("female"));
webServer.setArgBoolean(F("notifications"), EEPROM[EEPROM_POS_NOTIFICATIONS] != 0);
}
// initialization
void userInit()
{
uint16_t magic;
EEPROM.get(EEPROM_POS_MAGIC, magic);
if( magic != MAGIC ) // EEPROM is uninitialized?
{
magic = MAGIC;
// set default values
EEPROM.put(EEPROM_POS_MAGIC, magic);
EEPROM.update(EEPROM_POS_FIRST_NAME, 0);
EEPROM.update(EEPROM_POS_LAST_NAME, 0);
EEPROM.update(EEPROM_POS_AGE, 0);
EEPROM.update(EEPROM_POS_GENDER, 'f');
EEPROM.update(EEPROM_POS_NOTIFICATIONS, 0);
}
URLHandler *userPageHandler = webServer.createURLHandler(F("/User.html.json"));
userPageHandler->setFieldCb.attach(userSetFieldCb);
userPageHandler->loadCb.attach(userLoadCb);
}