iectable.c 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: iectable.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2013-05-29
  7. 功能说明: DTU点表处理程序
  8. 其它说明:
  9. 逻辑点:Logic Point(缩写 lp ),代表DFTU逻辑模型中的各种点资源,和具体通道配置无关。
  10. 通讯点:Communication Point(缩写 cp ),和后台通讯的三遥地址编号,从转发点表中取出。
  11. 修改记录:
  12. */
  13. /*------------------------------- 头文件 --------------------------------------
  14. */
  15. #include "head.h"
  16. #ifdef LINUX_KERNEL_APP
  17. #include <linux/delay.h>
  18. #endif
  19. /*------------------------------- 宏定义 --------------------------------------
  20. */
  21. #ifdef IECTABLE_NEWDPI_V106
  22. #define RSC_FILE_VERSION 0X01010106 //资源表文件版本 配合维护工具增加遥信单双点的单独配置
  23. #else
  24. #define RSC_FILE_VERSION 0X01010105 //资源表文件版本
  25. #endif
  26. /*------------------------------ 全局变量 -------------------------------------
  27. */
  28. struct rsc_file_head_data *g_rsc_head;
  29. struct di_rsc *g_di_pub_rsc;
  30. struct do_rsc *g_do_pub_rsc;
  31. struct ac_rsc *g_ac_pub_rsc;
  32. struct di_rsc *g_di_sw_rsc;
  33. struct do_rsc *g_do_sw_rsc;
  34. struct ac_rsc *g_ac_sw_rsc;
  35. struct led_rsc *g_led_rsc;
  36. struct unit_rsc *g_unit_rsc;
  37. // 转发点表文件
  38. struct table_file_head_data g_table_head_null; // 全0结构,防止访问异常
  39. struct table_file_head_data *g_table_head = &g_table_head_null; // 转发点表文件头
  40. struct di_table *g_di_table;
  41. struct di_merge_table *g_di_merge_table;
  42. struct di_db_table *g_di_db_table;
  43. #ifdef FUN_DIMER_LINK
  44. struct di_table *g_di_info_merge_table;
  45. u32 g_di_info_merge_num; //个数
  46. #endif
  47. struct do_table *g_do_table;
  48. struct ac_table *g_ac_table;
  49. struct sz_table *g_sz_table;
  50. struct dd_table *g_dd_table;
  51. struct file_contrast rsc_contrast;
  52. u16 g_crc_rsc;
  53. u16 g_crc_rectable;
  54. // 转发点表相关遥控信息
  55. REMOTEYKSTATUS *g_yk_info;
  56. // 级联点表
  57. u32 g_lt_di_num = 0;
  58. u32 g_lt_do_num = 0;
  59. u32 g_lt_ac_num = 0;
  60. u32 g_lt_dd_num = 0;
  61. LINK_TABLE *g_lt_di = NULL;
  62. LINK_TABLE *g_lt_do = NULL;
  63. LINK_TABLE *g_lt_ac = NULL;
  64. LINK_TABLE *g_lt_dd = NULL;
  65. /*------------------------------ 函数声明 -------------------------------------
  66. */
  67. /*------------------------------ 外部函数 -------------------------------------
  68. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  69. */
  70. /**************************************************************************
  71. 函数名称:create_rsc_file
  72. 函数版本:1.00
  73. 作者:
  74. 创建日期:2013.05.30
  75. 函数功能说明:生成资源表文件
  76. 输入参数:
  77. 输出参数:
  78. 返回值:
  79. 更新信息:
  80. 更新日志1:
  81. 日期:
  82. 修改者:
  83. 修改内容:
  84. 修改原因:
  85. ***************************************************************************/
  86. int tbl_create_rsc(void)
  87. {
  88. unsigned int i,j,file_length;
  89. char *p;
  90. loff_t pos;
  91. struct file * pfile;
  92. struct rsc_file_head_data fh;
  93. struct di_rsc disrc;
  94. struct do_rsc dosrc;
  95. struct ac_rsc acsrc;
  96. struct unit_rsc unitsrc;
  97. struct led_rsc ledsrc;
  98. struct dd_rsc ddsrc;
  99. // 写文件头
  100. // 配置文件头
  101. memset(&fh,0,sizeof(fh));
  102. fh.cfh.signature = SIG_RSC_FILE;
  103. fh.cfh.version = RSC_FILE_VERSION;
  104. //装置类型
  105. // 公共类三遥资源
  106. fh.pub_di_addr = FILE_ADDR_ALGIN(sizeof(fh));
  107. fh.pub_di_num = PUB_DI_NUM+EV_PUB_END-EV_PUB_START;
  108. fh.pub_do_addr = FILE_ADDR_ALGIN(fh.pub_di_addr + fh.pub_di_num * sizeof(struct di_rsc));
  109. fh.pub_do_num = PUB_DO_NUM;
  110. fh.pub_ac_addr = FILE_ADDR_ALGIN(fh.pub_do_addr + fh.pub_do_num * sizeof(struct do_rsc));
  111. fh.pub_ac_num = PUB_AC_NUM_ALL;
  112. // 开关类三遥资源
  113. fh.sw_di_addr = FILE_ADDR_ALGIN(fh.pub_ac_addr + fh.pub_ac_num * sizeof(struct ac_rsc));
  114. fh.sw_di_num = SW_DI_NUM+EV_SW_NUM;
  115. fh.sw_do_addr = FILE_ADDR_ALGIN(fh.sw_di_addr + fh.sw_di_num * sizeof(struct di_rsc));
  116. fh.sw_do_num = SW_DO_NUM;
  117. fh.sw_ac_addr = FILE_ADDR_ALGIN(fh.sw_do_addr + fh.sw_do_num * sizeof(struct do_rsc));
  118. fh.sw_ac_num = SW_AC_NUM_ALL;
  119. // 单位表
  120. fh.unit_addr = FILE_ADDR_ALGIN(fh.sw_ac_addr + fh.sw_ac_num * sizeof(struct ac_rsc));
  121. fh.unit_num = UNIT_NUM;
  122. // LED资源
  123. fh.led_addr = FILE_ADDR_ALGIN(fh.unit_addr + fh.unit_num * sizeof(struct unit_rsc));
  124. fh.led_num = SW_LED_NUM + PUB_LED_NUM;
  125. // 电度资源
  126. fh.dd_addr = FILE_ADDR_ALGIN(fh.led_addr + fh.led_num * sizeof(struct led_rsc));
  127. fh.dd_num = SW_DD_NUM_ALL;
  128. // 得到文件长度
  129. file_length = FILE_ADDR_ALGIN(fh.dd_addr + fh.dd_num * sizeof(struct dd_rsc));
  130. // 分配并初始化空间
  131. p = rt_malloc(file_length + 2); //加crc长度
  132. if(!p)
  133. {
  134. return -1;
  135. }
  136. memset(p,0,file_length);
  137. // 写入文件头
  138. memcpy(p,(char *)&fh,sizeof(fh));
  139. // 写公共遥信
  140. for(i=0; i<fh.pub_di_num; i++)
  141. {
  142. memset(&disrc,0,sizeof(disrc));
  143. if (i < PUB_DI_NUM)
  144. {
  145. disrc.is_real = 1;
  146. disrc.indexno = i+1;
  147. strncpy(disrc.name,g_pub_di_name[i],EQU_CFG_NAME_LEN);
  148. disrc.name[EQU_CFG_NAME_LEN-1] = 0;
  149. }
  150. else
  151. {
  152. disrc.is_real = 0;
  153. disrc.indexno = i+1;
  154. j= i+EV_SW_NUM-PUB_DI_NUM;
  155. strncpy(disrc.name,tAllSOE[j].strName,EQU_CFG_NAME_LEN);
  156. disrc.name[EQU_CFG_NAME_LEN-1] = 0;
  157. }
  158. memcpy(p + fh.pub_di_addr + i*sizeof(disrc), (char *)&disrc, sizeof(disrc));
  159. }
  160. // 写公共遥控
  161. for(i=0; i<fh.pub_do_num; i++)
  162. {
  163. memset(&dosrc,0,sizeof(dosrc));
  164. dosrc.is_real = 1;
  165. dosrc.indexno = i+1;
  166. strncpy(dosrc.name,g_pub_do_name[i],EQU_CFG_NAME_LEN);
  167. dosrc.name[EQU_CFG_NAME_LEN-1] = 0;
  168. memcpy(p + fh.pub_do_addr + i*sizeof(dosrc), (char *)&dosrc, sizeof(dosrc));
  169. }
  170. // 写公共遥测
  171. for(i=0; i<fh.pub_ac_num; i++)
  172. {
  173. memset(&acsrc,0,sizeof(acsrc));
  174. acsrc.is_real = i<PUB_AC_NUM ? 1:0;
  175. acsrc.indexno = i+1;
  176. acsrc.unit = g_pub_ac_desc[i].unit;
  177. acsrc.unit_angle = g_pub_ac_desc[i].unit_angle;
  178. acsrc.normal = g_unit[g_pub_ac_desc[i].unit].normal;
  179. strncpy(acsrc.name,g_pub_ac_desc[i].name,EQU_CFG_NAME_LEN);
  180. acsrc.name[EQU_CFG_NAME_LEN-1] = 0;
  181. memcpy(p + fh.pub_ac_addr + i*sizeof(acsrc), (char *)&acsrc, sizeof(acsrc));
  182. }
  183. // 写开关遥信
  184. for(i=0; i<fh.sw_di_num; i++)
  185. {
  186. memset(&disrc,0,sizeof(disrc));
  187. if (i < SW_DI_NUM)
  188. {
  189. disrc.is_real = 1;
  190. disrc.indexno = i+1;
  191. strncpy(disrc.name,g_sw_di_name[i],EQU_CFG_NAME_LEN);
  192. disrc.name[EQU_CFG_NAME_LEN-1] = 0;
  193. }
  194. else
  195. {
  196. disrc.is_real = 0;
  197. disrc.indexno = i+1;
  198. strncpy(disrc.name,tAllSOE[disrc.indexno-SW_DI_NUM-1].strName,EQU_CFG_NAME_LEN);
  199. disrc.name[EQU_CFG_NAME_LEN-1] = 0;
  200. }
  201. memcpy(p + fh.sw_di_addr + i*sizeof(disrc), (char *)&disrc, sizeof(disrc));
  202. }
  203. // 写开关遥控
  204. for(i=0; i<fh.sw_do_num; i++)
  205. {
  206. memset(&dosrc,0,sizeof(dosrc));
  207. dosrc.is_real = 1;
  208. dosrc.indexno = i+1;
  209. strncpy(dosrc.name,g_sw_do_name[i],EQU_CFG_NAME_LEN);
  210. dosrc.name[EQU_CFG_NAME_LEN-1] = 0;
  211. memcpy(p + fh.sw_do_addr + i*sizeof(dosrc), (char *)&dosrc, sizeof(dosrc));
  212. }
  213. // 写开关遥测
  214. for(i=0; i<fh.sw_ac_num; i++)
  215. {
  216. memset(&acsrc,0,sizeof(acsrc));
  217. acsrc.is_real = i<SW_AC_NUM ? 1:0;
  218. acsrc.indexno = i+1;
  219. acsrc.unit = g_sw_ac_desc[i].unit;
  220. acsrc.unit_angle = g_sw_ac_desc[i].unit_angle;
  221. acsrc.normal = g_unit[g_sw_ac_desc[i].unit].normal;
  222. strncpy(acsrc.name,g_sw_ac_desc[i].name,EQU_CFG_NAME_LEN);
  223. acsrc.name[EQU_CFG_NAME_LEN-1] = 0;
  224. memcpy(p + fh.sw_ac_addr + i*sizeof(acsrc), (char *)&acsrc, sizeof(acsrc));
  225. }
  226. // 写单位描述
  227. for(i=0; i<fh.unit_num; i++)
  228. {
  229. memset(&unitsrc,0,sizeof(unitsrc));
  230. strncpy(unitsrc.name,g_unit[i].name,8);
  231. unitsrc.name[8-1] = 0;
  232. memcpy(p + fh.unit_addr+ i*sizeof(unitsrc), (char *)&unitsrc, sizeof(unitsrc));
  233. }
  234. // 写LED资源
  235. for(i=0; i<fh.led_num; i++)
  236. {
  237. memset(&ledsrc,0,sizeof(ledsrc));
  238. // 先填写公共LED资源
  239. if (i < PUB_LED_NUM)
  240. {
  241. ledsrc.owner = 0;
  242. ledsrc.indexno = i+1;
  243. strncpy(ledsrc.name, g_pub_led_name[i], EQU_CFG_NAME_LEN);
  244. ledsrc.name[EQU_CFG_NAME_LEN-1] = 0;
  245. }
  246. else
  247. {
  248. ledsrc.owner = 1;
  249. ledsrc.indexno = i+1-PUB_LED_NUM;
  250. strncpy(ledsrc.name,g_sw_led_name[i-PUB_LED_NUM],EQU_CFG_NAME_LEN);
  251. ledsrc.name[EQU_CFG_NAME_LEN-1] = 0;
  252. }
  253. memcpy(p + fh.led_addr + i*sizeof(ledsrc), (char *)&ledsrc, sizeof(ledsrc));
  254. }
  255. // 写开关电度
  256. for(i=0; i<fh.dd_num; i++)
  257. {
  258. memset(&ddsrc,0,sizeof(ddsrc));
  259. ddsrc.is_real = 1;
  260. ddsrc.indexno = i+1;
  261. ddsrc.unit = g_dd_desc[i].unit;
  262. ddsrc.unit_angle = g_dd_desc[i].unit_angle;
  263. ddsrc.normal = g_unit[g_dd_desc[i].unit].normal;
  264. strncpy(ddsrc.name,g_dd_desc[i].name,EQU_CFG_NAME_LEN);
  265. ddsrc.name[EQU_CFG_NAME_LEN-1] = 0;
  266. memcpy(p + fh.dd_addr + i*sizeof(ddsrc), (char *)&ddsrc, sizeof(ddsrc));
  267. }
  268. // 创建描述文件
  269. pfile = rt_file_open("/tmp/"FILE_NAME_RSC,O_CREAT|O_RDWR|O_TRUNC,0);
  270. if(IS_ERR(pfile))
  271. {
  272. rt_free(p);
  273. return -10;
  274. }
  275. // 计算CRC
  276. g_crc_rsc = CrcStr(p,file_length);
  277. memcpy(p+file_length,&g_crc_rsc,2);
  278. pos = 0;
  279. rt_file_write(pfile,p,file_length + 2,&pos);
  280. rt_file_close(pfile,0);
  281. rsc_contrast.version = fh.cfh.version;
  282. rsc_contrast.signature = fh.cfh.signature;
  283. rsc_contrast.length = file_length+2;
  284. rsc_contrast.crc = g_crc_rsc;
  285. rt_free(p);
  286. return 0;
  287. }
  288. int tbl_init(void)
  289. {
  290. u32 len;
  291. u8 *buf;
  292. struct table_file_head_data *brh;
  293. struct file * pfile;
  294. loff_t pos;
  295. // 打开文件
  296. pfile = rt_file_open("/app/data/iectable.bin",O_RDONLY ,0);
  297. if(IS_ERR(pfile))
  298. {
  299. return -1;
  300. }
  301. // 得到文件长度
  302. len = rt_file_getfile_size(pfile);
  303. if(len <= 0)
  304. {
  305. rt_file_close(pfile,0);
  306. return -11;
  307. }
  308. // 分配内存
  309. buf = rt_malloc(len);
  310. if((buf) == NULL)
  311. {
  312. rt_file_close(pfile,0);
  313. return -2;
  314. }
  315. // 读出内容
  316. pos = 0;
  317. if(rt_file_read(pfile,buf,len,&pos) != len)
  318. {
  319. rt_file_close(pfile,0);
  320. rt_free(buf);
  321. return -3;
  322. }
  323. // 关闭文件
  324. rt_file_close(pfile,0);
  325. // 检查CRC
  326. g_crc_rectable = CrcStr(buf,len-2);
  327. if(g_crc_rectable != *(u16*)(buf+len-2))
  328. {
  329. rt_free(buf);
  330. return -4;
  331. }
  332. // 检查文件签名
  333. brh = (struct table_file_head_data*)buf;
  334. if(brh->cfh.signature != SIG_TABLE_FILE)
  335. {
  336. rt_free(buf);
  337. return -5;
  338. }
  339. //比对资源表文件
  340. if ((brh->rsc_version != rsc_contrast.version)
  341. || (brh->rsc_signature!= rsc_contrast.signature)
  342. || (brh->rsc_length!= rsc_contrast.length)
  343. || (brh->rsc_crc!= rsc_contrast.crc))
  344. {
  345. rt_printf("iec_version=%4x\trsc_version=%4x\r\n",brh->rsc_version, rsc_contrast.version);
  346. rt_printf("iec_signature=%4x\trsc_signature=%4x\r\n",brh->rsc_signature, rsc_contrast.signature);
  347. rt_printf("iec_length=%4x\trsc_length=%4x\r\n",brh->rsc_length, rsc_contrast.length);
  348. rt_printf("iec_crc=%4x\trsc_crc=%4x\r\n",brh->rsc_crc, rsc_contrast.crc);
  349. rt_free(buf);
  350. return -6;
  351. }
  352. g_table_head = (struct table_file_head_data *)buf;
  353. g_di_table = (struct di_table *)(buf + brh->di_addr);
  354. g_di_merge_table = (struct di_merge_table *)(buf + brh->dimerge_addr);
  355. g_di_db_table = (struct di_db_table *)(buf + brh->di_db_addr);
  356. g_do_table = (struct do_table *)(buf + brh->do_addr);
  357. g_ac_table = (struct ac_table *)(buf + brh->ac_addr);
  358. g_sz_table = (struct sz_table *)(buf + brh->sz_addr);
  359. g_dd_table = (struct dd_table *)(buf + brh->dd_addr);
  360. #ifdef FUN_DIMER_LINK
  361. g_di_info_merge_table = (struct di_table *)FILE_ADDR_ALGIN(buf + brh->di_db_addr+g_table_head->di_db_num*sizeof(struct di_db_table));
  362. g_di_info_merge_num = (brh->do_addr - brh->di_db_addr)/sizeof(struct di_table);
  363. rt_printf("---------g_di_info_merge_table=%x,g_di_info_merge_num=%d\r\n",(u32)g_di_info_merge_table-(u32)buf,g_di_info_merge_num);
  364. #endif
  365. #ifdef FUN_JSON_FILE
  366. //tbl_json_file_init();
  367. #endif
  368. //分配遥控信息结构
  369. if(g_table_head->do_num)
  370. {
  371. len = g_table_head->do_num * sizeof(REMOTEYKSTATUS);
  372. g_yk_info = (REMOTEYKSTATUS *)rt_malloc(len);
  373. if(g_yk_info == NULL)
  374. {
  375. return -7;
  376. }
  377. memset(g_yk_info,0,len);
  378. }
  379. hs_write_iec_crc();
  380. return tbl_link_init();
  381. }
  382. #ifdef FUN_JSON_FILE
  383. int tbl_json_file_init(void)
  384. {
  385. int i,j;
  386. unsigned int file_len=0;
  387. unsigned char *p,*p_file;
  388. loff_t pos;
  389. struct timespec ts;
  390. struct rtc_time_t tm;
  391. char name[64];
  392. char dir[64];
  393. struct file * handle;
  394. #ifdef FUNC_JSON_UTF8_FORMAT
  395. int k=0;
  396. u8 utf8[3];
  397. unsigned char *file_utf;
  398. u32 utf8_code;
  399. u16 gb2312_code;
  400. #endif
  401. sprintf(dir,"%s/soeIndex.json",HF_IEC_TAB_DIR);
  402. rt_file_del(dir);
  403. // 打开文件
  404. handle = rt_file_open(dir,O_CREAT|O_RDWR ,0);
  405. #if 0
  406. if(IS_ERR(handle))
  407. {
  408. handle = 0;
  409. rt_file_deldir(HF_IEC_TAB_DIR);
  410. }
  411. else
  412. {
  413. //得到文件长度
  414. rt_file_llseek(handle,0,SEEK_END);
  415. file_len= handle->f_pos;
  416. rt_file_llseek(handle,0,SEEK_SET);
  417. //文件长度为0
  418. if(file_len && !hs_read_iec_crc())
  419. {
  420. rt_file_close(handle,0);
  421. return 0;
  422. }
  423. }
  424. #endif
  425. if(!g_di_table)
  426. return -1;
  427. rt_file_mkdir(HF_IEC_TAB_DIR);
  428. file_len = HF_IEC_TAB_HEAD_LEN+HF_IEC_TAB_ITEM_LEN*g_table_head->di_num+8;
  429. // 分配并初始化空间
  430. p_file = rt_malloc(file_len);
  431. if(!p_file)
  432. {
  433. return -2;
  434. }
  435. memset(p_file,0,file_len);
  436. p=p_file;
  437. //获取当前时间
  438. clk_time_get(&ts);
  439. timespec_to_rtc(ts,&tm,0);
  440. j=sprintf(p,"{\r\n\t\"文件描述\":\"原始点表索引\",\r\n");
  441. p += j;
  442. j=sprintf(p,"\t\"修改时间\":\"%04d-%02d-%02d %02d:%02d:%02d\",\r\n",
  443. tm.year+2000,
  444. tm.month,
  445. tm.day,
  446. tm.hour,
  447. tm.min,
  448. tm.ms/1000);
  449. p += j;
  450. j=sprintf(p,"\t\"总数量\":\"%d\",\r\n",g_table_head->di_num);
  451. p += j;
  452. j=sprintf(p,"\t\"index_list\":[");
  453. p += j;
  454. for(i=0;i<g_table_head->di_num;i++)
  455. {
  456. tbl_getname(RES_TYPE_YX,i,name);
  457. if(i == g_table_head->di_num-1)
  458. {
  459. j=sprintf(p,"{\r\n\t\"id\": %d,\r\n\t\"name\": \"%s\"\r\n\t}",i,name);
  460. }
  461. else
  462. {
  463. j=sprintf(p,"{\r\n\t\"id\": %d,\r\n\t\"name\": \"%s\"\r\n\t},",i,name);
  464. }
  465. p += j;
  466. if(i!=g_table_head->di_num-1)
  467. {
  468. j=sprintf(p," ");
  469. p += j;
  470. }
  471. }
  472. j=sprintf(p,"]\r\n}");
  473. p += j;
  474. file_len = p-p_file;
  475. pos = 0;
  476. #ifdef FUNC_JSON_UTF8_FORMAT
  477. file_utf = rt_malloc(file_len*3);
  478. if(!file_utf)
  479. {
  480. rt_free(p_file);
  481. return -3;
  482. }
  483. for(i=0;i<file_len;)
  484. {
  485. if(p_file[i] <= 0x80) //非汉字
  486. {
  487. file_utf[k] = p_file[i];
  488. k++;
  489. i++;
  490. continue;
  491. }
  492. gb2312_code = p_file[i+1]|(p_file[i]<<8);
  493. utf8_code = GetHzUtf8ByFontLib(gb2312_code);
  494. if(utf8_code == 0)
  495. {
  496. rt_err_set(ERR_CODE_INIT_SOFTWARE,0);
  497. return false;
  498. }
  499. utf8[0] = (utf8_code>>16)&0xFF;
  500. utf8[1] = (utf8_code>>8)&0xFF;
  501. utf8[2] = utf8_code&0xFF;
  502. memcpy(&file_utf[k],utf8,sizeof(utf8));
  503. k += 3;
  504. i += 2;
  505. }
  506. if(rt_file_write(handle,file_utf,k,&pos)!=k)
  507. {
  508. rt_free(p_file);
  509. rt_free(file_utf);
  510. return -4;
  511. }
  512. #else
  513. if(rt_file_write(handle,p_file,file_len,&pos)!=file_len)
  514. {
  515. rt_free(p_file);
  516. return -4;
  517. }
  518. #endif
  519. rt_file_close(handle,0);
  520. rt_free(p_file);
  521. #ifdef FUNC_JSON_UTF8_FORMAT
  522. rt_free(file_utf);
  523. #endif
  524. return 0;
  525. }
  526. #endif
  527. int tbl_exit(void)
  528. {
  529. tbl_link_exit();
  530. if(g_yk_info)
  531. {
  532. rt_free(g_yk_info);
  533. }
  534. if(g_table_head && (g_table_head != &g_table_head_null))
  535. {
  536. rt_free(g_table_head);
  537. }
  538. return 0;
  539. }
  540. int tbl_cp2index(u16 cp)
  541. {
  542. int i;
  543. // 获取点号在转发表中的位置
  544. for(i=0;i<g_table_head->di_num;i++)
  545. {
  546. if(cp == g_di_table[i].cp)
  547. {
  548. return i;
  549. }
  550. }
  551. return -1;
  552. }
  553. u8 tbl_get_dpi(int i) // 判断点号是否是双点
  554. {
  555. int j;
  556. if(i < 0)
  557. {
  558. return 0;
  559. }
  560. #ifdef IECTABLE_NEWDPI_V106
  561. return g_di_table[i].dpi;
  562. #else
  563. if(g_di_table[i].owner == SWITCH_NUM_EXT)
  564. {
  565. return 1;
  566. }
  567. #endif // 备用点,可能对应双点与合并点,也可能仅占位置
  568. // 双点
  569. for(j=0;j<g_table_head->di_db_num;j++)
  570. {
  571. if(g_di_table[i].cp == g_di_db_table[j].cp)
  572. {
  573. return 1;
  574. }
  575. }
  576. return 0;
  577. }
  578. u8 tbl_get_yx(int i,int bDPI)
  579. {
  580. int j;
  581. u8 v;
  582. bool b_siq=false;
  583. #ifdef FUNC_JX_YX_BEFORE
  584. static u8 v_tmp[PUB_DI_NUM+SW_DI_NUM+EV_PUB_END]={0};
  585. #endif
  586. if(i < 0)
  587. {
  588. return 0;
  589. }
  590. // 单点
  591. if(g_di_table[i].indexno>0)
  592. {
  593. v=GetRmtYxVal(g_di_table[i].owner,g_di_table[i].indexno);
  594. if(v&0x80)
  595. {
  596. if(pRunSet->bTT_QDS)
  597. {
  598. b_siq = true;
  599. v=(v&0x7f);
  600. }
  601. #ifdef IEC_QDS_HAVE
  602. b_siq = true;
  603. v=(v&0x7f);
  604. #endif
  605. }
  606. #ifndef IECTABLE_NEWDPI_V106 //老版本,特殊处理
  607. //上送到主站的开关属性为31的点上送为双点
  608. if(g_di_table[i].owner == SWITCH_NUM_EXT)
  609. {
  610. if(g_di_table[i].is_inverse)
  611. {
  612. v = (v==2)?1:2;
  613. }
  614. }
  615. else
  616. #endif
  617. {
  618. v = g_di_table[i].is_inverse ? ((~v)&0x03) : v;
  619. // 如果需要双点转单点,除了0x02外,其余都为0
  620. if(bDPI == 0)
  621. {
  622. v = (v==0x02) ? 1 : 0;
  623. }
  624. }
  625. #ifdef FUNC_JX_YX_BEFORE
  626. if(!g_run_stu.bjx)
  627. {
  628. v_tmp[i] = (b_siq?(v|0x80):v);
  629. }
  630. else
  631. {
  632. return v_tmp[i];
  633. }
  634. #endif
  635. return (b_siq?(v|0x80):v);
  636. }
  637. // 备用点,可能对应双点与合并点,也可能仅占位置
  638. // 双点
  639. for(j=0;j<g_table_head->di_db_num;j++)
  640. {
  641. if(g_di_table[i].cp == g_di_db_table[j].cp)
  642. {
  643. v=plc_db_value(j);
  644. #if defined GD_AREA_ZHONGSHAN || defined GD_AREA_ZHONGSHAN_2020
  645. {
  646. int id1,id2;
  647. id1 = g_di_db_table[j].no[0]&0xff;
  648. id2 = g_di_db_table[j].no[1]&0xff;
  649. if(((id1 == (SW_DI_BHTT+1))&&(id2 == (SW_DI_FA_TT+1)))
  650. ||((id2 == (SW_DI_BHTT+1))&&(id1 == (SW_DI_FA_TT+1))))
  651. {
  652. v = (v == 0)?1:2;
  653. }
  654. }
  655. #endif
  656. if(!bDPI)
  657. {
  658. v = (v == SW_DI_TYPE_ON);
  659. }
  660. #ifdef FUNC_JX_YX_BEFORE
  661. if(!g_run_stu.bjx)
  662. {
  663. v_tmp[i] = v;
  664. }
  665. else
  666. {
  667. return v_tmp[i];
  668. }
  669. #endif
  670. return v;
  671. }
  672. }
  673. // 合并点
  674. for(j=0;j<g_table_head->dimerge_num;j++)
  675. {
  676. if(g_di_table[i].cp == g_di_merge_table[j].cp)
  677. {
  678. v = g_plc[g_plc_merge_index+j].result ? 1:0;
  679. if(bDPI)
  680. {
  681. v+=1;
  682. }
  683. #ifdef FUNC_JX_YX_BEFORE
  684. if(!g_run_stu.bjx)
  685. {
  686. v_tmp[i] = v;
  687. }
  688. else
  689. {
  690. return v_tmp[i];
  691. }
  692. #endif
  693. return v;
  694. }
  695. }
  696. // 备用点,仅占位置
  697. v=0;
  698. if(bDPI)
  699. {
  700. v+=1;
  701. }
  702. #ifdef FUNC_JX_YX_BEFORE
  703. if(!g_run_stu.bjx)
  704. {
  705. v_tmp[i] = v;
  706. }
  707. else
  708. {
  709. return v_tmp[i];
  710. }
  711. #endif
  712. return v;
  713. }
  714. // 远动遥信值
  715. int tbl_yd_yx(u16 begin,u16 num,u8 * yx_buf)
  716. {
  717. u8 yx;
  718. u8 sw,no;
  719. u16 i,j,k ;
  720. u16 cnt,cnt_begin,cnt_yx;
  721. // 每个遥信占2bits,每帧最多200字节,允许800个遥信(可以超过一个合并点20个遥信,5个字节)。
  722. if(num > 800)
  723. {
  724. num = 800;
  725. }
  726. cnt_begin = 0;
  727. cnt_yx = 0;
  728. for(i=0; i<g_table_head->di_num; i++)
  729. {
  730. // 寻找起始位置
  731. if(cnt_begin < begin)
  732. {
  733. // 不过单点、双点、合并点、备用点,都在g_di_table占有位置,首先加1
  734. cnt_begin++;
  735. if(g_di_table[i].indexno)
  736. {
  737. continue;
  738. }
  739. // 双点
  740. cnt = 0;
  741. for(j=0; j<g_table_head->di_db_num; j++)
  742. {
  743. if(g_di_db_table[j].cp == g_di_table[i].cp)
  744. {
  745. cnt = 2;
  746. break;
  747. }
  748. }
  749. if(cnt)
  750. {
  751. cnt_begin += cnt;
  752. continue;
  753. }
  754. // 合并点
  755. cnt = 0;
  756. for(j=0;j<g_table_head->dimerge_num;j++)
  757. {
  758. if(g_di_merge_table[j].cp == g_di_table[i].cp)
  759. {
  760. for(k=0;k<MIX_YX_NUMBER;k++)
  761. {
  762. if(g_di_merge_table[j].no[k] == 0)
  763. {
  764. break;
  765. }
  766. cnt++;
  767. }
  768. break;
  769. }
  770. cnt_begin += cnt;
  771. }
  772. if(cnt_begin > begin)
  773. {
  774. rt_printf("tbl_yd_yx error:cnt_begin=%d,begin=%d.\r\n",cnt_begin,begin);
  775. return -1;
  776. }
  777. continue;
  778. }
  779. // 此处开始,获取遥信值
  780. if(cnt_yx >= num)
  781. {
  782. return cnt_yx;
  783. }
  784. // 单点
  785. yx = tbl_get_yx(i,1);
  786. yx_buf[cnt_yx/4] |= yx<<((cnt_yx%4)*2);
  787. cnt_yx++;
  788. if(g_di_table[i].indexno)
  789. {
  790. continue;
  791. }
  792. // 双点
  793. cnt = 0;
  794. for(j=0; j<g_table_head->di_db_num; j++)
  795. {
  796. if(g_di_db_table[j].cp == g_di_table[i].cp)
  797. {
  798. for (k=0; k<2; k++)
  799. {
  800. sw = (u8)(g_di_db_table[j].no[k]>>8);
  801. no = (u8)(g_di_db_table[j].no[k]);
  802. yx=GetRmtYxVal(sw,no);
  803. yx = g_di_db_table[j].is_inv[k] ? ((~yx)&0x03) : yx; // 取反
  804. //yx += 1; // 变双点
  805. yx_buf[cnt_yx/4] |= yx<<((cnt_yx%4)*2);
  806. cnt_yx++;
  807. cnt++;
  808. }
  809. break;
  810. }
  811. }
  812. if(cnt)
  813. {
  814. continue;
  815. }
  816. // 合并点
  817. cnt = 0;
  818. for(j=0; j<g_table_head->dimerge_num; j++)
  819. {
  820. if(g_di_merge_table[j].cp == g_di_table[i].cp)
  821. {
  822. for (k=0; k<MIX_YX_NUMBER; k++)
  823. {
  824. // 组合点号为空代表结束,退出。
  825. if(g_di_merge_table[j].no[k] == 0)
  826. {
  827. break;
  828. }
  829. no=g_di_merge_table[j].no[k]&0xff;
  830. sw=(g_di_merge_table[j].no[k]>>8)&0xff;
  831. yx=GetRmtYxVal(sw,no);
  832. yx = g_di_merge_table[j].is_inv[k] ? ((~yx)&0x03) : yx; // 取反
  833. // yx += 1; // 变双点
  834. yx_buf[cnt_yx/4] |= yx<<((cnt_yx%4)*2);
  835. cnt_yx++;
  836. cnt++;
  837. }
  838. break;
  839. }
  840. }
  841. }
  842. return cnt_yx;
  843. }
  844. // 远动遥测值
  845. int tbl_yd_yc(u16 begin,u16 num,u8 * yc_buf)
  846. {
  847. u8 sw,no;
  848. u16 i;
  849. u16 cnt_yc;
  850. long val,ang;
  851. int pCal;
  852. // 每个遥测占9bytes,每帧最多200字节,允许 200/9 个遥测。
  853. if(num > 200/9)
  854. {
  855. num = 200/9;
  856. }
  857. cnt_yc = 0;
  858. for(i=begin; (i<g_table_head->ac_num) && (cnt_yc < num); i++,cnt_yc++)
  859. {
  860. sw = g_ac_table[i].owner;
  861. no = g_ac_table[i].indexno - 1;
  862. if (sw == 0)
  863. {
  864. val=g_sw_pub.ac_in[no];
  865. if(no<PUB_AC_NUM)
  866. {
  867. ang=g_ui[no].p;
  868. if(g_ui[no].chn_index!=CFG_ADC_CHANNEL_ZERO)
  869. {
  870. pCal = 0x1;
  871. }
  872. else if(g_ui[no].ui_base_make!=-1)
  873. {
  874. pCal = 0x2;
  875. }
  876. else
  877. {
  878. pCal = 0x4;
  879. }
  880. }
  881. else
  882. {
  883. ang=ANGEL_INVALID;
  884. pCal=0x2;
  885. }
  886. if(g_unit[g_pub_ac_desc[no].unit].zero>0&&_AbsL(val)<g_unit[g_pub_ac_desc[no].unit].zero && pRunSet->bTT_RET_ZERO)
  887. {
  888. val=0;
  889. ang=ANGEL_INVALID;
  890. }
  891. yc_buf[cnt_yc*9] = pCal;
  892. yc_buf[cnt_yc*9+1] = val;
  893. yc_buf[cnt_yc*9+2] = (val >> 8);
  894. yc_buf[cnt_yc*9+3] = (val >> 16);
  895. yc_buf[cnt_yc*9+4] = (val >> 24);
  896. yc_buf[cnt_yc*9+5] = ang;
  897. yc_buf[cnt_yc*9+6] = (ang >> 8);
  898. yc_buf[cnt_yc*9+7] = (ang >> 16);
  899. yc_buf[cnt_yc*9+8] = (ang >> 24);
  900. }
  901. else if (sw <= SWITCH_NUM_EXT)
  902. {
  903. int index_begin;
  904. sw--;
  905. index_begin = UI_SW_INDEX_BEGIN(sw);
  906. val = g_sw[sw].ac_in[no];
  907. if(no<SW_AC_NUM)
  908. {
  909. ang=g_ui[index_begin+no].p;
  910. if(g_ui[index_begin+no].chn_index!=CFG_ADC_CHANNEL_ZERO)
  911. {
  912. pCal = 0x1;
  913. }
  914. else if(g_ui[index_begin+no].ui_base_make!=-1)
  915. {
  916. pCal = 0x2;
  917. }
  918. else
  919. {
  920. pCal = 0x4;
  921. }
  922. }
  923. else
  924. {
  925. pCal= 0x2;
  926. ang = ANGEL_INVALID;
  927. }
  928. if(g_unit[g_sw_ac_desc[no].unit].zero>0&&_AbsL(val)<g_unit[g_sw_ac_desc[no].unit].zero && pRunSet->bTT_RET_ZERO)
  929. {
  930. val=0;
  931. ang=ANGEL_INVALID;
  932. }
  933. yc_buf[cnt_yc*9] = pCal;
  934. yc_buf[cnt_yc*9+1] = val;
  935. yc_buf[cnt_yc*9+2] = (val >> 8);
  936. yc_buf[cnt_yc*9+3] = (val >> 16);
  937. yc_buf[cnt_yc*9+4] = (val >> 24);
  938. yc_buf[cnt_yc*9+5] = ang;
  939. yc_buf[cnt_yc*9+6] = (ang >> 8);
  940. yc_buf[cnt_yc*9+7] = (ang >> 16);
  941. yc_buf[cnt_yc*9+8] = (ang >> 24);
  942. }
  943. }
  944. return cnt_yc;
  945. }
  946. // 远动电度值
  947. int tbl_yd_dd(u16 begin,u16 num,u8 * dd_buf)
  948. {
  949. u8 sw,no;
  950. u16 i;
  951. u16 cnt_dd;
  952. long val,ang;
  953. int pCal;
  954. // 每个遥测占9bytes,每帧最多200字节,允许 200/9 个遥测。
  955. if(num > 200/9)
  956. {
  957. num = 200/9;
  958. }
  959. cnt_dd = 0;
  960. for(i=begin; (i<g_table_head->dd_num) && (cnt_dd < num); i++,cnt_dd++)
  961. {
  962. sw = g_dd_table[i].owner;
  963. no = g_dd_table[i].indexno - 1;
  964. if (sw == 0)
  965. {
  966. pCal = 0x2;
  967. val=0;
  968. ang=ANGEL_INVALID;
  969. dd_buf[cnt_dd*9] = pCal;
  970. dd_buf[cnt_dd*9+1] = val;
  971. dd_buf[cnt_dd*9+2] = (val >> 8);
  972. dd_buf[cnt_dd*9+3] = (val >> 16);
  973. dd_buf[cnt_dd*9+4] = (val >> 24);
  974. dd_buf[cnt_dd*9+5] = ang;
  975. dd_buf[cnt_dd*9+6] = (ang >> 8);
  976. dd_buf[cnt_dd*9+7] = (ang >> 16);
  977. dd_buf[cnt_dd*9+8] = (ang >> 24);
  978. }
  979. else if (sw <= SWITCH_NUM_EXT)
  980. {
  981. sw--;
  982. pCal = 0x2;
  983. val = (long)(g_sw[sw].dd[no].fv*Q16_BASE);
  984. ang=ANGEL_INVALID;
  985. dd_buf[cnt_dd*9] = pCal;
  986. dd_buf[cnt_dd*9+1] = val;
  987. dd_buf[cnt_dd*9+2] = (val >> 8);
  988. dd_buf[cnt_dd*9+3] = (val >> 16);
  989. dd_buf[cnt_dd*9+4] = (val >> 24);
  990. dd_buf[cnt_dd*9+5] = ang;
  991. dd_buf[cnt_dd*9+6] = (ang >> 8);
  992. dd_buf[cnt_dd*9+7] = (ang >> 16);
  993. dd_buf[cnt_dd*9+8] = (ang >> 24);
  994. }
  995. }
  996. return cnt_dd;
  997. }
  998. /*------------------------------ 内部函数 -------------------------------------
  999. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  1000. */
  1001. /*------------------------------ 测试函数 -------------------------------------
  1002. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1003. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1004. */
  1005. void tbl_getdiname(WORD owner, WORD index,char *name)
  1006. {
  1007. if(index == 0)
  1008. {
  1009. sprintf(name,"备用点");
  1010. return;
  1011. }
  1012. index--;
  1013. if(owner == 0)
  1014. {
  1015. if(index < PUB_DI_NUM)
  1016. {
  1017. strcpy(name, g_pub_di_name[index]);
  1018. }
  1019. else
  1020. {
  1021. index -= PUB_DI_NUM;
  1022. strcpy(name, tAllSOE[index + EV_SW_NUM].strName);
  1023. }
  1024. }
  1025. else
  1026. {
  1027. char swstr[12];
  1028. strcpy(swstr,"");
  1029. #if SWITCH_NUM_MAX!=1
  1030. sprintf(swstr,"开关%02d",owner);
  1031. #endif
  1032. if(index < SW_DI_NUM)
  1033. {
  1034. sprintf(name,"%s%s", swstr,g_sw_di_name[index]);
  1035. }
  1036. else
  1037. {
  1038. sprintf(name, "%s%s", swstr,tAllSOE[index - SW_DI_NUM].strName);
  1039. }
  1040. }
  1041. }
  1042. void tbl_getacname(WORD owner,WORD index,char *name)
  1043. {
  1044. if(owner==0)
  1045. {
  1046. strcpy(name, g_pub_ac_desc[index-1].name);
  1047. }
  1048. else
  1049. {
  1050. #if SWITCH_NUM_MAX!=1
  1051. sprintf(name,"开关%d_%s",owner, g_sw_ac_desc[index-1].name);
  1052. #else
  1053. sprintf(name,"%s", g_sw_ac_desc[index-1].name);
  1054. #endif
  1055. }
  1056. }
  1057. void tbl_getddname(WORD owner,WORD index,char *name)
  1058. {
  1059. strcpy(name, g_dd_desc[index-1].name);
  1060. }
  1061. void tbl_getdoname(WORD owner,WORD index,char *name)
  1062. {
  1063. if(owner==0)
  1064. {
  1065. sprintf(name,"%s", g_pub_do_name[index-1]);
  1066. }
  1067. else
  1068. {
  1069. #if SWITCH_NUM_MAX!=1
  1070. sprintf(name,"开关%d%s",owner, g_sw_do_name[index-1]);
  1071. #else
  1072. sprintf(name,"%s", g_sw_do_name[index-1]);
  1073. #endif
  1074. }
  1075. }
  1076. int tbl_get_sz_index_yc(u16 tbl_index)
  1077. {
  1078. return tbl_index;
  1079. }
  1080. int tbl_get_sz_index_yk(u16 tbl_index)
  1081. {
  1082. int i;
  1083. int sz_index;
  1084. sz_index = 0;
  1085. for(i=0; i< tbl_index; i++)
  1086. {
  1087. sz_index++;
  1088. if(g_do_table[i].indexno[1])
  1089. {
  1090. sz_index++;
  1091. }
  1092. }
  1093. return sz_index;
  1094. }
  1095. int tbl_get_sz_index_yx(u16 tbl_index)
  1096. {
  1097. int i,j,k;
  1098. int sz_index,cnt;
  1099. sz_index = 0;
  1100. for(i=0; i<tbl_index; i++)
  1101. {
  1102. // 不过单点、双点、合并点、备用点,都在g_di_table占有位置,首先加1
  1103. sz_index++;
  1104. if(g_di_table[i].indexno)
  1105. {
  1106. continue;
  1107. }
  1108. // 双点
  1109. cnt = 0;
  1110. for(j=0; j<g_table_head->di_db_num; j++)
  1111. {
  1112. if(g_di_db_table[j].cp == g_di_table[i].cp)
  1113. {
  1114. cnt = 2;
  1115. break;
  1116. }
  1117. }
  1118. if(cnt)
  1119. {
  1120. sz_index += cnt;
  1121. continue;
  1122. }
  1123. // 合并点
  1124. cnt = 0;
  1125. for(j=0;j<g_table_head->dimerge_num;j++)
  1126. {
  1127. if(g_di_merge_table[j].cp == g_di_table[i].cp)
  1128. {
  1129. for(k=0;k<MIX_YX_NUMBER;k++)
  1130. {
  1131. if(g_di_merge_table[j].no[k] == 0)
  1132. {
  1133. break;
  1134. }
  1135. cnt++;
  1136. }
  1137. break;
  1138. }
  1139. }
  1140. if(cnt)
  1141. {
  1142. sz_index += cnt;
  1143. continue;
  1144. }
  1145. }
  1146. return sz_index;
  1147. }
  1148. int tbl_getname_sz(WORD tbl_type, WORD tbl_index,char *name)
  1149. {
  1150. int i;
  1151. for(i=0; i< g_table_head->sz_num;i++)
  1152. {
  1153. if(tbl_type == g_sz_table[i].type && tbl_index == g_sz_table[i].index)
  1154. {
  1155. strcpy(name,(char *)&g_sz_table[g_table_head->sz_num] + g_sz_table[i].offset);
  1156. return 0;
  1157. }
  1158. }
  1159. return -1;
  1160. }
  1161. void tbl_getname(WORD tbl_type, WORD tbl_index,char *name)
  1162. {
  1163. int sz_index;
  1164. if(tbl_type == RES_TYPE_YX)
  1165. {
  1166. sz_index = tbl_get_sz_index_yx(tbl_index);
  1167. if(tbl_getname_sz(tbl_type,sz_index,name) < 0)
  1168. {
  1169. tbl_getdiname(g_di_table[tbl_index].owner,g_di_table[tbl_index].indexno,name);
  1170. }
  1171. }
  1172. else if(tbl_type == RES_TYPE_YC)
  1173. {
  1174. sz_index = tbl_get_sz_index_yc(tbl_index);
  1175. if(tbl_getname_sz(tbl_type,sz_index,name) < 0)
  1176. {
  1177. tbl_getacname(g_ac_table[tbl_index].owner,g_ac_table[tbl_index].indexno,name);
  1178. }
  1179. }
  1180. else if(tbl_type == RES_TYPE_YK)
  1181. {
  1182. sz_index = tbl_get_sz_index_yk(tbl_index);
  1183. if(tbl_getname_sz(tbl_type,sz_index,name) < 0)
  1184. {
  1185. tbl_getdoname(g_do_table[tbl_index].owner,g_do_table[tbl_index].indexno[0],name);
  1186. }
  1187. }
  1188. else if(tbl_type == RES_TYPE_DD)
  1189. {
  1190. sz_index = tbl_index;
  1191. if(tbl_getname_sz(tbl_type,sz_index,name) < 0)
  1192. {
  1193. tbl_getddname(g_ac_table[tbl_index].owner,g_ac_table[tbl_index].indexno,name);
  1194. }
  1195. }
  1196. }
  1197. void _tbl_link_ch_to_text( unsigned char ch,char *buf)
  1198. {
  1199. if( ch == 0 || ch == 128)
  1200. sprintf(buf,"无");
  1201. else if(ch < 128)
  1202. sprintf(buf,"ET_%02d",ch);
  1203. else
  1204. sprintf(buf,"RS_%02d",ch-128);
  1205. return;
  1206. }
  1207. int tbl_printf(void)
  1208. {
  1209. int i, j;
  1210. u8 owner, indexno;
  1211. char name[64];
  1212. rt_printf("di单点点表:\r\n");
  1213. rt_printf("cp\tsw\tno\tis_inverse\tDPI\r\n");
  1214. for(i=0; i<g_table_head->di_num; i++)
  1215. {
  1216. // tbl_getdiname(g_di_table[i].owner,g_di_table[i].indexno,name);
  1217. tbl_getname(RES_TYPE_YX,i,name);
  1218. rt_printf("%x,\t%d,\t%d,\t%d,\t\t%d,\t%s\r\n",
  1219. g_di_table[i].cp,
  1220. g_di_table[i].owner,
  1221. g_di_table[i].indexno,
  1222. g_di_table[i].is_inverse,
  1223. #ifdef IECTABLE_NEWDPI_V106
  1224. g_di_table[i].dpi,
  1225. #else
  1226. 0,
  1227. #endif
  1228. name);
  1229. }
  1230. rt_printf("\r\ndi双点点表:\r\n");
  1231. rt_printf("no\towner\tindexno\tis_inverse\r\n");
  1232. for(i=0; i<g_table_head->di_db_num; i++)
  1233. {
  1234. owner = (g_di_db_table[i].no[0]&0xFF00)>>8;
  1235. indexno = g_di_db_table[i].no[0];
  1236. tbl_getdiname(owner,indexno,name);
  1237. rt_printf("%x,\t%d,\t%d,\t%d,\t%s\r\n",
  1238. g_di_db_table[i].cp,
  1239. owner,
  1240. indexno,
  1241. g_di_db_table[i].is_inv[0],
  1242. name);
  1243. owner = (g_di_db_table[i].no[1]&0xFF00)>>8;
  1244. indexno = g_di_db_table[i].no[1];
  1245. tbl_getdiname(owner,indexno,name);
  1246. rt_printf("%x,\t%d,\t%d,\t%d,\t%s\r\n",
  1247. g_di_db_table[i].cp,
  1248. owner,
  1249. indexno,
  1250. g_di_db_table[i].is_inv[1],
  1251. name);
  1252. rt_printf("\r\n");
  1253. }
  1254. rt_printf("di合并点表:\r\n");
  1255. rt_printf("no\tinv_all\towner\tindex\tis_inv\tlink_ch\tlink_cp\r\n");
  1256. for(i=0; i<g_table_head->dimerge_num; i++)
  1257. {
  1258. for (j=0; j<20; j++)
  1259. {
  1260. if(g_di_merge_table[i].no[j] == 0)
  1261. {
  1262. break;
  1263. }
  1264. owner = (g_di_merge_table[i].no[j])>>8;
  1265. indexno = g_di_merge_table[i].no[j];
  1266. tbl_getdiname(owner,indexno,name);
  1267. rt_printf("%x,\t%d,\t%d,\t%d,\t%d,\t%x,\t%x,\t%s\r\n",
  1268. g_di_merge_table[i].cp,
  1269. g_di_merge_table[i].is_inv_all,
  1270. owner,
  1271. indexno,
  1272. g_di_merge_table[i].is_inv[j],
  1273. #ifdef IECTABLE_NEWDPI_V106
  1274. g_di_merge_table[i].link_ch[j],
  1275. g_di_merge_table[i].link_cp[j],
  1276. #else
  1277. 0,0,
  1278. #endif
  1279. name);
  1280. }
  1281. rt_printf("\r\n");
  1282. }
  1283. rt_printf("\r\n\r\n");
  1284. rt_printf("do点表:\r\n");
  1285. rt_printf("no\towner\tindex0\tindex1\tlnk_ch\tlnk_cp\r\n");
  1286. for(i=0; i<g_table_head->do_num; i++)
  1287. {
  1288. //tbl_getdoname(g_do_table[i].owner,g_do_table[i].indexno[0],name);
  1289. tbl_getname(RES_TYPE_YK,i,name);
  1290. rt_printf("%x,\t%d,\t%d,\t%d,\t%d,\t%d,\t%s\r\n",
  1291. g_do_table[i].cp,
  1292. g_do_table[i].owner,
  1293. g_do_table[i].indexno[0],
  1294. g_do_table[i].indexno[1],
  1295. g_do_table[i].link_ch,
  1296. g_do_table[i].link_cp,
  1297. name);
  1298. }
  1299. rt_printf("\r\nac点表:\r\n");
  1300. rt_printf("no\towner\tindexno\trate\t\tnormal\t\tdead\t\tlnk_ch\tlnk_cp\r\n");
  1301. for(i=0; i<g_table_head->ac_num; i++)
  1302. {
  1303. rt_printf("%x,\t%d,\t%d,",
  1304. g_ac_table[i].cp,
  1305. g_ac_table[i].owner,
  1306. g_ac_table[i].indexno);
  1307. rt_printf("\t%s,",q16_to_str(g_ac_table[i].rate));
  1308. rt_printf("\t%s,",q16_to_str(g_ac_table[i].normal)),
  1309. rt_printf("\t%s,",q16_to_str(g_ac_table[i].dead_value)),
  1310. _tbl_link_ch_to_text(g_ac_table[i].link_ch,name);
  1311. rt_printf("\t%s,",name),
  1312. rt_printf("\t%04x,",g_ac_table[i].link_cp),
  1313. //tbl_getacname(g_ac_table[i].owner,g_ac_table[i].indexno,name);
  1314. tbl_getname(RES_TYPE_YC,i,name);
  1315. rt_printf("\t%s\r\n",name);
  1316. }
  1317. rt_printf("\r\ndd点表:\r\n");
  1318. rt_printf("no\towner\tindexno\trate\t\tnormal\t\tdead\t\tlnk_ch\tlnk_cp\r\n");
  1319. for(i=0; i<g_table_head->dd_num; i++)
  1320. {
  1321. rt_printf("%x,\t%d,\t%d,",
  1322. g_dd_table[i].cp,
  1323. g_dd_table[i].owner,
  1324. g_dd_table[i].indexno);
  1325. rt_printf("\t%s,",q16_to_str(g_dd_table[i].rate));
  1326. rt_printf("\t%s,",q16_to_str(g_dd_table[i].normal)),
  1327. rt_printf("\t%s,",q16_to_str(g_dd_table[i].dead_value)),
  1328. _tbl_link_ch_to_text(g_dd_table[i].link_ch,name);
  1329. rt_printf("\t%s,",name),
  1330. rt_printf("\t%04x,",g_dd_table[i].link_cp),
  1331. //tbl_getddname(g_dd_table[i].owner,g_dd_table[i].indexno,name);
  1332. tbl_getname(RES_TYPE_DD,i,name);
  1333. rt_printf("\t%s\r\n",name);
  1334. }
  1335. rt_printf("字符串表(%d):\r\n",g_table_head->sz_num);
  1336. rt_printf("type\tindex\toffet\tname\r\n");
  1337. for(i=0; i<g_table_head->sz_num; i++)
  1338. {
  1339. name[0] = 0;
  1340. tbl_getname_sz(g_sz_table[i].type,g_sz_table[i].index,name);
  1341. rt_printf("%d,\t%d,\t%d,\t%s\r\n",
  1342. g_sz_table[i].type,
  1343. g_sz_table[i].index,
  1344. g_sz_table[i].offset,
  1345. name);
  1346. }
  1347. return 0;
  1348. }
  1349. int tbl_printf_rsc(void)
  1350. {
  1351. int i;
  1352. u32 len;
  1353. u16 crc;
  1354. u8 *buf;
  1355. struct rsc_file_head_data *brh;
  1356. struct file * pfile;
  1357. loff_t pos;
  1358. // 打开文件
  1359. pfile = rt_file_open("/tmp/"FILE_NAME_RSC,O_RDONLY ,0);
  1360. if(IS_ERR(pfile))
  1361. {
  1362. return -1;
  1363. }
  1364. // 得到文件长度
  1365. len = rt_file_getfile_size(pfile);
  1366. if(len <= 0)
  1367. {
  1368. rt_file_close(pfile,0);
  1369. return -11;
  1370. }
  1371. // 分配内存
  1372. buf = rt_malloc(len);
  1373. if((buf) == NULL)
  1374. {
  1375. rt_file_close(pfile,0);
  1376. return -2;
  1377. }
  1378. // 读出内容
  1379. pos = 0;
  1380. if(rt_file_read(pfile,buf,len,&pos) != len)
  1381. {
  1382. rt_file_close(pfile,0);
  1383. rt_free(buf);
  1384. return -3;
  1385. }
  1386. // 关闭文件
  1387. rt_file_close(pfile,0);
  1388. // 检查CRC
  1389. crc = CrcStr(buf,len-2);
  1390. if(crc != *(u16*)(buf+len-2))
  1391. {
  1392. rt_free(buf);
  1393. return -4;
  1394. }
  1395. // 检查文件签名
  1396. brh = (struct rsc_file_head_data*)buf;
  1397. if(brh->cfh.signature != SIG_RSC_FILE)
  1398. {
  1399. rt_free(buf);
  1400. return -5;
  1401. }
  1402. // 检查文件长度
  1403. /*if(len < sizeof(*brh) + brh->br_num*sizeof(struct board_res)+ 2)
  1404. {
  1405. rt_free(buf);
  1406. return -51;
  1407. }*/
  1408. g_rsc_head = (struct rsc_file_head_data *)buf;
  1409. g_di_pub_rsc = (struct di_rsc *)(buf + brh->pub_di_addr);
  1410. g_do_pub_rsc = (struct do_rsc *)(buf + brh->pub_do_addr);
  1411. g_ac_pub_rsc = (struct ac_rsc *)(buf + brh->pub_ac_addr);
  1412. g_di_sw_rsc = (struct di_rsc *)(buf + brh->sw_di_addr);
  1413. g_do_sw_rsc = (struct do_rsc *)(buf + brh->sw_do_addr);
  1414. g_ac_sw_rsc = (struct ac_rsc *)(buf + brh->sw_ac_addr);
  1415. g_led_rsc = (struct led_rsc *)(buf + brh->led_addr);
  1416. g_unit_rsc = (struct unit_rsc *)(buf + brh->unit_addr);
  1417. rt_printf("PUB di资源表:\r\n");
  1418. rt_printf("no\tis_real\tindex\tname\r\n");
  1419. for(i=0; i<g_rsc_head->pub_di_num; i++)
  1420. {
  1421. rt_printf("%d,\t%d,\t%d,\t%s,\r\n",i,
  1422. g_di_pub_rsc[i].is_real,
  1423. g_di_pub_rsc[i].indexno,
  1424. g_di_pub_rsc[i].name);
  1425. }
  1426. rt_printf("PUB do资源表:\r\n");
  1427. rt_printf("no\tis_real\tindex\tname\r\n");
  1428. for(i=0; i<g_rsc_head->pub_do_num; i++)
  1429. {
  1430. rt_printf("%d,\t%d,\t%d,\t%s,\r\n",
  1431. i,g_do_pub_rsc[i].is_real,
  1432. g_do_pub_rsc[i].indexno,
  1433. g_do_pub_rsc[i].name);
  1434. }
  1435. rt_printf("PUB ac资源表:\r\n");
  1436. rt_printf("no\tis_real\tindex\tname\tunit\tunit_angle\tnormal\r\n");
  1437. for(i=0; i<g_rsc_head->pub_ac_num; i++)
  1438. {
  1439. rt_printf("%d,\t%d,\t%d,\t%s,\t%d,\t%d,\t%d,\r\n",i,
  1440. g_ac_pub_rsc[i].is_real,
  1441. g_ac_pub_rsc[i].indexno,
  1442. g_ac_pub_rsc[i].name,
  1443. g_ac_pub_rsc[i].unit,
  1444. g_ac_pub_rsc[i].unit_angle,
  1445. g_ac_pub_rsc[i].normal);
  1446. }
  1447. rt_printf("SW di资源表:\r\n");
  1448. rt_printf("no\tis_real\tindex\tname\r\n");
  1449. for(i=0; i<g_rsc_head->sw_di_num; i++)
  1450. {
  1451. rt_printf("%d,\t%d,\t%d,\t%s,\r\n",i,
  1452. g_di_sw_rsc[i].is_real,
  1453. g_di_sw_rsc[i].indexno,
  1454. g_di_sw_rsc[i].name);
  1455. }
  1456. rt_printf("SW do资源表:\r\n");
  1457. rt_printf("no\tis_real\tindex\tname\r\n");
  1458. for(i=0; i<g_rsc_head->sw_do_num; i++)
  1459. {
  1460. rt_printf("%d,\t%d,\t%d,\t%s,\r\n",
  1461. i,g_do_sw_rsc[i].is_real,
  1462. g_do_sw_rsc[i].indexno,
  1463. g_do_sw_rsc[i].name);
  1464. }
  1465. rt_printf("SW ac资源表:\r\n");
  1466. rt_printf("no\tis_real\tindex\tname\tunit\tunit_angle\tnormal\r\n");
  1467. for(i=0; i<g_rsc_head->sw_ac_num; i++)
  1468. {
  1469. rt_printf("%d,\t%d,\t%d,\t%s,\t%d,\t%d,\t%d,\r\n",i,
  1470. g_ac_sw_rsc[i].is_real,
  1471. g_ac_sw_rsc[i].indexno,
  1472. g_ac_sw_rsc[i].name,
  1473. g_ac_sw_rsc[i].unit,
  1474. g_ac_sw_rsc[i].unit_angle,
  1475. g_ac_sw_rsc[i].normal);
  1476. }
  1477. rt_printf("LED资源表:\r\n");
  1478. rt_printf("no\towner\tindex\tname\r\n");
  1479. for(i=0; i<g_rsc_head->led_num; i++)
  1480. {
  1481. rt_printf("%d,\t%d,\t%d,\t%s,\r\n",
  1482. i,g_led_rsc[i].owner,
  1483. g_led_rsc[i].indexno,
  1484. g_led_rsc[i].name);
  1485. }
  1486. rt_printf("单位资源表:\r\n");
  1487. for(i=0; i<g_rsc_head->unit_num; i++)
  1488. {
  1489. rt_printf("%s\r\n",g_unit_rsc[i].name);
  1490. }
  1491. return 0;
  1492. }
  1493. void tbl_printf_cvs(void)
  1494. {
  1495. int i;
  1496. char name[64];
  1497. rt_printf("\r\n\r\n0,%s,V1.00.001,101,V1.00.001,",EQUIP_TYPE_STRING); //备份点号
  1498. for(i=0; i<g_table_head->di_num; i++)// 遥信
  1499. {
  1500. strcpy(name,"");
  1501. if(g_di_table[i].indexno==0)
  1502. {
  1503. bool bMix=true;
  1504. int m;
  1505. for(m=0; m<g_table_head->di_db_num; m++) // 双点
  1506. {
  1507. if(g_di_table[i].cp==g_di_db_table[m].cp)
  1508. {
  1509. tbl_getdiname(((g_di_db_table[m].no[0]>>8)&0xff),(g_di_db_table[m].no[0]&0xff),name);
  1510. strcat(name,"(双点)");
  1511. bMix=false;
  1512. break;
  1513. }
  1514. }
  1515. if(bMix) //合并点
  1516. {
  1517. for(m=0; m<g_table_head->dimerge_num; m++)
  1518. {
  1519. if(g_di_table[i].cp==g_di_merge_table[m].cp)
  1520. {
  1521. tbl_getdiname(((g_di_merge_table[m].no[0]>>8)&0xff),(g_di_merge_table[m].no[0]&0xff),name);
  1522. strcat(name,"(合并点)");
  1523. bMix=false;
  1524. break;
  1525. }
  1526. }
  1527. }
  1528. if(bMix) sprintf(name,"备用遥信%d",i+1);
  1529. }
  1530. else
  1531. {
  1532. tbl_getdiname(g_di_table[i].owner,g_di_table[i].indexno,name);
  1533. }
  1534. rt_printf("\r\n1,%04XH,0,3,5,%s",g_di_table[i].cp,name); //备份点号
  1535. }
  1536. for(i=0; i<g_table_head->ac_num; i++) // 遥测
  1537. {
  1538. long rate;
  1539. strcpy(name,"");
  1540. if(g_ac_table[i].indexno!=0)
  1541. {
  1542. tbl_getacname(g_ac_table[i].owner,g_ac_table[i].indexno,name);
  1543. }
  1544. else
  1545. {
  1546. sprintf(name,"备用遥测%d",i+1);
  1547. }
  1548. rate=g_ac_table[i].rate;
  1549. if(rate==0)rate=65536;
  1550. rt_printf("\r\n2,%04XH,0,1,20,50,%.2f,0,32768,0,1,%-s",g_ac_table[i].cp,((32768.0*65536)/rate),name); //备份点号
  1551. }
  1552. for(i=0; i<g_table_head->do_num; i++) //遥控
  1553. {
  1554. strcpy(name,"");
  1555. if(g_do_table[i].indexno[0]!=0)
  1556. {
  1557. tbl_getdoname(g_do_table[i].owner,g_do_table[i].indexno[0],name);
  1558. }
  1559. else
  1560. {
  1561. sprintf(name,"备用遥控%d",i+1);
  1562. }
  1563. rt_printf("\r\n5,%04XH,0,0,0,1,%-s",g_do_table[i].cp,name); //备份点号
  1564. }
  1565. rt_printf("\r\n\r\n"); //备份点号
  1566. }
  1567. /*
  1568. * sunxi 20190625 当 rt_malloc 的参数为0时,返回的地址值是 0x10
  1569. */
  1570. int tbl_link_init(void)
  1571. {
  1572. int i,num;
  1573. // 遥信
  1574. // 得到级联表个数
  1575. num = 0;
  1576. for(i=0; i<g_table_head->di_num; i++)
  1577. {
  1578. if(g_di_table[i].link_ch)
  1579. {
  1580. num++;
  1581. }
  1582. }
  1583. #ifdef FUN_DIMER_LINK
  1584. for(i=0; i<g_di_info_merge_num; i++)
  1585. {
  1586. if(g_di_info_merge_table[i].link_ch)
  1587. {
  1588. num++;
  1589. }
  1590. }
  1591. #endif
  1592. #ifdef IECTABLE_NEWDPI_V106
  1593. for(i=0; i<g_table_head->dimerge_num; i++)
  1594. {
  1595. int j;
  1596. for(j=0;j<20;j++)
  1597. {
  1598. if(g_di_merge_table[i].link_ch[j])
  1599. {
  1600. num++;
  1601. }
  1602. }
  1603. }
  1604. #endif
  1605. // 分配内存
  1606. if(num > 0) // sunxi 20190625 当 num为0时返回地址0x10是不正确的。
  1607. {
  1608. g_lt_di = (LINK_TABLE *)rt_malloc(num * sizeof(LINK_TABLE));
  1609. if(g_lt_di == NULL)
  1610. {
  1611. return -11;
  1612. }
  1613. g_lt_di_num = num;
  1614. // 初始化表
  1615. num = 0;
  1616. #ifdef FUN_DIMER_LINK
  1617. for(i=0; i<g_table_head->di_num; i++)
  1618. {
  1619. if((g_di_table[i].owner == 0) && (g_di_table[i].indexno == 0)) /*该点为双点或者合并点*/
  1620. {
  1621. int no=0;
  1622. for(no=0;no<g_di_info_merge_num;no++) /*组合点*/
  1623. {
  1624. if(g_di_info_merge_table[no].cp != g_di_table[i].cp) continue;
  1625. if(g_di_info_merge_table[no].link_ch)
  1626. {
  1627. g_lt_di[num].cp_s = g_di_info_merge_table[no].link_cp| (g_di_info_merge_table[no].link_ch << 16);
  1628. g_lt_di[num].tbl_index = i;
  1629. g_lt_di[num].owner=g_di_info_merge_table[no].owner;
  1630. g_lt_di[num].indexno=g_di_info_merge_table[no].indexno;
  1631. g_lt_di[num].is_inverse=g_di_info_merge_table[no].is_inverse;
  1632. g_lt_di[num].cp=g_di_info_merge_table[no].cp;
  1633. g_lt_di[num].is_mix=1;
  1634. num++;
  1635. }
  1636. }
  1637. }
  1638. else
  1639. {
  1640. if(g_di_table[i].link_ch)
  1641. {
  1642. // TODO:需要排序
  1643. g_lt_di[num].cp_s = g_di_table[i].link_cp| (g_di_table[i].link_ch << 16);
  1644. g_lt_di[num].tbl_index = i;
  1645. g_lt_di[num].owner=g_di_table[i].owner;
  1646. g_lt_di[num].indexno=g_di_table[i].indexno;
  1647. g_lt_di[num].is_inverse=g_di_table[i].is_inverse;
  1648. g_lt_di[num].cp=g_di_table[i].cp;
  1649. g_lt_di[num].is_mix=0;
  1650. num++;
  1651. }
  1652. }
  1653. }
  1654. #else
  1655. for(i=0; i<g_table_head->di_num; i++)
  1656. {
  1657. if(g_di_table[i].link_ch)
  1658. {
  1659. // TODO:需要排序
  1660. g_lt_di[num].cp_s = g_di_table[i].link_cp| (g_di_table[i].link_ch << 16);
  1661. g_lt_di[num].tbl_index = i;
  1662. g_lt_di[num].owner=g_di_table[i].owner;
  1663. g_lt_di[num].indexno=g_di_table[i].indexno;
  1664. g_lt_di[num].is_inverse=g_di_table[i].is_inverse;
  1665. g_lt_di[num].cp=g_di_table[i].cp;
  1666. g_lt_di[num].is_mix=0;
  1667. num++;
  1668. }
  1669. }
  1670. #endif
  1671. #ifdef IECTABLE_NEWDPI_V106
  1672. for(i=0; i<g_table_head->dimerge_num; i++)
  1673. {
  1674. int j;
  1675. for(j=0;j<20;j++)
  1676. {
  1677. if(g_di_merge_table[i].link_ch[j])
  1678. {
  1679. g_lt_di[num].cp_s = g_di_merge_table[i].link_cp[j]| (g_di_merge_table[i].link_ch[j] << 16);
  1680. g_lt_di[num].owner=(u8)(g_di_merge_table[i].no[j]>>8);
  1681. g_lt_di[num].indexno=(u8)(g_di_merge_table[i].no[j]>>0);
  1682. g_lt_di[num].is_inverse=(u8)(g_di_merge_table[i].is_inv[j]);
  1683. g_lt_di[num].cp=g_di_merge_table[i].cp;
  1684. g_lt_di[num].is_mix=1;
  1685. g_lt_di[num].tbl_index=j; // 在对应点表中的索引
  1686. num++;
  1687. }
  1688. }
  1689. }
  1690. #endif
  1691. }
  1692. else
  1693. g_lt_di_num = 0;
  1694. // 遥控
  1695. // 得到级联表个数
  1696. num = 0;
  1697. for(i=0; i<g_table_head->do_num; i++)
  1698. {
  1699. if(g_do_table[i].link_ch)
  1700. {
  1701. num++;
  1702. }
  1703. }
  1704. // 分配内存
  1705. if(num > 0) // sunxi 20190625 当 num为0时返回地址0x10是不正确的。
  1706. {
  1707. g_lt_do = (LINK_TABLE *)rt_malloc(num * sizeof(LINK_TABLE));
  1708. if(g_lt_do == NULL)
  1709. {
  1710. return -12;
  1711. }
  1712. g_lt_do_num = num;
  1713. // 初始化表
  1714. num = 0;
  1715. for(i=0; i<g_table_head->do_num; i++)
  1716. {
  1717. if(g_do_table[i].link_ch)
  1718. {
  1719. // TODO:需要排序
  1720. g_lt_do[num].cp_s = g_do_table[i].link_cp| (g_do_table[i].link_ch << 16);
  1721. g_lt_do[num].tbl_index = i;
  1722. num++;
  1723. }
  1724. }
  1725. }
  1726. else
  1727. g_lt_do_num = 0;
  1728. // 遥测
  1729. // 得到级联表个数
  1730. num = 0;
  1731. for(i=0; i<g_table_head->ac_num; i++)
  1732. {
  1733. if(g_ac_table[i].link_ch)
  1734. {
  1735. num++;
  1736. }
  1737. }
  1738. // 分配内存
  1739. if(num > 0) // sunxi 20190625 当 num为0时返回地址0x10是不正确的。
  1740. {
  1741. g_lt_ac = (LINK_TABLE *)rt_malloc(num * sizeof(LINK_TABLE));
  1742. if(g_lt_ac == NULL)
  1743. {
  1744. return -13;
  1745. }
  1746. g_lt_ac_num = num;
  1747. // 初始化表
  1748. num = 0;
  1749. for(i=0; i<g_table_head->ac_num; i++)
  1750. {
  1751. if(g_ac_table[i].link_ch)
  1752. {
  1753. // TODO:需要排序
  1754. g_lt_ac[num].cp_s = g_ac_table[i].link_cp | (g_ac_table[i].link_ch << 16);
  1755. g_lt_ac[num].tbl_index = i;
  1756. num++;
  1757. }
  1758. }
  1759. }
  1760. else
  1761. g_lt_ac_num = 0;
  1762. // 电度
  1763. // 得到级联表个数
  1764. num = 0;
  1765. for(i=0; i<g_table_head->dd_num; i++)
  1766. {
  1767. if(g_dd_table[i].link_ch)
  1768. {
  1769. num++;
  1770. }
  1771. }
  1772. // 分配内存
  1773. if(num > 0) // sunxi 20190625 当 num为0时返回地址0x10是不正确的。
  1774. {
  1775. g_lt_dd = (LINK_TABLE *)rt_malloc(num * sizeof(LINK_TABLE));
  1776. if(g_lt_dd == NULL)
  1777. {
  1778. return -13;
  1779. }
  1780. g_lt_dd_num = num;
  1781. // 初始化表
  1782. num = 0;
  1783. for(i=0; i<g_table_head->dd_num; i++)
  1784. {
  1785. if(g_dd_table[i].link_ch)
  1786. {
  1787. // TODO:需要排序
  1788. g_lt_dd[num].cp_s = g_dd_table[i].link_cp | (g_dd_table[i].link_ch << 16);
  1789. g_lt_dd[num].tbl_index = i;
  1790. num++;
  1791. }
  1792. }
  1793. }
  1794. else
  1795. g_lt_dd_num = 0;
  1796. return 0;
  1797. }
  1798. int tbl_link_exit(void)
  1799. {
  1800. // sunxi 20190627 added
  1801. if(g_lt_dd)
  1802. {
  1803. rt_free(g_lt_dd);
  1804. g_lt_dd = 0;
  1805. g_lt_dd_num = 0;
  1806. }
  1807. if(g_lt_ac)
  1808. {
  1809. rt_free(g_lt_ac);
  1810. g_lt_ac = 0;
  1811. g_lt_ac_num = 0;
  1812. }
  1813. if(g_lt_do)
  1814. {
  1815. rt_free(g_lt_do);
  1816. g_lt_do = 0;
  1817. g_lt_do_num = 0;
  1818. }
  1819. if(g_lt_di)
  1820. {
  1821. rt_free(g_lt_di);
  1822. g_lt_di = 0;
  1823. g_lt_di_num = 0;
  1824. }
  1825. return 0;
  1826. }
  1827. LINK_TABLE *tbl_link_di(u16 ch,u16 cp)
  1828. {
  1829. u32 i,cp_s;
  1830. // TODO: 需要优化算法
  1831. cp_s = ((ch)<<16) | cp;
  1832. for(i=0; i<g_lt_di_num; i++)
  1833. {
  1834. if(cp_s == g_lt_di[i].cp_s)
  1835. {
  1836. return &g_lt_di[i];
  1837. }
  1838. }
  1839. return 0;
  1840. }
  1841. LINK_TABLE *tbl_link_do(u16 ch,u16 cp)
  1842. {
  1843. u32 i,cp_s;
  1844. // TODO: 需要优化算法
  1845. cp_s = ((ch)<<16) | cp;
  1846. for(i=0; i<g_lt_do_num; i++)
  1847. {
  1848. if(cp_s == g_lt_do[i].cp_s)
  1849. {
  1850. return &g_lt_do[i];
  1851. }
  1852. }
  1853. return 0;
  1854. }
  1855. LINK_TABLE *tbl_link_ac(u16 ch,u16 cp)
  1856. {
  1857. u32 i,cp_s;
  1858. // TODO: 需要优化算法
  1859. cp_s = ((ch)<<16) | cp;
  1860. for(i=0; i<g_lt_ac_num; i++)
  1861. {
  1862. if(cp_s == g_lt_ac[i].cp_s)
  1863. {
  1864. return &g_lt_ac[i];
  1865. }
  1866. }
  1867. return 0;
  1868. }
  1869. LINK_TABLE *tbl_link_dd(u16 ch,u16 cp)
  1870. {
  1871. u32 i,cp_s;
  1872. // TODO: 需要优化算法
  1873. cp_s = ((ch)<<16) | cp;
  1874. for(i=0; i<g_lt_dd_num; i++)
  1875. {
  1876. if(cp_s == g_lt_dd[i].cp_s)
  1877. {
  1878. return &g_lt_dd[i];
  1879. }
  1880. }
  1881. return 0;
  1882. }
  1883. int tbl_link_printf(void)
  1884. {
  1885. int i;
  1886. LINK_TABLE* lt;
  1887. rt_printf("点号\t级联通道\t级联点号\t开关\t序号\t合并点 \r\n");
  1888. rt_printf("级联遥信点表(num=%d):\r\n",g_lt_di_num);
  1889. for(i=0; i<g_lt_di_num; i++)
  1890. {
  1891. //struct di_table * dt;
  1892. lt = &g_lt_di[i];
  1893. //dt = &g_di_table[lt->tbl_index];
  1894. rt_printf("%04x\t%x\t\t%04x\t\t%02d\t%02d\t%d\r\n",lt->cp,lt->cp_s>>16,lt->cp_s&0xffff,lt->owner,lt->indexno,lt->is_mix);
  1895. }
  1896. rt_printf("级联遥测点表(num=%d):\r\n",g_lt_ac_num);
  1897. for(i=0; i<g_lt_ac_num; i++)
  1898. {
  1899. struct ac_table * dt;
  1900. lt = &g_lt_ac[i];
  1901. dt = &g_ac_table [lt->tbl_index];
  1902. rt_printf("%04x\t%02d\t\t%04x\t\t%02d\t%02d\r\n",dt->cp,lt->cp_s>>16,lt->cp_s&0xffff,dt->owner,dt->indexno);
  1903. }
  1904. rt_printf("级联遥控点表(num=%d):\r\n",g_lt_do_num);
  1905. for(i=0; i<g_lt_do_num; i++)
  1906. {
  1907. struct do_table * dt;
  1908. lt = &g_lt_do[i];
  1909. dt = &g_do_table[lt->tbl_index];
  1910. rt_printf("%04x\t%02d\t\t%04x\t\t%02d\t%02d\r\n",dt->cp,lt->cp_s>>16,lt->cp_s&0xffff,dt->owner,dt->indexno);
  1911. }
  1912. rt_printf("级联电度点表(num=%d):\r\n",g_lt_dd_num);
  1913. for(i=0; i<g_lt_dd_num; i++)
  1914. {
  1915. struct dd_table * dt;
  1916. lt = &g_lt_dd[i];
  1917. dt = &g_dd_table [lt->tbl_index];
  1918. rt_printf("%04x\t%02d\t\t%04x\t\t%02d\t%02d\r\n",dt->cp,lt->cp_s>>16,lt->cp_s&0xffff,dt->owner,dt->indexno);
  1919. }
  1920. return 0;
  1921. }
  1922. /*------------------------------ 文件结束 -------------------------------------
  1923. */