#include <EEPROM.h>
int items_counter = 0;
int lookup_table_ini_pos = EEPROM.length() - 256;
int REG_SIZE = 16;
int REGID_SIZE = 7;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// put your setup code here, to run once:
// for (int i = 0 ; i < EEPROM.length() ; i++) EEPROM.write(i, 0);
//for (int i = 0 ; i < 255 ; i++) EEPROM.write(i, 0);
while (!Serial);
for (int i = 1; i <= 256; i++)
if (i <= 16)
EEPROM.write( (EEPROM.length() - i) , 1);
else {
EEPROM.write( (EEPROM.length() - i) , 0);
Serial.println((EEPROM.length() - i));
}
}
void print_positions_marked() {
for (int i = 0; i < 256; i++) {
Serial.print(lookup_table_ini_pos + i);
Serial.print(" (");
Serial.print(i);
Serial.print(") ");
Serial.print(" : ");
Serial.println( EEPROM.read(lookup_table_ini_pos + i) );
}
}
int capture_and_use_first_clean_pos() {
for (int i = 0; i <= 240; i++) {
/* Serial.print("posicao: ");
Serial.print(i);
Serial.print("val: ");
Serial.println(EEPROM.read(lookup_table_ini_pos + i)); */
if (EEPROM.read(lookup_table_ini_pos + i) == 0) {
EEPROM.write(lookup_table_ini_pos + i, 1);
return i * REG_SIZE;
}
}
}
void write_string_to_eeprom(const String &strToWrite)
{
if (!update_items_counter(1)) {
Serial.println("item cannot be added!");
return;
}
int clean_pos = capture_and_use_first_clean_pos();
/* Serial.print(strToWrite);
Serial.print(" : ");
Serial.println(clean_pos); */
for (int i = 0; i < REG_SIZE; i++)
EEPROM.write(clean_pos + i, strToWrite[i]);
}
String read_string_from_eeprom(int addrOffset, int ssize)
{
char data[ssize + 1];
for (int i = 0; i < ssize; i++)
{
data[i] = EEPROM.read(addrOffset + i);
}
data[ssize] = '\0';
return String(data);
}
bool update_items_counter(byte n) {
if (items_counter == 0 && n < 0) {
Serial.println("memory is already empty");
return false;
}
if (items_counter == 240 && n > 0) {
Serial.println("full memory!");
return false;
}
items_counter += n;
return true;
}
int delete_string_from_eeprom(const String &s) {
int pos = capture_string_position(s);
if (pos == -1) {
Serial.println("item not found");
return pos;
}
int s_pos = pos / REG_SIZE;
update_items_counter(-1);
EEPROM.write(lookup_table_ini_pos + s_pos, 0);
return pos;
}
int capture_string_position(const String &s) {
for (int i = 0; i <= 240; i++) {
int has_s = EEPROM.read(lookup_table_ini_pos + i);
if (has_s) {
String aux = read_string_from_eeprom(i * REG_SIZE, s.length());
if (aux == s)
return i * REG_SIZE;
}
}
return -1;
}
String read_name() {
String name = "";
while (name.length() < 9) {
if(Serial.available()){
char data_in = Serial.read();
name += (data_in);
Serial.println(data_in);
}
}
Serial.flush();
return name;
}
void add() {
// read tag id
String tagID = "1234567";
// check if already exists
int tagID_pos = capture_string_position(tagID);
Serial.println( tagID_pos );
if (tagID_pos != -1) {
Serial.println("tag already exists, continue to change your username: ");
delete_string_from_eeprom(tagID);
}
// read username
String name = read_name();
// add tag to registers
write_string_to_eeprom(tagID + name);
}
int i = 1;
void loop() {
// put your main code here, to run repeatedly:
if (i == 1) {
String r = "1234567luizpaulo";
Serial.println(r);
write_string_to_eeprom(r);
String z = read_string_from_eeprom(0, REG_SIZE);
Serial.println(z);
String b = "7654321luizpaulo";
write_string_to_eeprom(b);
int p = delete_string_from_eeprom("bbbgggiiijjjkkkl");
Serial.print("luizaqui");
Serial.println(p);
Serial.println("----");
String c = "7654321pauloluiz";
write_string_to_eeprom(c);
Serial.println(read_string_from_eeprom(0, REG_SIZE));
write_string_to_eeprom(r);
add();
print_positions_marked();
String ss = "1234567ziuloluap";
Serial.println( read_string_from_eeprom(capture_string_position(ss), REG_SIZE));
i = 2;
}
}