#include "file.h" #include "filedata.h" #include "general.h" //debug //调试用 #define DEBUG_TEST #ifdef DEBUG_FILEI2C #ifdef DEBUG_TEST extern uint8_t bcd_to_dec(uint8_t val); static bool is_first = false; #define uint08 uint8_t #define uint16 uint16_t #define MINUTE 60 #define HOUR (60*MINUTE) #define DAY (24*HOUR) #define YEAR (365*DAY) //判断是不是闰年 int isYunNian(int year) { if(((year%4==0) && (year%100!=0))||(year%400==0)) return 1; else return 0; } //得出从1970 到现在闰年多出来的天数 //每4年多一天,每400年少3天,但是少于400年,就要另算 int daysInYunNian(int yearsBetween,int ceturyBetween) { return (yearsBetween/4 - ((ceturyBetween)/4*3+(ceturyBetween)%4-1)); } //long型的数据只能保存六十多年的妙数不够用的,所以使用的是long long /* long long getSecondsFromNowTo1970() { long long llseconds = 0; struct tm *local; int year = 0; int mon = 0; int mday = 0; int hour = 0; int min = 0; int sec = 0; int years =0; int yunYueDays = 0; static int month[12] = { 0, DAY*(31), DAY*(31+29), DAY*(31+29+31), DAY*(31+29+31+30), DAY*(31+29+31+30+31), DAY*(31+29+31+30+31+30), DAY*(31+29+31+30+31+30+31), DAY*(31+29+31+30+31+30+31+31), DAY*(31+29+31+30+31+30+31+31+30), DAY*(31+29+31+30+31+30+31+31+30+31), DAY*(31+29+31+30+31+30+31+31+30+31+30) }; time_t t; t=time(NULL); local=localtime(&t); year = local->tm_year; mon = local->tm_mon; mday = local->tm_mday; hour = local->tm_hour; min = local->tm_min; sec = local->tm_sec; years = year-70; yunYueDays = daysInYunNian(years+2,((year+1900)/100 - 1970/100)); llseconds = YEAR*(long long)years + DAY*(long long)yunYueDays; llseconds += month[mon]; llseconds += DAY*(mday-1); // 再加上本月过去的天数的秒数时间。 llseconds += HOUR*hour; // 再加上当天过去的小时数的秒数时间。 llseconds += MINUTE*min; // 再加上1 小时内过去的分钟数的秒数时间。 llseconds += sec; if (mon>1 && !isYunNian(year)) llseconds -= DAY; //因为时制的问题快了八个小时要减去(北京时区) llseconds -= 8*HOUR; printf("the year of now is %d/n",local->tm_year); printf("the month of now is %d/n",local->tm_mon); printf("the mday of now is %d/n",local->tm_mday); printf("the hour of now is %d/n",local->tm_hour); printf("the sec of now is %d/n",local->tm_sec); printf("~~~~~the secs of now between 70 is %ld/n",t); printf("~~~~~the secs of now between 70 is %lld/n",llseconds); printf("__LONG_MAX__ is %ld/n",__LONG_MAX__); printf("__INT_MAX__ is %ld/n",__INT_MAX__); printf("__LONG_LONG_MAX__ is %lld/n",__LONG_LONG_MAX__); printf("DBL_MAX is %0.10lf/n",DBL_MAX); return 0; } */ /* int main() { getSecondsFromNowTo1970(); return 0; } if(realday==0) { if(COLLECT_DENSITY_15 == density) { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,DATA_DAY_MAX-1); end = hour; get_reportdata_curtime1(density,num,&value[4*(24-end)*4],0,end,realday); } else if(COLLECT_DENSITY_30 == density) { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,DATA_DAY_MAX-1); end = hour; get_reportdata_curtime1(density,num,&value[2*(24-end)*4],0,end,realday); } else { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,DATA_DAY_MAX-1); end = hour; get_reportdata_curtime1(density,num,&value[(24-end)*4],0,end,realday); } } else { if(hour == 0) { //0点 realday = realday - 1; get_reportdata_curtime1(density,num,value,0,24,realday); } else { if(COLLECT_DENSITY_15 == density) { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,realday-1); end = hour; get_reportdata_curtime1(density,num,&value[4*(24-end)*4],0,end,realday); } else if(COLLECT_DENSITY_30 == density) { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,realday-1); end = hour; get_reportdata_curtime1(density,num,&value[2*(24-end)*4],0,end,realday); } else { begin=hour; get_reportdata_curtime1(density,num,value,begin,24,realday-1); end = hour; get_reportdata_curtime1(density,num,&value[(24-end)*4],0,end,realday); } } } */ /* void get_reportdata(uint8_t day,uint8_t density,uint8_t * num,uint8_t *value) { uint8_t realday = 0; uint8_t valid = 0; uint32_t year = 0; uint8_t mon = 0; uint8_t date = 0; struct waterdata_struct waterdata; realday = get_realday(day); validflag_read(realday); valid = get_validflag(); year = get_validyear(); mon = get_validmon(); date = get_validday(); #ifdef DEBUG_FILEI2C HT_PRINT("存储有效时间 %05d:%02d:%02d 上几天=%02d 实际天数空间存储位置=%02d\r\n",year,mon,date,day,realday); //return; #endif if(COLLECT_DENSITY_30 == density) { for(uint8_t i=0; i<24; i++) { file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C uint8_t * buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); value = value + 4; * num = * num + 1; } memset((uint8_t *)&waterdata,0,sizeof(waterdata)); file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); value = value + 4; * num = * num + 1; } } } else { for(uint8_t i=0; i<24; i++) { file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C uint8_t * buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); value = value + 4; * num = * num + 1; } } } } */ /* void get_reportdata(uint8_t day,uint8_t density,uint8_t * num,uint8_t *value) { uint8_t realday = 0; uint8_t valid = 0; uint32_t year = 0; uint8_t mon = 0; uint8_t date = 0; struct waterdata_struct waterdata; realday = get_realday(day); validflag_read(realday); valid = get_validflag(); year = get_validyear(); mon = get_validmon(); date = get_validday(); #ifdef DEBUG_FILEI2C HT_PRINT("存储有效时间 %05d:%02d:%02d 上几天=%02d 实际天数空间存储位置=%02d\r\n",year,mon,date,day,realday); //return; #endif if(COLLECT_DENSITY_30 == density) { for(uint8_t i=0; i<24; i++) { file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C uint8_t * buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); } else { memset(value,0xEE,4); } value = value + 4; memset((uint8_t *)&waterdata,0,sizeof(waterdata)); file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); } else { memset(value,0xEE,4); } value = value + 4; } * num = 48; } else { for(uint8_t i=0; i<24; i++) { file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata)); #ifdef DEBUG_FILEI2C uint8_t * buf = (uint8_t*)&waterdata; HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d valid=%02x forwarddata=%02x%02x%02x%02x reversedata=%02x%02x%02x%02x status=%02x%02x\r\n",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour,waterdata.min,i,day,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10]); #endif if(waterdata.invalid == valid && waterdata.crc == get_ck((uint8_t*)&waterdata.invalid,WATERDATA_LEN) && waterdata.year == year && waterdata.mon == mon && waterdata.day == date) { get_one_reportdata(value,&waterdata); } else { memset(value,0xEE,4); } value = value + 4; } * num = 24; } } */ /* //在此时间之后的30天 void curtime_read() { uint32_t year = 0; uint8_t mon = 0; uint8_t date = 0; uint8_t day = 0; uint32_t 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(); } } } */ #ifdef REPORT_REALDATA void get_reportdata_mask(uint8_t year,uint8_t mon,uint8_t day,uint8_t density,uint8_t * num,uint8_t *value) { uint8_t realday = 0; uint8_t valid = 0; uint32_t tmpyear = 0; uint8_t tmpmon = 0; uint8_t tmpday = 0; bool find = false; struct waterdata_struct waterdata; year = year + DEC_YEAR; for(uint8_t i=0; i