record.c 75 KB

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