dcfactor.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: dcfactor.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-05-20
  7. 功能说明: 直流系数处理。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. #define DCFACTOR_FILE_VERSION 0X01010101 //文件版本
  17. /*------------------------------ 类型结构 -------------------------------------
  18. */
  19. /*------------------------------ 全局变量 -------------------------------------
  20. */
  21. float g_dc_temp;
  22. struct dc_factor g_dcfactor[DC_NUM];
  23. struct dc_factor_save g_dcfactor_save[DC_NUM];
  24. u8 g_dcfactor_id[AUTH_ID_LEN];
  25. float dc_adjust[2];
  26. /*------------------------------ 函数声明 -------------------------------------
  27. */
  28. int dcfactor_init(void);
  29. int dcfactor_readfile(void);
  30. int dcfactor_update(void);
  31. /*------------------------------ 外部函数 -------------------------------------
  32. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  33. */
  34. /******************************************************************************
  35. 函数名称: dcfactor_init
  36. 函数版本: 01.01
  37. 创建作者: xxxxxx
  38. 创建日期: 2015-10-23
  39. 函数说明: dcfactor初始化。
  40. 参数说明: 无
  41. 返回值: 成功返回0.
  42. 修改记录:
  43. */
  44. int dcfactor_init(void)
  45. {
  46. int i,ret;
  47. ret = dcfactor_readfile();
  48. if (ret != 0)
  49. {
  50. rt_err_set(ERR_CODE_DCFACTOR,0);
  51. rt_file_del("/app/data/dcfactor.bin");
  52. rt_printf("直流系数文件错误: %d\r\n", ret);
  53. for (i=0; i<DC_NUM; i++)
  54. {
  55. g_dcfactor_save[i].adjust_set = DC_DEFAULT;
  56. g_dcfactor_save[i].dc_h = 50;
  57. g_dcfactor_save[i].dc_l = 10;
  58. }
  59. g_dc_temp = 40.0;
  60. }
  61. _getdcfactorinf();
  62. dcfactor_update();
  63. return ret;
  64. }
  65. /******************************************************************************
  66. 函数名称: dcfactor_exit
  67. 函数版本: 01.01
  68. 创建作者: xxxxxx
  69. 创建日期: 2015-10-23
  70. 函数说明: dcfactor退出。
  71. 参数说明: 无
  72. 返回值: 成功返回0.
  73. 修改记录:
  74. */
  75. int dcfactor_exit(void)
  76. {
  77. return 0;
  78. }
  79. /******************************************************************************
  80. 函数名称: dcfactor_createfile
  81. 函数版本: 01.01
  82. 创建作者: xxxxxx
  83. 创建日期: 2015-10-23
  84. 函数说明: 创建直流系数文件
  85. 参数说明: 无
  86. 返回值: 成功返回0.
  87. 修改记录:
  88. */
  89. int dcfactor_createfile(u8 *id, u8 *factor)
  90. {
  91. unsigned int addr,file_length;
  92. u16 crc;
  93. char *p;
  94. loff_t pos;
  95. struct file * pfile;
  96. struct dcfactor_file_head_data dcfactor_file;
  97. // 写文件头
  98. memset(&dcfactor_file,0,sizeof(dcfactor_file));
  99. dcfactor_file.cfh.signature = SIG_DCFACTOR_FILE;
  100. dcfactor_file.cfh.version = DCFACTOR_FILE_VERSION;
  101. memcpy (&dcfactor_file.auth_id, id, 8);
  102. // 校正温度更新
  103. #if defined TMP_CHIP_DS18B20
  104. dcfactor_file.temp = ds18b20_get_temp();
  105. #elif defined TMP_CHIP_GX21M15
  106. dcfactor_file.temp = gx21m15_get_temp();
  107. #elif defined TMP_CHIP_AHT20
  108. dcfactor_file.temp = aht20_get_temp();
  109. #endif
  110. dcfactor_file.addr = FILE_ADDR_ALGIN(sizeof(dcfactor_file));
  111. dcfactor_file.num = DC_NUM;
  112. // 得到文件长度
  113. addr = dcfactor_file.addr + dcfactor_file.num * sizeof(struct dc_factor_save);
  114. file_length = addr;
  115. // 分配并初始化空间
  116. p = rt_malloc(file_length + 2);
  117. if(!p)
  118. {
  119. return -1;
  120. }
  121. memset(p, 0, file_length + 2);
  122. // 写入文件头
  123. memcpy(p, (char *)&dcfactor_file, sizeof(dcfactor_file));
  124. // 写直流系数
  125. memcpy(p+dcfactor_file.addr, factor, sizeof(struct dc_factor_save)*2);
  126. // 计算CRC
  127. crc = CrcStr(p, file_length);
  128. memcpy(p+file_length, &crc, 2);
  129. // 创建数据文件
  130. pfile = rt_file_open("/app/data/dcfactor.bin",O_CREAT|O_RDWR,0);
  131. if(IS_ERR(pfile))
  132. {
  133. rt_err_set(ERR_CODE_DCFACTOR,0);
  134. rt_free(p);
  135. return -2;
  136. }
  137. pos = 0;
  138. rt_file_write(pfile, p, file_length+2, &pos);
  139. rt_file_close(pfile,0);
  140. rt_free(p);
  141. memcpy(g_dcfactor_id, id, 8);
  142. memcpy(g_dcfactor_save, factor, sizeof(g_dcfactor_save));
  143. dcfactor_update();
  144. g_dc_temp = dcfactor_file.temp;
  145. //清除直流告警灯
  146. rt_err_clr(ERR_CODE_DCFACTOR,0);
  147. return 0;
  148. }
  149. /******************************************************************************
  150. 函数名称: dcfactor_readfile
  151. 函数版本: 01.01
  152. 创建作者: xxxxxx
  153. 创建日期: 2015-10-23
  154. 函数说明: 读取直流系数文件
  155. 参数说明: 无
  156. 返回值: 成功返回0.
  157. 修改记录:
  158. */
  159. int dcfactor_readfile(void)
  160. {
  161. u32 len,len2;
  162. u16 crc;
  163. u8 *buf;
  164. loff_t pos;
  165. struct file * pfile;
  166. struct dcfactor_file_head_data *brh;
  167. // 创建并打开文件
  168. pfile = rt_file_open("/app/data/dcfactor.bin",O_RDWR,0);
  169. if(IS_ERR(pfile))
  170. {
  171. return -1;
  172. }
  173. // 得到文件长度
  174. len = rt_file_getfile_size(pfile);
  175. if(len <= 0)
  176. {
  177. rt_file_close(pfile,0);
  178. return -11;
  179. }
  180. // 分配内存
  181. buf = rt_malloc(len);
  182. if((buf) == NULL)
  183. {
  184. rt_file_close(pfile,0);
  185. return -2;
  186. }
  187. // 读出内容
  188. pos = 0;
  189. if(rt_file_read(pfile,buf,len,&pos) != len)
  190. {
  191. rt_file_close(pfile,0);
  192. rt_free(buf);
  193. return -3;
  194. }
  195. // 关闭文件
  196. rt_file_close(pfile,0);
  197. // 检查CRC
  198. crc = CrcStr(buf,len-2);
  199. if(crc != *(u16*)(buf+len-2))
  200. {
  201. rt_free(buf);
  202. return -4;
  203. }
  204. // 检查文件签名
  205. brh = (struct dcfactor_file_head_data*)buf;
  206. if(brh->cfh.signature != SIG_DCFACTOR_FILE)
  207. {
  208. rt_free(buf);
  209. return -5;
  210. }
  211. //noted by sunxi: 20220413 暂进屏蔽
  212. #ifndef CPU_FUXI
  213. // 检查FLASH唯一ID号
  214. memcpy (&g_dcfactor_id, &brh->auth_id, 8);
  215. if (memcmp (&g_dcfactor_id, g_auth_id, 8) != 0)
  216. {
  217. rt_free(buf);
  218. return -6;
  219. }
  220. #endif
  221. // 检查文件长度
  222. len2 = FILE_ADDR_ALGIN(sizeof(*brh)) + brh->num*sizeof(struct dc_factor_save)+ 2;
  223. if(len != len2)
  224. {
  225. rt_printf("dcfactor_readfile:len=%d,len2=%d.\r\n",len,len2);
  226. rt_free(buf);
  227. return -7;
  228. }
  229. //取出文件中存储内容
  230. g_dc_temp = brh->temp;
  231. memcpy (&g_dcfactor_save, buf+brh->addr, sizeof(struct dc_factor_save)*2);
  232. rt_free(buf);
  233. return 0;
  234. }
  235. /******************************************************************************
  236. 函数名称: dcfactor_update
  237. 函数版本: 01.01
  238. 创建作者: xxxxxx
  239. 创建日期: 2015-10-23
  240. 函数说明: 更新程序实际的直流系数
  241. 参数说明: 无
  242. 返回值: 成功返回0.
  243. 修改记录:
  244. */
  245. int dcfactor_update(void)
  246. {
  247. int i;
  248. // 直流量校正系数
  249. for (i=0; i<DC_NUM; i++)
  250. {
  251. if (g_dcfactor_save[i].dc_h-g_dcfactor_save[i].dc_l == 0)
  252. {
  253. g_dcfactor[i].f_dc = 1;
  254. }
  255. else
  256. {
  257. g_dcfactor[i].f_dc = (dc_adjust[1] - dc_adjust[0])/(g_dcfactor_save[i].dc_h-g_dcfactor_save[i].dc_l);
  258. }
  259. g_dcfactor[i].f_dcL = g_dcfactor_save[i].dc_l;
  260. }
  261. return 0;
  262. }
  263. int dcfactor_restore_default(void)
  264. {
  265. int i;
  266. struct dc_factor_save factor[2];
  267. for(i=0; i<DC_NUM; i++)
  268. {
  269. factor[i].dc_l = dc_adjust[0];
  270. factor[i].dc_h = dc_adjust[1];
  271. factor[i].adjust_set = DC_DEFAULT;
  272. }
  273. return dcfactor_createfile(g_auth_id, (u8 *)&factor);
  274. }
  275. void _getdcfactorinf(void)
  276. {
  277. u32 i,file_length;
  278. struct file * pfile;
  279. u8 *filebuf;
  280. //u8 filestr[128],*pstr,strlenth;
  281. loff_t pos;
  282. // 打开文件
  283. pfile = rt_file_open("/app/data/pcolcfg.ini",O_RDONLY ,0);
  284. if(IS_ERR(pfile))
  285. {
  286. rt_printf("error! 无法打开 pcolcfg.ini\r\n");
  287. goto dc_err;
  288. }
  289. // 得到文件长度
  290. file_length = rt_file_getfile_size(pfile);
  291. if(file_length <= 0)
  292. {
  293. rt_file_close(pfile,0);
  294. goto dc_err;
  295. }
  296. if(file_length == 0)
  297. {
  298. rt_file_close(pfile,0);
  299. goto dc_err;
  300. }
  301. // 分配内存
  302. filebuf = rt_malloc(file_length);
  303. if((filebuf) == NULL)
  304. {
  305. rt_file_close(pfile,0);
  306. goto dc_err;
  307. }
  308. pos = 0;
  309. if(rt_file_read(pfile,filebuf,file_length,&pos) != file_length)
  310. {
  311. rt_file_close(pfile,0);
  312. rt_free(filebuf);
  313. goto dc_err;
  314. }
  315. for(i = 0; i < file_length; i++)
  316. {
  317. if(strncmp(&filebuf[i],"DC_AJUST_0", 10) == 0)
  318. {
  319. dc_adjust[0] = getstrval(&filebuf[i]);
  320. }
  321. else if(strncmp(&filebuf[i],"DC_AJUST_1", 10) == 0)
  322. {
  323. dc_adjust[1] = getstrval(&filebuf[i]);
  324. break;
  325. }
  326. }
  327. if(i >= file_length)
  328. {
  329. dc_adjust[0] = DC_AJUST_0;
  330. dc_adjust[1] = DC_AJUST_1;
  331. }
  332. rt_printf("dc_adjust[0] = %f\r\n", dc_adjust[0]);
  333. rt_printf("dc_adjust[1] = %f\r\n", dc_adjust[1]);
  334. rt_file_close(pfile,0); // 关闭文件
  335. rt_free(filebuf); // 释放内存
  336. return;
  337. dc_err:
  338. dc_adjust[0] = DC_AJUST_0;
  339. dc_adjust[1] = DC_AJUST_1;
  340. rt_printf("dc_adjust[0] = %f\r\n", dc_adjust[0]);
  341. rt_printf("dc_adjust[1] = %f\r\n", dc_adjust[1]);
  342. }
  343. /*------------------------------ 内部函数 -------------------------------------
  344. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  345. */
  346. /*------------------------------ 测试函数 -------------------------------------
  347. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  348. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  349. */
  350. int dcfactor_printf(void)
  351. {
  352. int i;
  353. rt_printf("直流校正系数:\r\n");
  354. rt_printf("校正温度:%f.\r\n",g_dc_temp);
  355. rt_printf("%d,\t存储标志:%d,\tdc_h=%9f,\tdc_l=%9f \r\n",
  356. 0,
  357. g_dcfactor_save[0].adjust_set,
  358. g_dcfactor_save[0].dc_h,
  359. g_dcfactor_save[0].dc_l);
  360. rt_printf("%d,\t存储标志:%d,\tdc_h=%9f,\tdc_l=%9f \r\n",
  361. 1,
  362. g_dcfactor_save[1].adjust_set,
  363. g_dcfactor_save[1].dc_h,
  364. g_dcfactor_save[1].dc_l);
  365. rt_printf("存储ID号:0x");
  366. for (i=0; i<8; i++)
  367. {
  368. rt_printf("%02x ", g_dcfactor_id[i]);
  369. }
  370. rt_printf("\r\n实际ID号:0x");
  371. for (i=0; i<8; i++)
  372. {
  373. rt_printf("%02x ", g_auth_id[i]);
  374. }
  375. rt_printf("\r\n");
  376. return 0;
  377. }
  378. //========================== 本文件结束 =============================