河北水利局项目

This commit is contained in:
2025-12-15 16:07:49 +08:00
commit f11a7c2b95
1146 changed files with 452892 additions and 0 deletions

280
filedata/filedata.c Normal file
View File

@@ -0,0 +1,280 @@
#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));
}

127
filedata/filedata.h Normal file
View File

@@ -0,0 +1,127 @@
#ifndef __FILEDATA_H
#define __FILEDATA_H
#define DEBUG_FILEI2C
#define IIC_WATEPLUS_ADDR (1)
#define IIC_CUR_TIME_ADDR (1024)
#define IIC_WATERDATA_ADDR (10) //存放数据是否有效
#define IIC_DAYDATA_ADDR (2048) //每日数据存放空间
#define IIC_PAGE_NUM (128)
#define DATA_VALID_AA (0xAA)
#define DATA_DAY_MAX (30)
#define WATERDATA_LEN (31)
#define CUR_TIME_LEN (13)
#define VALID_DATA_LEN (7)
#define DEC_YEAR (2000-1900)
#define CUR_YEAR (121)
#define uint8_t u8
#define uint16_t u16
#define uint32_t u32
#define HT_PRINT printf
#define COLLECT_DENSITY_15 (1) //15分钟
#define COLLECT_DENSITY_30 (2) //30分钟
#define COLLECT_DENSITY_60 (3) //一小时
#pragma pack(1)
struct waterdata_struct
{
uint8_t invalid; //是否有效, 1
uint8_t current[5]; //取水口流量 5
uint8_t sum[5]; //取水口累计流量 5
uint8_t surplus[6]; //水表1剩余水量 6
u8 ala[4]; //遥测状态及报警信息 4
u8 vol[2]; //蓄电池电压 2
u8 csq; //信号强度CSQ 1
uint32_t year; // 4
uint8_t mon; // 1
uint8_t day; // 1
uint8_t hour; // 1
uint8_t min; // 1
uint8_t crc;
};
struct curtime_struct
{
uint32_t time; //当天时间 秒数
uint32_t year;
uint8_t mon;
uint8_t day;
uint8_t hour;
uint8_t min;
uint8_t sec;
uint8_t crc;
};
struct valid_struct
{
uint8_t valid; //当天数据是否有效
uint32_t year;
uint8_t mon;
uint8_t day;
uint8_t crc;
};
/* Exported types ------------------------------------------------------------*/
typedef struct
{
uint8_t Year; /*!<RTC 年*/
uint8_t Month; /*!<RTC 月*/
uint8_t Date; /*!<RTC 日*/
uint8_t Hour; /*!<RTC 时*/
uint8_t Minute; /*!<RTC 分*/
uint8_t Second; /*!<RTC 秒*/
uint8_t Week; /*!<RTC 周*/
}RTC_TimeDateTypeDef,RTC_StampTmieTypeDef;
#pragma pack()
void file_write_delay();
void file_i2c_write(uint32_t addr,uint8_t * buf,uint16_t len);
void file_i2c_read(uint32_t addr,uint8_t * buf,uint16_t len);
uint8_t get_ck(uint8_t *val, uint16_t len);
uint8_t get_period_day();
uint32_t get_curtime();
void file_curtime_write(uint8_t * buf,uint8_t len);
void file_curtime_read(uint8_t * buf,uint8_t len);
void file_validflag_write(uint8_t day,uint8_t * buf,uint8_t len);
void file_validflag_read(uint8_t day,uint8_t * buf,uint8_t len);
void validflag_read(uint8_t day);
void validflag_write(uint32_t year,uint8_t mon,uint8_t date,uint8_t day);
uint8_t get_validflag();
uint32_t get_validyear();
uint8_t get_validmon();
uint8_t get_validday();
uint8_t get_realday(uint8_t day);
void file_waterdata_write(uint8_t day,uint8_t hour,uint8_t min,uint8_t * buf,uint16_t len);
void file_waterdata_read(uint8_t day,uint8_t hour,uint8_t min,uint8_t * buf,uint16_t len);
void get_complete_curtime(uint32_t *curyear,uint8_t *curmon,uint8_t *curday,uint8_t *curhour,uint8_t *curmin);
uint8_t bcd_to_dec(uint8_t val);
uint8_t get_space_day(uint32_t oldtime,uint32_t newtime);
unsigned long mktime (unsigned int year, unsigned int mon,
unsigned int day, unsigned int hour,
unsigned int min, unsigned int sec);
void waterdata_write(uint32_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec);
#define IIC_DATA_ADDR (4096*4)
#define WATERDATA_ONE_LEN (sizeof(struct waterdata_struct))
#endif

846
filedata/filedatadebug.c Normal file
View File

@@ -0,0 +1,846 @@
#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<DATA_DAY_MAX; i++)
{
validflag_read(i);
valid = get_validflag();
tmpyear = get_validyear();
tmpmon = get_validmon();
tmpday = get_validday();
if(tmpyear == year && tmpmon == mon && tmpday == day)
{
realday = i;
find = true;
break;
}
}
if(!find)
{
* num = 0;
return;
}
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 == day)
{
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 == day)
{
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 == day)
{
get_one_reportdata(value,&waterdata);
value = value + 4;
* num = * num + 1;
}
}
}
}
#else
#endif
#endif
/*
#define DEVICE_EE256 0xa0 //FM24C256的器件地址
#define ADDRLEN_EE256 2 //FM24C256的数据地址长度为2字节
#define LEN_MAX (1)
uint08 Test_I2C1(void)
{
uint08 Device = DEVICE_EE256;
uint16 Addr;
uint08 AddrLen = ADDRLEN_EE256;
uint08 Buf[64];
uint08 Len = 16;
uint08 Result = 0;
uint08 TestData[LEN_MAX] = {0};
memset(TestData,0x66,LEN_MAX);
IWDT_Clr(); //清系统看门狗
Addr = 8;
Len = 16;
for(uint16 j = 0;j<100;j++)
{
//memset(Buf, 0, 64);
//Result = I2C_Read_Bottom(Device, Addr, AddrLen, Buf, Len);//读ee测试
memset(Buf, 0x55, 64);
memcpy(Buf, TestData, 8);
Result = I2C_Write_Bottom(Device, Addr+j*LEN_MAX, AddrLen, Buf, LEN_MAX);//写ee测试
memset(Buf, 0, 64);
Result = I2C_Read_Bottom(Device, Addr+j*LEN_MAX, AddrLen, Buf, LEN_MAX);//读ee测试
if(0 != memcmp(Buf,TestData,LEN_MAX))
{
uint16 k = 0;
}
}
uint16 kkk = 0;
IWDT_Clr(); //清系统看门狗
return Result;
}
*/
long kernel_mktimeday()
{
unsigned long oldtime = mktime(2021-1900,2,27,0,0,0);
unsigned long newtime = mktime(2021-1900,3,1,0,0,0);
unsigned long day = get_space_day(oldtime,newtime);;
HT_PRINT("day = %02d \r\n",day);
return day;
}
#define DEVICE_EE256 0xa0 //FM24C256的器件地址
//#define DEVICE_EE256 0xa1 //FM24C256的器件地址
#define ADDRLEN_EE256 2 //FM24C256的数据地址长度为2字节
#define LEN_MAX (1)
#if 0
uint08 Buf[64];
uint08 Test_I2C1(void)
{
I2C_Init();
uint08 Device = DEVICE_EE256;
uint16 Addr;
uint08 AddrLen = 2;//ADDRLEN_EE256;
uint08 Len = 16;
uint08 Result = 0;
uint08 TestData[LEN_MAX] = {0};
memset(TestData,0x77,LEN_MAX);
IWDT_Clr(); //清系统看门狗
Addr = 8;
Len = 16;
for(uint16 j = 0;j<1024;j++)
{
//memset(Buf, 0, 64);
//Result = I2C_Read_Bottom(Device, Addr, AddrLen, Buf, Len);//读ee测试
memset(Buf, 0x55, 64);
memcpy(Buf, TestData, 8);
Result = I2C_Write_Bottom(0xa0, Addr+j*LEN_MAX, AddrLen, Buf, LEN_MAX);//写ee测试
if(1 == Result)
{
uint16 k = 0;
}
//I2C_Init();
//HT_PRINT("index=============================\r\n");
vTaskDelay(3/ portTICK_PERIOD_MS);
memset(Buf, 0, 64);
Result = I2C_Read_Bottom(0xa0, Addr+j*LEN_MAX, AddrLen, Buf, LEN_MAX);//读ee测试
if(1 == Result)
{
uint16 k = 0;
}
if(0 != memcmp(Buf,TestData,LEN_MAX))
{
uint16 k = 0;
}
}
uint16 kkk = 0;
IWDT_Clr(); //清系统看门狗
return Result;
}
#endif
static uint8_t value[128];
void testwritebasetime()
{
RTC_TimeDateTypeDef rtctime;
uint32_t year = 0;
uint8_t mon = 0;
uint8_t day = 0;
uint8_t hour = 0;
uint8_t min = 0;
uint8_t sec = 0;
year = bcd_to_dec(rtctime.Year) + DEC_YEAR;
mon = bcd_to_dec(rtctime.Month);
day = bcd_to_dec(rtctime.Date);
hour = bcd_to_dec(rtctime.Hour);
min = bcd_to_dec(rtctime.Minute);
sec = bcd_to_dec(rtctime.Second);
waterdata_write(year,mon,day,hour,min,sec);
}
#define EEPROM_TEST_LEN (127)
void fillvalue()
{
for(int i = 0;i<EEPROM_TEST_LEN;i++)
{
value[i] = i%10;
}
}
void i2ctest()
{
uint8_t tmpvalue[EEPROM_TEST_LEN];
for(int i = 0;i<2000;i++)
{
fillvalue();
file_i2c_write(IIC_DATA_ADDR+i*EEPROM_TEST_LEN,value,EEPROM_TEST_LEN);
memset(tmpvalue,0,sizeof(tmpvalue));
file_i2c_read(IIC_DATA_ADDR+i*EEPROM_TEST_LEN,tmpvalue,EEPROM_TEST_LEN);
if(0 != memcmp(value,tmpvalue,EEPROM_TEST_LEN))
{
HT_PRINT("*** eeprom write read fail ***\r\n");
}
}
}
void debug_reportdata()
{
uint8_t number = 0;
if(is_first == false)
{
is_first = true;
uint32_t year = 21+DEC_YEAR;
uint8_t mon = 1;
uint8_t day = 1;
uint8_t hour = 0;
uint8_t min = 0;
uint8_t sec = 0;
HT_PRINT("*** 写入 ***\r\n");
#if 1
for(int i=0;i<DATA_COUNT_MAX/24;i++)
{
HT_PRINT("*** 写入 i=%d ***\r\n",i);
for(int j = 0;j<24;j++)
{
//年 月 日 时 分
/*
struct waterdata_struct
{
uint8_t invalid; //是否有效, 1
uint8_t rpsucess; //上报是否成功。 1
uint8_t current[5]; //取水口流量 5
uint8_t sum[4]; //取水口累计流量 5
uint8_t surplus[6]; //水表1剩余水量 6
u8 ala[4]; //遥测状态及报警信息 4
u8 vol[2]; //蓄电池电压 2
u8 csq; //信号强度CSQ 1
uint32_t year; // 4
uint8_t mon; // 1
uint8_t day; // 1
uint8_t hour; // 1
uint8_t min; // 1
uint8_t crc;
};
*/
struct waterdata_struct waterdata;
memset(&waterdata,0,sizeof(waterdata));
waterdata.invalid = 0xAA;
waterdata.current[0] = i;
waterdata.current[1] = i;
waterdata.current[2] = i;
waterdata.current[3] = i;
waterdata.current[4] = i;
waterdata.sum[0] = j;
waterdata.sum[1] = j;
waterdata.sum[2] = j;
waterdata.sum[3] = j;
waterdata.surplus[0] = j;
waterdata.surplus[1] = j;
waterdata.surplus[2] = j;
waterdata.surplus[3] = j;
waterdata.surplus[4] = j;
waterdata.surplus[5] = j;
u16 count = 0;
count = i*24 + j;
waterdata.crc= GetSum(&(waterdata.invalid),WATERDATA_LEN);
hb_waterdata_write(count,&waterdata,sizeof(waterdata));
// hb_waterdata_write(count,
//waterdata_write(year,mon,i,j,min,sec);
//void hb_waterdata_write(u16 count,struct uint8_t * buf,uint16_t len)
}
}
HT_PRINT("*** 读取 ***\r\n");
//void file_waterdata_read(uint8_t day,uint8_t hour,uint8_t min,uint8_t * buf,uint16_t len)
for(int i=0;i<DATA_COUNT_MAX/24;i++)
{
HT_PRINT("*** 读取 *** i=%d \r\n",i);
for(int j = 0;j<24;j++)
{
u16 count = 0;
count = i*24 + j;
struct waterdata_struct waterdata;
memset(&waterdata,0,sizeof(waterdata));
hb_waterdata_read(count,&waterdata,sizeof(waterdata));
//file_waterdata_read(i,j,0,value,sizeof(struct waterdata_struct));
//void hb_waterdata_read(u16 count,struct uint8_t * buf,uint16_t len)
}
}
#endif
#if 0
HT_PRINT("*** 得到上报数据 *** 中间修改历史时间?\r\n");
for(uint16_t i = 0;i<30;i++)
{
memset(value,0,sizeof(value));
get_reportdata(i,COLLECT_DENSITY_30,&number,value);
HT_PRINT("number = %d\r\n",number);
for(uint16_t j = 0;j<48;j++)
{
uint8_t * p = value;
HT_PRINT("number = %02d %02x%02x%02x%02x\r\n",j,value[0+j*4],value[1+j*4],value[2+j*4],value[3+j*4]);
}
}
#endif
HT_PRINT("*** 得到上报数据 *** 中间修改历史时间?\r\n");
#if 0
for(uint16_t i = 1;i<31;i++)
{
HT_PRINT("\r\n i = %d\r\n",i);
memset(value,0,sizeof(value));
//get_reportdata_mask(18,1,i,COLLECT_DENSITY_30,&number,value);
get_reportdata_maskhour(18,1,i,23,COLLECT_DENSITY_30,&number,value);
for(uint16_t j = 0;j<number;j++)
{
uint8_t * p = value;
HT_PRINT("number = %02d %02x%02x%02x%02x\r\n",j,value[0+j*4],value[1+j*4],value[2+j*4],value[3+j*4]);
}
}
#endif
#if 0
RTC_TimeDateTypeDef TempTime;
uint8_t InitTime[] = {0x18, 0x01, 0x30, 0x02, 0x02, 0x03, 0x01};
comm_memcpy((uint8_t*)(&TempTime), InitTime, 7);
rtc_setRTC((&TempTime));
// for(uint16_t i = 0;i<30;i++)
{
memset(value,0,sizeof(value));
//get_reportdata(i,COLLECT_DENSITY_30,&number,value);
get_reportdata_curtime(COLLECT_DENSITY_15,&number,value);
HT_PRINT("number = %d\r\n",number);
for(uint16_t j = 0;j<number;j++)
{
uint8_t * p = value;
HT_PRINT("number = %02d %02x%02x%02x%02x\r\n",j,value[0+j*4],value[1+j*4],value[2+j*4],value[3+j*4]);
}
}
#endif
}
}
#endif

19
filedata/filedatawr.c Normal file
View File

@@ -0,0 +1,19 @@
#include "file.h"
#include "filedata.h"
extern bool I2C_eeprom_write_buf(u16 startAddr, u8 * buf, u16 length);
extern bool I2C_eeprom_read_buf(u16 addr, u8 * buf, u16 length);
extern void waterdata_printf(struct waterdata_struct * waterdata);
void file_curtime_write(uint8_t * buf,uint8_t len)
{
I2C_eeprom_write_buf(IIC_CUR_TIME_ADDR,buf,len);
}
void file_curtime_read(uint8_t * buf,uint8_t len)
{
I2C_eeprom_read_buf(IIC_CUR_TIME_ADDR,buf,len);
}

112
filedata/fileidatatime.c Normal file
View File

@@ -0,0 +1,112 @@
#include "file.h"
#include "filedata.h"
#include "rtc_ext.h"
//include/linux/time.h
//内核中的mktime()函数位于kernel/time.c内
uint8_t rtc_getRTC(RTC_TimeDateTypeDef* para)
{
uint8_t Result = 1;
st_rtc_ext TempTime1;
read_rtc_time(&TempTime1);//读一次时间
Result = 0;
para->Year = TempTime1.year;
para->Month = TempTime1.month;
para->Date = TempTime1.day;
para->Hour = TempTime1.hour;
para->Minute = TempTime1.min;
para->Second = TempTime1.sec;
para->Week = TempTime1.week;
return Result;
}
unsigned long mktime (unsigned int year, unsigned int mon,
unsigned int day, unsigned int hour,
unsigned int min, unsigned int sec)
{
if (0 >= (int) (mon -= 2)) { /* 1..12 -> 11,12,1..10 */
mon += 12; /* Puts Feb last since it has leap day */
year -= 1;
}
return (((
(unsigned long) (year/4 - year/100 + year/400 + 367*mon/12 + day) +
year*365 - 719499
)*24 + hour /* now have hours */
)*60 + min /* now have minutes */
)*60 + sec; /* finally seconds */
}
uint8_t bcd_to_dec(uint8_t val)
{
return ((((val)>>4)*10) + ((val)&0x0F));
}
uint8_t get_space_day(uint32_t oldtime,uint32_t newtime)
{
uint8_t day = 0;
if(newtime>oldtime)
{
day = (newtime - oldtime)/(3600*24);
}
return day;
}
uint32_t get_curtime(uint8_t *curyear,uint8_t *curmon,uint8_t *curday)
{
RTC_TimeDateTypeDef rtctime;
uint32_t time = 0;
uint32_t year = 0;
uint8_t mon = 0;
uint8_t day = 0;
rtc_getRTC(&rtctime);
year = bcd_to_dec(rtctime.Year);
mon = bcd_to_dec(rtctime.Month);
day = bcd_to_dec(rtctime.Date);
year = year + DEC_YEAR;
time = mktime(year,mon,day,0,0,0);
*curyear = year;
*curmon = mon;
*curday = day;
#ifdef DEBUG_FILEI2C
HT_PRINT("time = %d year = %d mon = %d day = %d\r\n",time,year,mon,day);
#endif
return time;
}
void get_complete_curtime(uint32_t *curyear,uint8_t *curmon,uint8_t *curday,uint8_t *curhour,uint8_t *curmin)
{
RTC_TimeDateTypeDef rtctime;
uint32_t year = 0;
uint8_t mon = 0;
uint8_t day = 0;
uint8_t hour = 0;
uint8_t min = 0;
rtc_getRTC(&rtctime);
year = bcd_to_dec(rtctime.Year);
mon = bcd_to_dec(rtctime.Month);
day = bcd_to_dec(rtctime.Date);
hour = bcd_to_dec(rtctime.Hour);
min = bcd_to_dec(rtctime.Minute);
year = year + DEC_YEAR;
*curyear = year;
*curmon = mon;
*curday = day;
*curhour = hour;
*curmin = min;
}

400
filedata/filereportdata.c Normal file
View File

@@ -0,0 +1,400 @@
#include "file.h"
#include "filedata.h"
static uint32_t get_meter_data(uint32_t pluseCounter,uint32_t reversepluseCounter)
{
return 0;
}
static void get_one_reportdata(uint8_t * val,struct waterdata_struct * waterdata)
{
}
static void curtime_printf(struct waterdata_struct * waterdata,uint8_t day,uint8_t i)
{
#ifdef DEBUG_FILEI2C
HT_PRINT("reportdata %04d/%02d/%02d %02d:%02d:00 cnt = %02d day=%02d ",
waterdata->year,waterdata->mon,waterdata->day,waterdata->hour,waterdata->min,
i,day);
waterdata_printf(waterdata);
#endif
}
static bool is_waterdata_cmp(struct waterdata_struct * waterdata,uint8_t year,uint8_t mon,uint8_t day,uint8_t valid)
{
uint8_t ck = get_ck((uint8_t*)&waterdata->invalid,WATERDATA_LEN);
if(waterdata->invalid == valid && waterdata->crc == ck && waterdata->year == year && waterdata->mon == mon && waterdata->day == day)
{
if(waterdata->year>=CUR_YEAR && waterdata->year!=0xFF)
{
return true;
}
}
return false;
}
void get_waterdata(struct waterdata_struct * waterdata,uint8_t year,uint8_t mon,uint8_t day,uint8_t valid,uint8_t * value)
{
if(is_waterdata_cmp(waterdata,year,mon,day,valid))
{
get_one_reportdata(value,waterdata);
}
else
{
memset(value,0xEE,4);
}
#ifdef DEBUG_FILEI2C
HT_PRINT("[data=%02x%02x%02x%02x]\r\n",value[0],value[1],value[2],value[3]);
#endif
}
void get_waterdata_spacetime(struct waterdata_struct * waterdata,uint8_t year,uint8_t mon,uint8_t day,uint8_t valid,uint8_t * value)
{
uint32_t tmpyear = 0;
uint8_t tmpmon = 0;
uint8_t tmpday = 0;
uint8_t tmphour = 0;
uint8_t tmpmin = 0;
uint8_t spaceday = DATA_DAY_MAX;
uint32_t newtime = 0;
uint32_t oldtime = 0;
get_complete_curtime(&tmpyear,&tmpmon,&tmpday,&tmphour,&tmpmin);
newtime = mktime(tmpyear,tmpmon,tmpday,0,0,0);
oldtime = mktime(year,mon,day,0,0,0);
if(newtime>=oldtime)
{
spaceday = get_space_day(oldtime,newtime);
}
if(is_waterdata_cmp(waterdata,year,mon,day,valid)&& spaceday<=1)
{
get_one_reportdata(value,waterdata);
}
else
{
memset(value,0xEE,4);
}
#ifdef DEBUG_FILEI2C
HT_PRINT("[spaceday=%d] oldtime=%d newtime=%d [data=%02x%02x%02x%02x] \r\n",spaceday,oldtime,newtime,value[0],value[1],value[2],value[3]);
#endif
}
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<DATA_DAY_MAX; i++)
{
validflag_read(i);
valid = get_validflag();
tmpyear = get_validyear();
tmpmon = get_validmon();
tmpday = get_validday();
if(tmpyear == year && tmpmon == mon && tmpday == day)
{
realday = i;
find = true;
break;
}
}
if(!find)
{
* num = 0;
return;
}
if(density > COLLECT_DENSITY_60)
{
density = COLLECT_DENSITY_30;
}
if(COLLECT_DENSITY_15 == density)
{
for(uint8_t i=0; i<24; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,15,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,45,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 96;
}
else if(COLLECT_DENSITY_30 == density)
{
for(uint8_t i=0; i<24; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 48;
}
else
{
for(uint8_t i=0; i<24; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 24;
}
}
//得到当前时间之前24小时数据
static void get_reportdata_curtime1(uint8_t density,uint8_t * num,uint8_t *value,uint8_t begin,uint8_t end,uint8_t realday)
{
struct waterdata_struct waterdata;
uint8_t valid = 0;
uint32_t year = 0;
uint8_t mon = 0;
uint8_t day = 0;
validflag_read(realday);
valid = get_validflag();
year = get_validyear();
mon = get_validmon();
day = get_validday();
if(COLLECT_DENSITY_15 == density)
{
for(uint8_t i=begin; i<end; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,15,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,45,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 96;
}
else if(COLLECT_DENSITY_30 == density)
{
for(uint8_t i=begin; i<end; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,30,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 48;
}
else
{
for(uint8_t i=begin; i<end; i++)
{
memset((uint8_t *)&waterdata,0,sizeof(waterdata));
file_waterdata_read(realday,i,0,(uint8_t *)&waterdata,sizeof(waterdata));
curtime_printf(&waterdata,day,i);
get_waterdata_spacetime(&waterdata,year,mon,day,valid,value);
value = value + 4;
}
* num = 24;
}
}
void get_reportdata_curtime2(uint8_t realday,uint8_t hour,uint8_t density,uint8_t * num,uint8_t *value)
{
uint8_t begin = 0;
uint8_t end = 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_maskhour(uint8_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t density,uint8_t * num,uint8_t *value)
{
uint8_t realday = 0;
uint32_t tmpyear = 0;
uint8_t tmpmon = 0;
uint8_t tmpday = 0;
bool find = false;
year = year + DEC_YEAR;
for(uint8_t i=0; i<DATA_DAY_MAX; i++)
{
validflag_read(i);
tmpyear = get_validyear();
tmpmon = get_validmon();
tmpday = get_validday();
if(tmpyear == year && tmpmon == mon && tmpday == day)
{
realday = i;
find = true;
break;
}
}
if(!find)
{
* num = 0;
return;
}
if(density > COLLECT_DENSITY_60)
{
density = COLLECT_DENSITY_30;
}
get_reportdata_curtime2(realday,hour,density,num,value);
}
void get_reportdata_curtime(uint8_t density,uint8_t * num,uint8_t *value)
{
uint32_t year = 0;
uint8_t mon = 0;
uint8_t day = 0;
uint8_t hour = 0;
uint8_t min = 0;
uint8_t realday = 0;
uint32_t tmpyear = 0;
uint8_t tmpmon = 0;
uint8_t tmpday = 0;
bool find = false;
get_complete_curtime(&year,&mon,&day,&hour,&min);
for(uint8_t i=0; i<DATA_DAY_MAX; i++)
{
validflag_read(i);
tmpyear = get_validyear();
tmpmon = get_validmon();
tmpday = get_validday();
if(tmpyear == year && tmpmon == mon && tmpday == day)
{
realday = i;
find = true;
break;
}
}
if(!find)
{
* num = 0;
return;
}
if(density > COLLECT_DENSITY_60)
{
density = COLLECT_DENSITY_30;
}
get_reportdata_curtime2(realday,hour,density,num,value);
}

119
filedata/hbfile.c Normal file
View File

@@ -0,0 +1,119 @@
#include "file.h"
#include "filedata.h"
#include "General.h"
#include "Mem.h"
extern u8 GetSum(u8 * buffer, u16 length);
extern bool I2C_eeprom_write_buf(u16 startAddr, u8 * buf, u16 length);
extern bool I2C_eeprom_read_buf(u16 addr, u8 * buf, u16 length);
void waterdata_printf(struct waterdata_struct * waterdata);
void hb_waterdata_write(u16 count,uint8_t * buf,uint16_t len)
{
if(count<DATA_COUNT_MAX)
{
uint32_t datapos =IIC_DATA_ADDR+WATERDATA_ONE_LEN*(count);
I2C_eeprom_write_buf(datapos,(uint8_t *)buf, len);
#ifdef DEBUG_FILEI2C
uint8_t Buf[64];
struct waterdata_struct * waterdata = (struct waterdata_struct *)buf;
HT_PRINT("--->%05d count=%04d ",datapos,count);
waterdata_printf(waterdata);
memset(Buf, 0, 64);
I2C_eeprom_read_buf(datapos,(uint8_t *)Buf, len);
HT_PRINT("<---%05d count=%04d ",datapos,count);
waterdata_printf(waterdata);
if(0 !=memcmp(buf,Buf,len))
{
HT_PRINT("!!!file_waterdata_write error\r\n");
}
#endif
}
}
void hb_waterdata_read(u16 count,uint8_t * buf,uint16_t len)
{
if(count<DATA_COUNT_MAX)
{
uint32_t datapos =IIC_DATA_ADDR+WATERDATA_ONE_LEN*(count);
I2C_eeprom_read_buf(datapos,(uint8_t *)buf, len);
#ifdef DEBUG_FILEI2C
struct waterdata_struct * waterdata = (struct waterdata_struct *)buf;
HT_PRINT("waterdata_read addr=%05d day=%04d ",datapos,count);
waterdata_printf(waterdata);
#endif
}
}
void hb_waterdata_one_write(u16 index,u8 * sumdata,u8 year,u8 month,u8 day,u8 hour)
{
struct waterdata_struct waterdata;
memset(&waterdata,0,sizeof(waterdata));
waterdata.year = year;
waterdata.mon = month;
waterdata.day = day;
waterdata.hour = hour;
MemCpy(waterdata.sum,sumdata,SUM_DATA_LEN);
waterdata.crc = GetSum((uint8_t*)&waterdata.invalid,WATERDATA_LEN);
hb_waterdata_write(index,(uint8_t *)&waterdata, sizeof(waterdata));
}
void waterdata_printf(struct waterdata_struct * waterdata)
{
#ifdef DEBUG_FILEI2C
uint8_t ck = 0;
ck = GetSum((uint8_t*)&waterdata->invalid,WATERDATA_LEN);
HT_PRINT("valid=%02x ",waterdata->invalid);
HT_PRINT("current=%02x%02x%02x%02x%02x ",waterdata->current[0],waterdata->current[1],waterdata->current[2],waterdata->current[3],waterdata->current[4]);//取水口流量 5
HT_PRINT("sum=%02x%02x%02x%02x%02x ",waterdata->sum[0],waterdata->sum[1],waterdata->sum[2],waterdata->sum[3],waterdata->sum[4]);//取水口累计流量 5
HT_PRINT("surplus=%02x%02x%02x%02x%02x%02x ",waterdata->surplus[0],waterdata->surplus[1],waterdata->surplus[2],waterdata->surplus[3],waterdata->surplus[4],waterdata->surplus[5]);//水表1剩余水量 6
HT_PRINT("ala=%02x%02x%02x%02x ",waterdata->ala[0],waterdata->ala[1],waterdata->ala[2],waterdata->ala[3]);//遥测状态及报警信息 4
HT_PRINT("vol=%02x%02x ",waterdata->vol[0],waterdata->vol[1]);//蓄电池电压 2
HT_PRINT("csq=%02x ",waterdata->csq);//csq信号强度 1
HT_PRINT("time=%02x-%02x-%02x %02x ",waterdata->year,waterdata->mon,waterdata->day,waterdata->hour);//csq信号强度 1
HT_PRINT("ck1=%02x ck2=%02x\r\n",waterdata->crc,ck);
#endif
}
void data_printf()
{
struct waterdata_struct waterdata;
printf("\r\n计数 有效 流量 累计 剩余 状态 电压 CSQ信号强度 年月日时 校验\r\n");
for(u16 i = 0;i<DATA_COUNT_MAX;i++)
{
uint32_t datapos =IIC_DATA_ADDR+WATERDATA_ONE_LEN*(i);
I2C_eeprom_read_buf(datapos,(uint8_t *)&waterdata, sizeof(waterdata));
uint8_t ck = 0;
ck = GetSum((uint8_t*)&waterdata.invalid,WATERDATA_LEN);
HT_PRINT("%04d ",i+1);
HT_PRINT("%02x ",waterdata.invalid);
HT_PRINT("%02x%02x%02x%02x%02x ",waterdata.current[0],waterdata.current[1],waterdata.current[2],waterdata.current[3],waterdata.current[4]);//取水口流量 5
HT_PRINT("%02x%02x%02x%02x%02x ",waterdata.sum[0],waterdata.sum[1],waterdata.sum[2],waterdata.sum[3],waterdata.sum[4]);//取水口累计流量 5
HT_PRINT("%02x%02x%02x%02x%02x%02x ",waterdata.surplus[0],waterdata.surplus[1],waterdata.surplus[2],waterdata.surplus[3],waterdata.surplus[4],waterdata.surplus[5]);//水表1剩余水量 6
HT_PRINT("%02x%02x%02x%02x ",waterdata.ala[0],waterdata.ala[1],waterdata.ala[2],waterdata.ala[3]);//遥测状态及报警信息 4
HT_PRINT("%02x%02x ",waterdata.vol[0],waterdata.vol[1]);//蓄电池电压 2
HT_PRINT("%02x ",waterdata.csq);//csq信号强度 1
HT_PRINT("%02x-%02x-%02x %02x ",waterdata.year,waterdata.mon,waterdata.day,waterdata.hour);//csq信号强度
if(waterdata.crc==ck)
{
HT_PRINT("%02x=%02x\r\n",waterdata.crc,ck);
}
else
{
HT_PRINT("%02x!=%02x error!\r\n",waterdata.crc,ck);
}
}
}