record.c 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: record.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-06-20
  7. 功能说明: 录波处理。
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #ifdef LINUX_KERNEL_APP
  15. #include <linux/delay.h>
  16. #include <linux/kmod.h>
  17. #else
  18. #include <linux/if.h>
  19. #include <linux/tcp.h>
  20. #include <termios.h>
  21. #include <pthread.h>
  22. #include <sys/prctl.h>
  23. #endif
  24. #include "history_file.h"
  25. /*------------------------------- 宏定义 --------------------------------------
  26. */
  27. #define DFTU_LINUX_ZX
  28. #define RCD_BACKUP_PATH "/app/data/data/"
  29. #define RCD_BACKUP_MAX_FILES 120 //最大文件数
  30. #define RCD_DI_CHANNEL_CNT 128
  31. #define RCD_FILE_PATH HF_WAVE_DIR
  32. #define RCD_MAX_FILES 64 //最大文件数
  33. #define RCD_WAVE_MAX_NO 9999 //录波最大序号
  34. #define RCD_FILE_NAME "/tmp/rec_wave.dat"
  35. #define RCD_FILE_HEAD_SIZE 256
  36. #define RCD_LINE_NUM 8
  37. #define RCD_LINE_SIZE 512 //按64个通道计算,每个通道8字节(实际7字节,剩64字节算序号和时间戳),
  38. #define RCD_LINE_BUF_SIZE (RCD_LINE_SIZE*RCD_LINE_NUM)
  39. #define RCD_CFG_FILE_SIZE (128*1024) //cfg文件的大小
  40. #define TIME_WAVE_PRE (20*NSEC_PER_MS*6) // 6周波时间,以ns为单位。
  41. #define RCD_XDL_NO (SWITCH_NUM_MAX+1) //小电流录波文件下标
  42. #define RCD_MAX_CNT 64 //录波FIFO最大个数,必须是2的n次方
  43. #define RCD_ST_IDLE 0
  44. #define RCD_ST_START_0 1
  45. #define RCD_ST_START_1 2
  46. #define RCD_ST_RECORD 3
  47. #define RCD_ST_RECORD_OK 4
  48. #define RCD_ST_RECORD_ERR 5
  49. #define RCD_ST_FILE_OK 6
  50. #define RCD_ST_FILE_ERR 7
  51. /*------------------------------ 类型结构 -------------------------------------
  52. */
  53. struct rcd_ac
  54. {
  55. s8 name[EQU_CFG_NAME_LEN];
  56. u8 slot; //板卡槽位地址
  57. u8 index; //AI硬件地址索引
  58. u8 owner; //归属:公共(0)、开关1~开关12(1~12)
  59. u8 type; //AI类型
  60. u8 channel; // 内部通道序号,用来索引采样点数据
  61. u8 is_ct_inverse; // CT是否反向
  62. u8 is_not_owner; // 如果为1,owner值无效。
  63. u8 reserved[5];
  64. float factor_e_k; // 有效值理论比例系数
  65. float factor_e_c; // 有效值校准比例系数
  66. float factor_p_k; // 相位理论修正系数
  67. float factor_p_c; // 相位校准修正系数
  68. };
  69. struct rcd_di
  70. {
  71. s8 name[EQU_CFG_NAME_LEN];
  72. };
  73. struct rcd_do
  74. {
  75. s8 name[EQU_CFG_NAME_LEN];
  76. };
  77. struct rcd_file_head
  78. {
  79. struct cfg_file_head cfh;
  80. //
  81. s8 equ_name[16];
  82. s8 version[16];
  83. struct timespec ts_begin;
  84. u32 type;
  85. u32 dots_per_period;
  86. // 通道配置头
  87. // AC
  88. u32 ac_addr; //地址
  89. u32 ac_num; //个数
  90. // DI
  91. u32 di_addr; //地址
  92. u32 di_num; //个数
  93. // DO
  94. u32 do_addr; //地址
  95. u32 do_num; //个数
  96. // 采样点
  97. u32 dot_addr; //地址
  98. u32 dot_num; //个数
  99. };
  100. // 站名、录波装置编号、版本年代
  101. struct cfg_file_srr
  102. {
  103. char station_name[65]; // 站名包括最后一个字符'\0',下同
  104. char rec_dev_id[65]; //录波装置编号
  105. char rev_year[5]; //版本年代
  106. };
  107. // 通道的种类和数量
  108. struct cfg_file_TT
  109. {
  110. int A;//模拟通道的数目
  111. int D;//开关量通道的数目
  112. };
  113. // 模拟通道信息
  114. struct cfg_file_TT_A
  115. {
  116. int An; //通道的索引
  117. char ch_id[65];//通道标识符
  118. char Ph[3];//通道相位标识符
  119. char Ccb[65];//被检测的电路组件
  120. char Uu[33];//通道的单位
  121. float a;//通道点值的倍数
  122. float b;//通道值偏移量
  123. float skew;//通道从采样开始的时间偏移(us)
  124. int min;//此通道中的最小值
  125. int max;//此通道中的最大值
  126. float primary;//通道电压或电流变压器一次线圈比例系数
  127. float secondary;//通道电压或电流变压器二次线圈比例系数
  128. char ps[2];//采用primary 值还是secondary值;决定转换后的ax+b通道值是一次侧值还是二次侧值
  129. };
  130. // 开关量(数字)通道信息
  131. struct cfg_file_TT_D
  132. {
  133. int Dn; //status通道索引
  134. char ch_id[65];//通道名称
  135. char ph[3];//通道的相位标识符
  136. char ccbm[65];//被检测的电路组件
  137. int Y;//开关量通道的状态
  138. };
  139. // 采样速率信息
  140. struct cfg_file_samp_info
  141. {
  142. int nrates; //DAT文件中所用到的采样速率个数
  143. float samp;//采样频率
  144. int endsamp;//最终的采样数
  145. };
  146. // 时间/日期信息
  147. struct cfg_file_date_info
  148. {
  149. char firsttime[27];
  150. char trigger_point_ime[27];
  151. };
  152. //录波配置(.CFG)文件定义
  153. struct cfg_file_struct
  154. {
  155. struct cfg_file_srr srr;
  156. struct cfg_file_TT tt;
  157. struct cfg_file_TT_A *tt_a;
  158. struct cfg_file_TT_D *tt_d;
  159. float Lf; //线路频率
  160. struct cfg_file_samp_info si;
  161. struct cfg_file_date_info date_i;
  162. char ft[7]; //DAT文件格式
  163. char timemult[2];//时间倍乘因数
  164. int tt_a_cnt; //模拟通道数
  165. int *tt_a_index; //对应的配置索引
  166. int tt_d_cnt; //数字量通道数
  167. int *tt_d_index; //对应的配置索引
  168. u8 chnl[64]; //通道号
  169. };
  170. // DAT文件格式
  171. struct dat_file_struct
  172. {
  173. unsigned int n;//采样编号
  174. unsigned int timestamp;//采样时间
  175. int An[CFG_ADC_CHANNEL];//模拟通道数据
  176. int Dn[RCD_DI_CHANNEL_CNT];//开关量通道
  177. } ;
  178. struct rcd
  179. {
  180. // 录波类型
  181. u32 type;
  182. u32 sw;//开关序号
  183. // 以采样点索引为时间单位的变量
  184. u32 dt_begin; // 开始时间点
  185. u32 dt_cur; // 当前时间点
  186. u32 dt_end; // 结束时间点
  187. // 录波开始时刻
  188. struct timespec ts_begin;
  189. // 录波文件相关变量
  190. int f_index;
  191. loff_t f_offset;
  192. struct file * f_handle;
  193. int fd_cfg;
  194. int fd_dat;
  195. int new_waveno; //故障录波新序号
  196. int state; //录波状态
  197. int reuslt; //录波结果 0表示成功
  198. char rcd_working; //同一线路的录波类型
  199. //int rcd_type_buf[RCD_BUF_TYPE_NUM]; //缓存录波类型
  200. //int b_head;
  201. //int b_tail;
  202. struct cfg_file_struct f_cfs;
  203. struct dat_file_struct f_dfs;
  204. int sw_chancnt; //开关通道数
  205. int pub_cnt; //公共通道数
  206. char tmp_cfg[128]; //临时文件名
  207. char tmp_dat[128]; //临时文件名
  208. char *pdat_mem; //存放dat文件内容的内存指针
  209. u32 pdat_mem_pos; //内容的实际长度
  210. u32 pdat_mem_size; //分配的内存大小
  211. char *pcfg_mem; //存放cfg文件内容的内存指针
  212. u32 pcfg_mem_pos; //内容的实际长度
  213. u32 pcfg_mem_size; //分配的内存大小
  214. int *pAn; //模拟通道数据
  215. int pAn_size; //数据维度
  216. int pAn_no; //序号
  217. u8 *pDn; //开关量通道数据
  218. int pDn_size; //数据维度
  219. int pDn_no; //序号
  220. unsigned int samp_t; //采样间隔
  221. } ;
  222. /*------------------------------ 全局变量 -------------------------------------
  223. */
  224. int g_rcd_init;
  225. u32 g_rcd_working;
  226. struct rcd g_rcd[RCD_MAX_CNT];
  227. struct rcd g_rcd_xdl[1];
  228. int g_new_waveno[SWITCH_NUM_MAX+2];
  229. static volatile u8 rcd_head=0;
  230. static volatile u8 rcd_tail=0;
  231. static int rcd_sd_flag=0;
  232. #ifdef LINUX_KERNEL_APP
  233. static struct task_struct * g_ts_rcd;
  234. static struct task_struct * g_ts_rcd_writefile; //写文件任务
  235. static DECLARE_WAIT_QUEUE_HEAD(g_wq_rcd);
  236. static int g_wq_rcd_flag;
  237. #else
  238. static pthread_t _rcd_thread_tid = 0;
  239. static pthread_t _rcd_writefile_tid = 0;
  240. static int g_rcd_exit_flag = 0;
  241. static int g_rcd_writefile_exit_flag = 0;
  242. pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;
  243. pthread_mutex_t g_mutex;
  244. pthread_condattr_t attr;
  245. #endif
  246. extern float g_freq;
  247. //static char g_file_buf[4096];
  248. char wave_name[RECORD_FILES_MAX][40];
  249. int g_wave_filetype = 1; //录波文件格式.默认是BINARY
  250. #ifndef GW_AREA_MAIN_2021
  251. bool g_rcd_type_enable[RECORD_TYPE_NUM];
  252. #endif
  253. /*------------------------------ 函数声明 -------------------------------------
  254. */
  255. static void _rcd_save_to_flash(struct rcd *prcd);
  256. int _rcd_close_wave(struct rcd *prcd);
  257. int _rcd_soft_isr(int irq, void *dev_id);
  258. int _rcd_thread(void * unused);
  259. int _rcd_writefile_thread(void * unused);
  260. //获取对应的故障录波序号
  261. void _rcd_get_waveno(void);
  262. int rcd_write_cfg(struct rcd *prcd);
  263. int rcd_write_dat(struct rcd *prcd);
  264. void _rcd_uninit_wave(struct rcd *prcd);
  265. /*------------------------------ 外部函数 -------------------------------------
  266. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  267. */
  268. //获取FIFO数量即已经录波的个数
  269. int rcd_get_fifo_count(int head, int tail, int count)
  270. {
  271. if(head >= tail)
  272. {
  273. return (head - tail);
  274. }
  275. return ((count - tail)+head);
  276. }
  277. //获取配置的数字量开关通道数
  278. static int rcd_get_di_chan_cnt(u32 sw)
  279. {
  280. int i=0;
  281. int cnt = 0;
  282. for(i=0; i< g_equ_config->di_num; i++)
  283. {
  284. if( (g_equ_config_di[i].type == 0) || (g_equ_config_di[i].owner != (sw+1)))
  285. {
  286. continue;
  287. }
  288. cnt++;
  289. }
  290. return cnt;
  291. }
  292. #if 0
  293. //获取配置的开关通道数
  294. static int rcd_get_chan_cnt_all(void)
  295. {
  296. int i=0;
  297. int cnt = 0;
  298. for(i=0; i< g_equ_config->ac_num; i++)
  299. {
  300. if( g_equ_config_ac[i].type == 0)
  301. {
  302. continue;
  303. }
  304. cnt++;
  305. }
  306. return cnt;
  307. }
  308. #endif
  309. int rcd_get_sw_addr(u32 sw)
  310. {
  311. int index;
  312. u16 cp=0;
  313. index = plc_yx2index(sw+1,SW_DI_KRHW+1);
  314. if(index >= 0)
  315. {
  316. cp = g_lp[index].cp;
  317. }
  318. return cp;
  319. }
  320. #if 0
  321. //获取配置的模拟开关通道数
  322. static int rcd_get_chan_cnt(u32 sw)
  323. {
  324. int i=0;
  325. int cnt = 0;
  326. for(i=0; i< g_equ_config->ac_num; i++)
  327. {
  328. if( g_equ_config_ac[i].type == 0)
  329. {
  330. continue;
  331. }
  332. if( g_equ_config_ac[i].owner == (sw+1))
  333. {
  334. cnt++;
  335. }
  336. }
  337. return cnt;
  338. }
  339. //获取配置的公共通道数
  340. static int rcd_get_pub_cnt(void)
  341. {
  342. int i=0;
  343. int cnt = 0;
  344. for(i=0; i< g_equ_config->ac_num; i++)
  345. {
  346. if( g_equ_config_ac[i].type == 0)
  347. {
  348. continue;
  349. }
  350. if( g_equ_config_ac[i].owner == 0)
  351. {
  352. cnt++;
  353. }
  354. }
  355. return cnt;
  356. }
  357. #endif
  358. //初始化开关模拟通道
  359. int rcd_init_sw_A(struct rcd *prcd)
  360. {
  361. int i=0;
  362. int type1 = 0;
  363. int index;
  364. char pabc[]={0,0, 0};
  365. int scale = 0;
  366. float f;
  367. u32 sw=prcd->sw;
  368. //u32 type = prcd->type;
  369. for(i=0;i<prcd->f_cfs.tt.A;i++)
  370. {
  371. index = prcd->f_cfs.tt_a_index[i];
  372. type1 = g_equ_config_ac[index].type -1;
  373. //开关
  374. if(g_equ_config_ac[index].owner==(sw+1))
  375. {
  376. prcd->f_cfs.tt_a[i].An = i+1;
  377. sprintf(prcd->f_cfs.tt_a[i].ch_id,"%s%d" , g_sw_ac_desc[type1].name, g_equ_config_ac[index].owner);
  378. if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IA"))
  379. {
  380. pabc[0]='A';
  381. pabc[1]= 0;
  382. }
  383. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IB"))
  384. {
  385. pabc[0]='B';
  386. pabc[1]= 0;
  387. }
  388. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IC"))
  389. {
  390. pabc[0]='C';
  391. pabc[1]= 0;
  392. }
  393. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "I0"))
  394. {
  395. prcd->f_cfs.tt_a[i].ch_id[1]='Z';
  396. pabc[0]='Z';
  397. pabc[1]= 0;
  398. }
  399. else
  400. {
  401. pabc[0]=0;
  402. }
  403. sprintf(prcd->f_cfs.tt_a[i].Ph, "%s", pabc);
  404. strcpy(prcd->f_cfs.tt_a[i].Uu, g_unit[g_sw_ac_desc[type1].unit].name);
  405. }
  406. else if(g_equ_config_ac[index].owner==0)
  407. {
  408. prcd->f_cfs.tt_a[i].An = i+1;
  409. strcpy(prcd->f_cfs.tt_a[i].ch_id, g_pub_ac_desc[type1].name);
  410. if(strlen(prcd->f_cfs.tt_a[i].ch_id)>3)
  411. {
  412. pabc[0]=prcd->f_cfs.tt_a[i].ch_id[1];
  413. pabc[1]=prcd->f_cfs.tt_a[i].ch_id[2];
  414. }
  415. else
  416. {
  417. if(strstr( prcd->f_cfs.tt_a[i].ch_id, "U0"))
  418. {
  419. prcd->f_cfs.tt_a[i].ch_id[1]='Z';
  420. pabc[0]='Z';
  421. pabc[1]=0;
  422. }
  423. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "US"))
  424. {
  425. pabc[0]=0;
  426. }
  427. else
  428. {
  429. pabc[0]=prcd->f_cfs.tt_a[i].ch_id[1];
  430. pabc[1]=0;
  431. }
  432. }
  433. sprintf(prcd->f_cfs.tt_a[i].Ph, "%s", pabc);
  434. strcpy(prcd->f_cfs.tt_a[i].Uu, g_unit[g_pub_ac_desc[type1].unit].name);
  435. }
  436. scale= equ_get_ac_scale(g_equ_config_ac[index].slot, g_equ_config_ac[index].index);
  437. factor_e_c_get(g_equ_config_ac[index].slot,g_equ_config_ac[index].index,&f);
  438. prcd->f_cfs.tt_a[i].a =f/factor_e_k(scale)*1.4142;
  439. prcd->f_cfs.tt_a[i].b = 0;
  440. prcd->f_cfs.tt_a[i].skew = 0;
  441. prcd->f_cfs.tt_a[i].max = 32767;
  442. prcd->f_cfs.tt_a[i].min= -32767;
  443. prcd->f_cfs.tt_a[i].primary = sw_get_chnl_ps(index,1);
  444. prcd->f_cfs.tt_a[i].secondary= sw_get_chnl_ps(index,0);
  445. prcd->f_cfs.tt_a[i].ps[0]='S';
  446. prcd->f_cfs.tt_a[i].ps[1]=0;
  447. //rt_printf("%d,%s,%s,%s,", g_rcd[sw].f_cfs.tt_a[i].An, g_rcd[sw].f_cfs.tt_a[i].ch_id, g_rcd[sw].f_cfs.tt_a[i].Ph, g_rcd[sw].f_cfs.tt_a[i].Uu );
  448. //rt_printf("%f,%f,%f,%d,%d,", g_rcd[sw].f_cfs.tt_a[i].a, g_rcd[sw].f_cfs.tt_a[i].b, g_rcd[sw].f_cfs.tt_a[i].skew, g_rcd[sw].f_cfs.tt_a[i].min, g_rcd[sw].f_cfs.tt_a[i].max);
  449. //rt_printf("%f,%f,%s\r\n", g_rcd[sw].f_cfs.tt_a[i].primary, g_rcd[sw].f_cfs.tt_a[i].secondary, g_rcd[sw].f_cfs.tt_a[i].ps);
  450. }
  451. return 0;
  452. }
  453. //初始化开关模拟通道
  454. int rcd_init_DI(struct rcd *prcd)
  455. {
  456. int i=0;
  457. int type1 = 0;
  458. int index;
  459. int sw = prcd->sw;
  460. // u32 type = prcd->type;
  461. for(i=0;i<prcd->f_cfs.tt.D;i++)
  462. {
  463. index = prcd->f_cfs.tt_d_index[i];
  464. type1 = g_equ_config_di[index].type -1;
  465. //开关
  466. if(g_equ_config_di[index].owner==(sw+1))
  467. {
  468. prcd->f_cfs.tt_d[i].Dn = i+1;
  469. sprintf(prcd->f_cfs.tt_d[i].ch_id,"开关%d %s" ,g_equ_config_di[index].owner, g_sw_di_name[type1]);
  470. }
  471. }
  472. return 0;
  473. }
  474. //初始化开关模拟通道
  475. int rcd_init_A_all(struct rcd *prcd)
  476. {
  477. int i=0;
  478. int type1 = 0;
  479. int index;
  480. char pabc[]={0,0, 0};
  481. // u32 sw = prcd->sw;
  482. // u32 type=prcd->type;
  483. int scale = 0;
  484. float f;
  485. for(i=0;i<prcd->f_cfs.tt.A;i++)
  486. {
  487. index = prcd->f_cfs.tt_a_index[i];
  488. type1 = g_equ_config_ac[index].type -1;
  489. //开关
  490. if(g_equ_config_ac[index].owner!=0)
  491. {
  492. prcd->f_cfs.tt_a[i].An = i+1;
  493. sprintf(prcd->f_cfs.tt_a[i].ch_id,"%s%d" , g_sw_ac_desc[type1].name, g_equ_config_ac[index].owner);
  494. if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IA"))
  495. {
  496. pabc[0]='A';
  497. pabc[1]= 0;
  498. }
  499. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IB"))
  500. {
  501. pabc[0]='B';
  502. pabc[1]= 0;
  503. }
  504. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "IC"))
  505. {
  506. pabc[0]='C';
  507. pabc[1]= 0;
  508. }
  509. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "I0"))
  510. {
  511. prcd->f_cfs.tt_a[i].ch_id[1]='Z';
  512. pabc[0]='Z';
  513. pabc[1]= 0;
  514. }
  515. else
  516. {
  517. pabc[0]=0;
  518. }
  519. sprintf(prcd->f_cfs.tt_a[i].Ph, "%s", pabc);
  520. strcpy(prcd->f_cfs.tt_a[i].Uu, g_unit[g_sw_ac_desc[type1].unit].name);
  521. }
  522. else if(g_equ_config_ac[index].owner==0)
  523. {
  524. prcd->f_cfs.tt_a[i].An = i+1;
  525. strcpy(prcd->f_cfs.tt_a[i].ch_id, g_pub_ac_desc[type1].name);
  526. if(strlen(prcd->f_cfs.tt_a[i].ch_id)>3)
  527. {
  528. pabc[0]=prcd->f_cfs.tt_a[i].ch_id[1];
  529. pabc[1]=prcd->f_cfs.tt_a[i].ch_id[2];
  530. }
  531. else
  532. {
  533. if(strstr( prcd->f_cfs.tt_a[i].ch_id, "U0"))
  534. {
  535. prcd->f_cfs.tt_a[i].ch_id[1]='Z';
  536. pabc[0]='Z';
  537. pabc[1]=0;
  538. }
  539. else if(strstr( prcd->f_cfs.tt_a[i].ch_id, "US"))
  540. {
  541. pabc[0]=0;
  542. }
  543. else
  544. {
  545. pabc[0]=prcd->f_cfs.tt_a[i].ch_id[1];
  546. pabc[1]=0;
  547. }
  548. }
  549. sprintf(prcd->f_cfs.tt_a[i].Ph, "%s", pabc);
  550. strcpy(prcd->f_cfs.tt_a[i].Uu, g_unit[g_pub_ac_desc[type1].unit].name);
  551. }
  552. scale = equ_get_ac_scale(g_equ_config_ac[index].slot, g_equ_config_ac[index].index);
  553. factor_e_c_get(g_equ_config_ac[index].slot,g_equ_config_ac[index].index,&f);
  554. prcd->f_cfs.tt_a[i].a =f/factor_e_k(scale)*1.4142;
  555. prcd->f_cfs.tt_a[i].b = 0;
  556. prcd->f_cfs.tt_a[i].skew = 0;
  557. prcd->f_cfs.tt_a[i].max = 32767;
  558. prcd->f_cfs.tt_a[i].min= -32767;
  559. prcd->f_cfs.tt_a[i].primary =sw_get_chnl_ps(index,1);
  560. prcd->f_cfs.tt_a[i].secondary= sw_get_chnl_ps(index,0);
  561. prcd->f_cfs.tt_a[i].ps[0]='S';
  562. prcd->f_cfs.tt_a[i].ps[1]=0;
  563. //rt_printf("%d,%s,%s,%s,", g_rcd[sw].f_cfs.tt_a[i].An, g_rcd[sw].f_cfs.tt_a[i].ch_id, g_rcd[sw].f_cfs.tt_a[i].Ph, g_rcd[sw].f_cfs.tt_a[i].Uu );
  564. //rt_printf("%f,%f,%f,%d,%d,", g_rcd[sw].f_cfs.tt_a[i].a, g_rcd[sw].f_cfs.tt_a[i].b, g_rcd[sw].f_cfs.tt_a[i].skew, g_rcd[sw].f_cfs.tt_a[i].min, g_rcd[sw].f_cfs.tt_a[i].max);
  565. //rt_printf("%f,%f,%s\r\n", g_rcd[sw].f_cfs.tt_a[i].primary, g_rcd[sw].f_cfs.tt_a[i].secondary, g_rcd[sw].f_cfs.tt_a[i].ps);
  566. }
  567. return 0;
  568. }
  569. int rcd_get_pub_cnt(u32 sw)
  570. {
  571. int i=0;
  572. int cnt = 0;
  573. #if 1
  574. // 电压
  575. for(i=0; i< PUB_AC_NUM; i++)
  576. {
  577. if((short)g_sw_pub.ac_cfg_index[i] != INDEX_INVALLID)
  578. {
  579. //电压组2
  580. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  581. {
  582. if(i >= PUB_AC_UA2)
  583. {
  584. cnt++;
  585. }
  586. else
  587. {
  588. continue;
  589. }
  590. }
  591. else //电压组1
  592. {
  593. if(i < PUB_AC_UA2)
  594. {
  595. cnt++;
  596. }
  597. else
  598. {
  599. continue;
  600. }
  601. }
  602. }
  603. }
  604. #else
  605. for(i=0;i<g_equ_config->ac_num;i++)
  606. {
  607. if( g_equ_config_ac[i].type == 0)
  608. {
  609. continue;
  610. }
  611. if( g_equ_config_ac[i].owner == 0)
  612. {
  613. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  614. {
  615. if(g_equ_config_ac[i].type >= PUB_AC_UA2)
  616. {
  617. cnt++;
  618. }
  619. }
  620. else
  621. {
  622. if(g_equ_config_ac[i].type < PUB_AC_UA2)
  623. {
  624. cnt++;
  625. }
  626. }
  627. }
  628. }
  629. #endif
  630. return cnt;
  631. }
  632. int rcd_init_channel(struct rcd *prcd)
  633. {
  634. int i;
  635. int cnt = 0;
  636. int pub_cnt = 0;
  637. struct rtc_time_t rtc;
  638. struct timespec ts;
  639. char tmp_buf[64];
  640. u32 sw = prcd->sw;
  641. // u32 type = prcd->type;
  642. memset(tmp_buf, 0, sizeof(tmp_buf));
  643. set_get_fixed_arg(FIXED_SET_MAU, tmp_buf, sizeof(tmp_buf));
  644. sprintf(prcd->f_cfs.srr.station_name, "%s ", tmp_buf);
  645. memset(tmp_buf, 0, sizeof(tmp_buf));
  646. set_get_fixed_arg(FIXED_SET_TPE, tmp_buf, sizeof(tmp_buf));
  647. strcat(prcd->f_cfs.srr.station_name, tmp_buf);
  648. sprintf(prcd->f_cfs.srr.rec_dev_id, "%03d", 1);
  649. sprintf(prcd->f_cfs.srr.rev_year, "%d", 1999);
  650. //rt_printf("sw=%d\r\n", sw);
  651. cnt = g_sw_ac_num[sw];//rcd_get_chan_cnt(sw);
  652. #ifdef BSP_TYPE_FTU
  653. pub_cnt = g_pub_ac_num;//rcd_get_pub_cnt();
  654. #else
  655. pub_cnt = rcd_get_pub_cnt(sw);//g_pub_ac_num;//rcd_get_pub_cnt();
  656. #endif
  657. prcd->sw_chancnt = cnt;
  658. prcd->f_cfs.tt_a_cnt = cnt + pub_cnt;
  659. prcd->f_cfs.tt_d_cnt = 0;
  660. if(cnt == 0)
  661. {
  662. return -1;
  663. }
  664. {
  665. //模拟通道
  666. prcd->f_cfs.tt_a = rt_malloc((cnt+pub_cnt)*sizeof(struct cfg_file_TT_A ));
  667. if(!prcd->f_cfs.tt_a)
  668. {
  669. return -1;
  670. }
  671. memset(prcd->f_cfs.tt_a , 0, (cnt+pub_cnt) *sizeof(struct cfg_file_TT_A ));
  672. //模拟通道对应的配置索引
  673. prcd->f_cfs.tt_a_index = rt_malloc((cnt+pub_cnt) *sizeof(int));
  674. if(!prcd->f_cfs.tt_a_index)
  675. {
  676. rt_free(prcd->f_cfs.tt_a);
  677. return -1;
  678. }
  679. #if 1
  680. cnt = 0;
  681. #ifdef BSP_TYPE_FTU
  682. // 电压
  683. for(i=0; i< PUB_AC_NUM; i++)
  684. {
  685. if((short)g_sw_pub.ac_cfg_index[i] != INDEX_INVALLID)
  686. {
  687. prcd->f_cfs.tt_a_index[cnt] = g_sw_pub.ac_cfg_index[i];
  688. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  689. cnt++;
  690. }
  691. }
  692. // 电流
  693. for(i=0; i< SW_AC_NUM; i++)
  694. {
  695. if((short)g_sw[sw].ac_cfg_index[i] != INDEX_INVALLID)
  696. {
  697. prcd->f_cfs.tt_a_index[cnt] = g_sw[sw].ac_cfg_index[i];
  698. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  699. cnt++;
  700. }
  701. }
  702. #else
  703. // 电压
  704. for(i=0; i< PUB_AC_NUM; i++)
  705. {
  706. if((short)g_sw_pub.ac_cfg_index[i] != INDEX_INVALLID)
  707. {
  708. //电压组2
  709. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  710. {
  711. if(i >= PUB_AC_UA2)
  712. {
  713. prcd->f_cfs.tt_a_index[cnt] = g_sw_pub.ac_cfg_index[i];
  714. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  715. cnt++;
  716. }
  717. else
  718. {
  719. continue;
  720. }
  721. }
  722. else //电压组1
  723. {
  724. if(i < PUB_AC_UA2)
  725. {
  726. prcd->f_cfs.tt_a_index[cnt] = g_sw_pub.ac_cfg_index[i];
  727. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  728. cnt++;
  729. }
  730. else
  731. {
  732. continue;
  733. }
  734. }
  735. }
  736. }
  737. // 电流
  738. for(i=0; i< SW_AC_NUM; i++)
  739. {
  740. if((short)g_sw[sw].ac_cfg_index[i] != INDEX_INVALLID)
  741. {
  742. prcd->f_cfs.tt_a_index[cnt] = g_sw[sw].ac_cfg_index[i];
  743. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  744. cnt++;
  745. }
  746. }
  747. #endif
  748. #else
  749. //记住原来的索引
  750. cnt = 0;
  751. for(i=0; i< g_equ_config->ac_num; i++)
  752. {
  753. if( g_equ_config_ac[i].type == 0)
  754. {
  755. continue;
  756. }
  757. if( g_equ_config_ac[i].owner == (sw+1))
  758. {
  759. prcd->f_cfs.tt_a_index[cnt++] = i;
  760. }
  761. else if( g_equ_config_ac[i].owner == 0)
  762. {
  763. #ifdef BSP_TYPE_FTU
  764. prcd->f_cfs.tt_a_index[cnt++] = i;
  765. #else
  766. //电压组2
  767. if(pRunSet->tSwSet[sw].bTT_Power_v2)
  768. {
  769. if(g_equ_config_ac[i].type >= PUB_AC_UA2)
  770. {
  771. prcd->f_cfs.tt_a_index[cnt++] = i;
  772. }
  773. else
  774. {
  775. continue;
  776. }
  777. }
  778. else //电压组1
  779. {
  780. if(g_equ_config_ac[i].type < PUB_AC_UA2)
  781. {
  782. prcd->f_cfs.tt_a_index[cnt++] = i;
  783. }
  784. else
  785. {
  786. continue;
  787. }
  788. }
  789. #endif
  790. }
  791. }
  792. #endif
  793. }
  794. //开关量通道数
  795. cnt = rcd_get_di_chan_cnt(sw);
  796. prcd->f_cfs.tt_d_cnt = cnt;
  797. //开入(开关量)通道
  798. prcd->f_cfs.tt_d = rt_malloc(cnt*sizeof(struct cfg_file_TT_D ));
  799. if(!prcd->f_cfs.tt_d)
  800. {
  801. rt_free(prcd->f_cfs.tt_a);
  802. rt_free(prcd->f_cfs.tt_a_index);
  803. return -1;
  804. }
  805. memset(prcd->f_cfs.tt_d , 0, cnt *sizeof(struct cfg_file_TT_D ));
  806. //开关量通道对应的配置索引
  807. prcd->f_cfs.tt_d_index = rt_malloc(cnt *sizeof(int));
  808. if(!prcd->f_cfs.tt_d_index)
  809. {
  810. rt_free(prcd->f_cfs.tt_a);
  811. rt_free(prcd->f_cfs.tt_a_index);
  812. rt_free(prcd->f_cfs.tt_d);
  813. return -1;
  814. }
  815. //记住原来的索引
  816. cnt = 0;
  817. for(i=0; i< g_equ_config->di_num; i++)
  818. {
  819. if( (g_equ_config_di[i].type == 0) || (g_equ_config_di[i].owner != (sw+1)))
  820. {
  821. continue;
  822. }
  823. prcd->f_cfs.tt_d_index[cnt++] = i;
  824. }
  825. //模拟通道数
  826. prcd->f_cfs.tt.A = prcd->f_cfs.tt_a_cnt ;
  827. //开关量通道数
  828. prcd->f_cfs.tt.D = prcd->f_cfs.tt_d_cnt;
  829. //rt_printf("%s,%s,%s\r\n", g_rcd[sw].f_cfs.srr.station_name, g_rcd[sw].f_cfs.srr.rec_dev_id, g_rcd[sw].f_cfs.srr.rev_year);
  830. //rt_printf("TT:%dA,%dD\r\n", g_rcd[sw].f_cfs.tt.A, g_rcd[sw].f_cfs.tt.D);
  831. rcd_init_sw_A(prcd);
  832. rcd_init_DI(prcd);
  833. prcd->f_cfs.Lf = g_freq;
  834. prcd->f_cfs.si.nrates = 1;
  835. if((g_freq < 45.0) || (g_freq > 55.0) )
  836. {
  837. prcd->f_cfs.si.samp = 6400;
  838. }
  839. else
  840. {
  841. prcd->f_cfs.si.samp = g_freq * CFG_ADC_DOTS_PER_PERIOD*ADC_REC_SAMPLE_RATE;
  842. }
  843. prcd->samp_t = 1000000/prcd->f_cfs.si.samp;
  844. prcd->f_cfs.si.endsamp = (prcd->dt_end - prcd->dt_begin)*ADC_REC_SAMPLE_RATE;
  845. ts = prcd->ts_begin;
  846. timespec_to_rtc(ts, &rtc, 0);
  847. sprintf(prcd->f_cfs.date_i.firsttime, "%02d/%02d/%04d,%02d:%02d:%02d.%06d", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  848. ts.tv_nsec +=TIME_WAVE_PRE;
  849. if(ts.tv_nsec >= 1000000000)
  850. {
  851. ts.tv_sec += 1;
  852. ts.tv_nsec -= 1000000000;
  853. }
  854. timespec_to_rtc(ts, &rtc, 0);
  855. sprintf(prcd->f_cfs.date_i.trigger_point_ime, "%02d/%02d/%04d,%02d:%02d:%02d.%06d", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  856. if(g_wave_filetype==0)
  857. {
  858. strcpy(prcd->f_cfs.ft,"ASCII");
  859. }
  860. else
  861. {
  862. strcpy(prcd->f_cfs.ft,"BINARY");
  863. }
  864. prcd->f_cfs.timemult[0] = '1';
  865. return 0;
  866. }
  867. int rcd_init_channel_all(struct rcd *prcd)
  868. {
  869. int i,j;
  870. int cnt = 0;
  871. int pub_cnt = 0;
  872. struct rtc_time_t rtc;
  873. struct timespec ts;
  874. // u32 sw = prcd->sw;
  875. // u32 type=prcd->type;
  876. char tmp_buf[64];
  877. memset(tmp_buf, 0, sizeof(tmp_buf));
  878. set_get_fixed_arg(FIXED_SET_MAU, tmp_buf, sizeof(tmp_buf));
  879. sprintf(prcd->f_cfs.srr.station_name, "%s ", tmp_buf);
  880. memset(tmp_buf, 0, sizeof(tmp_buf));
  881. set_get_fixed_arg(FIXED_SET_TPE, tmp_buf, sizeof(tmp_buf));
  882. strcat(prcd->f_cfs.srr.station_name, tmp_buf);
  883. sprintf(prcd->f_cfs.srr.rec_dev_id, "%03d", 1);
  884. sprintf(prcd->f_cfs.srr.rev_year, "%d", 1999);
  885. //rt_printf("sw=%d\r\n", sw);
  886. cnt = g_sw_ac_num[SWITCH_NUM_MAX];//rcd_get_chan_cnt_all();
  887. prcd->f_cfs.tt_a_cnt = cnt;
  888. prcd->f_cfs.tt_d_cnt = 0;
  889. if(cnt == 0)
  890. {
  891. return -1;
  892. }
  893. {
  894. //模拟通道
  895. prcd->f_cfs.tt_a = rt_malloc((cnt+pub_cnt)*sizeof(struct cfg_file_TT_A ));
  896. if(!prcd->f_cfs.tt_a)
  897. {
  898. return -1;
  899. }
  900. memset(prcd->f_cfs.tt_a , 0, (cnt+pub_cnt) *sizeof(struct cfg_file_TT_A ));
  901. //模拟通道对应的配置索引
  902. prcd->f_cfs.tt_a_index = rt_malloc((cnt+pub_cnt) *sizeof(int));
  903. if(!prcd->f_cfs.tt_a_index)
  904. {
  905. rt_free(prcd->f_cfs.tt_a);
  906. return -1;
  907. }
  908. #if 1
  909. //记住原来的索引
  910. cnt = 0;
  911. // 电压
  912. for(i=0; i < PUB_AC_NUM; i++)
  913. {
  914. if((short)g_sw_pub.ac_cfg_index[i] != INDEX_INVALLID)
  915. {
  916. prcd->f_cfs.tt_a_index[cnt] = g_sw_pub.ac_cfg_index[i];
  917. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  918. cnt++;
  919. }
  920. }
  921. for(i=0; i<SWITCH_NUM_MAX; i++)
  922. {
  923. // 电流
  924. for(j=0; j < SW_AC_NUM; j++)
  925. {
  926. if((short)g_sw[i].ac_cfg_index[j] != INDEX_INVALLID)
  927. {
  928. prcd->f_cfs.tt_a_index[cnt] = g_sw[i].ac_cfg_index[j];
  929. prcd->f_cfs.chnl[cnt] = equ_get_ac_channel(g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].slot, g_equ_config_ac[prcd->f_cfs.tt_a_index[cnt]].index);
  930. cnt++;
  931. }
  932. }
  933. }
  934. #else
  935. //记住原来的索引
  936. cnt = 0;
  937. for(i=0; i< g_equ_config->ac_num; i++)
  938. {
  939. if( g_equ_config_ac[i].type == 0)
  940. {
  941. continue;
  942. }
  943. prcd->f_cfs.tt_a_index[cnt++] = i;
  944. }
  945. #endif
  946. }
  947. //模拟通道数
  948. prcd->f_cfs.tt.A = prcd->f_cfs.tt_a_cnt ;
  949. //开关量通道数
  950. prcd->f_cfs.tt.D = prcd->f_cfs.tt_d_cnt;
  951. //rt_printf("%s,%s,%s\r\n", g_rcd[sw].f_cfs.srr.station_name, g_rcd[sw].f_cfs.srr.rec_dev_id, g_rcd[sw].f_cfs.srr.rev_year);
  952. //rt_printf("TT:%dA,%dD\r\n", g_rcd[sw].f_cfs.tt.A, g_rcd[sw].f_cfs.tt.D);
  953. rcd_init_A_all(prcd);
  954. prcd->f_cfs.Lf = freq_get(0);
  955. prcd->f_cfs.si.nrates = 1;
  956. if((g_freq < 45.0) || (g_freq > 55.0) )
  957. {
  958. prcd->f_cfs.si.samp = 6400;
  959. }
  960. else
  961. {
  962. prcd->f_cfs.si.samp = g_freq * CFG_ADC_DOTS_PER_PERIOD*ADC_REC_SAMPLE_RATE;
  963. }
  964. prcd->samp_t = 1000000/prcd->f_cfs.si.samp;
  965. prcd->f_cfs.si.endsamp = (prcd->dt_end - prcd->dt_begin)*ADC_REC_SAMPLE_RATE;
  966. ts = prcd->ts_begin;
  967. timespec_to_rtc(ts, &rtc, 0);
  968. sprintf(prcd->f_cfs.date_i.firsttime, "%02d/%02d/%04d,%02d:%02d:%02d.%06d", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  969. ts.tv_nsec +=TIME_WAVE_PRE;
  970. if(ts.tv_nsec >= 1000000000)
  971. {
  972. ts.tv_sec += 1;
  973. ts.tv_nsec -= 1000000000;
  974. }
  975. timespec_to_rtc(ts, &rtc, 0);
  976. sprintf(prcd->f_cfs.date_i.trigger_point_ime, "%02d/%02d/%04d,%02d:%02d:%02d.%06d", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  977. if(g_wave_filetype==0)
  978. {
  979. strcpy(prcd->f_cfs.ft,"ASCII");
  980. }
  981. else
  982. {
  983. strcpy(prcd->f_cfs.ft,"BINARY");
  984. }
  985. prcd->f_cfs.timemult[0] = '1';
  986. return 0;
  987. }
  988. #ifdef LINUX_KERNEL_APP
  989. int rcd_init(void)
  990. {
  991. memset(&g_rcd,0,sizeof(g_rcd));
  992. //创建目录。如果目录已经存在,就不会再创建
  993. rt_file_mkdir(RCD_FILE_PATH);
  994. rt_file_mkdir(RCD_XDL_FILE_PATH);
  995. #ifdef DFTU_LINUX_ZX
  996. rt_file_mkdir(RCD_BACKUP_PATH);
  997. #endif
  998. //获取录波序号
  999. _rcd_get_waveno();
  1000. // 登记主循环软中断
  1001. rt_sirq_register(RT_SOFT_IRQ_RCD,_rcd_soft_isr,"rcd_soft_isr");
  1002. // 运行应用录波线程
  1003. g_ts_rcd = kthread_run(_rcd_thread,NULL,"rcd_thread");
  1004. if(IS_ERR(g_ts_rcd))
  1005. {
  1006. printk("ts=%p\r\n",g_ts_rcd);
  1007. g_ts_rcd = NULL;
  1008. return -1;
  1009. }
  1010. // 设置调度策略和优先级,最高
  1011. {
  1012. struct sched_param sp;
  1013. sp.sched_priority = 7;
  1014. sched_setscheduler(g_ts_rcd,SCHED_FIFO,&sp);
  1015. }
  1016. // 写录波文件线程
  1017. g_ts_rcd_writefile = kthread_run(_rcd_writefile_thread,NULL,"rcd_write");
  1018. if(IS_ERR(g_ts_rcd_writefile))
  1019. {
  1020. printk("ts=%p\r\n",g_ts_rcd_writefile);
  1021. g_ts_rcd_writefile = NULL;
  1022. return -1;
  1023. }
  1024. // 设置调度策略和优先级
  1025. {
  1026. struct sched_param sp;
  1027. sp.sched_priority = 14;
  1028. sched_setscheduler(g_ts_rcd_writefile,SCHED_FIFO,&sp);
  1029. }
  1030. g_rcd_init = 1;
  1031. return 0;
  1032. }
  1033. #else
  1034. //linux
  1035. int rcd_init(void)
  1036. {
  1037. int ret;
  1038. memset(&g_rcd,0,sizeof(g_rcd));
  1039. //创建目录。如果目录已经存在,就不会再创建
  1040. rt_file_mkdir(RCD_FILE_PATH);
  1041. rt_file_mkdir(RCD_XDL_FILE_PATH);
  1042. #ifdef DFTU_LINUX_ZX
  1043. rt_file_mkdir(RCD_BACKUP_PATH);
  1044. #endif
  1045. //获取录波序号
  1046. _rcd_get_waveno();
  1047. // 登记主循环软中断
  1048. //rt_sirq_register(RT_SOFT_IRQ_RCD,_rcd_soft_isr,"rcd_soft_isr");
  1049. pthread_condattr_init(&attr);
  1050. pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
  1051. pthread_cond_init(&g_cond, &attr);
  1052. ret = pthread_create(&_rcd_thread_tid, NULL, (void *)_rcd_thread, NULL);
  1053. if(ret)
  1054. {
  1055. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  1056. _rcd_thread_tid = 0;
  1057. return ret;
  1058. }
  1059. ret = pthread_create(&_rcd_writefile_tid, NULL, (void *)_rcd_writefile_thread, NULL);
  1060. if(ret)
  1061. {
  1062. rt_printf("ret = %d, err = %s\r\n", ret, strerror(ret));
  1063. _rcd_writefile_tid = 0;
  1064. return ret;
  1065. }
  1066. g_rcd_init = 1;
  1067. return 0;
  1068. }
  1069. #endif
  1070. #ifdef LINUX_KERNEL_APP
  1071. int rcd_exit(void)
  1072. {
  1073. u32 sw;
  1074. //int i;
  1075. struct rcd *prcd;
  1076. rt_sirq_unregister(RT_SOFT_IRQ_RCD);
  1077. if(g_ts_rcd != NULL)
  1078. {
  1079. wake_up(&g_wq_rcd);
  1080. kthread_stop(g_ts_rcd);
  1081. }
  1082. if(g_ts_rcd_writefile != NULL)
  1083. {
  1084. //wake_up(&g_wq_rcd);
  1085. kthread_stop(g_ts_rcd_writefile);
  1086. //g_ts_rcd_writefile = NULL;
  1087. }
  1088. for(sw=0;sw<=RCD_MAX_CNT;sw++)
  1089. {
  1090. prcd = &g_rcd[sw];
  1091. _rcd_close_wave(prcd);
  1092. _rcd_uninit_wave(prcd);
  1093. }
  1094. return 0;
  1095. }
  1096. #else
  1097. //linux
  1098. int rcd_exit(void)
  1099. {
  1100. u32 sw;
  1101. //int i;
  1102. struct rcd *prcd;
  1103. g_rcd_exit_flag = 1;
  1104. g_rcd_writefile_exit_flag = 1;
  1105. // rt_sirq_unregister(RT_SOFT_IRQ_RCD);
  1106. pthread_mutex_lock(&g_mutex);
  1107. /*唤醒*/
  1108. pthread_cond_signal(&g_cond);
  1109. pthread_mutex_unlock(&g_mutex);
  1110. for(sw=0;sw<=RCD_MAX_CNT;sw++)
  1111. {
  1112. prcd = &g_rcd[sw];
  1113. _rcd_close_wave(prcd);
  1114. _rcd_uninit_wave(prcd);
  1115. }
  1116. pthread_join(_rcd_writefile_tid, NULL);
  1117. pthread_join(_rcd_thread_tid, NULL);
  1118. pthread_mutex_destroy(&g_mutex);
  1119. pthread_cond_destroy(&g_cond);
  1120. return 0;
  1121. }
  1122. #endif
  1123. int rcd_start(u32 sw, u32 type,u32 waves)
  1124. {
  1125. uint32_t flags;
  1126. struct timespec ts;
  1127. u32 dt;
  1128. int i_head ;
  1129. struct rcd *prcd;
  1130. // 检查参数
  1131. if(sw > SWITCH_NUM_MAX)
  1132. {
  1133. return -1;
  1134. }
  1135. // 没有初始化好
  1136. if(g_rcd_init == 0)
  1137. {
  1138. return -2;
  1139. }
  1140. //过滤录波类型,如果是零流突变,必录
  1141. if(type >= RECORD_TYPE_NUM)
  1142. {
  1143. return -3;
  1144. }
  1145. #ifndef GW_AREA_MAIN_2021
  1146. if(g_rcd_type_enable[type] == 0)
  1147. #else
  1148. if(pRunSet->tSwSet[sw].bTT_rcd_type[type] == 0)
  1149. #endif
  1150. {
  1151. // #ifdef XDL_ZT
  1152. #if 0
  1153. TSETSW *pSet = &pRunSet->tSwSet[sw];
  1154. if((BH_ALL_EN(sw)) == 0)
  1155. {
  1156. return -4;
  1157. }
  1158. if((type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
  1159. || (type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
  1160. {
  1161. }
  1162. else
  1163. {
  1164. return -41;
  1165. }
  1166. #else
  1167. //if((BH_ALL_EN(sw)) == 0)
  1168. {
  1169. return -4;
  1170. }
  1171. #endif
  1172. }
  1173. if(g_sw_ac_num[sw]==0)
  1174. {
  1175. rt_printf("开关%02d没有配置模拟量!\r\n",sw);
  1176. return -5;
  1177. }
  1178. // 获取一个录波的数据结构
  1179. i_head = -1;
  1180. rt_irq_save(flags);
  1181. if(((rcd_head+1)&(RCD_MAX_CNT-1)) != rcd_tail)
  1182. {
  1183. i_head=rcd_head;
  1184. rcd_head = ((rcd_head+1)&(RCD_MAX_CNT-1));
  1185. }
  1186. rt_irq_restore(flags);
  1187. if(i_head == -1)
  1188. {
  1189. rt_printf("录波缓存已满(sw=%02d,type=%d)!\r\n",sw,type);
  1190. return -6;
  1191. }
  1192. prcd = &g_rcd[i_head];
  1193. prcd->state = RCD_ST_START_0;
  1194. // 最大录1000个周波,20S,约4M数据
  1195. if(waves > 1000)
  1196. {
  1197. waves = 1000;
  1198. }
  1199. // 初始化数据
  1200. prcd->type=type;
  1201. //置录波类型标志
  1202. //prcd->rcd_working=1;
  1203. prcd->sw = sw;
  1204. // 获取时间点,通过关中断保证时间的一致性
  1205. rt_irq_save(flags);
  1206. #ifdef CPU_FUXI
  1207. // ts=ts_adc_dots[g_adc_dots_index];
  1208. // 目前时间戳没有通过共享内存记录r核的时间,此处采用gps_get_time,但是现在采样点5ms更新一次,因此此处的时间最大可能出现5ms误差
  1209. gps_get_time(&ts);
  1210. #else
  1211. gps_get_time(&ts);
  1212. #endif
  1213. dt=g_adc_dots_count;
  1214. rt_irq_restore(flags);
  1215. // 得到第一个采样点的时刻
  1216. if(ts.tv_nsec < TIME_WAVE_PRE)
  1217. {
  1218. ts.tv_sec--;
  1219. ts.tv_nsec += NSEC_PER_SEC;
  1220. }
  1221. ts.tv_nsec -= TIME_WAVE_PRE;
  1222. prcd->ts_begin = ts;
  1223. // 采样点相关初始化
  1224. prcd->dt_begin = dt - CFG_ADC_DOTS_PER_PERIOD*6; // 前6个周波的位置
  1225. prcd->dt_cur = prcd->dt_begin;
  1226. prcd->dt_end = dt + CFG_ADC_DOTS_PER_PERIOD*waves; //启动后waves个周波
  1227. // 初始标志
  1228. prcd->fd_cfg = -1;
  1229. prcd->fd_dat = -1;
  1230. prcd->state = RCD_ST_START_1;
  1231. //g_rcd_working |= 1<<sw; //录波已经启动
  1232. // rt_printf("启动录波(sw=%02d,type=%d)!\r\n",sw,type);
  1233. #ifdef LINUX_KERNEL_APP
  1234. rt_sirq_force(RT_SOFT_IRQ_RCD);
  1235. #else
  1236. wq_rcd();
  1237. #endif
  1238. return 0;
  1239. }
  1240. //初始化小电流模拟通道
  1241. int rcd_init_A_xdl(struct rcd *prcd)
  1242. {
  1243. int i=0;
  1244. // u32 type=0;
  1245. //u32 sw = SWITCH_NUM_MAX;
  1246. for(i=0;i<prcd->f_cfs.tt.A;i++)
  1247. {
  1248. prcd->f_cfs.tt_a[i].An = i+1;
  1249. #ifdef XDL_ZT
  1250. sprintf(prcd->f_cfs.tt_a[i].ch_id,"%s" ,xdl_get_chan_name(i));
  1251. #endif
  1252. //sprintf(g_rcd[sw].f_cfs.tt_a[i].Ph, "%s", pabc);
  1253. strcpy(prcd->f_cfs.tt_a[i].Uu," ");
  1254. prcd->f_cfs.tt_a[i].a =1.0;
  1255. prcd->f_cfs.tt_a[i].b = 0;
  1256. prcd->f_cfs.tt_a[i].skew = 0;
  1257. prcd->f_cfs.tt_a[i].max = 32767;
  1258. prcd->f_cfs.tt_a[i].min= -32767;
  1259. prcd->f_cfs.tt_a[i].primary = 1.0;
  1260. prcd->f_cfs.tt_a[i].secondary= 1.0;
  1261. prcd->f_cfs.tt_a[i].ps[0]='S';
  1262. prcd->f_cfs.tt_a[i].ps[1]=0;
  1263. //rt_printf("%d,%s,%s,%s,", g_rcd[sw].f_cfs.tt_a[i].An, g_rcd[sw].f_cfs.tt_a[i].ch_id, g_rcd[sw].f_cfs.tt_a[i].Ph, g_rcd[sw].f_cfs.tt_a[i].Uu );
  1264. //rt_printf("%f,%f,%f,%d,%d,", g_rcd[sw].f_cfs.tt_a[i].a, g_rcd[sw].f_cfs.tt_a[i].b, g_rcd[sw].f_cfs.tt_a[i].skew, g_rcd[sw].f_cfs.tt_a[i].min, g_rcd[sw].f_cfs.tt_a[i].max);
  1265. //rt_printf("%f,%f,%s\r\n", g_rcd[sw].f_cfs.tt_a[i].primary, g_rcd[sw].f_cfs.tt_a[i].secondary, g_rcd[sw].f_cfs.tt_a[i].ps);
  1266. }
  1267. return 0;
  1268. }
  1269. int rcd_init_channel_xdl(struct rcd *prcd)
  1270. {
  1271. int cnt = 0;
  1272. int pub_cnt = 0;
  1273. struct rtc_time_t rtc;
  1274. struct timespec ts;
  1275. //u32 sw = SWITCH_NUM_MAX;
  1276. char tmp_buf[64];
  1277. // u32 type=0;
  1278. memset(tmp_buf, 0, sizeof(tmp_buf));
  1279. set_get_fixed_arg(FIXED_SET_MAU, tmp_buf, sizeof(tmp_buf));
  1280. sprintf(prcd->f_cfs.srr.station_name, "%s ", tmp_buf);
  1281. memset(tmp_buf, 0, sizeof(tmp_buf));
  1282. set_get_fixed_arg(FIXED_SET_TPE, tmp_buf, sizeof(tmp_buf));
  1283. strcat(prcd->f_cfs.srr.station_name, tmp_buf);
  1284. sprintf(prcd->f_cfs.srr.rec_dev_id, "%03d", 1);
  1285. sprintf(prcd->f_cfs.srr.rev_year, "%d", 1999);
  1286. //rt_printf("sw=%d\r\n", sw);
  1287. #ifdef XDL_ZT
  1288. cnt = xdl_get_chan_cnt();
  1289. #endif
  1290. prcd->f_cfs.tt_a_cnt = cnt;
  1291. prcd->f_cfs.tt_d_cnt = 0;
  1292. if(cnt == 0)
  1293. {
  1294. return -1;
  1295. }
  1296. {
  1297. //模拟通道
  1298. prcd->f_cfs.tt_a = rt_malloc((cnt+pub_cnt)*sizeof(struct cfg_file_TT_A ));
  1299. if(!prcd->f_cfs.tt_a)
  1300. {
  1301. return -1;
  1302. }
  1303. memset(prcd->f_cfs.tt_a , 0, (cnt+pub_cnt) *sizeof(struct cfg_file_TT_A ));
  1304. //模拟通道对应的配置索引
  1305. prcd->f_cfs.tt_a_index = rt_malloc((cnt+pub_cnt) *sizeof(int));
  1306. if(!prcd->f_cfs.tt_a_index)
  1307. {
  1308. rt_free(prcd->f_cfs.tt_a);
  1309. return -1;
  1310. }
  1311. }
  1312. //模拟通道数
  1313. prcd->f_cfs.tt.A = prcd->f_cfs.tt_a_cnt ;
  1314. //开关量通道数
  1315. prcd->f_cfs.tt.D = prcd->f_cfs.tt_d_cnt;
  1316. //rt_printf("%s,%s,%s\r\n", g_rcd[sw].f_cfs.srr.station_name, g_rcd[sw].f_cfs.srr.rec_dev_id, g_rcd[sw].f_cfs.srr.rev_year);
  1317. //rt_printf("TT:%dA,%dD\r\n", g_rcd[sw].f_cfs.tt.A, g_rcd[sw].f_cfs.tt.D);
  1318. rcd_init_A_xdl(prcd);
  1319. prcd->f_cfs.Lf = freq_get(0);
  1320. prcd->f_cfs.si.nrates = 1;
  1321. if((g_freq < 45.0) || (g_freq > 55.0) )
  1322. {
  1323. prcd->f_cfs.si.samp = 6400;
  1324. }
  1325. else
  1326. {
  1327. prcd->f_cfs.si.samp = g_freq * CFG_ADC_DOTS_PER_PERIOD*ADC_REC_SAMPLE_RATE;
  1328. }
  1329. prcd->samp_t = 1000000/prcd->f_cfs.si.samp;
  1330. prcd->f_cfs.si.endsamp = XDL_SAMPLE_LEN;
  1331. ts = prcd->ts_begin;
  1332. timespec_to_rtc(ts, &rtc, 0);
  1333. sprintf(prcd->f_cfs.date_i.firsttime, "%02d/%02d/%04d,%02d:%02d:%02d.%06d", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  1334. ts.tv_nsec +=TIME_WAVE_PRE;
  1335. if(ts.tv_nsec >= 1000000000)
  1336. {
  1337. ts.tv_sec += 1;
  1338. ts.tv_nsec -= 1000000000;
  1339. }
  1340. timespec_to_rtc(ts, &rtc, 0);
  1341. sprintf(prcd->f_cfs.date_i.trigger_point_ime, "%02d/%02d/%04d,%02d:%02d:%02d.%06", rtc.day, rtc.month,rtc.year+2000, rtc.hour, rtc.min, rtc.ms/1000, (rtc.ms%1000)*1000);
  1342. if(g_wave_filetype==0)
  1343. {
  1344. strcpy(prcd->f_cfs.ft,"ASCII");
  1345. }
  1346. else
  1347. {
  1348. strcpy(prcd->f_cfs.ft,"BINARY");
  1349. }
  1350. prcd->f_cfs.timemult[0] = '1';
  1351. return 0;
  1352. }
  1353. int _rcd_open_xdl_cfg(char *name,struct rcd *prcd, struct timespec *ts)
  1354. {
  1355. int ret = 0;
  1356. // int sw = RCD_XDL_NO;
  1357. // u32 type = 0;
  1358. u32 xdl_sw = prcd->sw;
  1359. prcd->ts_begin = *ts;
  1360. if(name)
  1361. {
  1362. sprintf(prcd->tmp_cfg, "/tmp/xdl_%s_%d.cfg", name,(int)xdl_sw);
  1363. }
  1364. else
  1365. {
  1366. sprintf(prcd->tmp_cfg, "/tmp/xdl_wave_%d.cfg", (int)xdl_sw);
  1367. }
  1368. //打开文件
  1369. prcd->fd_cfg = sys_open(prcd->tmp_cfg, O_CREAT|O_RDWR|O_TRUNC , 0777);
  1370. if(prcd->fd_cfg < 0)
  1371. {
  1372. rt_printf("%s:sys_open(%s) error\n",__func__, prcd->tmp_cfg);
  1373. return -1;
  1374. }
  1375. ret=rcd_init_channel_xdl(prcd);
  1376. //分配内存,用于缓存.cfg文件内容.
  1377. prcd->pcfg_mem = rt_malloc(RCD_CFG_FILE_SIZE);
  1378. if(!prcd->pcfg_mem)
  1379. {
  1380. rt_printf("%s: rt_malloc(RCD_CFG_FILE_SIZE) error\r\n", __func__);
  1381. return -1;
  1382. }
  1383. //最大缓存文件大小
  1384. prcd->pcfg_mem_size = RCD_CFG_FILE_SIZE;
  1385. prcd->pcfg_mem_pos = 0;
  1386. return 0;
  1387. }
  1388. int _rcd_close_xdl_cfg(struct rcd *prcd)
  1389. {
  1390. //u32 sw = RCD_XDL_NO;
  1391. //u32 type = 0;
  1392. if(prcd->fd_cfg >= 0)
  1393. {
  1394. sys_close(prcd->fd_cfg);
  1395. prcd->fd_cfg = -1;
  1396. }
  1397. if(prcd->pcfg_mem)
  1398. {
  1399. rt_free(prcd->pcfg_mem);
  1400. prcd->pcfg_mem = 0;
  1401. prcd->pcfg_mem_pos = 0;
  1402. }
  1403. return 0;
  1404. }
  1405. int _rcd_open_xdl_dat(char *name,struct rcd *prcd, struct timespec *ts)
  1406. {
  1407. struct rtc_time_t rtc;
  1408. // int sw = RCD_XDL_NO;
  1409. // u32 type = 0;
  1410. u32 xdl_sw = prcd->sw;
  1411. prcd->pdat_mem = 0;
  1412. prcd->pdat_mem_pos = 0;
  1413. prcd->ts_begin = *ts;
  1414. timespec_to_rtc(*ts, &rtc, 0);
  1415. if(name)
  1416. {
  1417. sprintf(prcd->tmp_dat, "/tmp/xdl_%s_%d.dat", name,(int)xdl_sw);
  1418. }
  1419. else
  1420. {
  1421. sprintf(prcd->tmp_dat, "/tmp/xdl_wave_%d.dat", (int)xdl_sw);
  1422. }
  1423. prcd->fd_dat = sys_open(prcd->tmp_dat, O_CREAT|O_RDWR|O_TRUNC , 0777);
  1424. if(prcd->fd_dat < 0)
  1425. {
  1426. rt_printf("%s:sys_open(%s) error\n",__func__, prcd->tmp_dat);
  1427. return -1;
  1428. }
  1429. memset(&prcd->f_dfs, 0, sizeof(prcd->f_dfs));
  1430. //分配内存,用于缓存每个模拟通道数据
  1431. if(!prcd->pAn)
  1432. {
  1433. //缓存个数
  1434. prcd->pAn_size = prcd->f_cfs.tt_a_cnt * XDL_SAMPLE_LEN;
  1435. //序号
  1436. prcd->pAn_no = 0;
  1437. //分配内存
  1438. prcd->pAn = rt_malloc(prcd->pAn_size*sizeof(int));
  1439. if(!prcd->pAn)
  1440. {
  1441. rt_printf("%s: rt_malloc(pAn) error\r\n", __func__);
  1442. return -1;
  1443. }
  1444. }
  1445. //分配内存,用于缓存每个开关量通道数据
  1446. if(!prcd->pDn)
  1447. {
  1448. //缓存个数
  1449. prcd->pDn_size = prcd->f_cfs.tt_d_cnt * XDL_SAMPLE_LEN;
  1450. //序号
  1451. prcd->pDn_no = 0;
  1452. //分配内存
  1453. prcd->pDn = rt_malloc(prcd->pDn_size*sizeof(u8));
  1454. if(!prcd->pDn)
  1455. {
  1456. rt_printf("%s: rt_malloc(pDn) error\r\n", __func__);
  1457. return -1;
  1458. }
  1459. }
  1460. //分配内存,用于缓存一条记录
  1461. if(!prcd->pdat_mem)
  1462. {
  1463. //一条记录最大字节数
  1464. prcd->pdat_mem_size = (prcd->f_cfs.tt_a_cnt*sizeof(s16)+8) * XDL_SAMPLE_LEN;
  1465. //位置
  1466. prcd->pdat_mem_pos = 0;
  1467. //分配内存
  1468. prcd->pdat_mem = rt_malloc(prcd->pdat_mem_size);
  1469. if(!prcd->pdat_mem)
  1470. {
  1471. rt_printf("%s: rt_malloc(%d) error\r\n", __func__, prcd->pdat_mem_size);
  1472. return -1;
  1473. }
  1474. }
  1475. return 0;
  1476. }
  1477. int _rcd_close_xdl_dat(struct rcd *prcd)
  1478. {
  1479. //u32 sw = RCD_XDL_NO;
  1480. //u32 type = 0;
  1481. if(prcd->fd_dat >= 0)
  1482. {
  1483. sys_close(prcd->fd_dat);
  1484. prcd->fd_dat = -1;
  1485. }
  1486. if(prcd->pAn)
  1487. {
  1488. rt_free(prcd->pAn);
  1489. prcd->pAn = 0;
  1490. }
  1491. if(prcd->pDn)
  1492. {
  1493. rt_free(prcd->pDn);
  1494. prcd->pDn = 0;
  1495. }
  1496. if(prcd->pdat_mem)
  1497. {
  1498. rt_free(prcd->pdat_mem);
  1499. prcd->pdat_mem = 0;
  1500. prcd->pdat_mem_size= 0;
  1501. prcd->pdat_mem_pos = 0;
  1502. }
  1503. return 0;
  1504. }
  1505. void _rcd_xdl_save(struct rcd *prcd)
  1506. {
  1507. //int sw = RCD_XDL_NO;
  1508. int i,j;
  1509. int ret;
  1510. #ifdef XDL_ZT
  1511. int pAn_no=0;
  1512. #endif
  1513. //u32 type = 0;
  1514. rcd_write_cfg(prcd);
  1515. prcd->pAn_no = 0;
  1516. for(i=0;i<XDL_SAMPLE_LEN;i++)
  1517. {
  1518. for(j=0; j< prcd->f_cfs.tt_a_cnt; j++)
  1519. {
  1520. #ifdef XDL_ZT
  1521. prcd->pAn[pAn_no++] = xdl_rcd_a(j, i);
  1522. #endif
  1523. //index = g_rcd[sw].f_cfs.tt_a_index[i];
  1524. //channel=equ_get_ac_channel(g_equ_config_ac[index].slot, g_equ_config_ac[index].index);
  1525. //if(channel < 0 || channel >= CFG_ADC_CHANNEL )
  1526. {
  1527. //continue;
  1528. }
  1529. //记录每个通道的数据
  1530. //g_rcd[sw].pAn[g_rcd[sw].pAn_no++] = g_adc_dots_rec[cur][channel];
  1531. }
  1532. rcd_write_dat(prcd);
  1533. }
  1534. ret = sys_write(prcd->fd_dat, prcd->pdat_mem, prcd->pdat_mem_pos);
  1535. if(ret!=prcd->pdat_mem_pos)
  1536. {
  1537. rt_printf("%s: sys_write(%d)=%d error\r\n", __func__, prcd->pdat_mem_pos, ret);
  1538. }
  1539. prcd->pdat_mem_pos = 0;
  1540. }
  1541. int rcd_start_xdl(char *name,int sw,char **chn_name,int chn_num,int chn_length,struct timespec *ts)
  1542. {
  1543. int ret;
  1544. // u32 type = 0;
  1545. struct rcd *prcd = &g_rcd_xdl[0];
  1546. prcd->fd_cfg = -1;
  1547. prcd->fd_dat = -1;
  1548. prcd->sw = sw;
  1549. ret = _rcd_open_xdl_cfg(name,prcd, ts);
  1550. if(ret < 0)
  1551. {
  1552. goto RET;
  1553. }
  1554. ret = _rcd_open_xdl_dat(name,prcd, ts);
  1555. if(ret < 0)
  1556. {
  1557. goto RET;
  1558. }
  1559. _rcd_xdl_save(prcd);
  1560. RET:
  1561. _rcd_close_xdl_dat(prcd);
  1562. _rcd_close_xdl_cfg(prcd);
  1563. return 0;
  1564. }
  1565. // 判断录波是否已完成
  1566. int rcd_check_ok(u32 sw)
  1567. {
  1568. // u32 type = 0;
  1569. //if (g_rcd_working &(1<<sw))
  1570. //if(g_rcd[sw][type].rcd_working)
  1571. if(rcd_sd_flag==0)
  1572. {
  1573. return 0;
  1574. }
  1575. rcd_sd_flag = 0;
  1576. return 1;
  1577. }
  1578. /******************************************************************************
  1579. 函数名称: get_rcd_list_name
  1580. 函数版本: 01.01
  1581. 创建作者: sunxi
  1582. 创建日期: 2013-08-08
  1583. 函数说明: 获取录波文件的名称
  1584. 参数说明:
  1585. 返回值:
  1586. 0: 成功
  1587. 其它: 失败
  1588. 修改记录:
  1589. */
  1590. int rcd_get_list_name(void)
  1591. {
  1592. #ifdef CPU_AM335X
  1593. char* m_path = "/app/335x_m";
  1594. #else
  1595. char* m_path = "/app/m";
  1596. #endif
  1597. u32 len;
  1598. int i, loop;
  1599. u8 *buf;
  1600. char *envp[] = { NULL };
  1601. struct file * pfile;
  1602. loff_t pos;
  1603. char *cmd_ls[] = {m_path,"ls", RCD_FILE_PATH, "/tmp/rcd_list.txt", NULL};
  1604. #ifdef CPU_FUXI
  1605. char tmp[128];
  1606. memset(tmp,0,sizeof(tmp));
  1607. sprintf(tmp," ls %s > %s",RCD_FILE_PATH,"/tmp/rcd_list.txt");
  1608. system(tmp);
  1609. #else
  1610. //调用shell脚本,生成文件列表filelist.txt
  1611. call_usermodehelper(m_path, cmd_ls, envp, UMH_WAIT_PROC);
  1612. #endif
  1613. // 打开文件
  1614. pfile = rt_file_open("/tmp/rcd_list.txt",O_RDONLY ,0);
  1615. if(IS_ERR(pfile))
  1616. {
  1617. return -1;
  1618. }
  1619. // 得到文件长度
  1620. len = rt_file_getfile_size(pfile);
  1621. if(len <= 0)
  1622. {
  1623. rt_file_close(pfile,0);
  1624. return -11;
  1625. }
  1626. // 分配内存
  1627. buf = rt_malloc(len);
  1628. if((buf) == NULL)
  1629. {
  1630. rt_file_close(pfile,0);
  1631. return -2;
  1632. }
  1633. // 读出内容
  1634. pos = 0;
  1635. if(rt_file_read(pfile,buf,len,&pos) != len)
  1636. {
  1637. rt_file_close(pfile,0);
  1638. rt_free(buf);
  1639. return -3;
  1640. }
  1641. // 关闭文件
  1642. rt_file_close(pfile,0);
  1643. // 检查文件长度
  1644. if(len > 37*RECORD_FILES_MAX)
  1645. {
  1646. rt_free(buf);
  1647. return -4;
  1648. }
  1649. // 拷贝名称
  1650. loop = len/35;
  1651. for (i=0; i<loop; i++)
  1652. {
  1653. memset(&wave_name[i], 0, 40);
  1654. memcpy(&wave_name[i], &buf[i*36], 35);
  1655. }
  1656. return loop;
  1657. }
  1658. /*------------------------------ 内部函数 -------------------------------------
  1659. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  1660. */
  1661. #ifdef LINUX_KERNEL_APP
  1662. int _rcd_soft_isr(int irq, void *dev_id)
  1663. {
  1664. rt_sirq_clear(RT_SOFT_IRQ_RCD);
  1665. g_wq_rcd_flag = 1;
  1666. wake_up(&g_wq_rcd);
  1667. return (int)IRQ_HANDLED;
  1668. }
  1669. #else
  1670. int _rcd_soft_isr(int irq, void *dev_id)
  1671. {
  1672. //rt_sirq_clear(RT_SOFT_IRQ_RCD);
  1673. //g_wq_rcd_flag = 1;
  1674. //wake_up(&g_wq_rcd);
  1675. pthread_mutex_lock(&g_mutex);
  1676. /*唤醒*/
  1677. pthread_cond_signal(&g_cond);
  1678. pthread_mutex_unlock(&g_mutex);
  1679. return 0;
  1680. }
  1681. void wq_rcd(void)
  1682. {
  1683. pthread_mutex_lock(&g_mutex);
  1684. /*唤醒*/
  1685. pthread_cond_signal(&g_cond);
  1686. pthread_mutex_unlock(&g_mutex);
  1687. }
  1688. #endif
  1689. //反初始化函数
  1690. void _rcd_uninit_wave(struct rcd *prcd)
  1691. {
  1692. //rt_printf("_rcd_uninit_wave...\r\n");
  1693. if(prcd->f_cfs.tt_a)
  1694. {
  1695. rt_free(prcd->f_cfs.tt_a);
  1696. prcd->f_cfs.tt_a = 0;
  1697. }
  1698. if(prcd->f_cfs.tt_a_index)
  1699. {
  1700. rt_free(prcd->f_cfs.tt_a_index);
  1701. prcd->f_cfs.tt_a_index = 0;
  1702. }
  1703. if(prcd->f_cfs.tt_d)
  1704. {
  1705. rt_free(prcd->f_cfs.tt_d);
  1706. prcd->f_cfs.tt_d = 0;
  1707. }
  1708. if(prcd->f_cfs.tt_d_index)
  1709. {
  1710. rt_free(prcd->f_cfs.tt_d_index);
  1711. prcd->f_cfs.tt_d_index = 0;
  1712. }
  1713. if(prcd->pcfg_mem)
  1714. {
  1715. rt_free(prcd->pcfg_mem);
  1716. prcd->pcfg_mem = 0;
  1717. prcd->pcfg_mem_size = 0;
  1718. prcd->pcfg_mem_pos = 0;
  1719. }
  1720. if(prcd->pAn)
  1721. {
  1722. rt_free(prcd->pAn);
  1723. prcd->pAn = 0;
  1724. }
  1725. if(prcd->pDn)
  1726. {
  1727. rt_free(prcd->pDn);
  1728. prcd->pDn = 0;
  1729. }
  1730. if(prcd->pdat_mem)
  1731. {
  1732. rt_free(prcd->pdat_mem);
  1733. prcd->pdat_mem = 0;
  1734. prcd->pdat_mem_size= 0;
  1735. prcd->pdat_mem_pos = 0;
  1736. }
  1737. }
  1738. int _rcd_init_wave(struct rcd *prcd)
  1739. {
  1740. struct rtc_time_t rtc;
  1741. struct timespec ts;
  1742. int ret=0;
  1743. u32 sw= prcd->sw;
  1744. // u32 type = prcd->type;
  1745. ts = prcd->ts_begin;
  1746. ts.tv_nsec +=TIME_WAVE_PRE;
  1747. if(ts.tv_nsec >= 1000000000)
  1748. {
  1749. ts.tv_sec += 1;
  1750. ts.tv_nsec -= 1000000000;
  1751. }
  1752. timespec_to_rtc(ts, &rtc, 0);
  1753. if(sw==SWITCH_NUM_MAX)
  1754. {
  1755. sprintf( prcd->tmp_cfg, "/tmp/ALL_wave.cfg");
  1756. }
  1757. else
  1758. {
  1759. #ifdef RCD_STRAN_S
  1760. sprintf( prcd->tmp_cfg, "/tmp/BAY%02d_%04d_%04d%02d%02d_%02d%02d%02d_%03d.cfg",tRunPara.byAddr,g_new_waveno[sw] , rtc.year+2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000, rtc.ms%1000);
  1761. #else
  1762. sprintf( prcd->tmp_cfg, "/tmp/BAY%02d_%04d_%04d%02d%02d_%02d%02d%02d_%03d.cfg",sw+1,g_new_waveno[sw] , rtc.year+2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000, rtc.ms%1000);
  1763. #endif
  1764. }
  1765. if(sw==SWITCH_NUM_MAX)
  1766. {
  1767. ret=rcd_init_channel_all(prcd);
  1768. }
  1769. else
  1770. {
  1771. ret=rcd_init_channel(prcd);
  1772. }
  1773. if(ret!=0)
  1774. {
  1775. return -1;
  1776. }
  1777. //分配内存,用于缓存.cfg文件内容.
  1778. prcd->pcfg_mem = rt_malloc(RCD_CFG_FILE_SIZE);
  1779. if(! prcd->pcfg_mem)
  1780. {
  1781. rt_printf("%s: rt_malloc(RCD_CFG_FILE_SIZE) error\r\n", __func__);
  1782. return -1;
  1783. }
  1784. //最大缓存文件大小
  1785. prcd->pcfg_mem_size = RCD_CFG_FILE_SIZE;
  1786. prcd->pcfg_mem_pos = 0;
  1787. prcd->pdat_mem = 0;
  1788. prcd->pdat_mem_pos = 0;
  1789. if(sw==SWITCH_NUM_MAX)
  1790. {
  1791. sprintf(prcd->tmp_dat, "/tmp/ALL_wave.dat");
  1792. }
  1793. else
  1794. {
  1795. #ifdef RCD_STRAN_S
  1796. sprintf(prcd->tmp_dat, "/tmp/BAY%02d_%04d_%04d%02d%02d_%02d%02d%02d_%03d.dat",tRunPara.byAddr, g_new_waveno[sw] , rtc.year+2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000, rtc.ms%1000);
  1797. #else
  1798. sprintf(prcd->tmp_dat, "/tmp/BAY%02d_%04d_%04d%02d%02d_%02d%02d%02d_%03d.dat",sw+1, g_new_waveno[sw] , rtc.year+2000, rtc.month, rtc.day, rtc.hour, rtc.min, rtc.ms/1000, rtc.ms%1000);
  1799. #endif
  1800. }
  1801. memset(& prcd->f_dfs, 0, sizeof( prcd->f_dfs));
  1802. //分配内存,用于缓存每个模拟通道数据
  1803. if(! prcd->pAn)
  1804. {
  1805. //缓存个数
  1806. prcd->pAn_size = prcd->f_cfs.tt_a_cnt * ( prcd->dt_end - prcd->dt_begin) * ADC_REC_SAMPLE_RATE;
  1807. //序号
  1808. prcd->pAn_no = 0;
  1809. //分配内存
  1810. prcd->pAn = rt_malloc( prcd->pAn_size*sizeof(int));
  1811. if(! prcd->pAn)
  1812. {
  1813. rt_printf("%s: rt_malloc(pAn) error\r\n", __func__);
  1814. return -1;
  1815. }
  1816. }
  1817. //分配内存,用于缓存每个开关量通道数据
  1818. if(! prcd->pDn)
  1819. {
  1820. //缓存个数
  1821. prcd->pDn_size = prcd->f_cfs.tt_d_cnt * ( prcd->dt_end - prcd->dt_begin) * ADC_REC_SAMPLE_RATE;
  1822. //序号
  1823. prcd->pDn_no = 0;
  1824. //分配内存
  1825. prcd->pDn = rt_malloc( prcd->pDn_size*sizeof(u8));
  1826. if(! prcd->pDn)
  1827. {
  1828. rt_printf("%s: rt_malloc(pDn) error\r\n", __func__);
  1829. return -1;
  1830. }
  1831. }
  1832. //分配内存,用于缓存一条记录
  1833. if(! prcd->pdat_mem)
  1834. {
  1835. //一条记录最大字节数
  1836. prcd->pdat_mem_size = RCD_LINE_BUF_SIZE;
  1837. //位置
  1838. prcd->pdat_mem_pos = 0;
  1839. //分配内存
  1840. prcd->pdat_mem = rt_malloc( prcd->pdat_mem_size);
  1841. if(! prcd->pdat_mem)
  1842. {
  1843. rt_printf("%s: rt_malloc(%d) error\r\n", __func__, prcd->pdat_mem_size);
  1844. return -1;
  1845. }
  1846. }
  1847. if(g_new_waveno[sw] >= RCD_WAVE_MAX_NO)
  1848. {
  1849. g_new_waveno[sw] = 1;
  1850. }
  1851. else
  1852. {
  1853. g_new_waveno[sw]++;
  1854. }
  1855. return 0;
  1856. }
  1857. int _rcd_open_cfg_wave(struct rcd *prcd)
  1858. {
  1859. if(prcd->fd_cfg >= 0)
  1860. {
  1861. return 0;
  1862. }
  1863. //打开文件
  1864. prcd->fd_cfg = sys_open(prcd->tmp_cfg, O_CREAT|O_RDWR|O_TRUNC , 0777);
  1865. if(prcd->fd_cfg < 0)
  1866. {
  1867. rt_printf("%s:sys_open(%s) error\n",__func__, prcd->tmp_cfg);
  1868. return -1;
  1869. }
  1870. return 0;
  1871. }
  1872. int _rcd_close_cfg_wave(struct rcd *prcd)
  1873. {
  1874. if(prcd->fd_cfg >= 0)
  1875. {
  1876. sys_close(prcd->fd_cfg);
  1877. prcd->fd_cfg = -1;
  1878. }
  1879. return 0;
  1880. }
  1881. int _rcd_open_dat_wave(struct rcd *prcd)
  1882. {
  1883. //文件已经打开,返回
  1884. if(prcd->fd_dat >= 0)
  1885. {
  1886. return 0;
  1887. }
  1888. prcd->fd_dat = sys_open(prcd->tmp_dat, O_CREAT|O_RDWR|O_TRUNC , 0777);
  1889. if(prcd->fd_dat < 0)
  1890. {
  1891. rt_printf("%s:sys_open(%s) error\n",__func__, prcd->tmp_dat);
  1892. return -1;
  1893. }
  1894. return 0;
  1895. }
  1896. int _rcd_close_dat_wave(struct rcd *prcd)
  1897. {
  1898. if(prcd->fd_dat >= 0)
  1899. {
  1900. sys_close(prcd->fd_dat);
  1901. prcd->fd_dat = -1;
  1902. }
  1903. return 0;
  1904. }
  1905. //打开创建录波文件
  1906. int _rcd_open_wave(struct rcd *prcd)
  1907. {
  1908. int ret = 0;
  1909. ret = _rcd_open_cfg_wave(prcd);
  1910. if(ret !=0 )
  1911. {
  1912. return -1;
  1913. }
  1914. ret = _rcd_open_dat_wave(prcd);
  1915. if(ret !=0 )
  1916. {
  1917. return -1;
  1918. }
  1919. return 0;
  1920. }
  1921. int _rcd_close_wave(struct rcd *prcd)
  1922. {
  1923. _rcd_close_cfg_wave(prcd);
  1924. _rcd_close_dat_wave(prcd);
  1925. return 0;
  1926. }
  1927. #if 0
  1928. int _rcd_open(u32 sw)
  1929. {
  1930. static struct rcd_file_head rfh;
  1931. static struct rcd_ac rac;
  1932. int i;
  1933. float f;
  1934. // 打开文件
  1935. g_rcd[sw].f_handle = rt_file_open(RCD_FILE_NAME,O_CREAT|O_RDWR|O_TRUNC ,0);
  1936. if(IS_ERR(g_rcd[sw].f_handle))
  1937. {
  1938. return -1;
  1939. }
  1940. memset(&rfh,0,sizeof(rfh));
  1941. // 文件签名和版本
  1942. rfh.cfh.signature = SIG_RECORD_FILE;
  1943. rfh.cfh.version = 1;
  1944. //文件头
  1945. strcpy(rfh.equ_name,EQUIP_NAME_STRING);
  1946. sprintf(rfh.version,"V%d.%02d.%02d",(VER_NUM>>16)&0XFF,(VER_NUM>>8)&0XFF,VER_NUM&0XFF);
  1947. rfh.ts_begin = g_rcd[sw].ts_begin;
  1948. rfh.type = g_rcd[sw].type;
  1949. rfh.dots_per_period = CFG_ADC_DOTS_PER_PERIOD;
  1950. //AC
  1951. rfh.ac_addr = sizeof(rfh);
  1952. rfh.ac_num = g_equ_config->ac_num;
  1953. //DI
  1954. rfh.di_addr = rfh.ac_addr + sizeof(struct rcd_ac)*rfh.ac_num;
  1955. rfh.di_num = 0;
  1956. // DO
  1957. rfh.do_addr = rfh.di_addr + sizeof(struct rcd_di)*rfh.di_num;
  1958. rfh.do_num = 0;
  1959. // 采样点
  1960. rfh.dot_addr = rfh.do_addr + sizeof(struct rcd_do)*rfh.do_num;
  1961. rfh.dot_num = g_rcd[sw].dt_end - g_rcd[sw].dt_begin;
  1962. // 将文件头写入文件
  1963. g_rcd[sw].f_offset = 0;
  1964. rt_file_write(g_rcd[sw].f_handle,(char *)&rfh,sizeof(rfh),&g_rcd[sw].f_offset);
  1965. // AC描述区
  1966. // 交流测量量
  1967. for(i=0; i< g_equ_config->ac_num; i++)
  1968. {
  1969. strcpy(rac.name,g_equ_config_ac[i].name);
  1970. rac.slot = g_equ_config_ac[i].slot;
  1971. rac.index = g_equ_config_ac[i].index;
  1972. rac.owner = g_equ_config_ac[i].owner;
  1973. rac.type = g_equ_config_ac[i].type;
  1974. rac.is_ct_inverse = g_equ_config_ac[i].is_ct_inverse;
  1975. if(rac.type == 0)
  1976. {
  1977. rac.is_not_owner = 1;
  1978. }
  1979. else
  1980. {
  1981. rac.is_not_owner = 0;
  1982. }
  1983. rac.channel = equ_get_ac_channel(g_equ_config_ac[i].slot,g_equ_config_ac[i].index);
  1984. // 系数
  1985. rac.factor_e_k = (float)(factor_e_k(g_equ_config_ac[i].scale));
  1986. factor_e_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f);
  1987. rac.factor_e_c= f;
  1988. rac.factor_p_k = (float)(factor_p_k(rac.channel));
  1989. factor_p_c_get(g_equ_config_ac[i].slot,g_equ_config_ac[i].index,&f);
  1990. rac.factor_p_c = f;
  1991. g_rcd[sw].f_offset = rfh.ac_addr + i*sizeof(rac);
  1992. rt_file_write(g_rcd[sw].f_handle,(char *)&rac,sizeof(rac),&g_rcd[sw].f_offset);
  1993. }
  1994. // DI描述区
  1995. for(i=0; i<rfh.di_num; i++)
  1996. {
  1997. }
  1998. // DO描述区
  1999. for(i=0; i<rfh.do_num; i++)
  2000. {
  2001. }
  2002. // 定位采样点的文件位置
  2003. g_rcd[sw].f_offset = rfh.dot_addr;
  2004. return 0;
  2005. }
  2006. #endif
  2007. int _rcd_save(struct rcd *prcd)
  2008. {
  2009. uint64_t us0;
  2010. int i,loop;
  2011. u32 dt_end;
  2012. int index=0;
  2013. u32 sw=prcd->sw;
  2014. // u32 type=prcd->type;
  2015. // 检查是否覆盖
  2016. if((int)(g_adc_dots_count - prcd->dt_cur) > (ADC_REC_DOTS_CHANNEL/ADC_REC_SAMPLE_RATE - 8))
  2017. {
  2018. rt_printf("_rcd_save overrun(%d):g_adc_dots_count=%d,dt_begin=%d,dt_cur=%d,dt_end=%d.\r\n",
  2019. sw,
  2020. g_adc_dots_count,
  2021. prcd->dt_begin,
  2022. prcd->dt_cur,
  2023. prcd->dt_end);
  2024. _rcd_close_wave(prcd);
  2025. return -1;
  2026. }
  2027. us0 = ustimer_get_origin();
  2028. // 由于遥信需要防抖处理后才能送到,所有需要延迟处理,目前延迟15个周波,300ms.
  2029. dt_end = g_adc_dots_count - CFG_ADC_DOTS_PER_PERIOD*15;
  2030. dt_end = ((int)(prcd->dt_end - dt_end) > 0) ? dt_end : prcd->dt_end;
  2031. while((int)(dt_end - prcd->dt_cur) > 0)
  2032. {
  2033. for(loop=0;loop<ADC_REC_SAMPLE_RATE;loop++)
  2034. {
  2035. u32 cur = (prcd->dt_cur*ADC_REC_SAMPLE_RATE+loop) & ADC_REC_DOTS_MASK;
  2036. for(i=0; i< prcd->f_cfs.tt_a_cnt; i++)
  2037. {
  2038. //记录每个通道的数据
  2039. prcd->pAn[prcd->pAn_no++] = g_adc_dots_rec[cur][prcd->f_cfs.chnl[i]];
  2040. }
  2041. for(i=0; i< prcd->f_cfs.tt_d_cnt; i++)
  2042. {
  2043. index = prcd->f_cfs.tt_d_index[i];
  2044. prcd->pDn[prcd->pDn_no++] =(u8)dido_di_is_on_ts(g_equ_config_di[index].slot, g_equ_config_di[index].index, prcd->dt_cur);
  2045. }
  2046. }
  2047. prcd->dt_cur++;
  2048. }
  2049. rt_stat_other_in(6,ustimer_get_duration(us0)/USTIMER_US);
  2050. // 根据条件启动小电流接地判断
  2051. if(prcd->dt_cur == prcd->dt_end)
  2052. {
  2053. // 如果没有投入小电流接地,直接返回
  2054. if((BH_ALL_EN(sw)) == 0)
  2055. {
  2056. return 0;
  2057. }
  2058. #ifdef XDL_ZT
  2059. {
  2060. TSETSW *pSet = &pRunSet->tSwSet[sw];
  2061. // 如果录波类型和启动类型一起,调用小电流接地判断函数
  2062. #ifndef GW_AREA_MAIN_2021
  2063. if((prcd->type == RECORD_TYPE_LLTB && pSet->bTT_xdlqd == XDL_QD_I0)
  2064. || (prcd->type == RECORD_TYPE_LXDY && pSet->bTT_xdlqd == XDL_QD_U0))
  2065. #else
  2066. if(prcd->type == RECORD_TYPE_JDGZ)
  2067. #endif
  2068. {
  2069. xdl_proc_adc(sw,prcd->dt_begin*ADC_REC_SAMPLE_RATE,&prcd->ts_begin);
  2070. }
  2071. }
  2072. #endif
  2073. }
  2074. return 0;
  2075. }
  2076. #ifdef LINUX_KERNEL_APP
  2077. int _rcd_thread(void * unused)
  2078. {
  2079. int tmp_tail;
  2080. struct rcd *prcd;
  2081. while(1)
  2082. {
  2083. wait_event_interruptible_timeout(g_wq_rcd,g_wq_rcd_flag,HZ/20); // 50ms
  2084. g_wq_rcd_flag = 0;
  2085. if(kthread_should_stop())
  2086. {
  2087. return 0;
  2088. }
  2089. for(tmp_tail = rcd_tail; tmp_tail != rcd_head; tmp_tail = (tmp_tail + 1) % RCD_MAX_CNT)
  2090. {
  2091. //得到录波数据结构指针
  2092. prcd = &g_rcd[tmp_tail];
  2093. switch(prcd->state )
  2094. {
  2095. case RCD_ST_START_1:
  2096. //初始化录波文件需要的辅助信息
  2097. if(_rcd_init_wave(prcd)!=0)
  2098. {
  2099. rt_printf("录波初始化失败(sw=%d,type=%d)!\r\n", prcd->sw, prcd->type);
  2100. prcd->state = RCD_ST_RECORD_ERR;
  2101. }
  2102. else
  2103. {
  2104. prcd->state = RCD_ST_RECORD;
  2105. }
  2106. break;
  2107. case RCD_ST_RECORD:
  2108. //录波未完成继续录波.如果录波已经完成,但是还没有写进文件,返回
  2109. if(prcd->dt_cur != prcd->dt_end)
  2110. {
  2111. if(_rcd_save(prcd)<0)
  2112. {
  2113. rt_printf("录波失败(sw=%d,type=%d)!\r\n", prcd->sw, prcd->type);
  2114. prcd->state = RCD_ST_RECORD_ERR;
  2115. }
  2116. }
  2117. else
  2118. {
  2119. prcd->state = RCD_ST_RECORD_OK;
  2120. }
  2121. break;
  2122. }
  2123. }
  2124. }
  2125. return 0;
  2126. }
  2127. #else
  2128. int _rcd_thread(void * unused)
  2129. {
  2130. int tmp_tail;
  2131. struct rcd *prcd;
  2132. struct timespec tv;
  2133. prctl(PR_SET_NAME, "_rcd_thread");
  2134. while(1)
  2135. {
  2136. // wait_event_interruptible_timeout(g_wq_rcd,g_wq_rcd_flag,HZ/20); // 50ms
  2137. // g_wq_rcd_flag = 0;
  2138. pthread_mutex_lock(&g_mutex);
  2139. /*此处等待唤醒*/
  2140. clock_gettime(CLOCK_MONOTONIC, &tv);
  2141. tv.tv_nsec += 50*1000*1000;// 50ms
  2142. pthread_cond_timedwait(&g_cond, &g_mutex, &tv);
  2143. /*唤醒成功*/
  2144. pthread_mutex_unlock(&g_mutex);
  2145. if(g_rcd_exit_flag)
  2146. {
  2147. return 0;
  2148. }
  2149. for(tmp_tail = rcd_tail; tmp_tail != rcd_head; tmp_tail = (tmp_tail + 1) % RCD_MAX_CNT)
  2150. {
  2151. //得到录波数据结构指针
  2152. prcd = &g_rcd[tmp_tail];
  2153. switch(prcd->state )
  2154. {
  2155. case RCD_ST_START_1:
  2156. //初始化录波文件需要的辅助信息
  2157. if(_rcd_init_wave(prcd)!=0)
  2158. {
  2159. rt_printf("录波初始化失败(sw=%lu,type=%lu)!\r\n", prcd->sw, prcd->type);
  2160. prcd->state = RCD_ST_RECORD_ERR;
  2161. }
  2162. else
  2163. {
  2164. prcd->state = RCD_ST_RECORD;
  2165. }
  2166. break;
  2167. case RCD_ST_RECORD:
  2168. //录波未完成继续录波.如果录波已经完成,但是还没有写进文件,返回
  2169. if(prcd->dt_cur != prcd->dt_end)
  2170. {
  2171. if(_rcd_save(prcd)<0)
  2172. {
  2173. rt_printf("录波失败(sw=%lu,type=%lu)!\r\n", prcd->sw, prcd->type);
  2174. prcd->state = RCD_ST_RECORD_ERR;
  2175. }
  2176. }
  2177. else
  2178. {
  2179. prcd->state = RCD_ST_RECORD_OK;
  2180. }
  2181. break;
  2182. }
  2183. }
  2184. }
  2185. return 0;
  2186. }
  2187. #endif
  2188. void _rcd_file_cp(char *src, char *dst);
  2189. static int _rcd_write_buf_to_file(struct rcd *prcd)
  2190. {
  2191. uint32_t us0;
  2192. int ret = 0;
  2193. u32 line,once;
  2194. u32 dt_cur = prcd->dt_begin;
  2195. u32 dt_end = prcd->dt_end;
  2196. u32 sw = prcd->sw;
  2197. ret=_rcd_open_wave(prcd);
  2198. if(ret !=0 )
  2199. {
  2200. rt_printf("创建录波文件失败\r\n");
  2201. _rcd_close_wave(prcd);//应释放初始化的资源
  2202. return -1;
  2203. }
  2204. rcd_write_cfg(prcd);
  2205. //写dat文件
  2206. us0 = ustimer_get_origin();
  2207. prcd->pAn_no = 0;
  2208. prcd->pDn_no = 0;
  2209. line = (dt_end- dt_cur)*ADC_REC_SAMPLE_RATE;
  2210. once = 0;
  2211. while(line--)
  2212. {
  2213. prcd->f_dfs.n++;
  2214. rcd_write_dat(prcd);
  2215. if(++once == RCD_LINE_NUM)
  2216. {
  2217. once = 0;
  2218. ret = sys_write(prcd->fd_dat, prcd->pdat_mem, prcd->pdat_mem_pos);
  2219. if(ret!=prcd->pdat_mem_pos)
  2220. {
  2221. rt_printf("%s: sys_write(%d)=%d error\r\n", __func__, prcd->pdat_mem_pos, ret);
  2222. }
  2223. prcd->pdat_mem_pos = 0;
  2224. }
  2225. }
  2226. if(prcd->pdat_mem_pos)
  2227. {
  2228. ret = sys_write(prcd->fd_dat, prcd->pdat_mem, prcd->pdat_mem_pos);
  2229. if(ret!=prcd->pdat_mem_pos)
  2230. {
  2231. rt_printf("%s: sys_write(%d)=%d error\r\n", __func__, prcd->pdat_mem_pos, ret);
  2232. }
  2233. prcd->pdat_mem_pos = 0;
  2234. }
  2235. _rcd_close_wave(prcd);
  2236. if(sw < SWITCH_NUM_MAX)
  2237. {
  2238. _rcd_save_to_flash(prcd);
  2239. }
  2240. if(prcd->type == RECORD_TYPE_SD)
  2241. {
  2242. rcd_sd_flag = 1; //手动录波完成本标志
  2243. }
  2244. rt_printf("录波%d周完成(sw=%d,type=%d)!\r\n",(prcd->dt_end - prcd->dt_begin)/CFG_ADC_DOTS_PER_PERIOD,sw,prcd->type);
  2245. return 0;
  2246. }
  2247. int _rcd_writefile_thread(void * unused)
  2248. {
  2249. int first_tail, tmp_tail;
  2250. struct rcd *prcd;
  2251. prctl(PR_SET_NAME, "_rcd_writefile_t");
  2252. while(1)
  2253. {
  2254. msleep(50);
  2255. #ifdef LINUX_KERNEL_APP
  2256. if(kthread_should_stop())
  2257. {
  2258. return 0;
  2259. }
  2260. #else
  2261. if(g_rcd_writefile_exit_flag)
  2262. {
  2263. return 0;
  2264. }
  2265. #endif
  2266. //得到录波数据结构指针
  2267. first_tail = rcd_tail;
  2268. for(tmp_tail = rcd_tail; tmp_tail != rcd_head; tmp_tail = (tmp_tail + 1) % RCD_MAX_CNT)
  2269. {
  2270. //得到录波数据结构指针
  2271. prcd = &g_rcd[tmp_tail];
  2272. //如果录波完成,写录波数据到文件中
  2273. if(prcd->state == RCD_ST_RECORD_OK)
  2274. {
  2275. //写录波数据到文件中
  2276. _rcd_write_buf_to_file(prcd);
  2277. //录波完成保存文件后,应当反初始化释放内存
  2278. _rcd_uninit_wave(prcd);
  2279. prcd->state = RCD_ST_FILE_OK;
  2280. }
  2281. if(prcd->state == RCD_ST_RECORD_ERR)
  2282. {
  2283. //录波失败,应当反初始化释放内存
  2284. _rcd_uninit_wave(prcd);
  2285. prcd->state = RCD_ST_FILE_ERR;
  2286. }
  2287. if((prcd->state == RCD_ST_FILE_OK) || (prcd->state == RCD_ST_FILE_ERR) )
  2288. {
  2289. if(first_tail == tmp_tail)
  2290. {
  2291. rcd_tail = (rcd_tail + 1) % RCD_MAX_CNT;
  2292. first_tail = rcd_tail;
  2293. prcd->state = RCD_ST_IDLE;
  2294. }
  2295. }
  2296. }
  2297. }
  2298. return 0;
  2299. }
  2300. static int _rcd_get_sw_waveno(u32 sw, struct dir_file_ext_struct *pdfs, int filecnt, struct dir_file_ext_struct *pdfs_min)
  2301. {
  2302. int i=0;
  2303. char tmp[128];
  2304. int rec_N=1; //序号
  2305. struct dir_file_ext_struct *p_max=0;
  2306. struct dir_file_ext_struct *p_min=0;
  2307. // tar czvf P1.tar.gz BAY01_0001_20190822_142530_739.cfg BAY01_0001_20190822_142530_739.dat 两个文件压缩为一个文件
  2308. sprintf(tmp, "BAY%02d", sw+1);
  2309. //查找录波间隔序号为sw的最大序号的文件
  2310. for(i=0; i<filecnt;i++)
  2311. {
  2312. if(strncmp(tmp, pdfs[i].file_name, 5)==0)
  2313. {
  2314. if(!p_max)
  2315. {
  2316. p_max = &pdfs[i];
  2317. continue;
  2318. }
  2319. if(strncmp(pdfs[i].file_name, p_max->file_name, 10)>0)
  2320. {
  2321. p_max = &pdfs[i];
  2322. }
  2323. }
  2324. }
  2325. //查找录波间隔序号为sw的最小序号的文件
  2326. for(i=0; i<filecnt;i++)
  2327. {
  2328. if(strncmp(tmp, pdfs[i].file_name, 5)==0)
  2329. {
  2330. if(!p_min)
  2331. {
  2332. p_min = &pdfs[i];
  2333. continue;
  2334. }
  2335. if(strncmp(pdfs[i].file_name, p_min->file_name, 10)<0)
  2336. {
  2337. p_min = &pdfs[i];
  2338. }
  2339. }
  2340. }
  2341. if((!p_max) || (!p_min)) //没有找到
  2342. {
  2343. rec_N = 1;
  2344. }
  2345. else if(p_max==p_min) //找到,但只有一个
  2346. {
  2347. if(p_min==pdfs_min) //该文件已经删除
  2348. {
  2349. rec_N = 1;
  2350. }
  2351. else
  2352. {
  2353. rec_N=simple_strtoul(p_min->file_name+6, NULL, 10);
  2354. rec_N = (rec_N + 1) %(RCD_WAVE_MAX_NO+1);
  2355. if(rec_N==0) rec_N = 1;
  2356. }
  2357. }
  2358. else //有多个
  2359. {
  2360. int rec_N1=0;
  2361. int rec_N2=0;
  2362. int rec_N3=0;
  2363. rec_N1=simple_strtoul(p_min->file_name+6, NULL, 10);
  2364. rec_N2=simple_strtoul(p_max->file_name+6, NULL, 10);
  2365. if((rec_N1+RCD_MAX_FILES) >= rec_N2) //两者之差.如果两者之差大于RCD_MAX_FILES,则说明应该递加最大序号
  2366. {
  2367. rec_N = (rec_N2 + 1) %(RCD_WAVE_MAX_NO+1);
  2368. if(rec_N==0) rec_N = 1;
  2369. }
  2370. else //存在回绕,小心处理
  2371. {
  2372. //查找录波间隔序号为sw的最新序号的文件
  2373. for(i=0; i<filecnt;i++)
  2374. {
  2375. if(strncmp(tmp, pdfs[i].file_name, 5)==0)
  2376. {
  2377. rec_N1=simple_strtoul(pdfs[i].file_name+6, NULL, 10);
  2378. //等于
  2379. if((rec_N1+RCD_MAX_FILES) < rec_N2)
  2380. {
  2381. rec_N3 = rec_N1;
  2382. continue;
  2383. }
  2384. else
  2385. {
  2386. break;
  2387. }
  2388. }
  2389. }
  2390. rec_N = (rec_N3+ 1) %(RCD_WAVE_MAX_NO+1);
  2391. if(rec_N==0) rec_N = 1;
  2392. }
  2393. }
  2394. //sprintf(tmp, "%sBAY%02d_%04d_%s", RCD_FILE_PATH, sw, rec_N, g_rcd[sw].tmp_cfg+16);
  2395. //rt_file_mv(g_rcd[sw].tmp_cfg, tmp);
  2396. //sprintf(tmp, "%sBAY%02d_%04d_%s", RCD_FILE_PATH, sw, rec_N, g_rcd[sw].tmp_dat+16);
  2397. //rt_file_mv(g_rcd[sw].tmp_dat, tmp);
  2398. return rec_N;
  2399. }
  2400. //获取对应的故障录波序号
  2401. void _rcd_get_waveno(void)
  2402. {
  2403. struct dir_file_ext_struct *pdfs;
  2404. struct dir_file_ext_struct *pdfs_min=0;
  2405. int file_cnt = 0;
  2406. char tmp[128];
  2407. // char addr[]={0,0,0,0,0};
  2408. int i=0;
  2409. sprintf(tmp, "/tmp/sw%d", 0);
  2410. pdfs = hf_get_dir_file_ext(RCD_FILE_PATH, &file_cnt, tmp);
  2411. if(file_cnt >= (RCD_MAX_FILES*2))
  2412. {
  2413. //找到最早的文件,并删除
  2414. pdfs_min = pdfs;
  2415. for(i=1;i<file_cnt;i++)
  2416. {
  2417. if(strncmp(pdfs[i].file_name+11, pdfs_min->file_name+11, 19) < 0)
  2418. {
  2419. pdfs_min = &pdfs[i];
  2420. }
  2421. }
  2422. }
  2423. #ifdef RCD_STRAN_S
  2424. for(i=0;i<SWITCH_NUM_MAX;i++)
  2425. {
  2426. g_new_waveno[i] = _rcd_get_sw_waveno(tRunPara.byAddr-1, pdfs, file_cnt, pdfs_min);
  2427. }
  2428. #else
  2429. for(i=0;i<SWITCH_NUM_MAX;i++)
  2430. {
  2431. g_new_waveno[i] = _rcd_get_sw_waveno(i, pdfs, file_cnt, pdfs_min);
  2432. }
  2433. #endif
  2434. if(pdfs)
  2435. {
  2436. rt_free(pdfs);
  2437. }
  2438. }
  2439. static void _rcd_save_to_flash(struct rcd *prcd)
  2440. {
  2441. struct dir_file_ext_struct *pdfs;
  2442. struct dir_file_ext_struct *pdfs_min=0;
  2443. int file_cnt = 0;
  2444. char tmp[128];
  2445. int i=0,ret;
  2446. u32 sw =prcd->sw;
  2447. // u32 type = prcd->type;
  2448. struct dir_file_ext_struct *pdfs2=0;
  2449. int file_cnt2 = 0;
  2450. char tmp2[128];
  2451. if(pRunSet->bTT_LogPrintf)
  2452. {
  2453. sprintf(tmp2, "/tmp/_sw%02d%u", sw, prcd->dt_begin);
  2454. pdfs2 = hf_get_dir_file_ext(RCD_BACKUP_PATH, &file_cnt2, tmp2);
  2455. if(pdfs2)
  2456. {
  2457. rt_free(pdfs2);
  2458. }
  2459. }
  2460. sprintf(tmp, "/tmp/sw%02d%u", sw, prcd->dt_begin);
  2461. pdfs = hf_get_dir_file_ext(RCD_FILE_PATH, &file_cnt, tmp);
  2462. //备份区文件未满
  2463. if(pRunSet->bTT_LogPrintf && (file_cnt2 < (RCD_BACKUP_MAX_FILES*2)))
  2464. {
  2465. sprintf(tmp, "%s%s", RCD_BACKUP_PATH, prcd->tmp_cfg+5);
  2466. ret = rt_file_mv(prcd->tmp_cfg, tmp);
  2467. if(ret != 0)
  2468. {
  2469. rt_printf("%s 文件移动失败(ret=%d)!\r\n",prcd->tmp_cfg,ret);
  2470. rt_file_del(prcd->tmp_cfg);
  2471. }
  2472. sprintf(tmp, "%s%s", RCD_BACKUP_PATH, prcd->tmp_dat+5);
  2473. ret = rt_file_mv(prcd->tmp_dat, tmp);
  2474. if(ret != 0)
  2475. {
  2476. rt_printf("%s 文件移动失败(ret=%d)!\r\n",prcd->tmp_dat,ret);
  2477. rt_file_del(prcd->tmp_dat);
  2478. }
  2479. sprintf(tmp, "%s%s", RCD_BACKUP_PATH, prcd->tmp_cfg+5);
  2480. sprintf(tmp2, "%s%s", RCD_FILE_PATH, prcd->tmp_cfg+5);
  2481. //创建软链接
  2482. ret=rt_file_ln(tmp, tmp2);
  2483. if(ret != 0)
  2484. {
  2485. rt_printf("%s 文件链接失败(ret=%d)!\r\n",prcd->tmp_cfg,ret);
  2486. }
  2487. #ifdef RCD_STRAN_S
  2488. iec_commadd_rcd(prcd->tmp_cfg+5);
  2489. #endif
  2490. sprintf(tmp, "%s%s", RCD_BACKUP_PATH, prcd->tmp_dat+5);
  2491. sprintf(tmp2, "%s%s", RCD_FILE_PATH, prcd->tmp_dat+5);
  2492. //创建软链接
  2493. ret=rt_file_ln(tmp, tmp2);
  2494. if(ret != 0)
  2495. {
  2496. rt_printf("%s 文件链接失败(ret=%d)!\r\n",prcd->tmp_dat,ret);
  2497. }
  2498. #ifdef RCD_STRAN_S
  2499. iec_commadd_rcd(prcd->tmp_dat+5);
  2500. #endif
  2501. }
  2502. else //备份文件区满
  2503. {
  2504. sprintf(tmp, "%s%s", RCD_FILE_PATH, prcd->tmp_cfg+5);
  2505. //rt_printf("%s,%s\r\n", tmp ,prcd->tmp_cfg+5);
  2506. ret = rt_file_mv(prcd->tmp_cfg, tmp);
  2507. if(ret != 0)
  2508. {
  2509. rt_printf("%s 文件移动失败(ret=%d)!\r\n",prcd->tmp_cfg,ret);
  2510. rt_file_del(prcd->tmp_cfg);
  2511. }
  2512. #ifdef RCD_STRAN_S
  2513. iec_commadd_rcd(prcd->tmp_cfg+5);
  2514. #endif
  2515. sprintf(tmp, "%s%s", RCD_FILE_PATH, prcd->tmp_dat+5);
  2516. //rt_printf("%s,%s\r\n", tmp ,prcd->tmp_dat+5);
  2517. ret = rt_file_mv(prcd->tmp_dat, tmp);
  2518. if(ret != 0)
  2519. {
  2520. rt_printf("%s 文件移动失败(ret=%d)!\r\n",prcd->tmp_dat,ret);
  2521. rt_file_del(prcd->tmp_dat);
  2522. }
  2523. #ifdef RCD_STRAN_S
  2524. iec_commadd_rcd(prcd->tmp_dat+5);
  2525. #endif
  2526. }
  2527. if((file_cnt+2) > (RCD_MAX_FILES*2))
  2528. {
  2529. //找到最早的文件,并删除
  2530. pdfs_min = pdfs;
  2531. for(i=1;i<file_cnt;i++)
  2532. {
  2533. if(strncmp(pdfs[i].file_name+11, pdfs_min->file_name+11, 19) < 0)
  2534. {
  2535. pdfs_min = &pdfs[i];
  2536. }
  2537. }
  2538. //因为文件以及已经排好序,找到第一个是cfg文件,第二个是dat文件
  2539. //先删除.cfg文件
  2540. sprintf(tmp, "%s%s", RCD_FILE_PATH,pdfs_min->file_name);
  2541. rt_file_del(tmp);
  2542. sprintf(tmp, "%s%s", RCD_FILE_PATH,pdfs_min[1].file_name);
  2543. rt_file_del(tmp);
  2544. }
  2545. if(pdfs)
  2546. {
  2547. rt_free(pdfs);
  2548. }
  2549. }
  2550. void _rcd_file_cp(char *src, char *dst)
  2551. {
  2552. int fd_src;
  2553. int fd_dst;
  2554. char *p_src;
  2555. struct stat s;
  2556. int ret;
  2557. if(sys_newstat(src, &s))
  2558. { rt_printf("%s:sys_newstat(%s) error\n",__func__, src);
  2559. return ;
  2560. }
  2561. p_src = rt_malloc(s.st_size);
  2562. if(!p_src)
  2563. {
  2564. return;
  2565. }
  2566. fd_src = sys_open(src, O_RDONLY, 0);
  2567. if(fd_src <=0)
  2568. {
  2569. rt_printf("%s:sys_open(%s) error\n",__func__, src);
  2570. rt_free(p_src);
  2571. return;
  2572. }
  2573. ret = sys_read(fd_src, p_src, s.st_size);
  2574. if(ret != s.st_size)
  2575. {
  2576. rt_free(p_src);
  2577. sys_close(fd_src);
  2578. rt_printf("%s:sys_read(%s) error\n",__func__, src);
  2579. return;
  2580. }
  2581. sys_close(fd_src);
  2582. fd_dst = sys_open(dst, O_CREAT|O_RDWR|O_TRUNC , 0777);
  2583. if(fd_dst <=0)
  2584. {
  2585. rt_free(p_src);
  2586. rt_printf("%s:sys_open(%s) error\n",__func__, dst);
  2587. return;
  2588. }
  2589. ret = sys_write(fd_dst, p_src, s.st_size);
  2590. if(ret!=s.st_size)
  2591. {
  2592. rt_printf("%s:sys_write(%s) error\n",__func__, dst);
  2593. rt_free(p_src);
  2594. sys_close(fd_dst);
  2595. return;
  2596. }
  2597. rt_free(p_src);
  2598. sys_close(fd_dst);
  2599. }
  2600. int rcd_write_cfg(struct rcd *prcd)
  2601. {
  2602. int ret;
  2603. int len;
  2604. int i;
  2605. char comma[]={',', 0};
  2606. char cr_line[]={'\r', '\n', 0};
  2607. // char tmp[128];
  2608. char *buf;
  2609. int f_handle;
  2610. struct cfg_file_struct *p_cfg;
  2611. // u32 sw=prcd->sw;
  2612. // u32 type=prcd->type;
  2613. //没有分配内存,返回
  2614. if(!prcd->pcfg_mem)
  2615. {
  2616. return -1;
  2617. }
  2618. //内存使用完毕,返回
  2619. if(prcd->pcfg_mem_pos > prcd->pcfg_mem_size)
  2620. {
  2621. return -1;
  2622. }
  2623. f_handle = prcd->fd_cfg;
  2624. p_cfg = &prcd->f_cfs;
  2625. // 站名、录波装置编号、版本年代
  2626. // 站名
  2627. len=strlen(p_cfg->srr.station_name);
  2628. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, p_cfg->srr.station_name, len);
  2629. prcd->pcfg_mem_pos += (u32)len;
  2630. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, comma, 1);
  2631. prcd->pcfg_mem_pos +=1;
  2632. //录波装置编号
  2633. len=strlen(p_cfg->srr.rec_dev_id);
  2634. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, p_cfg->srr.rec_dev_id, len);
  2635. prcd->pcfg_mem_pos +=(u32)len;
  2636. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, comma, 1);
  2637. prcd->pcfg_mem_pos +=1;
  2638. //版本年代
  2639. len=strlen(p_cfg->srr.rev_year);
  2640. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, p_cfg->srr.rev_year, len);
  2641. prcd->pcfg_mem_pos +=(u32)len;
  2642. memcpy(prcd->pcfg_mem+prcd->pcfg_mem_pos, cr_line, 2);
  2643. prcd->pcfg_mem_pos +=2;
  2644. buf = prcd->pcfg_mem+prcd->pcfg_mem_pos;
  2645. // 通道的种类和数量
  2646. //通道总数
  2647. buf += sprintf(buf, "%d,%dA,%dD\r\n", p_cfg->tt.A+p_cfg->tt.D, p_cfg->tt.A, p_cfg->tt.D);
  2648. // 模拟通道信息
  2649. for(i=0;i<p_cfg->tt.A;i++)
  2650. {
  2651. //通道的索引, 通道标识符
  2652. buf +=sprintf(buf, "%d,%s,", p_cfg->tt_a[i].An, p_cfg->tt_a[i].ch_id);
  2653. //通道相位标识符,被检测的电路组件, 通道的单位
  2654. buf +=sprintf(buf, "%s,%s,%s,", p_cfg->tt_a[i].Ph, p_cfg->tt_a[i].Ccb, p_cfg->tt_a[i].Uu);
  2655. //通道点值的倍数, 通道值偏移量
  2656. buf +=sprintf(buf, "%f,%f,", p_cfg->tt_a[i].a, p_cfg->tt_a[i].b);
  2657. //通道从采样开始的时间偏移,此通道中的最小值,此通道中的最大值
  2658. buf +=sprintf(buf, "%f,%d,%d,", p_cfg->tt_a[i].skew, p_cfg->tt_a[i].min, p_cfg->tt_a[i].max);
  2659. //通道电压或电流变压器一次线圈比例系数,通道电压或电流变压器二次线圈比例系数,采用primary 值还是secondary值
  2660. buf +=sprintf(buf, "%f,%f,%s\r\n", p_cfg->tt_a[i].primary, p_cfg->tt_a[i].secondary, p_cfg->tt_a[i].ps);
  2661. }
  2662. // 开关量(数字)通道信息
  2663. for(i=0;i<p_cfg->tt.D;i++)
  2664. {
  2665. //status通道索引,通道名称
  2666. buf +=sprintf(buf, "%d,%s,", p_cfg->tt_d[i].Dn, p_cfg->tt_d[i].ch_id);
  2667. //通道的相位标识符 ,被检测的电路组件,开关量通道的状态
  2668. buf +=sprintf(buf, "%s,%s,%d\r\n", p_cfg->tt_d[i].ph, p_cfg->tt_d[i].ccbm, p_cfg->tt_d[i].Y);
  2669. }
  2670. // 线路频率
  2671. buf +=sprintf(buf, "%f\r\n", p_cfg->Lf);
  2672. // 采样速率信息
  2673. buf +=sprintf(buf, "%d\r\n%f,%d\r\n", p_cfg->si.nrates, p_cfg->si.samp, p_cfg->si.endsamp);
  2674. // 时间/日期信息
  2675. buf +=sprintf(buf, "%s\r\n%s\r\n", p_cfg->date_i.firsttime, p_cfg->date_i.trigger_point_ime);
  2676. //文件格式信息
  2677. buf +=sprintf(buf, "%s\r\n", p_cfg->ft);
  2678. // 时间倍乘因数
  2679. buf +=sprintf(buf, "%s\r\n", p_cfg->timemult);
  2680. prcd->pcfg_mem_pos += buf - (prcd->pcfg_mem+prcd->pcfg_mem_pos);
  2681. ret = sys_write(prcd->fd_cfg, prcd->pcfg_mem, prcd->pcfg_mem_pos );
  2682. if(ret!=prcd->pcfg_mem_pos)
  2683. {
  2684. rt_printf("%s: sys_write(%d)=%d error\r\n", __func__, prcd->pcfg_mem_pos, ret);
  2685. }
  2686. prcd->pcfg_mem_pos = 0;
  2687. return 0;
  2688. }
  2689. static int rcd_write_dat_ascii(struct rcd *prcd)
  2690. {
  2691. int i;
  2692. char *buf;
  2693. struct dat_file_struct *p_dat;
  2694. // u32 sw=prcd->sw;
  2695. // u32 type=prcd->type;
  2696. p_dat = &prcd->f_dfs;
  2697. buf = prcd->pdat_mem + prcd->pdat_mem_pos;
  2698. //采样编号,采样时间
  2699. buf += sprintf(buf, "%d,%u,", p_dat->n, p_dat->timestamp);
  2700. p_dat->timestamp += prcd->samp_t;
  2701. //模拟通道的数据
  2702. for(i=0;i<prcd->f_cfs.tt_a_cnt;i++)
  2703. {
  2704. buf += sprintf(buf, "%d,", prcd->pAn[prcd->pAn_no++]);
  2705. }
  2706. //开关量通道数据
  2707. for(i=0;i<prcd->f_cfs.tt_d_cnt;i++)
  2708. {
  2709. buf += sprintf(buf, "%d,", prcd->pDn[prcd->pDn_no++]);
  2710. }
  2711. // 删除最后的逗号
  2712. buf--;
  2713. // 回车换行符
  2714. buf += sprintf(buf, "\r\n");
  2715. // 修正pdat_mem_pos
  2716. prcd->pdat_mem_pos = buf - prcd->pdat_mem;
  2717. return 0;
  2718. }
  2719. static int rcd_write_dat_binary(struct rcd *prcd)
  2720. {
  2721. int i;
  2722. char *buf;
  2723. struct dat_file_struct *p_dat;
  2724. // u32 sw = prcd->sw;
  2725. // u32 type = prcd->type;
  2726. p_dat = &prcd->f_dfs;
  2727. buf = prcd->pdat_mem + prcd->pdat_mem_pos;
  2728. //采样编号,采样时间
  2729. *buf++ = (p_dat->n >> 0) & 0xFF;
  2730. *buf++ = (p_dat->n >> 8) & 0xFF;
  2731. *buf++ = (p_dat->n >> 16) & 0xFF;
  2732. *buf++ = (p_dat->n >> 24) & 0xFF;
  2733. *buf++ = (p_dat->timestamp >> 0) & 0xFF;
  2734. *buf++ = (p_dat->timestamp >> 8) & 0xFF;
  2735. *buf++ = (p_dat->timestamp >> 16) & 0xFF;
  2736. *buf++ = (p_dat->timestamp >> 24) & 0xFF;
  2737. //buf += sprintf(buf, "%d,%u,", p_dat->n, p_dat->timestamp);
  2738. p_dat->timestamp += prcd->samp_t;
  2739. //模拟通道的数据
  2740. for(i=0;i<prcd->f_cfs.tt_a_cnt;i++)
  2741. {
  2742. //buf += sprintf(buf, "%d,", g_rcd[sw].pAn[g_rcd[sw].pAn_no++]);
  2743. *buf++ = (prcd->pAn[prcd->pAn_no] >> 0) & 0xFF;
  2744. *buf++ = (prcd->pAn[prcd->pAn_no] >> 8) & 0xFF;
  2745. prcd->pAn_no++;
  2746. }
  2747. //开关量通道数据
  2748. if(prcd->f_cfs.tt_d_cnt)
  2749. {
  2750. u16 d=0;
  2751. int j=0;
  2752. for(i=0;i<prcd->f_cfs.tt_d_cnt;i++)
  2753. {
  2754. d |= (prcd->pDn[prcd->pDn_no++] << (i-j*16)) & 0xFFFF;
  2755. if(i%16==15)
  2756. {
  2757. *buf++=(u8)(d & 0xFF);
  2758. *buf++=(u8)((d >> 8) & 0xFF);
  2759. j++;
  2760. d = 0;
  2761. }
  2762. }
  2763. if(i%16 != 0)
  2764. {
  2765. *buf++=(u8)(d & 0xFF);
  2766. *buf++=(u8)((d >> 8) & 0xFF);
  2767. }
  2768. }
  2769. // 删除最后的逗号
  2770. //buf--;
  2771. // 回车换行符
  2772. //buf += sprintf(buf, "\r\n");
  2773. // 修正pdat_mem_pos
  2774. prcd->pdat_mem_pos = buf - prcd->pdat_mem;
  2775. return 0;
  2776. }
  2777. int rcd_write_dat(struct rcd *prcd)
  2778. {
  2779. int ret = 0;
  2780. if(g_wave_filetype==0)
  2781. {
  2782. ret = rcd_write_dat_ascii(prcd);
  2783. }
  2784. else
  2785. {
  2786. ret = rcd_write_dat_binary(prcd);
  2787. }
  2788. return ret;
  2789. }
  2790. int rcd_get_A_D_N(char *data, int *pA, int *pD, int *pN, int *pUI) //获取模拟通道数,状态通道数,采样数
  2791. {
  2792. char *p;
  2793. char *p1;
  2794. char *p2;
  2795. int A;
  2796. int D;
  2797. char comma[]={',', 0};
  2798. char star[]={'*', 0};
  2799. char question[]={'?', 0};
  2800. char line[]={'\n', 0};
  2801. int cnt = 0;
  2802. int i=0;
  2803. static char tmpbuf[256];
  2804. p=data;
  2805. while(p)
  2806. {
  2807. p=strstr(p, line);
  2808. if(!p)
  2809. {
  2810. break;
  2811. }
  2812. p = p + 2;
  2813. cnt++;
  2814. }
  2815. if(cnt < 9)
  2816. {
  2817. rt_printf("不合法的文件格式!\r\n");
  2818. return -1;
  2819. }
  2820. p=data;
  2821. p=strstr(p, line);
  2822. p=p+2;
  2823. p1 = strstr(p, comma);
  2824. if(!p1)
  2825. {
  2826. rt_printf("没有找到通道总数!\r\n");
  2827. return -1;
  2828. }
  2829. p1++;
  2830. A=simple_strtoul(p1, NULL, 10);
  2831. if(A==0) //注意,模拟通道数不能为0
  2832. {
  2833. rt_printf("没有找到模拟通道数!\r\n");
  2834. return -1;
  2835. }
  2836. *pA = A;
  2837. p1 = strstr(p1, comma);
  2838. if(!p1)
  2839. {
  2840. rt_printf("没有找到状态数!\r\n");
  2841. return -1;
  2842. }
  2843. p1++;
  2844. D=simple_strtoul(p1, NULL, 10);
  2845. *pD = D;
  2846. p1=strstr(p1, line);
  2847. p1=p1+2;
  2848. for(i=0;i<A;i++)
  2849. {
  2850. memset(tmpbuf, 0, sizeof(tmpbuf));
  2851. p2 = p1;
  2852. p1=strstr(p1 ,line);
  2853. memcpy(tmpbuf, p2, p1-p2);
  2854. p1 = strstr(tmpbuf, "U0");
  2855. if(p1 == NULL)
  2856. {
  2857. p1 = strstr(tmpbuf, "UZ");
  2858. }
  2859. if(p1)
  2860. {
  2861. pUI[i] = 0; //零序电压
  2862. }
  2863. else
  2864. {
  2865. p1 = strstr(tmpbuf, "I0");
  2866. if(p1 == NULL)
  2867. {
  2868. p1 = strstr(tmpbuf, "IZ");
  2869. }
  2870. if(p1)
  2871. {
  2872. p1 = strstr(tmpbuf, star);
  2873. pUI[i] = p1 ? 2:1; //零序电流,2为故障线路
  2874. p1 = strstr(tmpbuf, question);
  2875. if(p1)
  2876. {
  2877. pUI[i] += 10; //零序电流,大于10为问题线路
  2878. }
  2879. }
  2880. else
  2881. {
  2882. pUI[i] = -1;//不是零序电压或电流
  2883. }
  2884. }
  2885. p1=p2;
  2886. p1=strstr(p1, line);
  2887. if(!p1)
  2888. {
  2889. return -1;
  2890. }
  2891. p1=p1+2;
  2892. }
  2893. for(i=0;i<(D+2);i++)
  2894. {
  2895. p1=strstr(p1, line);
  2896. if(!p1)
  2897. {
  2898. return -1;
  2899. }
  2900. p1=p1+2;
  2901. }
  2902. p1=strstr(p1, comma);
  2903. if(!p1)
  2904. {
  2905. rt_printf("没有找到采样数!\r\n");
  2906. return -1;
  2907. }
  2908. p1++;
  2909. *pN = simple_strtoul(p1, NULL, 10);
  2910. return 0;
  2911. }
  2912. #if 0
  2913. void testwavefile(void)
  2914. {
  2915. int f_handle;
  2916. static struct cfg_file_struct cfs;
  2917. static struct dat_file_struct dfs[3];
  2918. memset(&cfs, 0, sizeof(cfs));
  2919. memset(&dfs, 0, sizeof(dfs)*3);
  2920. memcpy(cfs.srr.station_name, "变电站名称", 10);
  2921. memcpy(cfs.srr.rec_dev_id,"0", 1);
  2922. memcpy(cfs.srr.rev_year,"1999", 4);
  2923. cfs.tt.A=8;
  2924. cfs.tt.D=2;
  2925. cfs.tt_a = rt_malloc(cfs.tt.A*sizeof(struct cfg_file_TT_A));
  2926. if(!cfs.tt_a)
  2927. {
  2928. printk("rt_malloc error\r\n");
  2929. return;
  2930. }
  2931. memset(cfs.tt_a, 0, cfs.tt.A*sizeof(struct cfg_file_TT_A));
  2932. cfs.tt_a[0].An=1;
  2933. memcpy(cfs.tt_a[0].ch_id, "母线A相电压", strlen("母线A相电压"));
  2934. memcpy(cfs.tt_a[0].Ph, "A", 1);
  2935. memcpy(cfs.tt_a[0].Uu, "V", 1);
  2936. cfs.tt_a[0].a = 0.010011;
  2937. cfs.tt_a[0].b = 0.000000;
  2938. cfs.tt_a[0].skew = 0.000000;
  2939. cfs.tt_a[0].min = -32767;
  2940. cfs.tt_a[0].max= 32767;
  2941. cfs.tt_a[0].primary=1100.000000;
  2942. cfs.tt_a[0].secondary=1.000000;
  2943. memcpy(cfs.tt_a[0].ps, "S", 1);
  2944. cfs.tt_a[1].An=2;
  2945. memcpy(cfs.tt_a[1].ch_id, "母线B相电压", strlen("母线B相电压"));
  2946. memcpy(cfs.tt_a[1].Ph, "B", 1);
  2947. memcpy(cfs.tt_a[1].Uu, "V", 1);
  2948. cfs.tt_a[1].a = 0.010011;
  2949. cfs.tt_a[1].b = 0.000000;
  2950. cfs.tt_a[1].skew = 0.000000;
  2951. cfs.tt_a[1].min = -32767;
  2952. cfs.tt_a[1].max= 32767;
  2953. cfs.tt_a[1].primary=1100.000000;
  2954. cfs.tt_a[1].secondary=1.000000;
  2955. memcpy(cfs.tt_a[1].ps, "S", 1);
  2956. cfs.tt_a[2].An=3;
  2957. memcpy(cfs.tt_a[2].ch_id, "母线C相电压", 11);
  2958. memcpy(cfs.tt_a[2].Ph, "C", 1);
  2959. memcpy(cfs.tt_a[2].Uu, "V", 1);
  2960. cfs.tt_a[2].a = 0.010011;
  2961. cfs.tt_a[2].b = 0.000000;
  2962. cfs.tt_a[2].skew = 0.000000;
  2963. cfs.tt_a[2].min = -32767;
  2964. cfs.tt_a[2].max= 32767;
  2965. cfs.tt_a[2].primary=1100.000000;
  2966. cfs.tt_a[2].secondary=1.000000;
  2967. memcpy(cfs.tt_a[2].ps, "S", 1);
  2968. cfs.tt_a[3].An=4;
  2969. memcpy(cfs.tt_a[3].ch_id, "母线A相电流", 11);
  2970. memcpy(cfs.tt_a[3].Ph, "A", 1);
  2971. memcpy(cfs.tt_a[3].Uu, "A", 1);
  2972. cfs.tt_a[3].a = 0.010011;
  2973. cfs.tt_a[3].b = 0.000000;
  2974. cfs.tt_a[3].skew = 0.000000;
  2975. cfs.tt_a[3].min = -32767;
  2976. cfs.tt_a[3].max= 32767;
  2977. cfs.tt_a[3].primary=1100.000000;
  2978. cfs.tt_a[3].secondary=1.000000;
  2979. memcpy(cfs.tt_a[3].ps, "S", 1);
  2980. cfs.tt_a[4].An=5;
  2981. memcpy(cfs.tt_a[4].ch_id, "母线B相电流", 11);
  2982. memcpy(cfs.tt_a[4].Ph, "B", 1);
  2983. memcpy(cfs.tt_a[4].Uu, "A", 1);
  2984. cfs.tt_a[4].a = 0.010011;
  2985. cfs.tt_a[4].b = 0.000000;
  2986. cfs.tt_a[4].skew = 0.000000;
  2987. cfs.tt_a[4].min = -32767;
  2988. cfs.tt_a[4].max= 32767;
  2989. cfs.tt_a[4].primary=1100.000000;
  2990. cfs.tt_a[4].secondary=1.000000;
  2991. memcpy(cfs.tt_a[4].ps, "S", 1);
  2992. cfs.tt_a[5].An=6;
  2993. memcpy(cfs.tt_a[5].ch_id, "母线C相电流", 11);
  2994. memcpy(cfs.tt_a[5].Ph, "C", 1);
  2995. memcpy(cfs.tt_a[5].Uu, "A", 1);
  2996. cfs.tt_a[5].a = 0.010011;
  2997. cfs.tt_a[5].b = 0.000000;
  2998. cfs.tt_a[5].skew = 0.000000;
  2999. cfs.tt_a[5].min = -32767;
  3000. cfs.tt_a[5].max= 32767;
  3001. cfs.tt_a[5].primary=1100.000000;
  3002. cfs.tt_a[5].secondary=1.000000;
  3003. memcpy(cfs.tt_a[5].ps, "S", 1);
  3004. cfs.tt_a[6].An=7;
  3005. memcpy(cfs.tt_a[6].ch_id, "线路零序电流", 12);
  3006. //memcpy(cfs.tt_a[6].Ph, "C", 1);
  3007. memcpy(cfs.tt_a[6].Uu, "A", 1);
  3008. cfs.tt_a[6].a = 0.010011;
  3009. cfs.tt_a[6].b = 0.000000;
  3010. cfs.tt_a[6].skew = 0.000000;
  3011. cfs.tt_a[6].min = -32767;
  3012. cfs.tt_a[6].max= 32767;
  3013. cfs.tt_a[6].primary=1100.000000;
  3014. cfs.tt_a[6].secondary=1.000000;
  3015. memcpy(cfs.tt_a[6].ps, "S", 1);
  3016. cfs.tt_a[7].An=8;
  3017. memcpy(cfs.tt_a[7].ch_id, "线路侧电压", 10);
  3018. //memcpy(cfs.tt_a[6].Ph, "C", 1);
  3019. memcpy(cfs.tt_a[7].Uu, "V", 1);
  3020. cfs.tt_a[7].a = 0.010011;
  3021. cfs.tt_a[7].b = 0.000000;
  3022. cfs.tt_a[7].skew = 0.000000;
  3023. cfs.tt_a[7].min = -32767;
  3024. cfs.tt_a[7].max= 32767;
  3025. cfs.tt_a[7].primary=1100.000000;
  3026. cfs.tt_a[7].secondary=1.000000;
  3027. memcpy(cfs.tt_a[7].ps, "S", 1);
  3028. cfs.tt_d = rt_malloc(cfs.tt.D*sizeof(struct cfg_file_TT_D));
  3029. if(!cfs.tt_a)
  3030. {
  3031. printk("rt_malloc error\r\n");
  3032. rt_free(cfs.tt_a );
  3033. return;
  3034. }
  3035. memset(cfs.tt_d, 0, cfs.tt.D*sizeof(struct cfg_file_TT_D));
  3036. cfs.tt_d[0].Dn = 1;
  3037. memcpy(cfs.tt_d[0].ch_id, "开关合位", 8);
  3038. cfs.tt_d[0].Y=0;
  3039. cfs.tt_d[1].Dn = 2;
  3040. memcpy(cfs.tt_d[1].ch_id, "开关分位", 8);
  3041. cfs.tt_d[1].Y=0;
  3042. cfs.Lf = 50;
  3043. cfs.si.nrates=1;
  3044. cfs.si.samp=1200;
  3045. cfs.si.endsamp=64;
  3046. memcpy(cfs.date_i.firsttime, "14/11/2014,19:21:35.810024", 26);
  3047. memcpy(cfs.date_i.trigger_point_ime, "14/11/2014,19:21:35.830000", 26);
  3048. memcpy(cfs.ft, "ASCII", 5);
  3049. memcpy(cfs.timemult, "1", 1);
  3050. f_handle=sys_open("/tmp/testwave.cfg",O_CREAT|O_RDWR | O_TRUNC|O_SYNC, 0777);
  3051. if( f_handle < 0)
  3052. {
  3053. return;
  3054. }
  3055. rcd_write_cfg(f_handle, &cfs);
  3056. rt_free(cfs.tt_d) ;
  3057. rt_free(cfs.tt_a);
  3058. sys_close(f_handle);
  3059. dfs[0].n=1;
  3060. dfs[0].timestamp=0;
  3061. dfs[0].An[0]=7294;
  3062. dfs[0].An[1]=-447;
  3063. dfs[0].An[2]=-6797;
  3064. dfs[0].An[3]=-2;
  3065. dfs[0].An[4]=14;
  3066. dfs[0].An[5]=7;
  3067. dfs[0].An[6]=19;
  3068. dfs[0].An[7]=0;
  3069. dfs[0].Dn[0]=0;
  3070. dfs[0].Dn[1]=0;
  3071. dfs[1].n=2;
  3072. dfs[1].timestamp=833;
  3073. dfs[1].An[0]=6089;
  3074. dfs[1].An[1]=1658;
  3075. dfs[1].An[2]=-7715;
  3076. dfs[1].An[3]=-11;
  3077. dfs[1].An[4]=12;
  3078. dfs[1].An[5]=-1;
  3079. dfs[1].An[6]=-1;
  3080. dfs[1].An[7]=0;
  3081. dfs[1].Dn[0]=0;
  3082. dfs[1].Dn[1]=0;
  3083. dfs[2].n=3;
  3084. dfs[2].timestamp=1666;
  3085. dfs[2].An[0]=4495;
  3086. dfs[2].An[1]=3649;
  3087. dfs[2].An[2]=-8122;
  3088. dfs[2].An[3]=-2;
  3089. dfs[2].An[4]=26;
  3090. dfs[2].An[5]=2;
  3091. dfs[2].An[6]=26;
  3092. dfs[2].An[7]=0;
  3093. dfs[2].Dn[0]=0;
  3094. dfs[2].Dn[1]=0;
  3095. f_handle=sys_open("/tmp/testwave.dat",O_CREAT|O_RDWR | O_TRUNC|O_SYNC, 0777);
  3096. if(f_handle < 0)
  3097. {
  3098. return;
  3099. }
  3100. rcd_write_dat(0);
  3101. rcd_write_dat(1);
  3102. rcd_write_dat(2);
  3103. sys_close(f_handle);
  3104. }
  3105. #endif
  3106. /*------------------------------ 测试函数 -------------------------------------
  3107. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  3108. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  3109. */