#include "file.h" #include "filedata.h" extern u8 GetSum(u8 * buffer, u16 length); struct waterdata_struct waterdata; struct curtime_struct curtime; struct valid_struct valid; uint8_t get_ck(uint8_t *val, uint16_t len) { return GetSum(val, len); } //得到正向数据 static void get_forwarddata() { } //得到反向数据 static void get_reverseddata() { } /* //得到状态 static void get_status() { waterdata.status[0] = 0; waterdata.status[1] = 0; } */ //得到状态 static void get_waterdata(int32_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min) { get_forwarddata(); get_reverseddata(); waterdata.invalid = DATA_VALID_AA; waterdata.year = year; waterdata.mon = mon; waterdata.day = day; waterdata.hour = hour; waterdata.min = min; waterdata.crc = get_ck(&(waterdata.invalid),WATERDATA_LEN); } uint32_t get_base_time() { return curtime.time; } bool curtime_iscmp(struct curtime_struct * time1,struct curtime_struct * time2) { if(time1->time == time2->time && time1->year == time2->year && time1->mon == time2->mon && time1->day == time2->day && time1->crc == time2->crc) { return true; } return false; } void curtime_write() { uint32_t year = 0; uint8_t mon = 0; uint8_t day = 0; struct curtime_struct tmpcurtime; curtime.time = get_curtime(&year,&mon,&day); curtime.year = year; curtime.mon = mon; curtime.day = day; curtime.crc = get_ck((uint8_t*)&(curtime),CUR_TIME_LEN); file_curtime_read((uint8_t*)&tmpcurtime,sizeof(tmpcurtime)); if(!curtime_iscmp(&tmpcurtime,&curtime)) { file_curtime_write((uint8_t*)&curtime,sizeof(curtime)); } } void validflag_read(uint8_t day) { file_validflag_read(day,(uint8_t*)&valid,sizeof(valid)); if(valid.crc != get_ck((uint8_t*)&(valid),VALID_DATA_LEN)) { valid.valid = 0xFF; } } void validflag_write(uint32_t year,uint8_t mon,uint8_t date,uint8_t day) { //标志每天只写一直。 //如果年月日和保存的年月日不等,认为写入。 //数据是否有效 validflag_read(day); if(valid.year != year || valid.mon != mon || valid.day != date) { valid.year = year; valid.mon = mon; valid.day = date; valid.valid = DATA_VALID_AA; valid.crc = get_ck((uint8_t*)&(valid),VALID_DATA_LEN); file_validflag_write(day,(uint8_t*)&valid,sizeof(valid)); } else { //如果年月日和保存的年月日相等,但是有效标志不等于AA if(valid.valid == DATA_VALID_AA) { } else { valid.year = year; valid.mon = mon; valid.day = date; valid.valid = DATA_VALID_AA; valid.crc = get_ck((uint8_t*)&(valid),VALID_DATA_LEN); file_validflag_write(day,(uint8_t*)&valid,sizeof(valid)); } } } uint8_t get_validflag() { return valid.valid; } uint32_t get_validyear() { return valid.year; } uint8_t get_validmon() { return valid.mon; } uint8_t get_validday() { return valid.day; } void adjust_basetime() { uint32_t year = 0; uint8_t mon = 0; uint8_t date = 0; uint8_t day = 0; uint32_t time = 0; time = get_curtime(&year,&mon,&date); file_curtime_read((uint8_t*)&curtime,sizeof(curtime)); //第一次开机 if(curtime.crc != get_ck((uint8_t*)&(curtime),CUR_TIME_LEN)) { curtime_write(); } //如果基准时间大于当前时间 if(curtime.time>time) { curtime_write(); } else { day = get_space_day(time,curtime.time); //如果间隔时间大于DATA_DAY_MAX,重新计数 if(day>=DATA_DAY_MAX) { curtime_write(); } } } bool is_waterdata_save(uint8_t space,uint32_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min) { struct waterdata_struct waterdata; file_waterdata_read(space,hour,min,(uint8_t *)&waterdata,sizeof(waterdata)); if(waterdata.year == year && waterdata.mon == mon && waterdata.day == day && waterdata.hour == hour && waterdata.min == min) { return false; } return true; } void waterdata_write(uint32_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec) { uint8_t space = 0; uint32_t oldtime = 0; uint32_t newtime = 0; //修正基准时间,新时间会大于等于基准时间,并且小于DATA_DAY_MAX //建立在时间准确的条件下 adjust_basetime(); oldtime = get_base_time(); newtime = mktime(year,mon,day,0,0,0); min = 0; if(newtime>=oldtime) { space = get_space_day(oldtime,newtime); //如果是当前年月日,不处理。 validflag_write(year,mon,day,space); //得到时间和数据,保存。 get_waterdata(year,mon,day,hour,min); if(is_waterdata_save(space,year,mon,day,hour,min)) { file_waterdata_write(space,hour,min,(uint8_t *)&waterdata,sizeof(waterdata)); } } } //当前时间减去基准时间,得到天数 static uint8_t get_sub_day() { uint32_t year = 0; uint8_t mon = 0; uint8_t date = 0; uint32_t oldtime = get_base_time(); uint32_t newtime = get_curtime(&year,&mon,&date); uint16_t day = 0; if(newtime>oldtime) { day = get_space_day(oldtime,newtime); } return day; } //得到在i2c中的位置 uint8_t get_realday(uint8_t day) { uint8_t realday = 0; uint8_t subday = 0; //计算需要重新测试 subday = get_sub_day(); if(subday>day) { realday = subday - day-1; if(realday>DATA_DAY_MAX-1) { realday = 0; } } else { realday = DATA_DAY_MAX - 1 - (day - subday); } #ifdef DEBUG_FILEI2C HT_PRINT("总天数=%02d i2c位置=%02d 前几日=%02d\r\n",DATA_DAY_MAX,realday,day); #endif return realday; } void hb_waterdata_write(u16 count,struct waterdata_struct * waterdata) { file_waterdata_write(count,0,0,(uint8_t *)waterdata,sizeof(struct waterdata_struct)); } void hb_waterdata_read(u16 count,struct waterdata_struct * waterdata) { file_waterdata_read(count,0,0,(uint8_t *)waterdata,sizeof(struct waterdata_struct)); }