servicedata.cpp 3.85 KB
#include "string.h"
#include "servicedata.h"
#include <QDebug>
#include <fcntl.h>
#include <unistd.h>        // write(), close()
#include <dirtylevel.h>

#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);
        qDebug() <<"FRAM Load Success";
    }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;
}