equ.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: equ.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-03-25
  7. 功能说明: 装置信息管理维护
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. /*------------------------------ 类型结构 -------------------------------------
  17. */
  18. /*------------------------------ 全局变量 -------------------------------------
  19. */
  20. // 装置通道配置文件
  21. struct equ_config g_equ_config_null; // 全0结构,防止访问异常
  22. struct equ_config *g_equ_config = &g_equ_config_null; // 装置配置文件头
  23. struct equ_config_di *g_equ_config_di; // 开入配置数组
  24. struct equ_config_do *g_equ_config_do; // 开出配置数组
  25. struct equ_config_ac *g_equ_config_ac; // 模拟量配置数组
  26. // 采样通道取反,以ADC为索引
  27. u8 g_equ_adc_inv[CFG_ADC_CHANNEL];
  28. int g_equ_adc_inv_num;
  29. // ADC通道是否配置
  30. u8 g_equ_adc_config[CFG_ADC_CHANNEL];
  31. // 板卡资源文件
  32. struct board_res_head g_board_res_head_null; // 全0结构,防止访问异常
  33. struct board_res_head *g_board_res_head = &g_board_res_head_null; // 板卡资源文件头
  34. struct board_res *g_board_res; // 板卡资源数组
  35. #if defined(CAN_SLAVE_BOARD)
  36. struct board_info g_board_info[EQU_SLOT_NUM_MAX+CAN_BOARD_NUM]; // 板卡实时信息
  37. #else
  38. struct board_info g_board_info[EQU_SLOT_NUM_MAX]; // 板卡实时信息
  39. #endif
  40. //已配置的开关数
  41. u32 g_sw_num;
  42. int g_slot_addr; // 插槽地址
  43. int g_hw_version; // 硬件版本
  44. u16 g_crc_brd_res;
  45. u16 g_crc_equ_cfg;
  46. // LED配置,按插槽配置
  47. struct led_config g_led_slot[EQU_SLOT_NUM_MAX];
  48. // equ文件比较用
  49. struct file_contrast g_equ_contrast;
  50. int g_sw_ac_num[SWITCH_NUM_MAX+1];
  51. int g_pub_ac_num;
  52. /*------------------------------ 函数声明 -------------------------------------
  53. */
  54. int _equ_get_di_num(u32 slot);
  55. int _equ_get_do_num(u32 slot);
  56. int _equ_get_ac_num(u32 slot);
  57. /*------------------------------ 外部函数 -------------------------------------
  58. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  59. */
  60. char * equ_info_brd_type(int type)
  61. {
  62. int i;
  63. for(i=0; i<g_board_res_head->br_num; i++)
  64. {
  65. if(g_board_res[i].type == type)
  66. {
  67. return g_board_res[i].name;
  68. }
  69. }
  70. return 0;
  71. }
  72. /******************************************************************************
  73. 函数名称: equ_init_file_brd_res
  74. 函数版本: 01.01
  75. 创建作者: sunxi
  76. 创建日期: 2013-08-08
  77. 函数说明: 从板卡资源文件装载板卡资源。
  78. 参数说明:
  79. 返回值:
  80. 0: 成功
  81. 其它: 失败
  82. 修改记录:
  83. */
  84. int equ_init_file_brd_res(void)
  85. {
  86. u32 len;
  87. u8 *buf;
  88. struct board_res_head *brh;
  89. struct file * pfile;
  90. loff_t pos;
  91. // 打开文件
  92. pfile = rt_file_open("/app/data/brd_res.bin",O_RDONLY ,0);
  93. if(IS_ERR(pfile))
  94. {
  95. return -1;
  96. }
  97. // 得到文件长度
  98. len = rt_file_getfile_size(pfile);
  99. if(len <= 0)
  100. {
  101. rt_file_close(pfile,0);
  102. return -11;
  103. }
  104. // 分配内存
  105. buf = rt_malloc(len);
  106. if((buf) == NULL)
  107. {
  108. rt_file_close(pfile,0);
  109. return -2;
  110. }
  111. // 读出内容
  112. pos = 0;
  113. if(rt_file_read(pfile,buf,len,&pos) != len)
  114. {
  115. rt_file_close(pfile,0);
  116. rt_free(buf);
  117. return -3;
  118. }
  119. // 关闭文件
  120. rt_file_close(pfile,0);
  121. // 检查CRC
  122. g_crc_brd_res = CrcStr(buf,len-2);
  123. if(g_crc_brd_res != *(u16*)(buf+len-2))
  124. {
  125. rt_free(buf);
  126. return -4;
  127. }
  128. // 检查文件签名
  129. brh = (struct board_res_head*)buf;
  130. if(brh->cfh.signature != SIG_EQU_RES_FILE)
  131. {
  132. rt_free(buf);
  133. return -5;
  134. }
  135. // 检查文件长度
  136. if(len < sizeof(*brh) + brh->br_num*sizeof(struct board_res)+ 2)
  137. {
  138. rt_free(buf);
  139. return -6;
  140. }
  141. // 装置板卡资源
  142. g_board_res_head = (struct board_res_head *)buf;
  143. g_board_res = (struct board_res *)(buf + brh->br_addr);
  144. return 0;
  145. }
  146. /******************************************************************************
  147. 函数名称: equ_init_file_config
  148. 函数版本: 01.01
  149. 创建作者: sunxi
  150. 创建日期: 2013-08-08
  151. 函数说明: 从装置配置文件装载装置配置。
  152. 参数说明:
  153. 返回值:
  154. 0: 成功
  155. 其它: 失败
  156. 修改记录:
  157. */
  158. int equ_init_file_config(void)
  159. {
  160. u32 len, i;
  161. u8 *buf;
  162. struct file *pfile;
  163. loff_t pos;
  164. struct equ_config *ec;
  165. // 打开文件
  166. pfile = rt_file_open("/app/data/equ_cfg.bin", O_RDONLY, 0);
  167. if (IS_ERR(pfile))
  168. {
  169. return -1;
  170. }
  171. // 得到文件长度
  172. len = rt_file_getfile_size(pfile);
  173. if (len < sizeof(struct equ_config) + 2)
  174. {
  175. rt_file_close(pfile, 0);
  176. return -11;
  177. }
  178. // 分配内存
  179. buf = rt_malloc(len);
  180. if ((buf) == NULL)
  181. {
  182. rt_file_close(pfile, 0);
  183. return -2;
  184. }
  185. // 读出内容
  186. pos = 0;
  187. if (rt_file_read(pfile, buf, len, &pos) != len)
  188. {
  189. rt_file_close(pfile, 0);
  190. rt_free(buf);
  191. return -3;
  192. }
  193. // 关闭文件
  194. rt_file_close(pfile, 0);
  195. // 检查CRC
  196. g_crc_equ_cfg = CrcStr(buf, len - 2);
  197. if (g_crc_equ_cfg != *(u16 *)(buf + len - 2))
  198. {
  199. rt_free(buf);
  200. return -4;
  201. }
  202. // 检查文件签名
  203. ec = (struct equ_config *)buf;
  204. if (ec->cfh.signature != SIG_EQU_CFG_FILE)
  205. {
  206. rt_free(buf);
  207. return -5;
  208. }
  209. // 文件比较内容赋值
  210. g_equ_contrast.version = ec->cfh.version;
  211. g_equ_contrast.signature = ec->cfh.signature;
  212. g_equ_contrast.length = len;
  213. g_equ_contrast.crc = g_crc_equ_cfg;
  214. // 比对资源表文件
  215. if ((ec->rsc_version != rsc_contrast.version) || (ec->rsc_signature != rsc_contrast.signature) || (ec->rsc_length != rsc_contrast.length) || (ec->rsc_crc != rsc_contrast.crc))
  216. {
  217. dp_err_nt_rt("equ_version = 0x%x, rsc_version = 0x%x\r\n", ec->rsc_version, rsc_contrast.version);
  218. dp_err_nt_rt("equ_signature = 0x%x, rsc_signature = 0x%x\r\n", ec->rsc_signature, rsc_contrast.signature);
  219. dp_err_nt_rt("equ_length = 0x%x, rsc_length = 0x%x\r\n", ec->rsc_length, rsc_contrast.length);
  220. dp_err_nt_rt("equ_crc = 0x%x, rsc_crc = 0x%x\r\n", ec->rsc_crc, rsc_contrast.crc);
  221. rt_free(buf);
  222. return -6;
  223. }
  224. // 装载配置
  225. g_equ_config = ec;
  226. g_equ_config_di = (struct equ_config_di *)(buf + g_equ_config->di_addr);
  227. g_equ_config_do = (struct equ_config_do *)(buf + g_equ_config->do_addr);
  228. g_equ_config_ac = (struct equ_config_ac *)(buf + g_equ_config->ac_addr);
  229. // 得到开关数量
  230. g_sw_num = 0;
  231. for (i = 0; i < g_equ_config->di_num; i++)
  232. {
  233. if (g_equ_config_di[i].owner > g_sw_num && g_equ_config_di[i].index)
  234. {
  235. g_sw_num = g_equ_config_di[i].owner;
  236. }
  237. }
  238. for (i = 0; i < g_equ_config->do_num; i++)
  239. {
  240. if (g_equ_config_do[i].owner > g_sw_num && g_equ_config_do[i].index)
  241. {
  242. g_sw_num = g_equ_config_do[i].owner;
  243. }
  244. }
  245. for (i = 0; i < g_equ_config->ac_num; i++)
  246. {
  247. if (g_equ_config_ac[i].type == 0)
  248. {
  249. continue;
  250. }
  251. if (g_equ_config_ac[i].owner > g_sw_num && g_equ_config_ac[i].index)
  252. {
  253. g_sw_num = g_equ_config_ac[i].owner;
  254. }
  255. if (g_equ_config_ac[i].owner == 0)
  256. {
  257. g_pub_ac_num++;
  258. }
  259. else
  260. {
  261. g_sw_ac_num[g_equ_config_ac[i].owner - 1]++;
  262. }
  263. g_sw_ac_num[SWITCH_NUM_MAX]++; // 总配置数
  264. }
  265. dp_info_nt_rt("线路开关数量:程序 = %d, 配置 = %d.\r\n", SWITCH_NUM_MAX, g_sw_num);
  266. if (g_sw_num > SWITCH_NUM_MAX)
  267. {
  268. return -7;
  269. }
  270. return 0;
  271. }
  272. /******************************************************************************
  273. 函数名称: equ_led_init
  274. 函数版本: 01.01
  275. 创建作者: xxxxxx
  276. 创建日期: 2015-04-16
  277. 函数说明: 开出类型LED初始化,找到对应的灯配置索引的GPIO
  278. 参数说明: 无
  279. 返回值: 成功返回0.
  280. 修改记录:
  281. */
  282. int equ_led_init(void)
  283. {
  284. int i, j, slot, index;
  285. // 默认没有配置任何灯
  286. for (i = 0; i < EQU_SLOT_NUM_MAX; i++)
  287. {
  288. g_led_slot[i].num = 0;
  289. for (j = 0; j < LED_MAX_NUM; j++)
  290. {
  291. g_led_slot[i].sn[j].no = LED_NULL;
  292. }
  293. }
  294. #if 0
  295. // 初始化公共灯
  296. for (i = 0; i < PUB_LED_NUM; i++)
  297. {
  298. index = g_sw_pub.led_cfg_index[i];
  299. if ((index != INDEX_INVALLID))
  300. {
  301. slot = g_equ_config_do[index].slot;
  302. index = g_equ_config_do[index].index;
  303. g_led_slot[slot].sn[index].sw = 0;
  304. g_led_slot[slot].sn[index].no = i;
  305. dp_info_h_c("i = %d, slot = %d, index = %d", i, slot, index);
  306. index++;
  307. if (index > g_led_slot[slot].num)
  308. {
  309. g_led_slot[slot].num = index;
  310. }
  311. }
  312. }
  313. // 初始化开关灯
  314. for (int sw = 0; sw < SWITCH_NUM_MAX; sw++)
  315. {
  316. for (i = 0; i < SW_LED_NUM; i++)
  317. {
  318. index = g_sw[sw].led_cfg_index[i];
  319. if ((index != INDEX_INVALLID))
  320. {
  321. slot = g_equ_config_do[index].slot;
  322. index = g_equ_config_do[index].index;
  323. dp_info_h_c("i = %d, slot = %d, index = %d, sw = %d", i, slot, index, sw);
  324. g_led_slot[slot].sn[index].sw = sw;
  325. g_led_slot[slot].sn[index].no = i;
  326. index++;
  327. if (index > g_led_slot[slot].num)
  328. {
  329. g_led_slot[slot].num = index;
  330. }
  331. }
  332. }
  333. }
  334. #endif
  335. return 0;
  336. }
  337. int equ_config_check(void)
  338. {
  339. int i;
  340. bool b_err=false;
  341. const int bank_cfg[EQU_SLOT_NUM_MAX]=
  342. {
  343. BOARD_TYPE_FUXI_DI,
  344. BOARD_TYPE_FUXI_DO,
  345. BOARD_TYPE_FUXI_AC,
  346. BOARD_TYPE_FUXI_24LED,
  347. BOARD_TYPE_MAIN,
  348. -1,
  349. -1,
  350. -1,
  351. -1,
  352. -1,
  353. -1,
  354. };
  355. for (i = 0; i < EQU_SLOT_NUM_MAX; i++)
  356. {
  357. if (bank_cfg[i] != -1 && bank_cfg[i] != g_board_info[i].type)
  358. {
  359. char *name;
  360. b_err = true;
  361. name = equ_info_brd_type(g_board_info[i].type);
  362. dp_err_nt_rt("通道配置错误:slot=%d, 当前类型=%s, 应该配成%s\r\n", i, (name == NULL) ? "无" : name, equ_info_brd_type(bank_cfg[i]));
  363. }
  364. }
  365. return (b_err ? -1 : 0);
  366. }
  367. /******************************************************************************
  368. 函数名称: equ_init
  369. 函数版本: 01.01
  370. 创建作者: sunxi
  371. 创建日期: 2013-08-08
  372. 函数说明: 装置初始化
  373. 参数说明:
  374. 返回值:
  375. 0: 成功
  376. 其它: 失败
  377. 修改记录:
  378. */
  379. int equ_init(void)
  380. {
  381. int i, ret;
  382. struct timespec ts;
  383. // 得到装置地址和硬件版本
  384. g_slot_addr = gpio_get_addr();
  385. g_hw_version = gpio_get_version();
  386. dp_info_nt_rt("g_hw_version = 0x%02x, g_slot_addr = 0x%02x.\r\n", g_hw_version, g_slot_addr);
  387. // 装置板卡资源
  388. ret = equ_init_file_brd_res();
  389. if (ret != 0)
  390. {
  391. rt_err_set(ERR_CODE_EQU_RESOURCE, 0);
  392. dp_err_n_c_rt("equ_init_file_resource err(ret=%d)", ret);
  393. return -1;
  394. }
  395. // 装载装置配置
  396. ret = equ_init_file_config();
  397. if (ret != 0)
  398. {
  399. rt_err_set(ERR_CODE_EQU_CONFIG, 0);
  400. dp_err_n_c_rt("equ_init_file_config err(ret=%d)", ret);
  401. return -2;
  402. }
  403. // 初始化板卡信息
  404. memset(g_board_info, 0, sizeof(g_board_info));
  405. clk_time_get(&ts);
  406. for (i = 0; i < g_equ_config->equ_slot_num; i++)
  407. {
  408. if (equ_info_brd_type(g_equ_config->brd_type[i]) == 0)
  409. {
  410. equ_led_init();
  411. dp_err_n_c_rt("板卡类型不存在(type=%d)!", g_equ_config->brd_type[i]);
  412. return -3;
  413. }
  414. g_board_info[i].type = g_equ_config->brd_type[i];
  415. g_board_info[i].di_num = _equ_get_di_num(i);
  416. g_board_info[i].do_num = _equ_get_do_num(i);
  417. g_board_info[i].ac_num = _equ_get_ac_num(i);
  418. #if (0) /* 打印数据测试 */
  419. if (0 != g_board_info[i].di_num)
  420. dp_info_nt("g_board_info[%d].di_num = %d ", i, g_board_info[i].di_num);
  421. if (0 != g_board_info[i].do_num)
  422. dp_info_nt("g_board_info[%d].do_num = %d ", i, g_board_info[i].do_num);
  423. if (0 != g_board_info[i].ac_num)
  424. dp_info_nt("g_board_info[%d].ac_num = %d ", i, g_board_info[i].ac_num);
  425. #endif
  426. if ((g_board_info[i].type < BOARD_TYPE_GROUP_RS) && (g_board_info[i].di_num || g_board_info[i].do_num || g_board_info[i].ac_num))
  427. {
  428. // 板卡需要周期性的检查是否正常工作。
  429. g_board_info[i].is_check = 1;
  430. }
  431. g_board_info[i].us0 = ustimer_get_origin();
  432. g_board_info[i].is_ok = 1;
  433. // 主板信息
  434. if (g_board_info[i].type == BOARD_TYPE_MAIN)
  435. {
  436. g_board_info[i].crc = m_CodeCrc;
  437. g_board_info[i].version = VER_NUM;
  438. }
  439. else if (g_board_info[i].type == BOARD_TYPE_FUXI_DI)
  440. {
  441. g_di_slot = i;
  442. }
  443. else if (g_board_info[i].type == BOARD_TYPE_FUXI_DO)
  444. {
  445. g_do_slot = i;
  446. }
  447. }
  448. // 模拟通道配置
  449. memset(g_equ_adc_inv, 0, sizeof(g_equ_adc_inv));
  450. for (i = 0; i < g_equ_config->ac_num; i++)
  451. {
  452. u32 adc;
  453. adc = equ_get_ac_channel(g_equ_config_ac[i].slot, g_equ_config_ac[i].index);
  454. if (adc < CFG_ADC_CHANNEL)
  455. {
  456. // 是否配置
  457. if (g_equ_config_ac[i].type)
  458. {
  459. g_equ_adc_config[adc] = 1;
  460. }
  461. // 是否取反
  462. if (g_equ_config_ac[i].is_ct_inverse)
  463. {
  464. g_equ_adc_inv[g_equ_adc_inv_num++] = adc;
  465. }
  466. }
  467. }
  468. // 初始化灯
  469. equ_led_init();
  470. ret = equ_config_check();
  471. if (ret)
  472. {
  473. dp_err_n_c_rt("%s:ret=%d", __func__, ret);
  474. return -4;
  475. }
  476. equ_init_di();
  477. equ_config_do_keeptime();
  478. return 0;
  479. }
  480. /******************************************************************************
  481. 函数名称: equ_exit
  482. 函数版本: 01.01
  483. 创建作者: sunxi
  484. 创建日期: 2013-08-08
  485. 函数说明: 装置退出
  486. 参数说明:
  487. 返回值:
  488. 0: 成功
  489. 其它: 失败
  490. 修改记录:
  491. */
  492. int equ_exit(void)
  493. {
  494. if(g_equ_config && (g_equ_config != &g_equ_config_null))
  495. {
  496. rt_free(g_equ_config);
  497. }
  498. if(g_board_res_head && (g_board_res_head != &g_board_res_head_null))
  499. {
  500. rt_free(g_board_res_head);
  501. }
  502. return 0;
  503. }
  504. /******************************************************************************
  505. 函数名称: equ_get_di_num
  506. 函数版本: 01.01
  507. 创建作者: sunxi
  508. 创建日期: 2013-08-08
  509. 函数说明: 得到插槽中子板的开入资源个数
  510. 参数说明:
  511. slot 插槽索引号
  512. 返回值: 开入资源个数
  513. 修改记录:
  514. */
  515. int _equ_get_di_num(u32 slot)
  516. {
  517. int i;
  518. u8 type;
  519. if(slot >= g_equ_config->equ_slot_num)
  520. {
  521. return 0;
  522. }
  523. type = g_equ_config->brd_type[slot];
  524. for(i=0; i<g_board_res_head->br_num; i++)
  525. {
  526. if(g_board_res[i].type == type)
  527. {
  528. return g_board_res[i].di_num;
  529. }
  530. }
  531. return 0;
  532. }
  533. int equ_get_di_num(u32 slot)
  534. {
  535. return (slot >=EQU_SLOT_NUM_MAX) ? 0 : g_board_info[slot].di_num;
  536. }
  537. /******************************************************************************
  538. 函数名称: equ_get_do_num
  539. 函数版本: 01.01
  540. 创建作者: sunxi
  541. 创建日期: 2013-08-08
  542. 函数说明: 得到插槽中子板的开出资源个数
  543. 参数说明:
  544. slot 插槽索引号
  545. 返回值: 开出资源个数
  546. 修改记录:
  547. */
  548. int _equ_get_do_num(u32 slot)
  549. {
  550. int i;
  551. u8 type;
  552. if(slot >= g_equ_config->equ_slot_num)
  553. {
  554. return 0;
  555. }
  556. type = g_equ_config->brd_type[slot];
  557. for(i=0; i<g_board_res_head->br_num; i++)
  558. {
  559. if(g_board_res[i].type == type)
  560. {
  561. return g_board_res[i].do_num;
  562. }
  563. }
  564. return 0;
  565. }
  566. int equ_get_do_num(u32 slot)
  567. {
  568. return (slot >=EQU_SLOT_NUM_MAX) ? 0 : g_board_info[slot].do_num;
  569. }
  570. /******************************************************************************
  571. 函数名称: equ_get_ac_num
  572. 函数版本: 01.01
  573. 创建作者: sunxi
  574. 创建日期: 2013-08-08
  575. 函数说明: 得到插槽中子板的模拟量资源个数
  576. 参数说明:
  577. slot 插槽索引号
  578. 返回值: 模拟量资源个数
  579. 修改记录:
  580. */
  581. int _equ_get_ac_num(u32 slot)
  582. {
  583. int i;
  584. u8 type;
  585. if(slot >= g_equ_config->equ_slot_num)
  586. {
  587. return 0;
  588. }
  589. type = g_equ_config->brd_type[slot];
  590. for(i=0; i<g_board_res_head->br_num; i++)
  591. {
  592. if(g_board_res[i].type == type)
  593. {
  594. return g_board_res[i].ac_num;
  595. }
  596. }
  597. return 0;
  598. }
  599. int equ_get_ac_num(u32 slot)
  600. {
  601. return (slot >=EQU_SLOT_NUM_MAX) ? 0 : g_board_info[slot].ac_num;
  602. }
  603. int equ_get_ac_scale(u8 slot,u8 no)
  604. {
  605. int i;
  606. for(i=0; i< g_equ_config->ac_num; i++)
  607. {
  608. if((g_equ_config_ac[i].slot==slot)&&(g_equ_config_ac[i].index==no))
  609. {
  610. return g_equ_config_ac[i].scale;
  611. }
  612. }
  613. return -1;
  614. }
  615. /******************************************************************************
  616. 函数名称: equ_get_slot_by_type
  617. 函数版本: 01.01
  618. 创建作者: sunxi
  619. 创建日期: 2013-08-08
  620. 函数说明: 通过子板的类型查找插槽。
  621. 参数说明:
  622. type 子板类型。
  623. 返回值: 插槽号
  624. 修改记录:
  625. */
  626. u32 equ_get_slot_by_type(u8 type)
  627. {
  628. u32 i;
  629. struct board_info *bi;
  630. bi = g_board_info;
  631. for(i=0; i<g_equ_config->equ_slot_num; i++)
  632. {
  633. if(equ_slot_check(i) != 0)
  634. {
  635. continue;
  636. }
  637. if(g_board_info[i].type == type)
  638. {
  639. return i;
  640. }
  641. }
  642. return 0;
  643. }
  644. /******************************************************************************
  645. 函数名称: equ_slot_check
  646. 函数版本: 01.01
  647. 创建作者: sunxi
  648. 创建日期: 2013-08-08
  649. 函数说明: 检查对应插槽中的子板是否正常。
  650. 参数说明:
  651. slot 插槽索引号
  652. 返回值: 插槽号
  653. 0: 成功
  654. 其它: 失败
  655. 修改记录:
  656. */
  657. int equ_slot_check(u32 slot)
  658. {
  659. if(slot >= g_equ_config->equ_slot_num)
  660. {
  661. return -1;
  662. }
  663. if(g_board_info[slot].is_ok == 0)
  664. {
  665. return -2;
  666. }
  667. return 0;
  668. }
  669. /******************************************************************************
  670. 函数名称: equ_di_name
  671. 函数版本: 01.01
  672. 创建作者: sunxi
  673. 创建日期: 2013-08-08
  674. 函数说明: 从板卡号和硬件编号得到开入点的名称
  675. 参数说明:
  676. slot 插槽索引号
  677. index 子板上开入索引号
  678. 返回值: 开入点的名称
  679. 修改记录:
  680. */
  681. char * equ_di_name(u8 slot,u8 no)
  682. {
  683. int i;
  684. for(i=0; i< g_equ_config->di_num; i++)
  685. {
  686. if((g_equ_config_di[i].slot==slot)&&(g_equ_config_di[i].index==no))
  687. {
  688. return shield_str(&g_equ_config_di[i]);
  689. }
  690. }
  691. return 0;
  692. }
  693. u8 equ_di_type(u8 slot,u8 no)
  694. {
  695. int i;
  696. for(i=0; i< g_equ_config->di_num; i++)
  697. {
  698. if((g_equ_config_di[i].slot==slot)&&(g_equ_config_di[i].index==no)&&(g_equ_config_di[i].owner>0)) //只有开关遥信才返回真正类型
  699. {
  700. return g_equ_config_di[i].type;
  701. }
  702. }
  703. return 0;
  704. }
  705. u8 equ_pub_di_type(u8 slot,u8 no)
  706. {
  707. int i;
  708. for(i=0; i< g_equ_config->di_num; i++)
  709. {
  710. if((g_equ_config_di[i].slot==slot)&&(g_equ_config_di[i].index==no)&&(g_equ_config_di[i].owner==0)) //公共类型
  711. {
  712. return g_equ_config_di[i].type;
  713. }
  714. }
  715. return 0;
  716. }
  717. /*------------------------------ 内部函数 -------------------------------------
  718. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  719. */
  720. /*------------------------------ 测试函数 -------------------------------------
  721. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  722. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  723. */
  724. int equ_info_printf(void)
  725. {
  726. int i;
  727. struct rtc_time_t rtc;
  728. struct timespec ts;
  729. struct board_res *br;
  730. struct board_info *bi;
  731. rt_printf("板卡资源信息:%s(可配置开关:%d,实际配置开关:%d):slot=%d\r\n",g_equ_config->equ_name,g_equ_config->equ_sw_num,g_sw_num,g_equ_config->equ_slot_num);
  732. br = g_board_res;
  733. rt_printf("name\t\ttype\tdi_num\tdo_num\tac_num\r\n");
  734. for(i=0; i<g_board_res_head->br_num; i++)
  735. {
  736. rt_printf("%-9s\t%03d\t%02d\t%02d\t%02d\r\n",br[i].name,br[i].type,br[i].di_num,br[i].do_num,br[i].ac_num);
  737. }
  738. bi = g_board_info;
  739. rt_printf("\r\nslot\ttype\tcan\tstatus\terrcode\tcrc\tversion\t\ttime\r\n");
  740. for(i=0; i<g_equ_config->equ_slot_num; i++)
  741. {
  742. rt_printf("%02d %s[%02d]\t%02d\t%02d\t%02d\t%04x\t%08x\t",i,equ_info_brd_type(bi[i].type),bi[i].type,bi[i].can_bus,bi[i].status,bi[i].errcode,bi[i].crc,bi[i].version);
  743. timespec_to_rtc(bi[i].update_time,&rtc,0);
  744. rt_printf("%04d-%02d-%02d %02d:%02d:%02d:%09d\r\n",
  745. rtc.year + 2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000,bi[i].update_time.tv_nsec );
  746. }
  747. clk_time_get(&ts);
  748. timespec_to_rtc(ts,&rtc,0);
  749. rt_printf("now:%04d-%02d-%02d %02d:%02d:%02d:%09d\r\n",
  750. rtc.year + 2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000,ts.tv_nsec );
  751. return 0;
  752. }
  753. int equ_info_printf_di(void)
  754. {
  755. int i;
  756. struct equ_config_di *cdi;
  757. cdi = g_equ_config_di;
  758. rt_printf("\r\nslot\tindex\ttype\towner\tfilter\tis_inv\tname\r\n");
  759. for(i=0; i<g_equ_config->di_num; i++)
  760. {
  761. rt_printf("%02d\t%02d\t%02d\t%d\t%d\t%d\t%s\r\n",
  762. cdi[i].slot,cdi[i].index+1,cdi[i].type,cdi[i].owner,cdi[i].filter_time,cdi[i].is_Inverse,cdi[i].name);
  763. }
  764. return 0;
  765. }
  766. int equ_info_printf_do(void)
  767. {
  768. int i;
  769. struct equ_config_do *cdo;
  770. cdo = g_equ_config_do;
  771. rt_printf("\r\nslot\tindex\ttype\towner\tpulse_t\tname\r\n");
  772. for(i=0; i<g_equ_config->do_num; i++)
  773. {
  774. rt_printf("%02d\t%02d\t%02d\t%d\t%d\t%s\r\n",
  775. cdo[i].slot,cdo[i].index+1,cdo[i].type,cdo[i].owner, cdo[i].time_pulse,cdo[i].name);
  776. }
  777. return 0;
  778. }
  779. int equ_info_printf_ac(void)
  780. {
  781. int i;
  782. struct equ_config_ac *cac;
  783. cac = g_equ_config_ac;
  784. rt_printf("\r\nslot\tindex\ttype\towner\tct_inv\tscale\tname\r\n");
  785. for(i=0; i<g_equ_config->ac_num; i++)
  786. {
  787. rt_printf("%02d\t%02d\t%02d\t%d\t%d\t%d\t%s\r\n",
  788. cac[i].slot,cac[i].index+1,cac[i].type,cac[i].owner,
  789. cac[i].is_ct_inverse,cac[i].scale,cac[i].name);
  790. }
  791. return 0;
  792. }
  793. /*------------------------------ 文件结束 -------------------------------------
  794. */