Lab_interaccio/2012/Edgard/Vdossier01/memory_manager.ino
2025-02-25 21:29:42 +01:00

160 lines
5.2 KiB
C++

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data ) {
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.write(data);
Wire.endTransmission();
delay(4);
}
byte readEEPROM(int deviceaddress, unsigned int eeaddress ) {
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.write((int)(eeaddress >> 8)); // MSB
Wire.write((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
while (!Wire.available()); rdata = Wire.read();
//if (Wire.available()); rdata = Wire.read();
return rdata;
}
void saveEEPROM(unsigned long value, unsigned int address){
uint8_t val=0x00;
for (int i = 0; i < 4; i++)
{
val=(byte)(value>>(8*i));
writeEEPROM(eeprom, address+3-i, val);
}
writeEEPROM(eeprom, address+4, 0x0D);
}
void clear_model(unsigned int address){
for (int i = 0; i < 80; i++)
{
if (i<16) writeEEPROM(eeprom, address+i, ' ');
else writeEEPROM(eeprom, address+i, 0x00);
}
}
void move_model(byte currentOption){
unsigned int address = EEI2C_ADDR_MODELS + 80*currentOption;
unsigned int address_next = EEI2C_ADDR_MODELS + 80*(currentOption+1);
if (currentOption < (system_models - 1))
{
for (int i = 0; i < 80*(system_models - currentOption); i++)
{
writeEEPROM(eeprom, address+i, readEEPROM(eeprom, address_next + i ));
}
}
system_models--;
}
void erase_model(byte currentOption){
lcd.clear();
lcd.print("Borrando...");
unsigned int address = EEI2C_ADDR_MODELS + 80*currentOption;
clear_model(address);
move_model(currentOption);
}
void config_init(){
// Check if the firmware version is the same of eeprom config
if (
EEPROM.read(EE_ADDR_SIGNATURE_CODE1) == SIGNATURE_CODE1 &&
EEPROM.read(EE_ADDR_SIGNATURE_CODE2) == SIGNATURE_CODE2 &&
EEPROM.read(EE_ADDR_SIGNATURE_CODE3) == SIGNATURE_CODE3 &&
EEPROM.read(EE_ADDR_SIGNATURE_CODE4) == SIGNATURE_CODE4 &&
EEPROM.read(EE_ADDR_CODE_MAYOR_VERSION) == CODE_MAYOR_VERSION &&
EEPROM.read(EE_ADDR_CODE_MINOR_VERSION) == CODE_MINOR_VERSION
) {
// loads in ram the eeprom config
config_loadBackup_all();
} else {
// clear the eeprom
for (int i = 0; i < EEPROM_SIZE; i++) EEPROM.write(i, 0xFF);
// writes sign codes
EEPROM.write(EE_ADDR_SIGNATURE_CODE1,SIGNATURE_CODE1);
EEPROM.write(EE_ADDR_SIGNATURE_CODE2,SIGNATURE_CODE2);
EEPROM.write(EE_ADDR_SIGNATURE_CODE3,SIGNATURE_CODE3);
EEPROM.write(EE_ADDR_SIGNATURE_CODE4,SIGNATURE_CODE4);
EEPROM.write(EE_ADDR_CODE_MAYOR_VERSION,CODE_MAYOR_VERSION);
EEPROM.write(EE_ADDR_CODE_MINOR_VERSION,CODE_MINOR_VERSION);
// load defaults in ram and save it on eeprom
config_loadDefaults_all();
config_saveBackup_all();
// inform of resetting action
display_printResetting();
}
}
void config_loadDefaults_all(){
config_loadDefaults_system();
//config_loadDefaults_intervalMode();
}
void config_saveBackup_all(){
config_saveBackup_system();
//config_saveBackup_intervalMode();
}
void config_loadBackup_all(){
config_loadBackup_system();
//config_loadBackup_intervalMode();
}
// Load the system config from eeprom to ram
void config_loadBackup_system(){
system_useBacklight = EEPROM.read(EE_ADDR_system_useBacklight);
system_useSpeaker = EEPROM.read(EE_ADDR_system_useSpeaker);
system_models = word(EEPROM.read(EE_ADDR_system_models + 1),EEPROM.read(EE_ADDR_system_models));
}
// Load the default system config to ram
void config_loadDefaults_system() {
system_useBacklight = DEFAULT_system_useBacklight;
system_useSpeaker = DEFAULT_system_useSpeaker;
system_models = DEFAULT_system_models;
EEPROM.write(EE_ADDR_BATTERY_HIGH+1,highByte(DEFAULT_BATTERY_HIGH));
EEPROM.write(EE_ADDR_BATTERY_HIGH,lowByte(DEFAULT_BATTERY_HIGH));
EEPROM.write(EE_ADDR_BATTERY_LOW+1,highByte(DEFAULT_BATTERY_LOW));
EEPROM.write(EE_ADDR_BATTERY_LOW,lowByte(DEFAULT_BATTERY_LOW));
}
// Save the system config from ram to eeprom
void config_saveBackup_system(){
EEPROM.write(EE_ADDR_system_useBacklight, system_useBacklight);
EEPROM.write(EE_ADDR_system_useSpeaker, system_useSpeaker);
EEPROM.write(EE_ADDR_system_models + 1, highByte(system_models));
EEPROM.write(EE_ADDR_system_models, lowByte(system_models));
}
void calibrate_level_battery()
{
int t_bat=0;
for(int i=1; i<=10; i++) t_bat=t_bat+analogRead(bat);
t_bat=t_bat/10;
int t_eeprom;
t_eeprom=word(EEPROM.read(EE_ADDR_BATTERY_HIGH+1),EEPROM.read(EE_ADDR_BATTERY_HIGH));
if ((t_bat>t_eeprom)||(t_eeprom>=435))
{
EEPROM.write(EE_ADDR_BATTERY_HIGH+1,highByte(t_bat));
EEPROM.write(EE_ADDR_BATTERY_HIGH,lowByte(t_bat));
}
t_eeprom=word(EEPROM.read(EE_ADDR_BATTERY_LOW+1),EEPROM.read(EE_ADDR_BATTERY_LOW));
if ((t_bat<t_eeprom)||(t_eeprom<=335))
{
EEPROM.write(EE_ADDR_BATTERY_LOW+1,highByte(t_bat));
EEPROM.write(EE_ADDR_BATTERY_LOW,lowByte(t_bat));
}
batmax=word(EEPROM.read(EE_ADDR_BATTERY_HIGH+1),EEPROM.read(EE_ADDR_BATTERY_HIGH));
batmin=word(EEPROM.read(EE_ADDR_BATTERY_LOW+1),EEPROM.read(EE_ADDR_BATTERY_LOW));
}