Adam Pippin
4 years ago
2 changed files with 150 additions and 0 deletions
@ -0,0 +1,142 @@ |
|||||
|
#include <M5StickC.h> |
||||
|
#include "Kernel.h" |
||||
|
#include "EAT.h" |
||||
|
#include "EEPROM.h" |
||||
|
|
||||
|
#define VERSION 1 |
||||
|
#define MAX_ENTRIES 16 |
||||
|
#define EEPROM_SIZE 4096 |
||||
|
|
||||
|
byte version = 0; |
||||
|
byte options = 0; |
||||
|
byte modules[MAX_ENTRIES]; |
||||
|
byte lengths[MAX_ENTRIES]; |
||||
|
|
||||
|
int EAT_get_offset(byte module); |
||||
|
|
||||
|
void EAT_load() |
||||
|
{ |
||||
|
EEPROM.begin(EEPROM_SIZE); |
||||
|
version = EEPROM.read(0); |
||||
|
options = EEPROM.read(1); |
||||
|
|
||||
|
if (version != VERSION) |
||||
|
{ |
||||
|
char msg[255]; |
||||
|
sprintf(msg, "Unsupported version (%d) -- please reinitialize EEPROM.", version); |
||||
|
Kernel_panic(msg); |
||||
|
//Kernel_panic("Unsupported EAT version -- please reinitialize EEPROM.");
|
||||
|
} |
||||
|
|
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
modules[i] = EEPROM.read((i*2)+2); |
||||
|
lengths[i] = EEPROM.read((i*2)+3); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void EAT_commit() |
||||
|
{ |
||||
|
EEPROM.write(0, version); |
||||
|
EEPROM.write(1, options); |
||||
|
|
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
EEPROM.write((i*2)+2, modules[i]); |
||||
|
EEPROM.write((i*2)+3, lengths[i]); |
||||
|
} |
||||
|
EEPROM.commit(); |
||||
|
} |
||||
|
|
||||
|
void EAT_initialize() |
||||
|
{ |
||||
|
EEPROM.begin(EEPROM_SIZE); |
||||
|
version = VERSION; |
||||
|
options = 0; |
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
modules[i] = 0; |
||||
|
lengths[i] = 0; |
||||
|
} |
||||
|
EAT_commit(); |
||||
|
} |
||||
|
|
||||
|
int EAT_get_offset(byte module) |
||||
|
{ |
||||
|
int offset = 0; |
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
if (modules[i] == module) |
||||
|
{ |
||||
|
return offset + 2 + (MAX_ENTRIES * 2); // header + EAT
|
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
offset += lengths[i]; |
||||
|
} |
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
int EAT_get_length(byte module) |
||||
|
{ |
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
if (modules[i] == module) |
||||
|
{ |
||||
|
return lengths[i]; |
||||
|
} |
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
bool EAT_allocate(byte module, byte length) |
||||
|
{ |
||||
|
for (int i=0; i<MAX_ENTRIES; i++) |
||||
|
{ |
||||
|
if (modules[i] == module) |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
if (modules[i] == 0) |
||||
|
{ |
||||
|
modules[i] = module; |
||||
|
lengths[i] = length; |
||||
|
EAT_commit(); |
||||
|
return true; |
||||
|
} |
||||
|
} |
||||
|
Kernel_panic("Attempt to allocate EAT module but out of entries"); |
||||
|
} |
||||
|
|
||||
|
void EAT_write(byte module, byte offset, byte value) |
||||
|
{ |
||||
|
int module_offset = EAT_get_offset(module); |
||||
|
if (offset == -1) |
||||
|
{ |
||||
|
Kernel_panic("Attempt to write to uninitialized EAT module"); |
||||
|
} |
||||
|
if (offset > EAT_get_length(module) - 1) |
||||
|
{ |
||||
|
Kernel_panic("Attempt to write outside EAT module bounds"); |
||||
|
} |
||||
|
offset += module_offset; |
||||
|
EEPROM.write(offset, value); |
||||
|
EEPROM.commit(); |
||||
|
} |
||||
|
|
||||
|
byte EAT_read(byte module, byte offset) |
||||
|
{ |
||||
|
int module_offset = EAT_get_offset(module); |
||||
|
if (offset == -1) |
||||
|
{ |
||||
|
Kernel_panic("Attempt to write to uninitialized EAT module"); |
||||
|
} |
||||
|
if (offset > EAT_get_length(module) - 1) |
||||
|
{ |
||||
|
Kernel_panic("Attempt to write outside EAT module bounds"); |
||||
|
} |
||||
|
offset += module_offset; |
||||
|
return EEPROM.read(offset |
||||
|
); |
||||
|
} |
@ -0,0 +1,8 @@ |
|||||
|
void EAT_load(); |
||||
|
void EAT_commit(); |
||||
|
void EAT_initialize(); |
||||
|
|
||||
|
int EAT_get_length(byte module); |
||||
|
bool EAT_allocate(byte module, byte length); |
||||
|
void EAT_write(byte module, byte offset, byte value); |
||||
|
byte EAT_read(byte module, byte offset); |
Loading…
Reference in new issue