Mam tu taki kawałek kodu, którego zadaniem jest zapisać ustawienia do bazy w pamięci EEPROM i potem je odczytać. Wszystko fajnie, działa, ale kod jest nieelegancki i trudny w utrzymaniu. Chcąc rozwijać aplikację dodanie kolejnego pola wymaga sporo pracy. Pamięć podłączona po i2c.
O ile zdefiniowane pola w strukturze jest proste, to potem chcąc wykonać zapis/odczyt muszę wyliczać offset dla każdego pola.
Wolałbym użyć funkcji, zapisu w ten sposób :
zamiast
Niestety nie potrafię jeszcze samemu napisać funkcji, która sama wyliczy mi offset dla konkretnego pola w ramach danej struktury. Problem w tym, że offset jest wyliczany z makra i nie da się przenieść argumentów poprzez funkcję.
Czy ktoś mnie naprowadzi jak to obejść?
Kod:
#include <Wire.h>
#include <I2C_EEPROM.h>
AT24C32<0x57> eep; //for RTC3231
#define offsetof(s,m) (size_t)&(((s *)NULL)->m)
struct MySetingsTab {
char struct_start[10];
char wifi_ssid[255];
char wifi_password[255];
int svrport;
int dhcp;
int ip_0;
int ip_1;
int ip_2;
int ip_3;
int nm_0;
int nm_1;
int nm_2;
int nm_3;
int gw_0;
int gw_1;
int gw_2;
int gw_3;
int dns_p0;
int dns_p1;
int dns_p2;
int dns_p3;
int dns_s0;
int dns_s1;
int dns_s2;
int dns_s3;
char system_login[255];
char system_password[255];
// setings for sleep mode option - work if this option is active
int active_time;
int sleep_time;
// setings for remote raporting sensor values
int remote_raporting;
int frequency_sec;
char remote_url[255];
char struct_end[10];
} mysetingstab, setingsfromdb;
size_t offset_struct_start = offsetof (MySetingsTab, struct_start);
size_t offset_wifi_ssid = offsetof (MySetingsTab, wifi_ssid);
size_t offset_wifi_password = offsetof (MySetingsTab, wifi_password);
size_t offset_svrport = offsetof (MySetingsTab, svrport);
size_t offset_dhcp = offsetof (MySetingsTab,dhcp);
size_t offset_ip_0 = offsetof (MySetingsTab, ip_0);
size_t offset_ip_1 = offsetof (MySetingsTab, ip_1);
size_t offset_ip_2 = offsetof (MySetingsTab, ip_2);
size_t offset_ip_3 = offsetof (MySetingsTab, ip_3);
size_t offset_nm_0 = offsetof (MySetingsTab, nm_0);
size_t offset_nm_1 = offsetof (MySetingsTab, nm_1);
size_t offset_nm_2 = offsetof (MySetingsTab, nm_2);
size_t offset_nm_3 = offsetof (MySetingsTab, nm_3);
size_t offset_gw_0 = offsetof (MySetingsTab, gw_0);
size_t offset_gw_1 = offsetof (MySetingsTab, gw_1);
size_t offset_gw_2 = offsetof (MySetingsTab, gw_2);
size_t offset_gw_3 = offsetof (MySetingsTab, gw_3);
size_t offset_dns_p0 = offsetof (MySetingsTab,dns_p0);
size_t offset_dns_p1 = offsetof (MySetingsTab,dns_p1);
size_t offset_dns_p2 = offsetof (MySetingsTab, dns_p2);
size_t offset_dns_p3 = offsetof (MySetingsTab, dns_p3);
size_t offset_dns_s0 = offsetof (MySetingsTab,dns_s0);
size_t offset_dns_s1 = offsetof (MySetingsTab,dns_s1);
size_t offset_dns_s2 = offsetof (MySetingsTab, dns_s2);
size_t offset_dns_s3 = offsetof (MySetingsTab, dns_s3);
size_t offset_system_login = offsetof (MySetingsTab, system_login);
size_t offset_system_password = offsetof (MySetingsTab, system_password);
size_t offset_active_time = offsetof (MySetingsTab, active_time);
size_t offset_sleep_time = offsetof (MySetingsTab, sleep_time);
size_t offset_remote_raporting = offsetof (MySetingsTab, remote_raporting);
size_t offset_frequency_sec = offsetof (MySetingsTab, frequency_sec);
size_t offset_remote_url = offsetof (MySetingsTab, remote_url);
size_t offset_struct_end = offsetof (MySetingsTab, struct_end);
void SaveDefaultSystemSettings(){
// tworzę tabelę
Serial.println("Creating Default Table...");
strcpy(mysetingstab.struct_start ,"start");
strcpy(mysetingstab.wifi_ssid ,"smartnet");
strcpy(mysetingstab.wifi_password ,"1234567890abcdf987654321wiara ze sie uda");
mysetingstab.svrport = 80;
mysetingstab.dhcp = 1;
mysetingstab.ip_0 = 192;
mysetingstab.ip_1 = 168;
mysetingstab.ip_2 = 0;
mysetingstab.ip_3 = 15;
mysetingstab.nm_0 = 255;
mysetingstab.nm_1 = 255;
mysetingstab.nm_2 = 255;
mysetingstab.nm_3 = 0;
mysetingstab.gw_0 = 192;
mysetingstab.gw_1 = 168;
mysetingstab.gw_2 = 0;
mysetingstab.gw_3 = 1;
mysetingstab.dns_p0 = 192;
mysetingstab.dns_p1 = 168;
mysetingstab.dns_p2 = 0;
mysetingstab.dns_p3 = 1;
mysetingstab.dns_s0 = 8;
mysetingstab.dns_s1 = 8;
mysetingstab.dns_s2 = 8;
mysetingstab.dns_s3 = 8;
strcpy(mysetingstab.system_login ,"abcdefghijklmnoperstwj1234567890");
strcpy(mysetingstab.system_password ,"ciekawe co sie zapisze to dlugi ciag znakow");
mysetingstab.active_time = 160;
mysetingstab.sleep_time = 300;
mysetingstab.remote_raporting = 0; // 1 == on 0 == off
mysetingstab.frequency_sec = 60;
strcpy(mysetingstab.remote_url ,"http://192.188.10.1/my_sensor_lab.php");
strcpy(mysetingstab.struct_end ,"end");
if(eep.ready()){
Serial.println("Epprom ready...");
Serial.println("Erase epprom...");
//erase epprom
for (int i = 0 ; i < eep.length() ; i++) {
uint16_t an = i;
int vb = 0 ;
eep.put(an ,vb);
// Serial.print("mem erase address: ");
//Serial.println(i);
delay(10);
} // end for
Serial.println("WAIT TIME 10 sek");
delay(10000);
Serial.println("Creating records...");
eep.put(offset_struct_start ,mysetingstab.struct_start);
eep.put(offset_wifi_ssid ,mysetingstab.wifi_ssid);
eep.put(offset_wifi_password ,mysetingstab.wifi_password);
eep.put(offset_svrport ,mysetingstab.svrport);
eep.put(offset_dhcp ,mysetingstab.dhcp);
eep.put(offset_ip_0 ,mysetingstab.ip_0);
eep.put(offset_ip_1 ,mysetingstab.ip_1);
eep.put(offset_ip_2 ,mysetingstab.ip_2);
eep.put(offset_ip_3 ,mysetingstab.ip_3);
eep.put(offset_nm_0 ,mysetingstab.nm_0);
eep.put(offset_nm_1 ,mysetingstab.nm_1);
eep.put(offset_nm_2 ,mysetingstab.nm_2);
eep.put(offset_nm_3 ,mysetingstab.nm_3 );
eep.put(offset_gw_0 ,mysetingstab.gw_0);
eep.put(offset_gw_1 ,mysetingstab.gw_1);
eep.put(offset_gw_2 ,mysetingstab.gw_2);
eep.put(offset_gw_3 ,mysetingstab.gw_3);
eep.put(offset_dns_p0 ,mysetingstab.dns_p0);
eep.put(offset_dns_p1 ,mysetingstab.dns_p1);
eep.put(offset_dns_p2 ,mysetingstab.dns_p2);
eep.put(offset_dns_p3 ,mysetingstab.dns_p3);
eep.put(offset_dns_s0 ,mysetingstab.dns_s0);
eep.put(offset_dns_s1 ,mysetingstab.dns_s1);
eep.put(offset_dns_s2 ,mysetingstab.dns_s2);
eep.put(offset_dns_s3 ,mysetingstab.dns_s3);
eep.put(offset_system_login ,mysetingstab.system_login);
eep.put(offset_system_password ,mysetingstab.system_password);
eep.put(offset_active_time ,mysetingstab.active_time);
eep.put(offset_sleep_time ,mysetingstab.sleep_time);
eep.put(offset_remote_raporting ,mysetingstab.remote_raporting);
eep.put(offset_frequency_sec ,mysetingstab.frequency_sec);
eep.put(offset_remote_url ,mysetingstab.remote_url);
eep.put(offset_struct_end ,mysetingstab.struct_end);
}
else{
Serial.println("upss - connection error");
}
Serial.println("Table isset DONE");
delay(3500);
}
void GetSetingsfromdb(){
if(eep.ready()){
Serial.println("GetSetingsfromdb");
// czyta dane
eep.fastBlockRead(offset_struct_start,&mysetingstab.struct_start ,sizeof( mysetingstab.struct_start));
eep.fastBlockRead(offset_wifi_ssid,&mysetingstab.wifi_ssid ,sizeof( mysetingstab.wifi_ssid ));
eep.fastBlockRead(offset_wifi_password ,&mysetingstab.wifi_password,sizeof( mysetingstab.wifi_password));
eep.fastBlockRead(offset_svrport,&mysetingstab.svrport,sizeof(mysetingstab.svrport));
eep.fastBlockRead(offset_dhcp,&mysetingstab.dhcp,sizeof(mysetingstab.dhcp ));
eep.fastBlockRead(offset_ip_0,&mysetingstab.ip_0,sizeof(mysetingstab.ip_0));
eep.fastBlockRead(offset_ip_1,&mysetingstab.ip_1,sizeof(mysetingstab.ip_1));
eep.fastBlockRead(offset_ip_2,&mysetingstab.ip_2,sizeof(mysetingstab.ip_2));
eep.fastBlockRead(offset_ip_3,&mysetingstab.ip_3,sizeof(mysetingstab.ip_3));
eep.fastBlockRead(offset_nm_0,&mysetingstab.nm_0,sizeof(mysetingstab.nm_0));
eep.fastBlockRead(offset_nm_1,&mysetingstab.nm_1,sizeof(mysetingstab.nm_1));
eep.fastBlockRead(offset_nm_2,&mysetingstab.nm_2,sizeof(mysetingstab.nm_2));
eep.fastBlockRead(offset_nm_3,&mysetingstab.nm_3,sizeof(mysetingstab.nm_3));
eep.fastBlockRead(offset_gw_0,&mysetingstab.gw_0,sizeof(mysetingstab.gw_0));
eep.fastBlockRead(offset_gw_1,&mysetingstab.gw_1,sizeof( mysetingstab.gw_1));
eep.fastBlockRead(offset_gw_2,&mysetingstab.gw_2,sizeof(mysetingstab.gw_2 ));
eep.fastBlockRead(offset_gw_3,&mysetingstab.gw_3,sizeof(mysetingstab.gw_3));
eep.fastBlockRead(offset_dns_p0,&mysetingstab.dns_p0,sizeof(mysetingstab.dns_p0));
eep.fastBlockRead(offset_dns_p1,&mysetingstab.dns_p1,sizeof(mysetingstab.dns_p1));
eep.fastBlockRead(offset_dns_p2,&mysetingstab.dns_p2 ,sizeof(mysetingstab.dns_p2));
eep.fastBlockRead(offset_dns_p3,&mysetingstab.dns_p3,sizeof(mysetingstab.dns_p3));
eep.fastBlockRead(offset_dns_s0,&mysetingstab.dns_s0,sizeof(mysetingstab.dns_s0));
eep.fastBlockRead(offset_dns_s1,&mysetingstab.dns_s1,sizeof(mysetingstab.dns_s1));
eep.fastBlockRead(offset_dns_s2,&mysetingstab.dns_s2,sizeof(mysetingstab.dns_s2));
eep.fastBlockRead(offset_dns_s3,&mysetingstab.dns_s3,sizeof(mysetingstab.dns_s3));
eep.fastBlockRead(offset_system_login,&mysetingstab.system_login,sizeof(mysetingstab.system_login));
eep.fastBlockRead(offset_system_password,&mysetingstab.system_password,sizeof(mysetingstab.system_password));
eep.fastBlockRead(offset_active_time,&mysetingstab.active_time,sizeof(mysetingstab.active_time));
eep.fastBlockRead(offset_sleep_time,&mysetingstab.sleep_time,sizeof(mysetingstab.sleep_time));
eep.fastBlockRead(offset_remote_raporting,&mysetingstab.remote_raporting,sizeof(mysetingstab.remote_raporting));
eep.fastBlockRead(offset_frequency_sec,&mysetingstab.frequency_sec,sizeof(mysetingstab.frequency_sec));
eep.fastBlockRead(offset_remote_url,&mysetingstab.remote_url,sizeof(mysetingstab.remote_url));
eep.fastBlockRead(offset_struct_end,&mysetingstab.struct_end ,sizeof( mysetingstab.struct_end)); // test data read end
} // end if
} //end GetSetingsfromdb()
void setup() {
//ESP.eraseConfig();
Serial.begin(9600);
delay(3000);
Wire.begin();
delay(3000);
delay(1000);
SaveDefaultSystemSettings();
GetSetingsfromdb() ;
Serial.print("remote_url: ");
Serial.println(mysetingstab.remote_url);
Serial.print("wifi_ssid: ");
Serial.println(mysetingstab.wifi_ssid);
Serial.print("wifi_password: ");
Serial.println(mysetingstab.wifi_password);
Serial.print("system_login: ");
Serial.println(mysetingstab.system_login);
Serial.print("system_password: ");
Serial.println(mysetingstab.system_password);
} // end of setup
void loop() {
// put your main code here, to run repeatedly:
}
O ile zdefiniowane pola w strukturze jest proste, to potem chcąc wykonać zapis/odczyt muszę wyliczać offset dla każdego pola.
Wolałbym użyć funkcji, zapisu w ten sposób :
Kod:
save_to_db(mysetingstab.remote_raporting, value);
zamiast
Kod:
eep.put(offset_remote_raporting ,mysetingstab.remote_raporting);
Niestety nie potrafię jeszcze samemu napisać funkcji, która sama wyliczy mi offset dla konkretnego pola w ramach danej struktury. Problem w tym, że offset jest wyliczany z makra i nie da się przenieść argumentów poprzez funkcję.
Czy ktoś mnie naprowadzi jak to obejść?