| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- /******************************************************************************
- 版权所有: 珠海欧力配网自动化股份有限公司
- 文件名称: file_led.c
- 文件版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020-03-13
- 功能说明: 故障指示灯记忆文件
- 其它说明:
- 修改记录:
- */
- /*------------------------------- 头文件 --------------------------------------
- */
- #include "head.h"
-
- /*------------------------------- 宏定义 --------------------------------------
- */
- /*------------------------------ 类型结构 -------------------------------------
- */
- /*------------------------------ 全局变量 -------------------------------------
- */
- u32 g_file_led_sign;
- struct file_led_res *g_file_led_read;
- struct file_led_res g_file_led_write[SWITCH_NUM_MAX];
- struct file *file_led_handle; // 故障LED状态bin文件句柄
- /*------------------------------ 局部变量 -------------------------------------
- */
- // 文件CRC校验
- u16 g_crc_file_led_res;
- /*------------------------------ 函数声明 -------------------------------------
- */
- static int _file_led_init(void);
- static int _file_led_creat(void);
- static int _file_led_write(void);
- /*------------------------------ 外部函数 -------------------------------------
- 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
- */
- /******************************************************************************
- 函数名称: file_led_init
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 故障LED状态系统初始化
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int file_led_init(void)
- {
- int i;
- unsigned long us,us0;
- i = _file_led_init();
- if (i != 0)
- {
- rt_printf("iret = %d\r\n", i);
- rt_file_del("/app/data/file_led.bin");
- us0 = ustimer_get_origin();
- i = _file_led_creat();
- us = ustimer_get_duration(us0);
- rt_printf("初始化故障LED记录文件, ret=%d, 耗时 t=%dus\r\n", i, us);
- }
- return i;
- }
- /******************************************************************************
- 函数名称: _file_led_init
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 故障LED状态初始化调用
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int _file_led_init(void)
- {
- int j;
- u32 len;
- u8 *buf;
- u8 *tmp;
- struct file_led_res_head *brh;
- loff_t pos;
- // 打开文件
- file_led_handle = rt_file_open("/app/data/file_led.bin",O_RDWR ,0655);
- if(IS_ERR(file_led_handle))
- {
- return -1;
- }
- // 得到文件长度
- // 得到文件长度
- len = rt_file_getfile_size(file_led_handle);
- if(len <= 0)
- {
- rt_file_close(file_led_handle,0);
- return -1;
- }
-
- // 分配内存
- buf = rt_malloc(len);
- if((buf) == NULL)
- {
- rt_file_close(file_led_handle,0);
- return -2;
- }
- //保存原指针,便于以后释放内存
- tmp = buf;
- // 读出内容
- pos = 0;
- if(rt_file_read(file_led_handle,buf,len,&pos) != len)
- {
- rt_file_close(file_led_handle,0);
- rt_free(buf);
- return -3;
- }
- // 检查CRC
- g_crc_file_led_res = CrcStr(buf,len-2);
- if(g_crc_file_led_res != *(u16*)(buf+len-2))
- {
- rt_free(buf);
- return -4;
- }
- // 检查文件签名
- brh = (struct file_led_res_head*)buf;
- if(brh->cfh.signature != SIG_FILE_LED_RES_FILE)
- {
- rt_free(buf);
- return -5;
- }
- // rt_printf("运行到这里....file_led_addr=%d,file_led_num=%d\r\n",brh->file_led_addr,brh->file_led_num);
- // 检查文件长度
- if(len < sizeof(*brh) + brh->file_led_num*sizeof(struct file_led_res)+ 2)
- {
- rt_free(buf);
- return -6;
- }
- // 文件头的长度写入了file_led_addr
- g_file_led_read = (struct file_led_res *)(buf + brh->file_led_addr);
- // 初始化故障LED状态结构体
- memset(g_file_led_write,0,sizeof(g_file_led_write));
- for(j=0;j<brh->file_led_num;j++)
- {
- g_file_led_write[j].led_hw=g_file_led_read[j].led_hw;
- g_file_led_write[j].led_tw=g_file_led_read[j].led_tw;
- g_file_led_write[j].led_gl=g_file_led_read[j].led_gl;
- g_file_led_write[j].led_jd=g_file_led_read[j].led_jd;
- }
- buf = tmp;
- //释放内存
- rt_free(buf);
- return 0;
- }
- /******************************************************************************
- 函数名称: file_led_exit
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 故障LED状态文件句柄退出
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int file_led_exit(void)
- {
- // 清除文件指针
- if(file_led_handle != 0)
- {
- rt_file_close(file_led_handle,0);
- file_led_handle = 0;
- }
- return 0;
- }
- /******************************************************************************
- 函数名称: _file_led_creat
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 创建LED显示灯状态文件
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int _file_led_creat(void)
- {
- unsigned int i,file_length;
- u16 crc16;
- char *p;
- loff_t pos;
- int ret;
-
- struct file_led_res_head fh;
- struct file_led_res desc;
- // 配置文件头
- memset(&fh,0,sizeof(fh));
- fh.cfh.signature = SIG_FILE_LED_RES_FILE;
- fh.cfh.version = 0X01010101;
- fh.file_led_addr = FILE_ADDR_ALGIN(sizeof(fh));
- // 故障LED状态数据容量
- fh.file_led_num = SWITCH_NUM_MAX;
- // 整个文件长度(文件头长度+数据长度)
- file_length = FILE_ADDR_ALGIN(fh.file_led_addr + fh.file_led_num * sizeof(struct file_led_res));
- // 分配并初始化空间
- p = rt_malloc(file_length + 2); //加crc长度
- if(!p)
- {
- return -1;
- }
- memset(p,0,file_length);
- // 写入文件头
- memcpy(p,(char *)&fh,sizeof(fh));
-
- // 写LED状态数据
- for(i=0; i<fh.file_led_num; i++)
- {
- memset(&desc,0,sizeof(desc));
-
- desc.led_hw = g_file_led_write[i].led_hw;
- desc.led_tw = g_file_led_write[i].led_tw;
- desc.led_gl = g_file_led_write[i].led_gl;
- // desc.led_gl = 2;
- desc.led_jd = g_file_led_write[i].led_jd;
-
- memcpy(p + fh.file_led_addr + i*sizeof(desc), (char *)&desc, sizeof(desc));
- }
- // 写入LED状态文件
- file_led_handle = rt_file_open("/app/data/file_led.bin",O_CREAT|O_RDWR|O_TRUNC,0644);
- if(IS_ERR(file_led_handle))
- {
- rt_free(p);
- return -1;
- }
- // 计算CRC
- crc16 = CrcStr(p,file_length);
- memcpy(p+file_length,&crc16,2);
-
- pos = 0;
- ret=rt_file_write(file_led_handle,p,file_length + 2,&pos);
- // 打开文件句柄程序退出前不再关闭
- // rt_file_close(file_led_handle,0);
- rt_free(p);
-
- rt_printf("led creat len=%d\r\n",ret);
- return 0;
- }
- /******************************************************************************
- 函数名称: file_led_write
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 记录LED显示灯状态
- 参数说明:
- 返回值:
- 无
- 修改记录:
- */
- void file_led_write(void)
- {
- static unsigned long us0=0;
- unsigned long us;
-
- // 标志置位延时5秒处理一次
- us = 5*USTIMER_SEC;
- if(ustimer_delay_origin2(&us0,us) != 1)
- {
- return;
- }
- if (g_file_led_sign)
- {
- _file_led_write();
- g_file_led_sign = 0;
- }
- }
- /******************************************************************************
- 函数名称: _file_led_write
- 函数版本: 01.00
- 创建作者: 赵海洋
- 创建日期: 2020年3月20日
- 函数说明: 写故障显示灯状态到LED状态文件
- 参数说明:
- 返回值:
- 0: 成功
- 其它: 失败
- 修改记录:
- */
- int _file_led_write(void)
- {
- unsigned int i,file_length;
- u16 crc16;
- char *p;
- loff_t pos;
- unsigned int ret;
-
- struct file_led_res_head fh;
- struct file_led_res desc;
- // 更新记录
- if (file_led_handle ==0)
- {
- return -1;
- }
- // 配置文件头
- memset(&fh,0,sizeof(fh));
- fh.cfh.signature = SIG_FILE_LED_RES_FILE;
- fh.cfh.version = 0X01010101;
- fh.file_led_addr = FILE_ADDR_ALGIN(sizeof(fh));
- // 故障LED状态数据容量
- fh.file_led_num = SWITCH_NUM_MAX;
- // 整个文件长度(文件头长度+数据长度)
- file_length = FILE_ADDR_ALGIN(fh.file_led_addr + fh.file_led_num * sizeof(struct file_led_res));
- // 分配并初始化空间
- p = rt_malloc(file_length + 2); //加crc长度
- if(!p)
- {
- return -2;
- }
- memset(p,0,file_length);
- // 写入文件头
- memcpy(p,(char *)&fh,sizeof(fh));
- // 写LED状态数据
- for(i=0; i<fh.file_led_num; i++)
- {
- memset(&desc,0,sizeof(desc));
-
- desc.led_hw = g_file_led_write[i].led_hw;
- desc.led_tw = g_file_led_write[i].led_tw;
- desc.led_gl = g_file_led_write[i].led_gl;
- desc.led_jd = g_file_led_write[i].led_jd;
-
- memcpy(p + fh.file_led_addr + i*sizeof(desc), (char *)&desc, sizeof(desc));
- }
- // 计算CRC
- crc16 = CrcStr(p,file_length);
- memcpy(p+file_length,&crc16,2);
-
- pos = 0;
- ret=rt_file_write(file_led_handle,p,file_length + 2,&pos);
- if (ret != file_length + 2)
- {
- rt_free(p);
- rt_printf("led save error ret=%d\r\n",ret);
- return -3;
- }
- rt_free(p);
-
- rt_printf("led save len=%d\r\n",ret);
- return 0;
- }
- /*------------------------------ 内部函数 -------------------------------------
- 内部函数以下划线‘_’开头,不需要检查参数的合法性.
- */
- /*------------------------------ 测试函数 -------------------------------------
- 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
- 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
- */
- /*------------------------------ 文件结束 -------------------------------------
- */
|