#include "string.h" #include "servicedata.h" #include #include #include // write(), close() #include #define FRAM_SIZE 2048 #define FRAM_TEST_PROCESS 0 #define fRam_path "/sys/bus/spi/devices/spi0.0/fram" #define INIT_FRAM 0 //시작시 RRAM 초기화 ServiceData::ServiceData() { qDebug()<< "Statics Data Size Report\r\n error_log size = " << sizeof(error_log) << " \r\nuse_static_log size = " << sizeof(use_statics_log) \ << "\r\nsensor_statics_log size = " << sizeof(sensor_statics_log); memset((void*)err_log.data,0x00,sizeof(error_log)); memset((void*)use_log.data,0x00,sizeof(use_statics_log)); memset((void*)sensor_log.data,0x00, sizeof(sensor_statics_log)); DirtyLevel::setCookingCount(0); DirtyLevel::setCookingTime(0); #if INIT_FRAM == 1 saveServiceData(); #else loadServiceData(); #endif } bool ServiceData::loadServiceData(void){ uint8_t buffs[FRAM_SIZE]; uint8_t* pBuff; int fd; qint64 temp_cookingTime = 0; int temp_cookingCount = 0; pBuff = buffs; #if FRAM_TEST_PROCESS == 1 int i; memset(buffs,0x00,256); for(i=0;i<256;i++){ buffs[i] = i; } fd = open(fRam_path, O_RDWR); if(fd>0){ write(fd,buffs,256); close(fd); } else{ qDebug()<<"FRAM open fail!"; return false; } i=0; memset(buffs,0x00,256); fd = open(fRam_path, O_RDONLY ); if(fd>0){ read(fd,buffs,256); close(fd); }else{ qDebug()<<"FRAM open fail!"; return false; } for(i=0;i<256;i++){ if(i !=buffs[i]) { qDebug()<<"FRAM Test Fail"; return false; } } qDebug()<<"FRAM Test Success!"; return true; #endif fd = open(fRam_path, O_RDONLY ); if(fd>0){ memset(buffs,0x00,FRAM_SIZE); read(fd,buffs,FRAM_SIZE); if(buffs[sizeof(error_log) + sizeof(use_statics_log) + sizeof(sensor_statics_log) + sizeof(qint64) + sizeof(int)] != 0x9C){ qDebug() << "service data read incorrected!"; close(fd); return saveServiceData(); } qDebug() << "FRAM Read, Write Size is " << sizeof(error_log)+sizeof(use_statics_log); memcpy((void*)err_log.data,pBuff,sizeof(error_log)); pBuff += sizeof(error_log); memcpy((void*)use_log.data, pBuff,sizeof(use_statics_log));pBuff += sizeof(use_statics_log); memcpy((void*)sensor_log.data,pBuff,sizeof(sensor_statics_log)); pBuff+= sizeof(sensor_statics_log); memcpy(&temp_cookingTime,pBuff, sizeof(qint64)); pBuff += sizeof(qint64); memcpy(&temp_cookingCount,pBuff, sizeof(int)); DirtyLevel::setCookingCount(temp_cookingCount); DirtyLevel::setCookingTime(temp_cookingTime); close(fd); }else{ qDebug()<<"FRAM FILE Open fail!!"; } return true; } bool ServiceData::saveServiceData(void){ uint8_t buffs[FRAM_SIZE]; uint8_t* pBuff; int fd; qint64 temp_cookingTime = DirtyLevel::cookingTime(); int temp_cookingCount = DirtyLevel::cookingCount(); pBuff = buffs; fd = open(fRam_path, O_RDWR | O_SYNC); if(fd>0){ memset(buffs,0x00,FRAM_SIZE); memcpy(pBuff,(void*)err_log.data,sizeof(error_log)); pBuff += sizeof(err_log); memcpy(pBuff,(void*)use_log.data,sizeof(use_statics_log)); pBuff += sizeof(use_statics_log); memcpy(pBuff,(void*)sensor_log.data,sizeof(sensor_statics_log)); pBuff += sizeof(sensor_statics_log); memcpy(pBuff, &temp_cookingTime, sizeof(qint64)); pBuff += sizeof(qint64); memcpy(pBuff, &temp_cookingCount, sizeof(int)); pBuff += sizeof(int); *pBuff = 0x9C; write(fd,buffs,FRAM_SIZE); close(fd); }else{ qDebug()<<"FRAM FILE Open fail!!"; return false; } return true; }