Maintain.c 82 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: Maintain.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2013-03-05
  7. 功能说明: 装置维护管理
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. #define MAINTAIN_TYPE 138
  17. #define MAINTAIN_ACK 0X80
  18. #define MAINTAIN_NAK 0X40
  19. #define MAINTAIN_ERR_OK 0x00
  20. #define MAINTAIN_ERR_NAME 0x01
  21. #define MAINTAIN_ERR_TYPE 0x02
  22. #define MAINTAIN_ERR_BUSY 0x03
  23. #define MAINTAIN_ERR_ADDR 0x04
  24. #define MAINTAIN_ERR_SIZE 0x05
  25. #define MAINTAIN_ERR_CRC 0x06
  26. #define MAINTAIN_ERR_SAVE 0x07
  27. #define MAINTAIN_ERR_PHASE 0x08
  28. #define MAINTAIN_ERR_MEM 0x09
  29. #define MAINTAIN_ERR_STATE 0x0a
  30. #define MAINTAIN_ERR_OCODE 0X0B
  31. #define MAINTAIN_ERR_NCODE 0X0C
  32. #define MAINTAIN_ERR_NSLOT 0X0D
  33. #define MAINTAIN_ERR_TIME 0X0E
  34. #define MAINTAIN_ERR_SETNULL 0X0F
  35. #define MAINTAIN_ERR_SETERR 0X10
  36. #define MAINTAIN_ERR_DATAL 0X11 //输入校正值太小
  37. #define MAINTAIN_ERR_CHXS 0X12 //通道系数超范围
  38. #define MAINTAIN_ERR_ANGLEL 0X13 //输入角度值太小
  39. #define MAINTAIN_ERR_ANGLEH 0X14 //输入角度值太大
  40. #define MAINTAIN_ERR_ANGLEXS 0X15 //角度系数超范围
  41. #define MAINTAIN_ERR_XSSAVE 0X16 //系数保存错误
  42. #define MAINTAIN_ERR_CODE 0X17
  43. #define MAINTAIN_ERR_CMD 0X18 // 不支持的命令
  44. #define MAINTAIN_ERR_FORMAT 0X19 // 格式错误
  45. #define MAINTAIN_ERR_OTHER 0xff
  46. #define MAINTAIN_ATTR_UP 0X01
  47. #define MAINTAIN_ATTR_DOWN 0X02
  48. #define BOARD_NUMBER 12 //最大支持板卡个数
  49. /*------------------------------ 类型结构 -------------------------------------
  50. */
  51. enum mState
  52. {
  53. MS_IDLE = 0, // 空闲状态
  54. MS_REQUEST, // 维护请求
  55. MS_END, // 维护结束
  56. MS_UPDATE, // 文件更新命令
  57. MS_EQUINF, // 查看装置信息
  58. MS_BOARDINF, // 查看板卡信息
  59. MS_TEST_DO, // 开出测试
  60. MS_TEST_DI, // 开入值刷新
  61. MS_TEST_LED, // LED测试
  62. MS_SAMPLE, // 零漂值刷新
  63. MS_ADJUST, // 采样校准
  64. MS_TEST_REMOTE, // 远动测试
  65. MS_RECORD, // 手动启动录波
  66. MS_MEASURE, // 测量值刷新
  67. MS_TIME_DIS, // 时间刷新
  68. MS_TIME_SET, // 对时
  69. MS_FLAG_DIS, // 标志刷新
  70. MS_BAT_MANAGE, // 电池管理
  71. MS_CLEAR_SOE, // 清除SOE
  72. MS_SET_CODE, // 修改密码
  73. MS_KEEP_ALIVE, // 心跳命令
  74. MS_BOARD_VERSION, // 主板版本
  75. MS_DIDO_AUTO_TEST, // 开入开出自动测试
  76. MS_BOARD_DI, // 板卡遥信
  77. MS_RESOURCE_THAN, // 资源表文件比对
  78. MS_BOARD_MEASURE, // 板卡测量值刷新
  79. MS_BOARD_CALIBRATION, // 板卡校准系数上传
  80. MS_DEFAULT_CALIBRATION, // 恢复默认校准系数
  81. MS_SAMPLE_CALIBRATION, // 整机采样校准
  82. MS_DEFAULT, // 恢复出厂设置
  83. MS_UZTEMP_MEASURE, // 直流、温度刷新
  84. MS_ADJUST_UZL, // 直流校准
  85. MS_SAMPLE_TEST, // 采样通道测试
  86. MS_KRKC_TEST, // 开入开出测试
  87. MS_LCD_TEST, // LCD测试
  88. MS_RESET_TEST, // 装置复位
  89. MS_CFGINF, // 配置信息查看
  90. MS_ERRINF, // 故障信息查看
  91. MS_GETIP, // 获取网口及对应IP
  92. MS_GET_GPRS_INFO, // 得到GPRS信息
  93. MS_FZXS_UD, // 辐值系数上传下载
  94. MS_AC_CFG, // 采样板单板通道配置
  95. MS_DC_FACTOR, // 直流校准系数
  96. MS_WAVE_OK, // 录波完成
  97. MS_FILE_ISUPDATE, // 文件是否更新
  98. MS_COMM_TEST, // 串口测试
  99. MS_PASSWORD, // 密码及权限确认
  100. MS_INSTU, // 内部状态查看
  101. MS_RCD_NAME, // 录波文件名称获取
  102. MS_RMT_PAIR, // 遥控器配对
  103. MS_BOARDINF2, // 查看板卡信息
  104. MS_SET_MTPWD, // 设置维护工具密码
  105. MS_MT_PWD, // 维护工具密码及权限确认
  106. MS_CLOSE_PORT, // 关闭维护端口服务
  107. MS_AUTH, // 装置授权管理
  108. MS_YD_REFRESH, // 远动遥信遥测刷新
  109. MS_FACTORY_SETUP, //出厂设置
  110. #if defined(CPU_AM335X)
  111. MS_APP_BAK_START, //启动app分区备份 58
  112. MS_APP_BAK_RESULT, //查询app分区备份结果 59
  113. #endif
  114. };
  115. struct maintain
  116. {
  117. enum mState state;
  118. s32 file_index;
  119. u16 file_type;
  120. };
  121. //板卡类型
  122. enum
  123. {
  124. BOARD_MASTER=0, //主板
  125. BOARD_AUX, //辅助功能板
  126. BOARD_DI_30, //DI板:30个
  127. BOARD_DI_72, //DI板:72个
  128. BOARD_DO, //DO板
  129. BOARD_AI_UI, //AI板:电压3个,电流9个
  130. BOARD_AI_I, //AI板:电流12个
  131. BOARD_POWER, //电源板
  132. BOARD_DISP, //显示板
  133. };
  134. //采样板类型
  135. enum
  136. {
  137. AC_4U12I=1,
  138. AC_4U9I,
  139. AC_1U12I,
  140. AC_6U4I,
  141. AC_4U4I,
  142. ACTYPE_NUM,
  143. };
  144. //板卡信息格式
  145. struct board_inf
  146. {
  147. BYTE bytype; //板卡类型
  148. BYTE bystatus; //板卡状态
  149. BYTE byCRC[2]; //程序CRC校验
  150. BYTE byVer[4]; //程序版本
  151. };
  152. struct ac_test_type
  153. {
  154. char * name;
  155. u16 normal_data;
  156. short normal_angle;
  157. };
  158. struct ac_test_board
  159. {
  160. int type;
  161. int num;
  162. const struct ac_test_type
  163. *data;
  164. };
  165. #define FILELIST_FILE_VERSION 0X01010101 //文件列表版本
  166. #define MTPWD_FILE_VERSION 0X01010101 //文件版本
  167. /*------------------------------ 全局变量 -------------------------------------
  168. */
  169. // 维护接入方式,是串口还是网络,如果是串口,不能打开网络端口
  170. bool g_mt_rs232;
  171. struct maintain g_maintain = {0};
  172. struct maintain_def g_mtbuf;
  173. struct prog_up g_prog_up;
  174. static const char * mt_init_pwd = "gh123456@"; // 维护工具默认密码
  175. static char mt_pwd[17];
  176. extern struct timespec g_sys_time;
  177. u8 dido_buf[128];
  178. uint32_t alive_us0 = 0,alive_us1 = 0;
  179. uint32_t rmttest_us0 = 0,rmttest_us1 = 0;
  180. const struct ac_test_type g_dtu_ac4u12i_desc[17] =
  181. {
  182. {"Ua", 100, 0},
  183. {"Ub", 100, -120},
  184. {"Uc", 100, 120},
  185. {"US", 100, 120},
  186. {"Ia1", 5, 0},
  187. {"Ib1", 5, -120},
  188. {"Ic1", 5, 120},
  189. {"Ia2", 5, 0},
  190. {"Ib2", 5, -120},
  191. {"Ic2", 5, 120},
  192. {"Ia3", 5, 0},
  193. {"Ib3", 5, -120},
  194. {"Ic3", 5, 120},
  195. {"Ia4", 5, 0},
  196. {"Ib4", 5, -120},
  197. {"Ic4", 5, 120},
  198. {"F", 50, 0},
  199. };
  200. #define AC_DTU_4U12I_NUM (sizeof(g_dtu_ac4u12i_desc)/sizeof(g_dtu_ac4u12i_desc[0]))
  201. const struct ac_test_type g_dtu_ac4u9i_desc[17] =
  202. {
  203. {"Ua", 100, 0},
  204. {"Ub", 100, -120},
  205. {"Uc", 100, 120},
  206. {"US", 100, 120},
  207. {"Ia1", 5, 0},
  208. {"Ib1", 5, -120},
  209. {"Ic1", 5, 120},
  210. {"Ia2", 5, 0},
  211. {"Ib2", 5, -120},
  212. {"Ic2", 5, 120},
  213. {"Ia3", 5, 0},
  214. {"Ib3", 5, -120},
  215. {"Ic3", 5, 120},
  216. {"+12V", 12, 0},
  217. {"-12V", -12, 0},
  218. {"+05V", 5, 0},
  219. {"F", 50, 0},
  220. };
  221. #define AC_DTU_4U9I_NUM (sizeof(g_dtu_ac4u9i_desc)/sizeof(g_dtu_ac4u9i_desc[0]))
  222. const struct ac_test_type g_dtu_ac1u12i_desc[17] =
  223. {
  224. {"US1", 100, 0},
  225. {"Ia1", 5, 0},
  226. {"Ib1", 5, -120},
  227. {"Ic1", 5, 120},
  228. {"Ia2", 5, 0},
  229. {"Ib2", 5, -120},
  230. {"Ic2", 5, 120},
  231. {"Ia3", 5, 0},
  232. {"Ib3", 5, -120},
  233. {"Ic3", 5, 120},
  234. {"Ia4", 5, 0},
  235. {"Ib4", 5, -120},
  236. {"Ic4", 5, 120},
  237. {"+12V", 12, 0},
  238. {"-12V", -12, 0},
  239. {"+05V", 5, 0},
  240. {"F", 50, 0},
  241. };
  242. #define AC_DTU_1U12I_NUM (sizeof(g_dtu_ac1u12i_desc)/sizeof(g_dtu_ac1u12i_desc[0]))
  243. const struct ac_test_type g_ftu_4u4i_desc[9] =
  244. {
  245. {"UA", 100, 0},
  246. {"UB", 100, -120},
  247. {"UC", 100, 120},
  248. {"U0", 100, 120},
  249. {"IA", 5, 0},
  250. {"IB", 5, -120},
  251. {"IC", 5, 120},
  252. {"I0", 5, 120},
  253. {"F", 50, 0},
  254. };
  255. #define AC_FTU_4U4I_NUM (sizeof(g_ftu_4u4i_desc)/sizeof(g_ftu_4u4i_desc[0]))
  256. struct ac_test_board g_ac_test_board[] =
  257. {
  258. {AC_4U12I,AC_DTU_4U9I_NUM,g_dtu_ac4u12i_desc},
  259. {AC_4U9I,AC_DTU_4U9I_NUM,g_dtu_ac4u9i_desc},
  260. {AC_1U12I,AC_DTU_1U12I_NUM,g_dtu_ac1u12i_desc},
  261. {AC_4U4I,AC_FTU_4U4I_NUM,g_ftu_4u4i_desc},
  262. };
  263. #define AC_TEST_BOARD_NUM (sizeof(g_ac_test_board)/sizeof(g_ac_test_board[0]))
  264. /*------------------------------ 函数声明 -------------------------------------
  265. */
  266. static void _maintain_state_reset(void);
  267. static void _maintain_echo(struct maintain_def *pt,u8 * cmd_buf,u8 cmd_len);
  268. static void _maintain_recv_rst(struct maintain_def *pt);
  269. static void _maintain_send(void);
  270. static int _maintain_comm(struct maintain_def *pt,unsigned char *buf,int len);
  271. static int _trans_file_comm(struct maintain_def *pt,u8 *buf,int len);
  272. static int _maintain_pwd_createfile(u8 *pwd);
  273. static int _maintain_pwd_readfile(void);
  274. extern BYTE g_LedNo;
  275. extern struct down_program_comm g_down_program; //面板升级
  276. int IEC101_TransFile(IEC101_DEF *pt,unsigned char *buf,int len);
  277. /*------------------------------ 外部函数 -------------------------------------
  278. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  279. */
  280. /**************************************************************************
  281. 函数名称:MainTain_Init
  282. 函数版本:1.00
  283. 作者:
  284. 创建日期:2013.03.28
  285. 函数功能说明:维护命令初始化
  286. 输入参数:
  287. 输出参数:
  288. 返回值:
  289. 更新信息:
  290. 更新日志1:
  291. 日期:
  292. 修改者:
  293. 修改内容:
  294. 修改原因:
  295. ***************************************************************************/
  296. void MainTain_Init(void)
  297. {
  298. int i;
  299. memset(&g_mtbuf,0,sizeof(struct maintain_def));
  300. alive_us0= ustimer_get_origin();
  301. alive_us1= ustimer_get_origin();
  302. i = _maintain_pwd_readfile();
  303. if (i != 0)
  304. {
  305. u8 j, tmp_pwd[16];
  306. memset (&mt_pwd, ' ', 16);
  307. memcpy (&mt_pwd, mt_init_pwd, strlen(mt_init_pwd));
  308. for (j=0; j<16; j++)
  309. {
  310. tmp_pwd[j] = ~mt_pwd[j];
  311. }
  312. _maintain_pwd_createfile(tmp_pwd);
  313. rt_printf("维护工具密码文件错误: %d\r\n", i);
  314. }
  315. }
  316. /**************************************************************************
  317. 函数名称:Maintain_Applay
  318. 函数版本:1.00
  319. 作者:
  320. 创建日期:2013.03.28
  321. 函数功能说明:维护命令链路数据处理
  322. 输入参数:
  323. 输出参数:
  324. 返回值:
  325. 更新信息:
  326. 更新日志1:
  327. 日期:
  328. 修改者:
  329. 修改内容:
  330. 修改原因:
  331. ***************************************************************************/
  332. void Maintain_Applay(void)
  333. {
  334. struct maintain_def *pt=&g_mtbuf;
  335. BYTE *pd;
  336. u8 AddByte=0;
  337. // 如果有僵死的维护线程,回收。
  338. net_maintain_zombie();
  339. if(bMaintain)
  340. {
  341. alive_us1 = ustimer_get_origin();
  342. #if defined (CPU_AM335X) || (defined CPU_FUXI)
  343. //noted by sunxi: 目前维护工具为每30秒发1条心跳,如果漏1条,就已经是60秒了。
  344. //这样很容易出问题,应该是发3条心跳,1条都没有收到才被认为有问题才合理。100秒可有3条心跳了。
  345. //需要这里加了宏CPU_AM335X,但是所有平台都应该改为100秒。
  346. if(alive_us1 - alive_us0 > 100*USTIMER_SEC) // 100秒循环检查
  347. #else
  348. if(alive_us1 - alive_us0 > 60*USTIMER_SEC)
  349. #endif
  350. {
  351. bMaintain=false;
  352. }
  353. }
  354. if(g_run_stu.bToolRmtTest)
  355. {
  356. rmttest_us1 = ustimer_get_origin();
  357. if(rmttest_us1 - rmttest_us0> 600UL*USTIMER_SEC) // 10分钟自动退出远动测试模式
  358. {
  359. g_run_stu.bToolRmtTest=false;
  360. }
  361. }
  362. if(pt->bData) //有接收到的数据
  363. {
  364. if (!g_mtbuf.hmi_mode)
  365. {
  366. g_file_save = 0;
  367. }
  368. pt->bData=false;
  369. if(pt->recvbuf[0]==0x10) pd=&pt->recvbuf[1];//短帧
  370. else if(pt->recvbuf[0]==0x68) pd=&pt->recvbuf[4];//长帧
  371. else return;
  372. // rt_printf("Maintain_Recv buf= %x %x %x %x %x %x %x %x %x %x %x %x\r\n", pd[0],pd[1],pd[2],pd[3],pd[4],pd[5],pd[6],pd[7],pd[8],pd[9],pd[10],pd[11]);
  373. pt->dValidTime=dTCounter;
  374. switch((pd[0]&0x0f))
  375. {
  376. case 3: //请求/确认
  377. case 4: //请求/无应答
  378. switch(pd[2]) //类型标识判断
  379. {
  380. case 138://维护命令管理模块
  381. _maintain_comm(pt,&pd[2+AddByte],pt->recvbuf[1]-(2+AddByte));
  382. break;
  383. case 137: // 下载上传文件
  384. _trans_file_comm(pt,&pd[2+AddByte],pt->recvbuf[1]-(2+AddByte));
  385. break;
  386. }
  387. break;
  388. } //类型判断结束
  389. _maintain_send();
  390. }
  391. else //无有效数据接收,平衡式101处理自动发送数据
  392. {
  393. if(pt->bSend)return; //正在发送数据,不处理
  394. if(dTCounter-pt->dValidTime>T_1s*10) // 6秒后,未收到应答报文
  395. {
  396. pt->dValidTime=dTCounter;
  397. if(++pt->byRetryTimes>2) //重发三次后,重新初始化
  398. {
  399. pt->bSend=false;
  400. }
  401. else
  402. {
  403. //需重新组织发送
  404. _maintain_send();
  405. }
  406. }
  407. return; // 发送,未收到数据,返回
  408. }
  409. }
  410. /**************************************************************************
  411. 函数名称:Maintain_Manage
  412. 函数版本:1.00
  413. 作者:
  414. 创建日期:2013.03.28
  415. 函数功能说明:维护命令处理
  416. 输入参数:
  417. 输出参数:
  418. 返回值:
  419. 更新信息:
  420. 更新日志1:
  421. 日期:
  422. 修改者:
  423. 修改内容:
  424. 修改原因:
  425. ***************************************************************************/
  426. int Maintain_Manage(u8 *buf, u32 len, u8 *cmd_buf)
  427. {
  428. u8 cmd_len=0;
  429. u16 i;
  430. char name[256];
  431. #if defined(CPU_AM335X)
  432. u32 llen;
  433. u8 *lbuf;
  434. u8 result = 0;
  435. struct file * pfile;
  436. loff_t pos;
  437. char *cmd_ls[] = {"/usr/sbin/app_backup.sh",NULL, NULL, NULL};
  438. #endif
  439. cmd_buf[0] = MAINTAIN_TYPE;
  440. cmd_buf[1] = buf[1];
  441. alive_us0= ustimer_get_origin();
  442. switch(buf[1])
  443. {
  444. case MS_REQUEST:
  445. // 维护请求
  446. _maintain_state_reset();
  447. sprintf(cmd_buf+2,szTool);
  448. sprintf(cmd_buf+21,VER_TIME "CRC:%04XH",m_CodeCrc);
  449. cmd_len = strlen(cmd_buf+2)+1+2;
  450. #if 0
  451. for (i=0; i<19; i++) //检查版本号
  452. {
  453. if (buf[2+i] != szTool[i])
  454. {
  455. cmd_buf[1] |= MAINTAIN_NAK;
  456. break;
  457. }
  458. }
  459. #endif
  460. bMaintain = true;
  461. cmd_buf[1] |= MAINTAIN_ACK;
  462. g_maintain.state = MS_REQUEST;
  463. break;
  464. case MS_END:
  465. // 维护结束
  466. bMaintain = false;
  467. if(g_run_stu.bToolRmtTest)
  468. {
  469. g_run_stu.bToolRmtTest = false;
  470. }
  471. // 如果是重复报文,继续肯定应答。
  472. if(g_maintain.state == MS_END)
  473. {
  474. cmd_buf[1] |= MAINTAIN_ACK;
  475. cmd_len = 2;
  476. break;
  477. }
  478. // 判断是否需要复位
  479. if(buf[2] == 1) // 0:不复位;1:复位
  480. {
  481. }
  482. // 一切正常,肯定应答
  483. cmd_buf[1] |= MAINTAIN_ACK;
  484. cmd_len = 2;
  485. // 复位全部状态后,设置状态为MS_END,继续应答重发确认帧。
  486. _maintain_state_reset();
  487. g_maintain.state = MS_END;
  488. break;
  489. case MS_UPDATE:
  490. {
  491. u16 file_type;
  492. char from_file_name[64];
  493. char to_file_name[64];
  494. memcpy(cmd_buf+2,buf+2,25);
  495. // 检查阶段
  496. if((g_maintain.state != MS_REQUEST) || (!bMaintain))
  497. {
  498. cmd_buf[1] |= MAINTAIN_NAK;
  499. cmd_buf[25] = MAINTAIN_ERR_PHASE;
  500. cmd_len = 26;
  501. break;
  502. }
  503. //检查文件名
  504. g_maintain.file_index = file_check(buf+3,ATTR_DOWN);
  505. if(g_maintain.file_index < 0)
  506. {
  507. cmd_buf[1] |= MAINTAIN_NAK;
  508. cmd_buf[25] = MAINTAIN_ERR_NAME;
  509. cmd_len = 26;
  510. break;
  511. }
  512. if (buf[25])
  513. {
  514. //子板升级
  515. if(g_maintain.file_type == FILETYPE_CHILDPRO)
  516. {
  517. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  518. extern struct program_comm g_program;
  519. if ((g_program.comm == 0)&&(g_prog_up.bit_echo == 0))
  520. {
  521. cmd_buf[1] |= MAINTAIN_NAK;
  522. cmd_buf[25] = MAINTAIN_ERR_OTHER;
  523. cmd_len = 26;
  524. break;
  525. }
  526. else
  527. {
  528. cmd_buf[26] = g_prog_up.framesum;
  529. cmd_buf[27] = g_prog_up.framesum>>8;
  530. cmd_buf[28] = g_prog_up.frameno;
  531. cmd_buf[29] = g_prog_up.frameno>>8;
  532. cmd_buf[30] = g_prog_up.bit_prog;
  533. cmd_buf[31] = g_prog_up.bit_prog>>8;
  534. cmd_buf[32] = g_prog_up.bit_echo;
  535. cmd_buf[33] = g_prog_up.bit_echo>>8;
  536. cmd_buf[1] |= MAINTAIN_ACK;
  537. cmd_len = 34;
  538. }
  539. #endif
  540. }
  541. else if(g_maintain.file_type == FILETYPE_F308_HMI)
  542. {
  543. if ((g_down_program.comm == 0)&&(g_down_program.bit_echo == 0))
  544. {
  545. cmd_buf[1] |= MAINTAIN_NAK;
  546. cmd_buf[25] = MAINTAIN_ERR_OTHER;
  547. cmd_len = 26;
  548. break;
  549. }
  550. else
  551. {
  552. cmd_buf[26] = g_down_program.framenum;
  553. cmd_buf[27] = g_down_program.framenum>>8;
  554. cmd_buf[28] = g_down_program.frameno;
  555. cmd_buf[29] = g_down_program.frameno>>8;
  556. cmd_buf[30] = g_down_program.bit_prog;
  557. cmd_buf[31] = g_down_program.bit_prog>>8;
  558. cmd_buf[32] = g_down_program.bit_echo;
  559. cmd_buf[33] = g_down_program.bit_echo>>8;
  560. cmd_buf[1] |= MAINTAIN_ACK;
  561. //rt_printf("[frameno=%d, %d]\n", g_down_program.frameno,g_down_program.framenum);
  562. cmd_len = 34;
  563. }
  564. }
  565. break;
  566. }
  567. memcpy(&g_maintain.file_type,buf+23,2);
  568. #ifndef MODE_LITTLE_ENDIAN
  569. swap16(&g_maintain.file_type);
  570. #endif
  571. file_type = file_check_type(buf+3,ATTR_DOWN);
  572. //文件校验,并进行移动、删除动作.注意GPRS相关文件作特殊处理
  573. if (g_file_save)
  574. {
  575. g_file_save = 0;
  576. }
  577. else if (g_maintain.file_type == file_type)
  578. {
  579. if (file_check_info(g_maintain.file_index) == 0)
  580. {
  581. char log_buf[128]={0};
  582. uint32_t us0 = ustimer_get_origin();
  583. watchdog_feed_mainloop_50s();
  584. sprintf(to_file_name,"%s%s",g_file_item[g_maintain.file_index].file_dir,g_file_item[g_maintain.file_index].file_name);
  585. sprintf(from_file_name,"%s%s","/tmp/",g_file_item[g_maintain.file_index].file_name);
  586. rt_file_mv(from_file_name,to_file_name);
  587. rt_printf("rt_file_mv:us=%d.\r\n",ustimer_get_duration(us0)/USTIMER_US);
  588. sprintf(name,"%s%s%s","文件更新",g_file_item[g_maintain.file_index].file_dir,g_file_item[g_maintain.file_index].file_name);
  589. log_str_time(LOG_OPERATE,name,0,1);
  590. sprintf(log_buf,"%s updated",g_file_item[g_maintain.file_index].file_name);
  591. load_hs_log_rcd(TYPE_SW_UPDATE,true,NULL,log_buf,1);
  592. }
  593. else
  594. {
  595. sprintf(from_file_name,"%s%s","/tmp/",g_file_item[g_maintain.file_index].file_name);
  596. rt_file_del(from_file_name);
  597. if (g_maintain.file_type == FILETYPE_SET)
  598. {
  599. set_create_data_file();
  600. }
  601. cmd_buf[1] |= MAINTAIN_NAK;
  602. cmd_buf[25] = MAINTAIN_ERR_CRC;
  603. cmd_len = 26;
  604. break;
  605. }
  606. }
  607. if (g_maintain.file_type == FILETYPE_SET)
  608. {
  609. int ret=0;
  610. ret = set_save_data_file(g_maintain.file_index);
  611. if (ret != 0)
  612. {
  613. cmd_buf[1] |= MAINTAIN_NAK;
  614. if (ret < 0)
  615. {
  616. cmd_buf[25] = MAINTAIN_ERR_CRC;
  617. }
  618. else if (ret & 0x07)
  619. {
  620. cmd_buf[25] = MAINTAIN_ERR_SETNULL;
  621. }
  622. else if (ret & 0x70)
  623. {
  624. cmd_buf[25] = MAINTAIN_ERR_SETERR;
  625. }
  626. cmd_len = 26;
  627. break;
  628. }
  629. }
  630. #ifdef FUN_GPRS // modfiy for xxxxxx 20220706 GPRS没有使用。
  631. else if(g_maintain.file_type == FILETYPE_INNERGPRS)
  632. {
  633. //extern void gprs_net_update_gprsini(void);
  634. //gprs_net_update_gprsini();
  635. //不作任何处理.GPRS模块自己会复位.
  636. extern int g_update_gprs_driver;
  637. if(strcmp(g_file_item[g_maintain.file_index].file_name,FILE_NAME_GPRSDRIVER) == 0)
  638. {
  639. g_update_gprs_driver = 1;//置更新标志
  640. }
  641. }
  642. #endif
  643. else if(g_maintain.file_type == FILETYPE_CHILDPRO)
  644. {
  645. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  646. if (init_file_program(buf[2], g_maintain.file_index) != 0) //文件读取校验有误
  647. {
  648. cmd_buf[1] |= MAINTAIN_NAK;
  649. cmd_buf[25] = MAINTAIN_ERR_CRC;
  650. cmd_len = 26;
  651. rt_file_del("/tmp/DTU-DIDO.elf.bin");
  652. break;
  653. }
  654. else
  655. {
  656. cmd_buf[25] = 1;
  657. }
  658. #endif
  659. }
  660. else if(g_maintain.file_type == FILETYPE_F308_HMI)
  661. {
  662. if (init_down_program( g_maintain.file_index) != 0) //文件读取校验有误
  663. {
  664. cmd_buf[1] |= MAINTAIN_NAK;
  665. cmd_buf[25] = MAINTAIN_ERR_CRC;
  666. cmd_len = 26;
  667. rt_file_del("/tmp/F308_HMI.bin");
  668. break;
  669. }
  670. else
  671. {
  672. cmd_buf[25] = 1;
  673. }
  674. }
  675. cmd_buf[1] |= MAINTAIN_ACK;
  676. if (cmd_buf[25])
  677. {
  678. //子板升级
  679. if(g_maintain.file_type == FILETYPE_CHILDPRO)
  680. {
  681. cmd_buf[26] = g_prog_up.framesum;
  682. cmd_buf[27] = g_prog_up.framesum>>8;
  683. cmd_buf[28] = g_prog_up.frameno;
  684. cmd_buf[29] = g_prog_up.frameno>>8;
  685. cmd_buf[30] = g_prog_up.bit_prog;
  686. cmd_buf[31] = g_prog_up.bit_prog>>8;
  687. cmd_buf[32] = g_prog_up.bit_echo;
  688. cmd_buf[33] = g_prog_up.bit_echo>>8;
  689. cmd_len = 34;
  690. }
  691. else if(g_maintain.file_type == FILETYPE_F308_HMI)
  692. {
  693. cmd_buf[26] = g_down_program.framenum;
  694. cmd_buf[27] = g_down_program.framenum>>8;
  695. cmd_buf[28] = g_down_program.frameno;
  696. cmd_buf[29] = g_down_program.frameno>>8;
  697. cmd_buf[30] = g_down_program.bit_prog;
  698. cmd_buf[31] = g_down_program.bit_prog>>8;
  699. cmd_buf[32] = g_down_program.bit_echo;
  700. cmd_buf[33] = g_down_program.bit_echo>>8;
  701. cmd_len = 34;
  702. }
  703. break;
  704. }
  705. else
  706. {
  707. cmd_len = 26;
  708. }
  709. }
  710. break;
  711. case MS_EQUINF:
  712. // 查看装置信息
  713. cmd_len = set_get_fixed_args_sz(buf[2],cmd_buf+2,240);
  714. cmd_len += 2;
  715. cmd_buf[1] |= MAINTAIN_ACK;
  716. break;
  717. case MS_BOARDINF:
  718. case MS_BOARDINF2:
  719. {
  720. // 查看板卡信息
  721. #define BOARD_INF_MAX_SLOT 11
  722. int slot_num=0,slot_begin=0;
  723. int b_info_size;
  724. if(buf[1] == MS_BOARDINF)
  725. {
  726. slot_num = g_equ_config->equ_slot_num > BOARD_INF_MAX_SLOT ? BOARD_INF_MAX_SLOT : g_equ_config->equ_slot_num;
  727. slot_begin = 0;
  728. }
  729. else if(g_equ_config->equ_slot_num > BOARD_INF_MAX_SLOT)
  730. {
  731. slot_num = g_equ_config->equ_slot_num -BOARD_INF_MAX_SLOT;
  732. slot_begin = BOARD_INF_MAX_SLOT;
  733. }
  734. else
  735. {
  736. cmd_buf[1] |= MAINTAIN_NAK;
  737. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  738. cmd_len = 3;
  739. break;
  740. }
  741. cmd_len = 2;
  742. b_info_size = 21;
  743. for(i=0; i<slot_num; i++)
  744. {
  745. cmd_buf[2+i*b_info_size] = g_board_info[slot_begin + i].type;
  746. cmd_buf[3+i*b_info_size] = g_board_info[slot_begin + i].status;
  747. cmd_buf[4+i*b_info_size] = g_board_info[slot_begin + i].errcode;
  748. cmd_buf[5+i*b_info_size] = g_board_info[slot_begin + i].crc;
  749. cmd_buf[6+i*b_info_size] = g_board_info[slot_begin + i].crc>>8;
  750. cmd_buf[7+i*b_info_size] = g_board_info[slot_begin + i].version;
  751. cmd_buf[8+i*b_info_size] = g_board_info[slot_begin + i].version>>8;
  752. cmd_buf[9+i*b_info_size] = g_board_info[slot_begin + i].version>>16;
  753. cmd_buf[10+i*b_info_size] = g_board_info[slot_begin + i].version>>24;
  754. cmd_buf[11+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_sec;
  755. cmd_buf[12+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_sec>>8;
  756. cmd_buf[13+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_sec>>16;
  757. cmd_buf[14+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_sec>>24;
  758. cmd_buf[15+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_nsec;
  759. cmd_buf[16+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_nsec>>8;
  760. cmd_buf[17+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_nsec>>16;
  761. cmd_buf[18+i*b_info_size] = g_board_info[slot_begin + i].update_time.tv_nsec>>24;
  762. cmd_buf[19+i*b_info_size] = g_board_info[slot_begin + i].can_bus;
  763. cmd_buf[20+i*b_info_size] = g_board_info[slot_begin + i].can_bus>>8;
  764. cmd_buf[21+i*b_info_size] = g_board_info[slot_begin + i].is_check;
  765. cmd_buf[22+i*b_info_size] = g_board_info[slot_begin + i].is_check>>8;
  766. cmd_len += b_info_size;
  767. }
  768. // 发送ACK
  769. cmd_buf[1] |= MAINTAIN_ACK;
  770. }
  771. break;
  772. case MS_TEST_DO:
  773. // 开出测试
  774. // 检查阶段
  775. if((g_maintain.state != MS_REQUEST) ||(!bMaintain))
  776. {
  777. cmd_buf[1] |= MAINTAIN_NAK;
  778. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  779. cmd_len = 3;
  780. break;
  781. }
  782. bMaintain_test = true;
  783. dido_single_test(buf[2],buf[3]);
  784. bMaintain_test = false;
  785. cmd_buf[2] = buf[2];
  786. cmd_buf[3] = buf[3];
  787. // 发送ACK
  788. cmd_buf[1] |= MAINTAIN_ACK;
  789. cmd_len = 4;
  790. break;
  791. case MS_TEST_DI:
  792. {
  793. // 开入值刷新
  794. int sw;
  795. sw = buf[2];
  796. cmd_buf[2] = sw;
  797. if(sw == 0)
  798. {
  799. int i;
  800. long flag=0;
  801. long value=0;
  802. long flag2=0;
  803. long value2=0;
  804. for(i=0;i<PUB_DI_NUM;i++)
  805. {
  806. if((short)g_sw_pub.di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  807. {
  808. struct equ_config_di *ecd=&g_equ_config_di[g_sw_pub.di_cfg_index[i]];
  809. if(i<32)
  810. {
  811. if(dido_di_is_on(ecd->slot,ecd->index))
  812. {
  813. value |= (1<<i);
  814. }
  815. flag |= (1<<i);
  816. }
  817. else
  818. {
  819. if(dido_di_is_on(ecd->slot,ecd->index))
  820. {
  821. value2 |= (1<<(i-32));
  822. }
  823. flag2 |= (1<<(i-32));
  824. }
  825. }
  826. }
  827. cmd_buf[3] = flag;
  828. cmd_buf[4] = (flag >> 8);
  829. cmd_buf[5] = (flag >> 16);
  830. cmd_buf[6] = (flag >> 24);
  831. cmd_buf[7] = value;
  832. cmd_buf[8] = (value >> 8);
  833. cmd_buf[9] = (value >> 16);
  834. cmd_buf[10] = (value >> 24);
  835. cmd_len = 11;
  836. if(PUB_DI_NUM>32)
  837. {
  838. cmd_buf[11] = flag2;
  839. cmd_buf[12] = (flag2 >> 8);
  840. cmd_buf[13] = (flag2>> 16);
  841. cmd_buf[14] = (flag2 >> 24);
  842. cmd_buf[15] = value2;
  843. cmd_buf[16] = (value2 >> 8);
  844. cmd_buf[17] = (value2 >> 16);
  845. cmd_buf[18] =(value2 >> 24);
  846. cmd_len = 19;
  847. }
  848. }
  849. else if(sw <= SWITCH_NUM_MAX)
  850. {
  851. int i;
  852. long flag=0;
  853. long value=0;
  854. long flag2=0;
  855. long value2=0;
  856. sw --;
  857. for(i=0;i<SW_DI_NUM;i++)
  858. {
  859. if((short)g_sw[sw].di_cfg_index[i]!=INDEX_INVALLID) //此遥信有配置
  860. {
  861. struct equ_config_di *ecd=&g_equ_config_di[g_sw[sw].di_cfg_index[i]];
  862. if(i<32)
  863. {
  864. if(dido_di_is_on(ecd->slot,ecd->index))
  865. {
  866. value |= (1<<i);
  867. }
  868. flag |= (1<<i);
  869. }
  870. else
  871. {
  872. if(dido_di_is_on(ecd->slot,ecd->index))
  873. {
  874. value2 |= (1<<(i-32));
  875. }
  876. flag2 |= (1<<(i-32));
  877. }
  878. }
  879. }
  880. cmd_buf[3] = flag;
  881. cmd_buf[4] = (flag >> 8);
  882. cmd_buf[5] = (flag>> 16);
  883. cmd_buf[6] = (flag >> 24);
  884. cmd_buf[7] = value;
  885. cmd_buf[8] = (value >> 8);
  886. cmd_buf[9] = (value >> 16);
  887. cmd_buf[10] =(value >> 24);
  888. cmd_len = 11;
  889. if(SW_DI_NUM>32)
  890. {
  891. cmd_buf[11] = flag2;
  892. cmd_buf[12] = (flag2 >> 8);
  893. cmd_buf[13] = (flag2>> 16);
  894. cmd_buf[14] = (flag2 >> 24);
  895. cmd_buf[15] = value2;
  896. cmd_buf[16] = (value2 >> 8);
  897. cmd_buf[17] = (value2 >> 16);
  898. cmd_buf[18] =(value2 >> 24);
  899. cmd_len = 19;
  900. }
  901. }
  902. else
  903. {
  904. cmd_buf[1] |= MAINTAIN_NAK;
  905. cmd_buf[2] = MAINTAIN_ERR_NSLOT;
  906. cmd_len = 3;
  907. break;
  908. }
  909. // 发送ACK
  910. cmd_buf[1] |= MAINTAIN_ACK;
  911. }
  912. break;
  913. case MS_TEST_LED:
  914. { // LED测试
  915. // 检查阶段
  916. if((g_maintain.state != MS_REQUEST) ||(!bMaintain))
  917. {
  918. cmd_buf[1] |= MAINTAIN_NAK;
  919. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  920. cmd_len = 3;
  921. break;
  922. }
  923. // 显示面板LED测试
  924. if(buf[2] == 0)
  925. {
  926. add_led_test(TEST_LED);
  927. }
  928. // 辅助板LED测试
  929. else if(buf[2] == 1)
  930. {
  931. g_led_aux_test_st= 1;
  932. }
  933. // 状态板LED测试
  934. else if(buf[2] == 2)
  935. {
  936. g_led_aux_test_st= 1;
  937. }
  938. cmd_buf[2] = buf[2];
  939. // 发送ACK
  940. cmd_buf[1] |= MAINTAIN_ACK;
  941. cmd_len = 3;
  942. }
  943. break;
  944. case MS_SAMPLE:
  945. { // 零漂值刷新
  946. u8 slot, i;
  947. short data;
  948. #ifdef CPU_FUXI
  949. int samcnt=((g_adc_dots_data_count/ADC_REC_SAMPLE_RATE)&CFG_ADC_DOTS_MASK);
  950. #else
  951. int samcnt=((g_adc_dots_count-1)&CFG_ADC_DOTS_MASK);
  952. #endif
  953. cmd_buf[2] = buf[2] ;
  954. slot = buf[2];
  955. if((slot>=16)
  956. || !(g_board_info[slot].type== BOARD_TYPE_FTUKZ1
  957. ||(g_board_info[slot].type >= BOARD_TYPE_DFTU_KC00&&g_board_info[slot].type<BOARD_TYPE_DFTU_KC00+BOARD_TYPE_KZ_NUM)
  958. || g_board_info[slot].type == BOARD_TYPE_AC) //只有7到10板有零漂
  959. || (g_board_info[slot].type== BOARD_TYPE_FBDTU_MAIN)
  960. || (g_board_info[slot].type== BOARD_TYPE_FBDTU_MAIN1)
  961. )
  962. {
  963. cmd_buf[1] |= MAINTAIN_NAK;
  964. cmd_buf[2] = MAINTAIN_ERR_NSLOT;
  965. cmd_len = 3;
  966. break;
  967. }
  968. for(i=0; i<EQU_SLOT_AC_CHN; i++)
  969. {
  970. data = g_adc_dots[equ_get_ac_channel(slot,i)][samcnt];
  971. cmd_buf[i*2+3]=(data);
  972. cmd_buf[i*2+4]=(data)>>8;
  973. }
  974. cmd_len = EQU_SLOT_AC_CHN*2;
  975. // 发送ACK
  976. cmd_buf[1] |= MAINTAIN_ACK;
  977. cmd_len += 3;
  978. }
  979. break;
  980. case MS_ADJUST:
  981. {
  982. // 采样校准
  983. // 检查阶段
  984. int ret;
  985. if((g_maintain.state != MS_REQUEST) || (!bMaintain))
  986. {
  987. cmd_buf[1] |= MAINTAIN_NAK;
  988. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  989. cmd_len = 3;
  990. break;
  991. }
  992. ret = sw_auto_adjust(-1);
  993. switch(ret)
  994. {
  995. case 0:
  996. cmd_buf[1] |= MAINTAIN_ACK;
  997. cmd_len = 2;
  998. break;
  999. case -1:
  1000. cmd_buf[1] |= MAINTAIN_NAK;
  1001. cmd_buf[2] = MAINTAIN_ERR_DATAL;
  1002. cmd_len = 3;
  1003. break;
  1004. case -2:
  1005. cmd_buf[1] |= MAINTAIN_NAK;
  1006. cmd_buf[2] = MAINTAIN_ERR_CHXS;
  1007. cmd_len = 3;
  1008. break;
  1009. case -3:
  1010. cmd_buf[1] |= MAINTAIN_NAK;
  1011. cmd_buf[2] = MAINTAIN_ERR_ANGLEL;
  1012. cmd_len = 3;
  1013. break;
  1014. case -4:
  1015. cmd_buf[1] |= MAINTAIN_NAK;
  1016. cmd_buf[2] = MAINTAIN_ERR_ANGLEH;
  1017. cmd_len = 3;
  1018. break;
  1019. case -5:
  1020. cmd_buf[1] |= MAINTAIN_NAK;
  1021. cmd_buf[2] = MAINTAIN_ERR_ANGLEXS;
  1022. cmd_len = 3;
  1023. break;
  1024. case -6:
  1025. cmd_buf[1] |= MAINTAIN_NAK;
  1026. cmd_buf[2] = MAINTAIN_ERR_XSSAVE;
  1027. cmd_len = 3;
  1028. break;
  1029. }
  1030. if (ret == 0)
  1031. {
  1032. log_str_time(LOG_OPERATE,"工具交流校准成功",0,0);
  1033. }
  1034. else
  1035. {
  1036. log_str_time(LOG_OPERATE,"工具交流校准失败",0,0);
  1037. }
  1038. }
  1039. break;
  1040. case MS_TEST_REMOTE:
  1041. { // 远动测试
  1042. // 检查阶段
  1043. if(g_maintain.state != MS_REQUEST)
  1044. {
  1045. cmd_buf[1] |= MAINTAIN_NAK;
  1046. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1047. cmd_len = 3;
  1048. break;
  1049. }
  1050. cmd_buf[2] = buf[2];
  1051. if(buf[2] == 0x01)
  1052. {
  1053. send_rmt_yc(buf); // 遥测
  1054. }
  1055. else if(buf[2] == 0x06) // 电度
  1056. {
  1057. send_rmt_dd(buf); // 遥测
  1058. }
  1059. else if (buf[2] == 0x05)
  1060. {
  1061. int ret;
  1062. char *szErr;
  1063. ret = send_rmt_yk(buf); // 遥控
  1064. if(ret != 0)
  1065. {
  1066. szErr = RmtCtrl_Err(ret);
  1067. // 发送ACK
  1068. cmd_buf[1] |= MAINTAIN_NAK;
  1069. strcpy(&cmd_buf[3],szErr);
  1070. cmd_len = 3 + strlen(szErr) + 1;
  1071. break;
  1072. }
  1073. }
  1074. else if(buf[2] == 0x02||buf[2] == 0x04) //xj 2019-10-18 解决远动测试发送遥测时,遥信也突发上送
  1075. {
  1076. send_rmt_yx(buf); // 遥信
  1077. }
  1078. rmttest_us0 = ustimer_get_origin();
  1079. g_run_stu.bToolRmtTest = true;
  1080. // 发送ACK
  1081. cmd_buf[1] |= MAINTAIN_ACK;
  1082. cmd_len = 3;
  1083. }
  1084. break;
  1085. case MS_RECORD:
  1086. { // 手动启动录波
  1087. int waves;
  1088. struct rtc_time_t tm;
  1089. struct timespec ts;
  1090. memcpy(cmd_buf+2,buf+2,4);
  1091. waves = (int)buf[2] | (int)buf[3]<<8 | (int)buf[4]<<16 | (int)buf[5]<<24; // zwg 此处有BUG,维护工具未发时间
  1092. // 得到当前时刻。
  1093. clk_time_get(&ts);
  1094. timespec_to_rtc(ts,&tm,0);
  1095. rt_printf("当前时间: %04d-%02d-%02d %02d:%02d:%02d:%09d!\r\n",
  1096. tm.year + 2000,
  1097. tm.month,
  1098. tm.day,
  1099. tm.hour,
  1100. tm.min,
  1101. tm.ms/1000,
  1102. ts.tv_nsec
  1103. );
  1104. rcd_start(SWITCH_NUM_MAX,RECORD_TYPE_SD, waves);
  1105. // 发送ACK
  1106. cmd_buf[1] |= MAINTAIN_ACK;
  1107. cmd_len = 6;
  1108. }
  1109. break;
  1110. case MS_MEASURE:
  1111. {
  1112. // 测量值刷新
  1113. #define YC_NUM_PER_FRAME (250/9)
  1114. int sw,frame,cnt;
  1115. sw = buf[2]&0x1f;
  1116. frame = (buf[2]>>5)&0x07;
  1117. cnt = 0;
  1118. if (sw == 0)
  1119. {
  1120. long val,ang;
  1121. int pCal=0;
  1122. for(i=frame*YC_NUM_PER_FRAME;i<PUB_AC_NUM_ALL;i++)
  1123. {
  1124. val=g_sw_pub.ac_in[i];
  1125. if(i<PUB_AC_NUM)
  1126. {
  1127. ang=g_ui[i].p;
  1128. if(g_ui[i].chn_index!=CFG_ADC_CHANNEL_ZERO)
  1129. {
  1130. pCal = 0x1;
  1131. }
  1132. else if(g_ui[i].ui_base_make!=-1)
  1133. {
  1134. pCal = 0x2;
  1135. }
  1136. else
  1137. {
  1138. pCal = 0x4;
  1139. }
  1140. }
  1141. else
  1142. {
  1143. ang=ANGEL_INVALID;
  1144. pCal=0x2;
  1145. }
  1146. if(g_unit[g_pub_ac_desc[i].unit].zero>0&&_AbsL(val)<g_unit[g_pub_ac_desc[i].unit].zero && pRunSet->bTT_RET_ZERO)
  1147. {
  1148. val=0;
  1149. ang=ANGEL_INVALID;
  1150. }
  1151. cmd_buf[3+cnt*9] = pCal;
  1152. cmd_buf[3+cnt*9+1] = val;
  1153. cmd_buf[3+cnt*9+2] = (val >> 8);
  1154. cmd_buf[3+cnt*9+3] = (val >> 16);
  1155. cmd_buf[3+cnt*9+4] = (val >> 24);
  1156. cmd_buf[3+cnt*9+5] = ang;
  1157. cmd_buf[3+cnt*9+6] = (ang >> 8);
  1158. cmd_buf[3+cnt*9+7] = (ang >> 16);
  1159. cmd_buf[3+cnt*9+8] = (ang >> 24);
  1160. cnt++;
  1161. if(cnt== YC_NUM_PER_FRAME)
  1162. {
  1163. frame++;
  1164. break;
  1165. }
  1166. }
  1167. }
  1168. else if (sw <= EQU_SLOT_NUM_MAX)
  1169. {
  1170. int index_begin;
  1171. index_begin = UI_SW_INDEX_BEGIN(sw-1);
  1172. for(i=frame*YC_NUM_PER_FRAME;i<SW_AC_NUM_ALL;i++)
  1173. {
  1174. long val,ang;
  1175. int pCal=0;
  1176. val=g_sw[sw-1].ac_in[i];
  1177. if(i<SW_AC_NUM)
  1178. {
  1179. ang=g_ui[index_begin+i].p;
  1180. if(g_ui[index_begin+i].chn_index!=CFG_ADC_CHANNEL_ZERO)
  1181. {
  1182. pCal = 0x1;
  1183. }
  1184. else if(g_ui[index_begin+i].ui_base_make!=-1)
  1185. {
  1186. pCal = 0x2;
  1187. }
  1188. else
  1189. {
  1190. pCal = 0x4;
  1191. }
  1192. }
  1193. else
  1194. {
  1195. pCal=0x2;
  1196. ang=ANGEL_INVALID;
  1197. }
  1198. if(g_unit[g_sw_ac_desc[i].unit].zero>0&&_AbsL(val)<g_unit[g_sw_ac_desc[i].unit].zero && pRunSet->bTT_RET_ZERO)
  1199. {
  1200. val=0;
  1201. ang=ANGEL_INVALID;
  1202. }
  1203. if(g_sw_ac_desc[i].unit==UNIT_GE)val*=65536;
  1204. cmd_buf[3+cnt*9] = pCal;
  1205. cmd_buf[3+cnt*9+1] = val;
  1206. cmd_buf[3+cnt*9+2] = (val >> 8);
  1207. cmd_buf[3+cnt*9+3] = (val >> 16);
  1208. cmd_buf[3+cnt*9+4] = (val >> 24);
  1209. cmd_buf[3+cnt*9+5] = ang;
  1210. cmd_buf[3+cnt*9+6] = (ang >> 8);
  1211. cmd_buf[3+cnt*9+7] = (ang >> 16);
  1212. cmd_buf[3+cnt*9+8] = (ang >> 24);
  1213. cnt++;
  1214. if(cnt== YC_NUM_PER_FRAME)
  1215. {
  1216. frame++;
  1217. break;
  1218. }
  1219. }
  1220. }
  1221. cmd_len = cnt*9;
  1222. cmd_len += 3;
  1223. // 发送ACK
  1224. cmd_buf[1] |= MAINTAIN_ACK;
  1225. cmd_buf[2] = sw;// | frame;
  1226. }
  1227. break;
  1228. case MS_TIME_DIS:
  1229. {
  1230. // 时间刷新
  1231. struct rtc_time_t t_rtc;
  1232. struct timespec ts;
  1233. #ifndef MODE_LITTLE_ENDIAN
  1234. u8 tmp=0;
  1235. #endif
  1236. // 得到系统时间
  1237. clk_time_get(&ts);
  1238. timespec_to_rtc(ts,&t_rtc,1);
  1239. memcpy(cmd_buf+2, &t_rtc, 8);
  1240. #ifndef MODE_LITTLE_ENDIAN
  1241. tmp = cmd_buf[2];
  1242. cmd_buf[2]=cmd_buf[3];
  1243. cmd_buf[3]=tmp;
  1244. tmp = cmd_buf[8];
  1245. cmd_buf[8]=cmd_buf[9];
  1246. cmd_buf[9]=tmp;
  1247. #endif
  1248. // 发送ACK
  1249. cmd_buf[1] |= MAINTAIN_ACK;
  1250. cmd_len = 10;
  1251. }
  1252. break;
  1253. case MS_TIME_SET:
  1254. {
  1255. // 时间设置
  1256. struct rtc_time_t t_rtc;
  1257. #ifndef MODE_LITTLE_ENDIAN
  1258. u8 tmp=0;
  1259. #endif
  1260. memcpy(cmd_buf+2, buf+2, 8);
  1261. #ifndef MODE_LITTLE_ENDIAN
  1262. tmp = buf[2];
  1263. buf[2]=buf[3];
  1264. buf[3]=tmp;
  1265. tmp = buf[8];
  1266. buf[8]=buf[9];
  1267. buf[9]=tmp;
  1268. #endif
  1269. memcpy(&t_rtc, buf+2, 8);
  1270. // 设置系统时间
  1271. if(sys_time_set(&t_rtc)!= 0)
  1272. {
  1273. cmd_buf[1] |= MAINTAIN_NAK;
  1274. cmd_buf[2] = MAINTAIN_ERR_TIME;
  1275. cmd_len = 3;
  1276. break;
  1277. }
  1278. // 发送ACK
  1279. cmd_buf[1] |= MAINTAIN_ACK;
  1280. cmd_len = 10;
  1281. log_str_time(LOG_OPERATE,"工具设置时间",0,0);
  1282. }
  1283. break;
  1284. case MS_FLAG_DIS:
  1285. // 标志刷新
  1286. // 得到所需上传标志
  1287. cmd_buf[2] = 1;
  1288. // 发送ACK
  1289. cmd_buf[1] |= MAINTAIN_ACK;
  1290. cmd_len = 2;
  1291. break;
  1292. case MS_BAT_MANAGE:
  1293. // 电源管理
  1294. if(buf[2] == 1)
  1295. {
  1296. bat_active(1);
  1297. }
  1298. if(buf[3] == 1)
  1299. {
  1300. bat_act_off(1);
  1301. }
  1302. memcpy(cmd_buf+2,buf+2,2);
  1303. // 发送ACK
  1304. cmd_buf[1] |= MAINTAIN_ACK;
  1305. cmd_len = 4;
  1306. break;
  1307. case MS_CLEAR_SOE:
  1308. // 清除事件
  1309. if (buf[2]) //清除操作记录
  1310. {
  1311. soe_clear_opt();
  1312. soe_record_opt(EV_CLEAR_OPE,0);
  1313. }
  1314. if (buf[3]) //清除事件记录
  1315. {
  1316. soe_clear_ev();
  1317. soe_record_opt(EV_CLEAR_SOE,0);
  1318. }
  1319. memcpy(cmd_buf+2,buf+2,2);
  1320. // 发送ACK
  1321. cmd_buf[1] |= MAINTAIN_ACK;
  1322. cmd_len = 4;
  1323. break;
  1324. case MS_SET_CODE:
  1325. {
  1326. // 设置密码
  1327. u16 old_password,new_password;
  1328. old_password = buf[2] | (buf[3]<<8);
  1329. new_password = buf[4] | (buf[5]<<8);
  1330. if((old_password!=tRunPara.wPassword) && (old_password!=PASS_WORD))
  1331. {
  1332. old_password=0;
  1333. cmd_buf[1] |= MAINTAIN_NAK;
  1334. cmd_buf[2] = MAINTAIN_ERR_OCODE; //旧密码错误
  1335. cmd_len = 3;
  1336. break;
  1337. }
  1338. if(new_password == INTER_PASSWORD)
  1339. {
  1340. new_password=0;
  1341. old_password=0;
  1342. cmd_buf[1] |= MAINTAIN_NAK;
  1343. cmd_buf[2] = MAINTAIN_ERR_NCODE; //新密码无效
  1344. cmd_len = 3;
  1345. break;
  1346. }
  1347. //SavePassword(new_password);
  1348. tRunPara.wPassword = ReadPassword();
  1349. log_str_time(LOG_OPERATE,"工具设置用户密码",0,0);
  1350. memcpy(cmd_buf+2,buf+2,4);
  1351. // 发送ACK
  1352. cmd_buf[1] |= MAINTAIN_ACK;
  1353. cmd_len = 6;
  1354. }
  1355. break;
  1356. case MS_KEEP_ALIVE:
  1357. {
  1358. alive_us0= ustimer_get_origin();
  1359. cmd_len = 2;
  1360. }
  1361. break;
  1362. case MS_BOARD_VERSION:
  1363. { // 主板版本
  1364. int flag,no=0;
  1365. struct board_info *bi;
  1366. bi = g_board_info;
  1367. flag = buf[2];
  1368. cmd_buf[2] =flag;
  1369. switch(flag)
  1370. {
  1371. case 0:
  1372. no = ENV_U_BOOT;
  1373. break;
  1374. case 1:
  1375. no = ENV_KERNEL;
  1376. break;
  1377. case 2:
  1378. no = ENV_ROOT_FS;
  1379. break;
  1380. case 3:
  1381. sprintf(cmd_buf+3,"APP VERSION:SV%02d.%03d %s",
  1382. VER_NUM/1000,VER_NUM%1000,VER_TIME);
  1383. cmd_len = strlen(cmd_buf+3) + 3;
  1384. break;
  1385. #ifdef CPU_FUXI
  1386. //fuxi 增加裸核版本信息
  1387. case 4:
  1388. sprintf(cmd_buf+3,"LuoHe VERSION:V%d.%02d %s CRC=%X",
  1389. LuoHe_version.ver/100,LuoHe_version.ver%100,LuoHe_version.time,LuoHe_version.v_crc);
  1390. cmd_len = strlen(cmd_buf+3) + 3;
  1391. break;
  1392. #endif
  1393. default:
  1394. cmd_len = 3;
  1395. break;
  1396. }
  1397. if(flag < 3)
  1398. {
  1399. sprintf(cmd_buf+3,"%s",env_get_info(no));
  1400. cmd_len = strlen(env_get_info(no)) + 3;
  1401. }
  1402. // 发送ACK
  1403. cmd_buf[1] |= MAINTAIN_ACK;
  1404. }
  1405. break;
  1406. case MS_DIDO_AUTO_TEST:
  1407. { // 开入开出自动测试
  1408. char tmpbuf[16];
  1409. // 检查阶段
  1410. if((g_maintain.state != MS_REQUEST) || (!bMaintain))
  1411. {
  1412. cmd_buf[1] |= MAINTAIN_NAK;
  1413. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1414. cmd_len = 3;
  1415. break;
  1416. }
  1417. bMaintain_test = true;
  1418. switch(buf[2])
  1419. {
  1420. case 0: //自动检测板卡测试
  1421. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  1422. tmpbuf[0] = 1;
  1423. tmpbuf[1] = 3;
  1424. tmpbuf[2] = 1;
  1425. tmpbuf[3] = 4;
  1426. tmpbuf[4] = 2;
  1427. tmpbuf[5] = 5;
  1428. tmpbuf[6] = 2;
  1429. tmpbuf[7] = 6;
  1430. dido_auto_test(tmpbuf,3);
  1431. cmd_buf[6] = 3;
  1432. #else
  1433. tmpbuf[0] = 1; // DO板卡
  1434. tmpbuf[1] = 1; // DI板卡
  1435. dido_auto_test(tmpbuf,1);
  1436. cmd_buf[6] = 1;
  1437. #endif
  1438. break;
  1439. case 1: //开出板卡测试
  1440. case 2: //开入板卡测试
  1441. tmpbuf[0] = 1;
  1442. tmpbuf[1] = 3;
  1443. dido_auto_test(tmpbuf,1);
  1444. cmd_buf[6] = 1;
  1445. break;
  1446. case 3: // 辅助板测试
  1447. tmpbuf[0] = 5;
  1448. tmpbuf[1] = 5;
  1449. dido_auto_test(tmpbuf,1);
  1450. cmd_buf[6] = 1;
  1451. break;
  1452. case 4: // 综合板测试
  1453. tmpbuf[0] = 4;
  1454. tmpbuf[1] = 6;
  1455. dido_auto_test(tmpbuf,1);
  1456. cmd_buf[6] = 1;
  1457. break;
  1458. case 5: //开入60板测试
  1459. tmpbuf[0] = 1;
  1460. tmpbuf[1] = 3;
  1461. tmpbuf[2] = 2;
  1462. tmpbuf[3] = 3;
  1463. dido_auto_test(tmpbuf,2);
  1464. cmd_buf[6] = 2;
  1465. break;
  1466. default:
  1467. break;
  1468. }
  1469. bMaintain_test = false;
  1470. cmd_buf[2] = 0;
  1471. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  1472. {
  1473. extern struct rt_stat g_stat_do_delay;
  1474. extern struct rt_stat g_stat_di_delay;
  1475. if (g_stat_do_delay.max > 1000000)
  1476. {
  1477. cmd_buf[2] |= 0x01;
  1478. }
  1479. if (g_stat_di_delay.max > (20000000+20000000))
  1480. {
  1481. cmd_buf[2] |= 0x02;
  1482. }
  1483. }
  1484. #endif
  1485. cmd_buf[3] = 0;
  1486. cmd_buf[4] = 0;
  1487. cmd_buf[5] = 0;
  1488. memcpy(cmd_buf+7,dido_buf,cmd_buf[6]*14);
  1489. // 发送ACK
  1490. cmd_buf[1] |= MAINTAIN_ACK;
  1491. cmd_len = cmd_buf[6]*14 + 4 + 3;
  1492. }
  1493. break;
  1494. case MS_BOARD_DI:
  1495. { // 板卡遥信
  1496. int slot;
  1497. slot = buf[2];
  1498. cmd_buf[2] = slot;
  1499. {
  1500. int i;
  1501. long flag1=0;
  1502. long value1=0;
  1503. long flag2=0;
  1504. long value2=0;
  1505. int di_num;
  1506. di_num = equ_get_di_num(slot);
  1507. for(i=0;i<di_num;i++)
  1508. {
  1509. if (i<32)
  1510. flag1 |= (1<<i);
  1511. else
  1512. flag2 |= (1<<(i-32));
  1513. if(dido_di_is_on(slot,i))
  1514. {
  1515. if (i<32)
  1516. value1 |= (1<<i);
  1517. else
  1518. value2 |= (1<<(i-32));
  1519. }
  1520. else
  1521. {
  1522. if (i<32)
  1523. value1 &= ~(1<<i);
  1524. else
  1525. value2 &= ~(1<<(i-32));
  1526. }
  1527. }
  1528. cmd_buf[3] = flag1;
  1529. cmd_buf[4] = (flag1 >> 8);
  1530. cmd_buf[5] = (flag1 >> 16);
  1531. cmd_buf[6] = (flag1 >> 24);
  1532. cmd_buf[7] = (flag2 >> 0);
  1533. cmd_buf[8] = (flag2 >> 8);
  1534. cmd_buf[9] = (flag2 >> 16);
  1535. cmd_buf[10] = (flag2 >> 24);
  1536. cmd_buf[11] = value1;
  1537. cmd_buf[12] = (value1 >> 8);
  1538. cmd_buf[13] = (value1 >> 16);
  1539. cmd_buf[14] = (value1 >> 24);
  1540. cmd_buf[15] = (value2 >> 0);
  1541. cmd_buf[16] = (value2 >> 8);
  1542. cmd_buf[17] = (value2 >> 16);
  1543. cmd_buf[18] = (value2 >> 24);
  1544. }
  1545. // 发送ACK
  1546. cmd_buf[1] |= MAINTAIN_ACK;
  1547. cmd_len = 19;
  1548. }
  1549. break;
  1550. case MS_RESOURCE_THAN:
  1551. {
  1552. memcpy(cmd_buf+2,buf+2,22);
  1553. // 定值描述文件
  1554. if(strcmp(buf+2,FILE_NAME_SET_DESC) == 0)
  1555. {
  1556. cmd_buf[22] = setdesc_contrast.version;
  1557. cmd_buf[23] = (setdesc_contrast.version >> 8);
  1558. cmd_buf[24] = (setdesc_contrast.version >> 16);
  1559. cmd_buf[25] = (setdesc_contrast.version >> 24);
  1560. cmd_buf[26] = setdesc_contrast.signature;
  1561. cmd_buf[27] = (setdesc_contrast.signature >> 8);
  1562. cmd_buf[28] = (setdesc_contrast.signature >> 16);
  1563. cmd_buf[29] = (setdesc_contrast.signature >> 24);
  1564. cmd_buf[30] = setdesc_contrast.length;
  1565. cmd_buf[31] = (setdesc_contrast.length >> 8);
  1566. cmd_buf[32] = (setdesc_contrast.length >> 16);
  1567. cmd_buf[33] = (setdesc_contrast.length >> 24);
  1568. cmd_buf[34] = setdesc_contrast.crc;
  1569. cmd_buf[35] = (setdesc_contrast.crc>> 8);
  1570. }
  1571. // 资源描述文件
  1572. else if(strcmp(buf+2,FILE_NAME_RSC) == 0)
  1573. {
  1574. cmd_buf[22] = rsc_contrast.version;
  1575. cmd_buf[23] = (rsc_contrast.version >> 8);
  1576. cmd_buf[24] = (rsc_contrast.version >> 16);
  1577. cmd_buf[25] = (rsc_contrast.version >> 24);
  1578. cmd_buf[26] = rsc_contrast.signature;
  1579. cmd_buf[27] = (rsc_contrast.signature >> 8);
  1580. cmd_buf[28] = (rsc_contrast.signature >> 16);
  1581. cmd_buf[29] = (rsc_contrast.signature >> 24);
  1582. cmd_buf[30] = rsc_contrast.length;
  1583. cmd_buf[31] = (rsc_contrast.length >> 8);
  1584. cmd_buf[32] = (rsc_contrast.length >> 16);
  1585. cmd_buf[33] = (rsc_contrast.length >> 24);
  1586. cmd_buf[34] = rsc_contrast.crc;
  1587. cmd_buf[35] = (rsc_contrast.crc>> 8);
  1588. }
  1589. // 通道配置文件
  1590. else if(strcmp(buf+2,FILE_NAME_EQU_CFG) == 0)
  1591. {
  1592. cmd_buf[22] = g_equ_contrast.version;
  1593. cmd_buf[23] = (g_equ_contrast.version >> 8);
  1594. cmd_buf[24] = (g_equ_contrast.version >> 16);
  1595. cmd_buf[25] = (g_equ_contrast.version >> 24);
  1596. cmd_buf[26] = g_equ_contrast.signature;
  1597. cmd_buf[27] = (g_equ_contrast.signature >> 8);
  1598. cmd_buf[28] = (g_equ_contrast.signature >> 16);
  1599. cmd_buf[29] = (g_equ_contrast.signature >> 24);
  1600. cmd_buf[30] = g_equ_contrast.length;
  1601. cmd_buf[31] = (g_equ_contrast.length >> 8);
  1602. cmd_buf[32] = (g_equ_contrast.length >> 16);
  1603. cmd_buf[33] = (g_equ_contrast.length >> 24);
  1604. cmd_buf[34] = g_equ_contrast.crc;
  1605. cmd_buf[35] = (g_equ_contrast.crc>> 8);
  1606. }
  1607. else
  1608. {
  1609. cmd_buf[1] |= MAINTAIN_NAK;
  1610. cmd_buf[22] = MAINTAIN_ERR_PHASE;
  1611. cmd_len = 23;
  1612. break;
  1613. }
  1614. cmd_buf[1] |= MAINTAIN_ACK;
  1615. cmd_len = 36;
  1616. }
  1617. break;
  1618. case MS_BOARD_MEASURE:
  1619. { // 板卡测量值刷新
  1620. int slot,chn;
  1621. slot = buf[2];
  1622. cmd_buf[2] = slot;
  1623. if((slot>=16)
  1624. || !(g_board_info[slot].type== BOARD_TYPE_FTUKZ1
  1625. ||(g_board_info[slot].type >= BOARD_TYPE_DFTU_KC00&&g_board_info[slot].type<BOARD_TYPE_DFTU_KC00+BOARD_TYPE_KZ_NUM)
  1626. || g_board_info[slot].type == BOARD_TYPE_AC) //只有7到10板有零漂
  1627. || (g_board_info[slot].type== BOARD_TYPE_FBDTU_MAIN)
  1628. || (g_board_info[slot].type== BOARD_TYPE_FBDTU_MAIN1)
  1629. )
  1630. {
  1631. cmd_buf[1] |= MAINTAIN_NAK;
  1632. cmd_buf[2] = MAINTAIN_ERR_NSLOT;
  1633. cmd_len = 3;
  1634. break;
  1635. }
  1636. chn = g_board_res[g_board_info[slot].type].ac_num;
  1637. for(i=0;i<chn;i++)
  1638. {
  1639. long val,ang;
  1640. int chn_index,j;
  1641. chn_index = equ_get_ac_channel(slot,i);
  1642. for(j=0;j<UI_NUM;j++)
  1643. {
  1644. if(g_ui[j].chn_index == chn_index)
  1645. {
  1646. break;
  1647. }
  1648. }
  1649. if(chn_index >=0 && j != UI_NUM)
  1650. {
  1651. val=g_ui[j].e;
  1652. ang=g_ui[j].p;
  1653. }
  1654. else
  1655. {
  1656. val=0;
  1657. ang=0;
  1658. }
  1659. cmd_buf[3+i*8] = val;
  1660. cmd_buf[3+i*8+1] = (val >> 8);
  1661. cmd_buf[3+i*8+2] = (val >> 16);
  1662. cmd_buf[3+i*8+3] = (val >> 24);
  1663. cmd_buf[3+i*8+4] = ang;
  1664. cmd_buf[3+i*8+5] = (ang >> 8);
  1665. cmd_buf[3+i*8+6] = (ang >> 16);
  1666. cmd_buf[3+i*8+7] = (ang >> 24);
  1667. }
  1668. {
  1669. long val=0;
  1670. val = g_sw_pub.ac_in[PUB_AC_IN_F1];
  1671. cmd_buf[3+i*8+0] = val;
  1672. cmd_buf[3+i*8+1] = (val >> 8);
  1673. cmd_buf[3+i*8+2] = (val >> 16);
  1674. cmd_buf[3+i*8+3] = (val >> 24);
  1675. }
  1676. cmd_len = 8*(chn+1);
  1677. cmd_len += 3;
  1678. // 发送ACK
  1679. cmd_buf[1] |= MAINTAIN_ACK;
  1680. }
  1681. break;
  1682. case MS_BOARD_CALIBRATION:
  1683. { // 板卡校准系数上传
  1684. int board;
  1685. s32 factor;
  1686. struct ac_slot_factor asf;
  1687. board = buf[2];
  1688. cmd_buf[2] = board;
  1689. if((board>=16)
  1690. || !(g_board_info[board].type== BOARD_TYPE_FTUKZ1
  1691. ||(g_board_info[board].type >= BOARD_TYPE_DFTU_KC00&&g_board_info[board].type<BOARD_TYPE_DFTU_KC00+BOARD_TYPE_KZ_NUM)
  1692. || g_board_info[board].type == BOARD_TYPE_AC) //只有7到10板有零漂
  1693. || (g_board_info[board].type== BOARD_TYPE_FBDTU_MAIN)
  1694. || (g_board_info[board].type== BOARD_TYPE_FBDTU_MAIN1)
  1695. )
  1696. {
  1697. cmd_buf[1] |= MAINTAIN_NAK;
  1698. cmd_buf[2] = MAINTAIN_ERR_NSLOT;
  1699. cmd_len = 3;
  1700. break;
  1701. }
  1702. if (factor_read(board,&asf) != 0)
  1703. {
  1704. cmd_buf[1] |= MAINTAIN_NAK;
  1705. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  1706. cmd_len = 3;
  1707. break;
  1708. }
  1709. for(i=0;i<EQU_SLOT_AC_CHN;i++)
  1710. {
  1711. factor = (s32)rt_round(asf.factor_e_c[i]*Q16_BASE); // 幅值系数
  1712. cmd_buf[3+i*8+0] = factor;
  1713. cmd_buf[3+i*8+1] = (factor>>8);
  1714. cmd_buf[3+i*8+2] = (factor>>16);
  1715. cmd_buf[3+i*8+3] = (factor>>24);
  1716. factor = (s32)rt_round(asf.factor_p_c[i]*Q16_BASE); // 角度系数
  1717. cmd_buf[3+i*8+4] = factor;
  1718. cmd_buf[3+i*8+5] = (factor>>8);
  1719. cmd_buf[3+i*8+6] = (factor>>16);
  1720. cmd_buf[3+i*8+7] = (factor>>24);
  1721. }
  1722. cmd_len = 8*EQU_SLOT_AC_CHN;
  1723. cmd_len += 3;
  1724. // 发送ACK
  1725. cmd_buf[1] |= MAINTAIN_ACK;
  1726. }
  1727. break;
  1728. case MS_DEFAULT_CALIBRATION:
  1729. { // 恢复默认校准系数
  1730. // 检查阶段
  1731. if((g_maintain.state != MS_REQUEST) || (!bMaintain))
  1732. {
  1733. cmd_buf[1] |= MAINTAIN_NAK;
  1734. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1735. cmd_len = 3;
  1736. break;
  1737. }
  1738. factor_restore_default();
  1739. log_str_time(LOG_OPERATE,"工具恢复默认校准系数",0,0);
  1740. // 发送ACK
  1741. cmd_buf[1] |= MAINTAIN_ACK;
  1742. cmd_len = 2;
  1743. }
  1744. break;
  1745. case MS_SAMPLE_CALIBRATION:
  1746. { // 整机采样校准
  1747. int ret;
  1748. // 检查阶段
  1749. if((g_maintain.state != MS_REQUEST) ||(!bMaintain))
  1750. {
  1751. cmd_buf[1] |= MAINTAIN_NAK;
  1752. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1753. cmd_len = 3;
  1754. break;
  1755. }
  1756. ret = sw_auto_adjust(-1);
  1757. switch(ret)
  1758. {
  1759. case 0:
  1760. cmd_buf[1] |= MAINTAIN_ACK;
  1761. cmd_len = 2;
  1762. break;
  1763. case -1:
  1764. cmd_buf[1] |= MAINTAIN_NAK;
  1765. cmd_buf[2] = MAINTAIN_ERR_DATAL;
  1766. cmd_len = 3;
  1767. break;
  1768. case -2:
  1769. cmd_buf[1] |= MAINTAIN_NAK;
  1770. cmd_buf[2] = MAINTAIN_ERR_CHXS;
  1771. cmd_len = 3;
  1772. break;
  1773. case -3:
  1774. cmd_buf[1] |= MAINTAIN_NAK;
  1775. cmd_buf[2] = MAINTAIN_ERR_ANGLEL;
  1776. cmd_len = 3;
  1777. break;
  1778. case -4:
  1779. cmd_buf[1] |= MAINTAIN_NAK;
  1780. cmd_buf[2] = MAINTAIN_ERR_ANGLEH;
  1781. cmd_len = 3;
  1782. break;
  1783. case -5:
  1784. cmd_buf[1] |= MAINTAIN_NAK;
  1785. cmd_buf[2] = MAINTAIN_ERR_ANGLEXS;
  1786. cmd_len = 3;
  1787. break;
  1788. case -6:
  1789. cmd_buf[1] |= MAINTAIN_NAK;
  1790. cmd_buf[2] = MAINTAIN_ERR_XSSAVE;
  1791. cmd_len = 3;
  1792. break;
  1793. }
  1794. if (ret == 0)
  1795. {
  1796. log_str_time(LOG_OPERATE,"工具交流校准成功",0,0);
  1797. }
  1798. else
  1799. {
  1800. log_str_time(LOG_OPERATE,"工具交流校准失败",0,0);
  1801. }
  1802. }
  1803. break;
  1804. case MS_DEFAULT:
  1805. { // 恢复出厂设置
  1806. // 检查阶段
  1807. if((g_maintain.state != MS_REQUEST) || ((!bMaintain)))
  1808. {
  1809. cmd_buf[1] |= MAINTAIN_NAK;
  1810. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1811. cmd_len = 3;
  1812. break;
  1813. }
  1814. init_default_equip_set(1);
  1815. // 发送ACK
  1816. cmd_buf[1] |= MAINTAIN_ACK;
  1817. cmd_len = 2;
  1818. log_str_time(LOG_OPERATE,"工具恢复出厂设置",0,0);
  1819. }
  1820. break;
  1821. case MS_UZTEMP_MEASURE:
  1822. { // 直流电压温度刷新
  1823. long val;
  1824. for(i=PUB_AC_IN_UZ1;i<PUB_AC_NUM_ALL;i++)
  1825. {
  1826. val=g_sw_pub.ac_in[i];
  1827. if(_AbsL(val)<g_unit[g_pub_ac_desc[i].unit].zero && pRunSet->bTT_RET_ZERO)
  1828. {
  1829. val=0;
  1830. }
  1831. cmd_buf[2+(i-PUB_AC_IN_UZ1)*4] = val;
  1832. cmd_buf[2+(i-PUB_AC_IN_UZ1)*4+1] = (val >> 8);
  1833. cmd_buf[2+(i-PUB_AC_IN_UZ1)*4+2] = (val >> 16);
  1834. cmd_buf[2+(i-PUB_AC_IN_UZ1)*4+3] = (val >> 24);
  1835. }
  1836. cmd_len = 4*3;
  1837. cmd_len += 3;
  1838. // 发送ACK
  1839. cmd_buf[1] |= MAINTAIN_ACK;
  1840. }
  1841. break;
  1842. case MS_ADJUST_UZL:
  1843. { // 直流校准
  1844. // 检查阶段
  1845. if((g_maintain.state != MS_REQUEST) ||(!bMaintain))
  1846. {
  1847. cmd_buf[1] |= MAINTAIN_NAK;
  1848. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  1849. cmd_len = 3;
  1850. break;
  1851. }
  1852. cmd_buf[2] = buf[2];
  1853. if (cmd_buf[2] == 0x01)
  1854. {
  1855. sw_adjust_dc_0();
  1856. }
  1857. else if(cmd_buf[2] == 0x02)
  1858. {
  1859. sw_adjust_dc_1();
  1860. }
  1861. // 发送ACK
  1862. cmd_buf[1] |= MAINTAIN_ACK;
  1863. cmd_len = 2;
  1864. log_str_time(LOG_OPERATE,"工具直流校准",0,0);
  1865. }
  1866. break;
  1867. case MS_SAMPLE_TEST:
  1868. {
  1869. float val=0,base_v=-1.0,base_i=-1.0;
  1870. u32 check_result[2]={0,0};
  1871. float accuracy[6] = {0.1, -0.1, 0.2, -0.2, 0.01, -0.01};
  1872. u8 sw;
  1873. // 检查电压
  1874. for(i=0;i<PUB_AC_NUM;i++)
  1875. {
  1876. if(g_ui[i].chn_index == CFG_ADC_CHANNEL_ZERO)
  1877. {
  1878. continue;
  1879. }
  1880. // 确定基准
  1881. if(base_v < 0)
  1882. {
  1883. val = ((float)g_ui[i].e/65536-100.0) / 100.0*100;
  1884. if ((val < accuracy[0]) && (val > accuracy[1]))
  1885. {
  1886. base_v = 100.0;
  1887. }
  1888. else
  1889. {
  1890. val = ((float)g_ui[i].e/65536-57.735) / 57.735*100;
  1891. if ((val < accuracy[0]) && (val > accuracy[1]))
  1892. {
  1893. base_v = 57.735;
  1894. }
  1895. }
  1896. }
  1897. // 检查精度
  1898. val = ((float)g_ui[i].e/65536-base_v) / base_v*100;
  1899. if ((val > accuracy[0]) || (val < accuracy[1]))
  1900. {
  1901. check_result[0] |= 0x01; //电压超精度
  1902. }
  1903. }
  1904. // 检查频率
  1905. val = g_sw_pub.ac_in[PUB_AC_IN_F1];
  1906. val = ((float)val/65536-50.0) / 100.0*100;
  1907. if ((val > accuracy[4]) || (val < accuracy[5]))
  1908. {
  1909. check_result[0] |= 0x02; //频率超精度
  1910. }
  1911. for (sw=0; sw<g_sw_num; sw++)
  1912. {
  1913. float dat=0;
  1914. int cnt;
  1915. // 检查电流
  1916. cnt = 0;
  1917. for(i=0;i<SW_AC_NUM;i++)
  1918. {
  1919. if(g_ui[UI_SW_INDEX(sw,i)].chn_index == CFG_ADC_CHANNEL_ZERO)
  1920. {
  1921. cnt++;
  1922. continue;
  1923. }
  1924. // 确定基准
  1925. if(base_i < 0)
  1926. {
  1927. val = ((float)g_ui[UI_SW_INDEX(sw,i)].e/65536-5.0) / 5.0*100;
  1928. if ((val < accuracy[0]) && (val > accuracy[1]))
  1929. {
  1930. base_i = 5.0;
  1931. }
  1932. else
  1933. {
  1934. val = ((float)g_ui[UI_SW_INDEX(sw,i)].e/65536-3.0) / 3.0*100;
  1935. if ((val < accuracy[0]) && (val > accuracy[1]))
  1936. {
  1937. base_i = 3.0;
  1938. }
  1939. }
  1940. rt_printf("base_i=%f.\r\n",base_i);
  1941. }
  1942. val = ((float)g_ui[UI_SW_INDEX(sw,i)].e/65536-base_i) / base_i*100;
  1943. if ((val > accuracy[0]) || (val < accuracy[1]))
  1944. {
  1945. // 0x01,开关电流超精度
  1946. check_result[1] |= 0x01<<(sw*2);
  1947. break;
  1948. }
  1949. }
  1950. // 整个开关没有配置,置0x03标志
  1951. if(cnt == SW_AC_NUM)
  1952. {
  1953. check_result[1] |= 0x03<<(sw*2);
  1954. continue;
  1955. }
  1956. // 如果精度有问题,不再检测P、Q.
  1957. if(i != SW_AC_NUM)
  1958. {
  1959. continue;
  1960. }
  1961. // 开始检查功率
  1962. dat = base_v*base_i*3;
  1963. if(g_ui[PUB_AC_UA1].chn_index == CFG_ADC_CHANNEL_ZERO)
  1964. {
  1965. // 二表法
  1966. dat /= 1.732;
  1967. }
  1968. // 检查P
  1969. val = ((float)g_sw[sw].ac_in[SW_AC_IN_P]/65536-dat) / dat*100;
  1970. if ((val > accuracy[2]) || (val < accuracy[3]))
  1971. {
  1972. // 0x02,开关功率超精度
  1973. check_result[1] |= 0x02<<(sw*2);
  1974. }
  1975. // 检查Q
  1976. val = ((float)g_sw[sw].ac_in[SW_AC_IN_Q]/65536-0.0) / dat*100;
  1977. if ((val > accuracy[2]) || (val < accuracy[3]))
  1978. {
  1979. // 0x02,开关功率超精度
  1980. check_result[1] |= 0x02<<(sw*2);
  1981. }
  1982. }
  1983. cmd_buf[2+0] = check_result[0];
  1984. cmd_buf[2+1] = (check_result[0] >> 8);
  1985. cmd_buf[2+2] = (check_result[0] >> 16);
  1986. cmd_buf[2+3] = (check_result[0] >> 24);
  1987. cmd_buf[2+4] = check_result[1];
  1988. cmd_buf[2+5] = (check_result[1] >> 8);
  1989. cmd_buf[2+6] = (check_result[1] >> 16);
  1990. cmd_buf[2+7] = (check_result[1] >> 24);
  1991. cmd_len = 10;
  1992. // 发送ACK
  1993. cmd_buf[1] |= MAINTAIN_ACK;
  1994. }
  1995. break;
  1996. case MS_KRKC_TEST:
  1997. { // 开入开出自动测试
  1998. extern struct rt_stat g_stat_do_delay;
  1999. extern struct rt_stat g_stat_di_delay;
  2000. u8 buf_test[24];
  2001. // 检查阶段
  2002. if((g_maintain.state != MS_REQUEST) || (!bMaintain))
  2003. {
  2004. cmd_buf[1] |= MAINTAIN_NAK;
  2005. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  2006. cmd_len = 3;
  2007. break;
  2008. }
  2009. memset(buf_test,0,sizeof(buf_test));
  2010. memcpy(buf_test,buf+3,buf[2]*2);
  2011. dido_auto_test(buf_test,buf[2]);
  2012. cmd_buf[2] = 0;
  2013. if (g_stat_do_delay.max > 1000000)
  2014. {
  2015. cmd_buf[2] |= 0x01;
  2016. }
  2017. if (g_stat_di_delay.max > (5000000+20000000))
  2018. {
  2019. cmd_buf[2] |= 0x02;
  2020. }
  2021. cmd_buf[3] = 0;
  2022. cmd_buf[4] = 0;
  2023. cmd_buf[5] = 0;
  2024. cmd_buf[6] = buf[2];
  2025. memcpy(cmd_buf+7,dido_buf,42);
  2026. // 发送ACK
  2027. cmd_buf[1] |= MAINTAIN_ACK;
  2028. cmd_len = buf[2]*14 + 4 + 3;
  2029. }
  2030. break;
  2031. case MS_LCD_TEST:
  2032. { // LCD测试
  2033. // 检查阶段
  2034. if((g_maintain.state != MS_REQUEST) ||(!bMaintain))
  2035. {
  2036. cmd_buf[1] |= MAINTAIN_NAK;
  2037. cmd_buf[2] = MAINTAIN_ERR_PHASE;
  2038. cmd_len = 3;
  2039. break;
  2040. }
  2041. add_led_test(TEST_LED);
  2042. add_led_test(TEST_LCD);
  2043. // 发送ACK
  2044. cmd_buf[1] |= MAINTAIN_ACK;
  2045. cmd_len = 2;
  2046. }
  2047. break;
  2048. case MS_RESET_TEST:
  2049. {
  2050. //复位
  2051. cmd_buf[2] = buf[2];
  2052. switch (cmd_buf[2])
  2053. {
  2054. case 0x1:
  2055. rt_printf("装置复位\r\n");
  2056. watchdog_reset_cpu(2); //装置复位
  2057. break;
  2058. case 0x2:
  2059. rt_printf("子板复位\r\n");
  2060. break;
  2061. case 0x4:
  2062. rt_printf("应用复位\r\n");
  2063. //env_restart(); //主板复位
  2064. watchdog_reset_cpu(2); //装置复位
  2065. break;
  2066. }
  2067. // 发送ACK
  2068. cmd_buf[1] |= MAINTAIN_ACK;
  2069. cmd_len = 2;
  2070. }
  2071. break;
  2072. case MS_CFGINF:
  2073. {
  2074. // 配置信息查看
  2075. cmd_buf[2] = 6;
  2076. sprintf(cmd_buf+3+24*0,"装置资源文件:%04XH",g_crc_rsc);
  2077. sprintf(cmd_buf+3+24*1,"板卡资源文件:%04XH",g_crc_brd_res);
  2078. sprintf(cmd_buf+3+24*2,"通道配置文件:%04XH",g_crc_equ_cfg);
  2079. sprintf(cmd_buf+3+24*3,"转发点表文件:%04XH",g_crc_rectable);
  2080. sprintf(cmd_buf+3+24*4,"定值描述文件:%04XH",g_crc_set_desc);
  2081. sprintf(cmd_buf+3+24*5,"定值数据文件:%04XH",g_crc_set_data);
  2082. cmd_len = 3 + 24*6;
  2083. // 发送ACK
  2084. cmd_buf[1] |= MAINTAIN_ACK;
  2085. }
  2086. break;
  2087. case MS_ERRINF:
  2088. {
  2089. // 故障信息查看
  2090. u8 num=0;
  2091. if(rt_err_count())
  2092. {
  2093. cmd_buf[2] = rt_err_count();
  2094. for (i=0; i<ERR_CODE_NUM; i++)
  2095. {
  2096. if (rt_err_test(i))
  2097. {
  2098. num++;
  2099. if (num > 9)
  2100. {
  2101. break;
  2102. }
  2103. sprintf(cmd_buf+3+(num-1)*20,rt_err_msg(i));
  2104. }
  2105. }
  2106. }
  2107. else
  2108. {
  2109. cmd_buf[2] = 0;
  2110. }
  2111. cmd_len = 3 + 20*10;
  2112. // 发送ACK
  2113. cmd_buf[1] |= MAINTAIN_ACK;
  2114. }
  2115. break;
  2116. case MS_GETIP:
  2117. {
  2118. // 获取网口及对应IP
  2119. int net;
  2120. char ipbuf[32];
  2121. cmd_buf[2] = 0;
  2122. for(net=0; net<g_net_num; net++)
  2123. {
  2124. // 如果接口不正常,不初始化
  2125. if(rt_if_ip_get(net,ipbuf) != 0)
  2126. {
  2127. cmd_buf[3+net*5] = 0;
  2128. continue;
  2129. }
  2130. cmd_buf[2] = net+1;
  2131. cmd_buf[3+net*5] = 1;
  2132. Swap_32(ipbuf);
  2133. memcpy(cmd_buf+4+net*5,ipbuf, 4);
  2134. }
  2135. cmd_len = 3 + 5*IEC104_TOTAL_SOCKETS;
  2136. // 发送ACK
  2137. cmd_buf[1] |= MAINTAIN_ACK;
  2138. }
  2139. break;
  2140. case MS_GET_GPRS_INFO:
  2141. {
  2142. int i,num;
  2143. cmd_buf[2] = buf[2];
  2144. if(cmd_buf[2] == 1)
  2145. {
  2146. // 发送查询子命令
  2147. IEC101_PH_GprsInfo();
  2148. cmd_buf[1] |= MAINTAIN_ACK;
  2149. cmd_len = 3;
  2150. }
  2151. else if(cmd_buf[2] == 2)
  2152. {
  2153. // 接收查询子命令1
  2154. gprs_get_info();
  2155. num = g_gprs_info_num<10 ? g_gprs_info_num : 10;
  2156. cmd_buf[3] = num;
  2157. for(i=0; i<num; i++)
  2158. {
  2159. strcpy(cmd_buf+ 4 + i*20,strGprsInf[i]);
  2160. }
  2161. cmd_buf[1] |= MAINTAIN_ACK;
  2162. cmd_len = 4 + num*20;
  2163. }
  2164. else if(cmd_buf[2] == 3)
  2165. {
  2166. //接收查询子命令2
  2167. num = g_gprs_info_num<10 ? 0 : (g_gprs_info_num -10);
  2168. cmd_buf[3] = num;
  2169. for(i=0; i<num; i++)
  2170. {
  2171. strcpy(cmd_buf+ 4 + i*20,strGprsInf[i+10]);
  2172. }
  2173. cmd_buf[1] |= MAINTAIN_ACK;
  2174. cmd_len = 4 + num*20;
  2175. }
  2176. else
  2177. {
  2178. // 不支持的子命令
  2179. cmd_buf[1] |= MAINTAIN_NAK;
  2180. cmd_buf[3] = MAINTAIN_ERR_OTHER;
  2181. cmd_len = 4;
  2182. }
  2183. }
  2184. break;
  2185. case MS_FZXS_UD:
  2186. {
  2187. int board;
  2188. s32 factor;
  2189. struct ac_slot_factor asf;
  2190. cmd_buf[2] = buf[2];
  2191. board = buf[3];
  2192. cmd_buf[3] = board;
  2193. if((board>=16)
  2194. || !(g_board_info[board].type== BOARD_TYPE_FTUKZ1
  2195. ||(g_board_info[board].type >= BOARD_TYPE_DFTU_KC00&&g_board_info[board].type<BOARD_TYPE_DFTU_KC00+BOARD_TYPE_KZ_NUM)
  2196. || g_board_info[board].type == BOARD_TYPE_AC) //只有7到10板有零漂
  2197. || (g_board_info[board].type== BOARD_TYPE_FBDTU_MAIN)
  2198. || (g_board_info[board].type== BOARD_TYPE_FBDTU_MAIN1)
  2199. )
  2200. {
  2201. cmd_buf[1] |= MAINTAIN_NAK;
  2202. cmd_buf[4] = MAINTAIN_ERR_NSLOT;
  2203. cmd_len = 5;
  2204. break;
  2205. }
  2206. if (factor_read(board,&asf) != 0)
  2207. {
  2208. cmd_buf[1] |= MAINTAIN_NAK;
  2209. cmd_buf[4] = MAINTAIN_ERR_OTHER;
  2210. cmd_len = 5;
  2211. break;
  2212. }
  2213. if(cmd_buf[2] == 1) //上传
  2214. {
  2215. for(i=0;i<EQU_SLOT_AC_CHN;i++)
  2216. {
  2217. factor = (s32)rt_round(asf.factor_e_c[i]*Q16_BASE); // 幅值系数
  2218. cmd_buf[4+i*8+0] = factor;
  2219. cmd_buf[4+i*8+1] = (factor>>8);
  2220. cmd_buf[4+i*8+2] = (factor>>16);
  2221. cmd_buf[4+i*8+3] = (factor>>24);
  2222. factor = (s32)rt_round(asf.factor_p_c[i]*Q16_BASE); // 角度系数
  2223. cmd_buf[4+i*8+4] = factor;
  2224. cmd_buf[4+i*8+5] = (factor>>8);
  2225. cmd_buf[4+i*8+6] = (factor>>16);
  2226. cmd_buf[4+i*8+7] = (factor>>24);
  2227. }
  2228. cmd_len = 8*EQU_SLOT_AC_CHN;
  2229. cmd_len += 4;
  2230. }
  2231. else if(cmd_buf[2] == 2)//下载
  2232. {
  2233. union
  2234. {
  2235. float ff;
  2236. u8 bb[4];
  2237. }ff;
  2238. for(i=0;i<EQU_SLOT_AC_CHN;i++)
  2239. {
  2240. CopySwap(ff.bb,&buf[4+i*8+0],4,false);
  2241. asf.factor_e_c[i] = ff.ff / Q16_BASE;
  2242. CopySwap(ff.bb,&buf[4+i*8+4],4,false);
  2243. asf.factor_p_c[i] = ff.ff / Q16_BASE;
  2244. }
  2245. if (factor_write_board(board, &asf) != 0)
  2246. {
  2247. cmd_buf[1] |= MAINTAIN_NAK;
  2248. cmd_buf[4] = MAINTAIN_ERR_OTHER;
  2249. cmd_len = 5;
  2250. break;
  2251. }
  2252. cmd_len = 4;
  2253. }
  2254. // 发送ACK
  2255. cmd_buf[1] |= MAINTAIN_ACK;
  2256. }
  2257. break;
  2258. case MS_AC_CFG:
  2259. {
  2260. int i,j;
  2261. cmd_buf[2] = buf[2];
  2262. for(i=0; i<AC_TEST_BOARD_NUM; i++)
  2263. {
  2264. if(g_ac_test_board[i].type == cmd_buf[2])
  2265. {
  2266. break;
  2267. }
  2268. }
  2269. if (i == AC_TEST_BOARD_NUM)
  2270. {
  2271. cmd_buf[1] |= MAINTAIN_NAK;
  2272. cmd_buf[4] = MAINTAIN_ERR_NSLOT;
  2273. cmd_len = 5;
  2274. break;
  2275. }
  2276. else
  2277. {
  2278. char name[10];
  2279. for (j=0; j<g_ac_test_board[i].num; j++)
  2280. {
  2281. strncpy(name,g_ac_test_board[i].data[j].name,4);
  2282. memcpy(&cmd_buf[3+8*j+0], name, 4);
  2283. cmd_buf[3+8*j+4] = g_ac_test_board[i].data[j].normal_data;
  2284. cmd_buf[3+8*j+5] = g_ac_test_board[i].data[j].normal_data>>8;
  2285. cmd_buf[3+8*j+6] = g_ac_test_board[i].data[j].normal_angle;
  2286. cmd_buf[3+8*j+7] = g_ac_test_board[i].data[j].normal_angle>>8;
  2287. }
  2288. }
  2289. cmd_len = 8*g_ac_test_board[i].num;
  2290. cmd_len += 4;
  2291. }
  2292. break;
  2293. case MS_DC_FACTOR:
  2294. {
  2295. s32 factor;
  2296. u8 *p;
  2297. cmd_buf[2] = buf[2];
  2298. cmd_len = 3;
  2299. if(cmd_buf[2] == 1) //上传
  2300. {
  2301. for(i=0; i<DC_NUM; i++)
  2302. {
  2303. factor = (s32)rt_round(g_dcfactor_save[i].dc_h * Q16_BASE); // 直流H系数
  2304. cmd_buf[3+i*8+0] = factor;
  2305. cmd_buf[3+i*8+1] = (factor>>8);
  2306. cmd_buf[3+i*8+2] = (factor>>16);
  2307. cmd_buf[3+i*8+3] = (factor>>24);
  2308. factor = (s32)rt_round(g_dcfactor_save[i].dc_l * Q16_BASE); // 直流L系数
  2309. cmd_buf[3+i*8+4] = factor;
  2310. cmd_buf[3+i*8+5] = (factor>>8);
  2311. cmd_buf[3+i*8+6] = (factor>>16);
  2312. cmd_buf[3+i*8+7] = (factor>>24);
  2313. }
  2314. cmd_buf[3+DC_NUM*8+0] = g_dcfactor_save[0].adjust_set;
  2315. cmd_buf[3+DC_NUM*8+1] = g_dcfactor_save[1].adjust_set;
  2316. memcpy (&cmd_buf[3+DC_NUM*8+2], g_auth_id, 8); //装置flash_id
  2317. memcpy (&cmd_buf[3+DC_NUM*8+2+8], g_dcfactor_id, 8); //存储flash_id
  2318. // 上传校准温度
  2319. p = (u8*)&g_dc_temp;
  2320. cmd_buf[3+DC_NUM*8+2+16] = p[3];
  2321. cmd_buf[3+DC_NUM*8+2+17] = p[2];
  2322. cmd_buf[3+DC_NUM*8+2+18] = p[1];
  2323. cmd_buf[3+DC_NUM*8+2+19] = p[0];
  2324. cmd_len = 8*2 + 2 + 8*2 + 4;
  2325. cmd_len += 3;
  2326. cmd_buf[1] |= MAINTAIN_ACK;
  2327. break;
  2328. }
  2329. else if(cmd_buf[2] == 2)//下载
  2330. {
  2331. union
  2332. {
  2333. float ff;
  2334. u8 bb[4];
  2335. }ff;
  2336. float dc_h, dc_l;
  2337. u8 id[8];
  2338. struct dc_factor_save factor[2];
  2339. memcpy(factor, g_dcfactor_save, sizeof(g_dcfactor_save));
  2340. for(i=0; i<DC_NUM; i++)
  2341. {
  2342. CopySwap(ff.bb,&buf[3+i*8+0],4,false);
  2343. dc_h = ff.ff / Q16_BASE;
  2344. CopySwap(ff.bb,&buf[3+i*8+4],4,false);
  2345. dc_l = ff.ff / Q16_BASE;
  2346. if (factor[i].dc_h != dc_h)
  2347. {
  2348. factor[i].dc_h = dc_h;
  2349. factor[i].adjust_set = DC_SETDATA;
  2350. }
  2351. if (factor[i].dc_l!= dc_l)
  2352. {
  2353. factor[i].dc_l = dc_l;
  2354. factor[i].adjust_set = DC_SETDATA;
  2355. }
  2356. }
  2357. memcpy(id, g_auth_id, 8);
  2358. if(dcfactor_createfile(&id[0], (u8 *)&factor) != 0)
  2359. {
  2360. rt_printf("直流系数文件保存失败.\r\n");
  2361. cmd_buf[1] |= MAINTAIN_NAK;
  2362. cmd_buf[3] = MAINTAIN_ERR_OTHER;
  2363. cmd_len = 4;
  2364. break;
  2365. }
  2366. log_str_time(LOG_OPERATE,"工具直流系数修改",0,0);
  2367. cmd_len = 3;
  2368. cmd_buf[1] |= MAINTAIN_ACK;
  2369. break;
  2370. }
  2371. else if(cmd_buf[2] == 3) // 恢复默认值
  2372. {
  2373. if(dcfactor_restore_default() != 0)
  2374. {
  2375. rt_printf("直流系数恢复默认值失败.\r\n");
  2376. cmd_buf[1] |= MAINTAIN_NAK;
  2377. cmd_buf[3] = MAINTAIN_ERR_OTHER;
  2378. cmd_len = 4;
  2379. break;
  2380. }
  2381. cmd_len = 3;
  2382. cmd_buf[1] |= MAINTAIN_ACK;
  2383. break;
  2384. }
  2385. // 不支持的直流系数命令
  2386. rt_printf("不支持的直流系数命令:cmd_buf[2]=%d.\r\n",cmd_buf[2]);
  2387. cmd_buf[1] |= MAINTAIN_NAK;
  2388. cmd_buf[3] = MAINTAIN_ERR_OTHER;
  2389. break;
  2390. }
  2391. break;
  2392. case MS_WAVE_OK:
  2393. {
  2394. if (rcd_check_ok(SWITCH_NUM_MAX) != 1)
  2395. {
  2396. cmd_buf[1] |= MAINTAIN_NAK;
  2397. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2398. cmd_len = 3;
  2399. break;
  2400. }
  2401. // 发送ACK
  2402. cmd_buf[1] |= MAINTAIN_ACK;
  2403. cmd_len = 2;
  2404. }
  2405. break;
  2406. case MS_FILE_ISUPDATE:
  2407. {
  2408. int file_index=0;
  2409. u32 file_time=0;
  2410. u16 file_type=0;
  2411. // 复制文件名
  2412. memcpy(cmd_buf+2,buf+2,20);
  2413. // 检查文件名
  2414. file_index = file_check(buf+2, ATTR_UP);
  2415. if(file_index < 0)
  2416. {
  2417. cmd_buf[1] |= MAINTAIN_NAK;
  2418. cmd_buf[22] = MAINTAIN_ERR_NAME;
  2419. cmd_len = 23;
  2420. break;
  2421. }
  2422. // 获取文件当前时间
  2423. file_time = file_change_time(file_index);
  2424. if ((short)file_time == -1)
  2425. {
  2426. cmd_buf[1] |= MAINTAIN_NAK;
  2427. cmd_buf[22] = MAINTAIN_ERR_NAME;
  2428. cmd_len = 23;
  2429. break;
  2430. }
  2431. // 如果是首次上传,暂存文件时间
  2432. if (buf[22])
  2433. {
  2434. g_file_time[file_index].st_mtime = file_time;
  2435. if (file_type == FILETYPE_LOG_APP)
  2436. {
  2437. file_index = log_file_check(buf+2);
  2438. g_logfile_update[file_index] = 0;
  2439. }
  2440. cmd_buf[22] = 0;
  2441. }
  2442. else
  2443. {
  2444. // 非首次上传,比对文件时间,并上传文件是否修改状态
  2445. cmd_buf[22] = 0;
  2446. if(g_file_time[file_index].st_mtime != file_time)
  2447. {
  2448. cmd_buf[22] = 1;
  2449. }
  2450. else if (file_type == FILETYPE_LOG_APP)
  2451. {
  2452. file_index = log_file_check(buf+2);
  2453. if(g_logfile_update[file_index])
  2454. {
  2455. cmd_buf[22] = 1;
  2456. }
  2457. }
  2458. }
  2459. // 发送ACK
  2460. cmd_buf[1] |= MAINTAIN_ACK;
  2461. cmd_len = 23;
  2462. }
  2463. break;
  2464. case MS_COMM_TEST:
  2465. {
  2466. u8 j;
  2467. // 启动测试
  2468. uart_test_begin = 1;
  2469. // 串口测试
  2470. uart_232_485_test(&buf[2]);
  2471. // 停止测试
  2472. uart_test_begin = 0;
  2473. memset(&cmd_buf[2], 0, 6);
  2474. // RS232_1, RS232_2
  2475. cmd_buf[2] = 0x7;
  2476. for (j=0; j<2; j++)
  2477. {
  2478. if (uart_test_flag[j][0])
  2479. {
  2480. cmd_buf[3] |= 0x1<<j;
  2481. }
  2482. if (uart_test_flag[j][1])
  2483. {
  2484. cmd_buf[4] |= 0x1<<j;
  2485. }
  2486. }
  2487. cmd_buf[3] |= 0x1<<2; // 串口3 自动满足
  2488. cmd_buf[4] |= 0x1<<2;
  2489. // RS485_1,RS485_2,RS485_3
  2490. cmd_buf[5] = 0x7;
  2491. for (j=0; j<3; j++)
  2492. {
  2493. if (uart_test_flag[j+3][0])
  2494. {
  2495. cmd_buf[6] |= 0x1<<j;
  2496. }
  2497. if (uart_test_flag[j+3][1])
  2498. {
  2499. cmd_buf[7] |= 0x1<<j;
  2500. }
  2501. }
  2502. // 发送ACK
  2503. cmd_buf[1] |= MAINTAIN_ACK;
  2504. cmd_len = 8;
  2505. }
  2506. break;
  2507. case MS_INSTU:
  2508. {
  2509. int i;
  2510. u32 data;
  2511. cmd_buf[2] = INSTU_NUM;
  2512. for(i=0; i<INSTU_NUM; i++)
  2513. {
  2514. data = *g_instu_desc[i].fstdata;
  2515. cmd_buf[3+i*4] = data;
  2516. cmd_buf[4+i*4] = (data >> 8);
  2517. cmd_buf[5+i*4] = (data >> 16);
  2518. cmd_buf[6+i*4] = (data >> 24);
  2519. }
  2520. // 发送ACK
  2521. cmd_buf[1] |= MAINTAIN_ACK;
  2522. cmd_len = INSTU_NUM*4 + 3;
  2523. }
  2524. break;
  2525. case MS_RCD_NAME:
  2526. {
  2527. static char name[9*64];
  2528. int i=0, j;
  2529. struct stat s;
  2530. static int sum=0, num=0, cur=0;
  2531. // 首次查询
  2532. if (buf[2] == 0)
  2533. {
  2534. memset (name, 0, 9*64);
  2535. //检查文件是否存在
  2536. if(sys_newstat("/tmp/rec_wave.dat",&s)==0)
  2537. {
  2538. memcpy(name, "/tmp/rec_wave.dat", strlen("/tmp/rec_wave.dat"));
  2539. i=1;
  2540. }
  2541. num = rcd_get_list_name();
  2542. if(num > 8)
  2543. {
  2544. num = 8;
  2545. }
  2546. for (j=0; j<num; j++)
  2547. {
  2548. memcpy(&name[(i+j)*64], "/app/data/rec_wave/", strlen("/app/data/rec_wave/"));
  2549. memcpy(&name[(i+j)*64+strlen("/app/data/rec_wave/")], wave_name[j],35);
  2550. }
  2551. if (num)
  2552. {
  2553. num += i;
  2554. sum = num;
  2555. }
  2556. else
  2557. {
  2558. num = 0;
  2559. sum = i;
  2560. }
  2561. cur=0;
  2562. }
  2563. else
  2564. {
  2565. cur+=3;
  2566. }
  2567. // 总条数
  2568. cmd_buf[2] = sum;
  2569. if (num > 3)
  2570. {
  2571. cmd_buf[3] = 1;
  2572. memcpy(cmd_buf+4, &name[cur*64], 3*64);
  2573. num -= 3;
  2574. cmd_len += 3*64;
  2575. }
  2576. else
  2577. {
  2578. cmd_buf[3] = 0;
  2579. memcpy(cmd_buf+4, &name[cur*64], (sum-cur)*64);
  2580. cmd_len += (sum-cur)*64;
  2581. }
  2582. // 发送ACK
  2583. cmd_buf[1] |= MAINTAIN_ACK;
  2584. cmd_len += 4;
  2585. }
  2586. break;
  2587. case MS_RMT_PAIR:
  2588. { // 遥控器配对
  2589. memcpy(cmd_buf+2,buf+2,2);
  2590. if (cmd_buf[2])
  2591. {
  2592. add_rmt_pair(RMT_PAIR);
  2593. log_str_time(LOG_OPERATE,"工具遥控器配对",0,0);
  2594. }
  2595. if (cmd_buf[3])
  2596. {
  2597. add_rmt_pair(RMT_CLRPAIR);
  2598. log_str_time(LOG_OPERATE,"工具遥控器配对清除",0,0);
  2599. }
  2600. // 发送ACK
  2601. cmd_buf[1] |= MAINTAIN_ACK;
  2602. cmd_len = 4;
  2603. }
  2604. break;
  2605. case MS_SET_MTPWD:
  2606. {
  2607. // 设置密码
  2608. u8 pwd[16];
  2609. int i, check=0, str=0, data=0;
  2610. // 此处需将密码解密
  2611. for (i=0; i<16; i++)
  2612. {
  2613. pwd[i] = ~buf[2+i];
  2614. }
  2615. // 校验旧密码
  2616. check = memcmp(pwd, mt_pwd,16);
  2617. if (check != 0)
  2618. {
  2619. cmd_buf[1] |= MAINTAIN_NAK;
  2620. cmd_buf[2] = MAINTAIN_ERR_OCODE;
  2621. cmd_len = 3;
  2622. // break;
  2623. }
  2624. // 此处需将密码解密
  2625. for (i=0; i<16; i++)
  2626. {
  2627. pwd[i] = ~buf[18+i];
  2628. }
  2629. // 校验新密码是否符合规则
  2630. for (i=0; i<16; i++)
  2631. {
  2632. // 密码中有数字
  2633. if ((pwd[i] >= 0x30) && (pwd[i] < 0x3A))
  2634. {
  2635. data = 1;
  2636. }
  2637. else
  2638. {
  2639. str = 1;
  2640. }
  2641. }
  2642. if (!data || !str)
  2643. {
  2644. cmd_buf[1] |= MAINTAIN_NAK;
  2645. cmd_buf[2] = MAINTAIN_ERR_NCODE; //新密码无效
  2646. cmd_len = 3;
  2647. break;
  2648. }
  2649. // 更新密码
  2650. memcpy (&mt_pwd, pwd, 16);
  2651. // 保存加密后的新密码
  2652. _maintain_pwd_createfile(&buf[18]);
  2653. log_str_time(LOG_OPERATE,"工具设置维护工具密码",0,0);
  2654. memcpy(cmd_buf+2,buf+2,32);
  2655. // 发送ACK
  2656. cmd_buf[1] |= MAINTAIN_ACK;
  2657. cmd_len = 34;
  2658. }
  2659. break;
  2660. case MS_PASSWORD:
  2661. // 不支持旧密码认证,直接否定确认
  2662. cmd_buf[1] |= MAINTAIN_NAK;
  2663. cmd_buf[2] = MAINTAIN_ERR_CODE;
  2664. cmd_len = 3;
  2665. break;
  2666. case MS_MT_PWD:
  2667. {
  2668. int i, check=0;
  2669. u8 pwd[16];
  2670. // 此处需将密码解密
  2671. for (i=0; i<16; i++)
  2672. {
  2673. pwd[i] = ~buf[2+i];
  2674. }
  2675. check = memcmp(pwd,mt_pwd,16);
  2676. if (check != 0)
  2677. {
  2678. cmd_buf[1] |= MAINTAIN_NAK;
  2679. cmd_buf[2] = MAINTAIN_ERR_CODE;
  2680. cmd_len = 3;
  2681. //print_mem("pwd0:",mt_pwd,16);
  2682. //print_mem("pwd1:",pwd,16);
  2683. break;
  2684. }
  2685. // 密码校验通过,打开相关的维护端口
  2686. {
  2687. char log[128];
  2688. sprintf(log,"%s登录!", &buf[2+16]);
  2689. log_str_time(LOG_OPERATE,log,0,0);
  2690. rt_printf("%s\r\n",log);
  2691. }
  2692. if(g_mt_rs232 == 0)
  2693. {
  2694. net_debug_init();
  2695. open_inet_port();
  2696. }
  2697. memcpy(cmd_buf+2,buf+2,16);
  2698. // 发送ACK
  2699. cmd_buf[1] |= MAINTAIN_ACK;
  2700. cmd_len = 18;
  2701. }
  2702. break;
  2703. case MS_CLOSE_PORT:
  2704. {
  2705. // 关闭端口服务,仅保留6008维护端口
  2706. net_debug_exit();
  2707. close_inet_port();
  2708. rt_printf("网络维护端口关闭.\r\n");
  2709. // 发送ACK
  2710. cmd_buf[1] |= MAINTAIN_ACK;
  2711. cmd_len = 2;
  2712. }
  2713. break;
  2714. case MS_AUTH:
  2715. {
  2716. cmd_buf[2] = buf[2];
  2717. // 上传ID
  2718. if(cmd_buf[2] == 1)
  2719. {
  2720. auth_get_encrypt_id(&cmd_buf[3],32);
  2721. print_mem(" id:",&cmd_buf[3],24);
  2722. cmd_len = 3 + 32;
  2723. }
  2724. // 下载license
  2725. else if(cmd_buf[2] == 2)
  2726. {
  2727. auth_save(&buf[3],AUTH_LICENSE_LEN);
  2728. cmd_len = 3;
  2729. }
  2730. // 从授权机获取授权
  2731. else if(cmd_buf[2] == 3)
  2732. {
  2733. int ret;
  2734. ret = auth_license(&buf[3],(struct rtc_time_t *)&buf[3+32],&cmd_buf[3]);
  2735. if(ret != 0)
  2736. {
  2737. rt_printf("auth_license error:ret=%d.\r\n",ret);
  2738. cmd_buf[1] |= MAINTAIN_NAK;
  2739. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2740. cmd_len = 3;
  2741. break;
  2742. }
  2743. cmd_len = 3 + AUTH_LICENSE_LEN;
  2744. }
  2745. // 发送ACK
  2746. cmd_buf[1] |= MAINTAIN_ACK;
  2747. }
  2748. break;
  2749. case MS_YD_REFRESH:
  2750. {
  2751. u16 begin,num;
  2752. // 将子命令和开始值复制到返回命令中
  2753. memcpy(&cmd_buf[2],&buf[2],3);
  2754. // 得到开始值和个数
  2755. Swap_16_memcpy((BYTE*)&begin,&buf[3]); // modify for am335x xxxxxx
  2756. Swap_16_memcpy((BYTE*)&num,&buf[5]); // modify for am335x xxxxxx
  2757. // 遥信
  2758. if(cmd_buf[2] == 1)
  2759. {
  2760. num = tbl_yd_yx(begin,num,cmd_buf+7);
  2761. if(num > 0)
  2762. {
  2763. Swap_16_memcpy(&cmd_buf[5],(BYTE*)&num); // modify for am335x xxxxxx
  2764. cmd_len = 3 + 4 + (num+3)/4;
  2765. }
  2766. else
  2767. {
  2768. cmd_buf[1] |= MAINTAIN_NAK;
  2769. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2770. cmd_len = 3;
  2771. break;
  2772. }
  2773. }
  2774. // 遥测
  2775. else if(cmd_buf[2] == 2)
  2776. {
  2777. num = tbl_yd_yc(begin,num,cmd_buf+7);
  2778. if(num > 0)
  2779. {
  2780. Swap_16_memcpy(&cmd_buf[5],(BYTE*)&num); // modify for am335x xxxxxx
  2781. cmd_len = 3 + 4 + num*9;
  2782. }
  2783. else
  2784. {
  2785. cmd_buf[1] |= MAINTAIN_NAK;
  2786. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2787. cmd_len = 3;
  2788. break;
  2789. }
  2790. }
  2791. // 电度
  2792. else if(cmd_buf[2] == 3)
  2793. {
  2794. num = tbl_yd_dd(begin,num,cmd_buf+7);
  2795. if(num > 0)
  2796. {
  2797. Swap_16_memcpy(&cmd_buf[5],(BYTE*)&num); // modify for am335x xxxxxx
  2798. cmd_len = 3 + 4 + num*9;
  2799. }
  2800. else
  2801. {
  2802. cmd_buf[1] |= MAINTAIN_NAK;
  2803. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2804. cmd_len = 3;
  2805. break;
  2806. }
  2807. }
  2808. else
  2809. {
  2810. cmd_buf[1] |= MAINTAIN_NAK;
  2811. cmd_buf[2] = MAINTAIN_ERR_OTHER;
  2812. cmd_len = 3;
  2813. break;
  2814. }
  2815. // 发送ACK
  2816. cmd_buf[1] |= MAINTAIN_ACK;
  2817. }
  2818. break;
  2819. case MS_FACTORY_SETUP:
  2820. {
  2821. u8 mac[6];
  2822. cmd_buf[2] = buf[2];
  2823. // 装置ID码
  2824. if(buf[2] == 1)
  2825. {
  2826. if(strlen(&buf[3]) == 24)
  2827. {
  2828. env_setenv("pid", &buf[3]);
  2829. rt_printf("pid=%s\r\n",&buf[3]);
  2830. cmd_len = 3;
  2831. }
  2832. else
  2833. {
  2834. cmd_buf[3] = MAINTAIN_ERR_FORMAT;
  2835. cmd_len = 4;
  2836. cmd_buf[1] |= MAINTAIN_NAK;
  2837. break;
  2838. }
  2839. }
  2840. // 网络1MAC
  2841. else if(buf[2] == 2)
  2842. {
  2843. if(rt_if_sz2mac(&buf[3],mac) == 0)
  2844. {
  2845. env_setenv("net1mac", &buf[3]);
  2846. rt_printf("net1mac=%s\r\n",&buf[3]);
  2847. cmd_len = 3;
  2848. }
  2849. else
  2850. {
  2851. cmd_buf[3] = MAINTAIN_ERR_FORMAT;
  2852. cmd_len = 4;
  2853. cmd_buf[1] |= MAINTAIN_NAK;
  2854. break;
  2855. }
  2856. }
  2857. // 网络2MAC
  2858. else if(buf[2] == 3)
  2859. {
  2860. if(rt_if_sz2mac(&buf[3],mac) == 0)
  2861. {
  2862. env_setenv("net2mac", &buf[3]);
  2863. rt_printf("net2mac=%s\r\n",&buf[3]);
  2864. cmd_len = 3;
  2865. }
  2866. else
  2867. {
  2868. cmd_buf[3] = MAINTAIN_ERR_FORMAT;
  2869. cmd_len = 4;
  2870. cmd_buf[1] |= MAINTAIN_NAK;
  2871. break;
  2872. }
  2873. }
  2874. // 发送ACK
  2875. cmd_buf[1] |= MAINTAIN_ACK;
  2876. }
  2877. break;
  2878. #if defined(CPU_AM335X)
  2879. case MS_APP_BAK_START:
  2880. rt_printf("maintain: 启动app分区备份.\r\n");
  2881. //下面备份工作需要大约5秒,耗时有点长,先喂狗
  2882. watchdog_feed_mainloop();
  2883. //1. 删除临时文件/tmp/backup_flag
  2884. rt_file_del("/tmp/backup_flag");
  2885. //2. 调用启动备份脚本(函数)
  2886. call_usermodehelper("/usr/sbin/app_backup.sh", cmd_ls, NULL, UMH_WAIT_PROC);
  2887. watchdog_feed_mainloop();
  2888. //3. 回复
  2889. cmd_buf[1] |= MAINTAIN_ACK;
  2890. cmd_len = 2;
  2891. break;
  2892. case MS_APP_BAK_RESULT:
  2893. //1. 检测临时文件/tmp/backup_flag是否存在?
  2894. // 打开文件
  2895. pfile = rt_file_open("/tmp/backup_flag",O_RDONLY ,0);
  2896. if(IS_ERR(pfile))
  2897. {
  2898. rt_printf("maintain: 临时文件/tmp/backup_flag不存在.\r\n");
  2899. //1.1 不存在
  2900. cmd_buf[1] |= MAINTAIN_ACK;
  2901. cmd_buf[2] = 2;//备份中
  2902. cmd_len = 3;
  2903. break;
  2904. }
  2905. // 得到文件长度
  2906. rt_file_llseek(pfile,0,SEEK_END);
  2907. llen = pfile->f_pos;
  2908. rt_file_llseek(pfile,0,SEEK_SET);
  2909. // 分配内存
  2910. lbuf = rt_malloc(llen);
  2911. if((lbuf) == NULL)
  2912. {
  2913. rt_file_close(pfile,0);
  2914. break;
  2915. }
  2916. // 读出内容
  2917. pos = 0;
  2918. if(rt_file_read(pfile,lbuf,llen,&pos) != llen)
  2919. {
  2920. rt_file_close(pfile,0);
  2921. rt_free(lbuf);
  2922. break;
  2923. }
  2924. // 关闭文件
  2925. rt_file_close(pfile,0);
  2926. result = lbuf[0];
  2927. rt_free(lbuf);
  2928. //1.2 存在
  2929. if(result == '1')
  2930. {
  2931. rt_printf("maintain: app分区备份成功.\r\n");
  2932. //2 读取文件/tmp/backup_flag内容,成功值是1,备份失败值是 0
  2933. //成功
  2934. cmd_buf[1] |= MAINTAIN_ACK;
  2935. cmd_buf[2] = 1;//成功
  2936. cmd_len = 3;
  2937. }
  2938. else
  2939. {
  2940. rt_printf("maintain: app分区备份失败.\r\n");
  2941. //失败
  2942. cmd_buf[1] |= MAINTAIN_ACK;
  2943. cmd_buf[2] = 0;//失败
  2944. cmd_len = 3;
  2945. }
  2946. break;
  2947. #endif
  2948. default:
  2949. rt_printf("Maintain_Manage:不支持的命令(%d)\r\n",buf[1]);
  2950. _maintain_state_reset();
  2951. cmd_buf[1] |= MAINTAIN_NAK;
  2952. cmd_buf[2] = MAINTAIN_ERR_CMD;
  2953. cmd_len = 3;
  2954. break;
  2955. }
  2956. return cmd_len;
  2957. }
  2958. void Maintain_uart_send(void)
  2959. {
  2960. struct maintain_def *pt = &g_mtbuf;
  2961. int len;
  2962. u8 buf_tx[256];
  2963. memset(buf_tx,0,sizeof(buf_tx));
  2964. pt->bData = false;
  2965. len = pt->recvbuf[1] + 6; //68 L L 68 + data + crc + END
  2966. memcpy(buf_tx,pt->recvbuf,len-1);
  2967. buf_tx[len] = 0x80;
  2968. buf_tx[len] |= (PDA_BOARD<<3);
  2969. buf_tx[len] |= MAIN_BOARD;
  2970. Add_Uart_Frame(PDA_BOARD,len,buf_tx);
  2971. }
  2972. void Maintain_Board_Recv(int len,BYTE *para)
  2973. {
  2974. struct maintain_def *pt = &g_mtbuf;
  2975. if(pt->bData)
  2976. {
  2977. _maintain_recv_rst(pt);
  2978. return;
  2979. }
  2980. pt->nRecvLenth = len;
  2981. memcpy(pt->recvbuf,para,len);
  2982. pt->bData=true;
  2983. pt->hmi_mode=true;
  2984. //print_mem("PCRX:",g_mtbuf.recvbuf,len);
  2985. mainloop_wakeup();
  2986. }
  2987. /**************************************************************************
  2988. 函数名称:_maintain_recv
  2989. 函数版本:1.00
  2990. 作者:
  2991. 创建日期:2013.03.29
  2992. 函数功能说明:6008端口数据接受判断,只判断是否满足报文格式
  2993. 输入参数:
  2994. 输出参数:有完整帧接受,返回1,否则返回 0
  2995. 返回值:
  2996. 更新信息:
  2997. 更新日志1:
  2998. 日期:
  2999. 修改者:
  3000. 修改内容:
  3001. 修改原因:
  3002. ***************************************************************************/
  3003. void Maintain_Recv(u8 byRevData)
  3004. {
  3005. struct maintain_def *pt = &g_mtbuf;
  3006. pt->recvbuf[pt->nRecvCounter++]=byRevData;
  3007. // pt->dTRecvPiece=dTCounter; //接收字符时的时刻,在大循环中判断,是否需要复归
  3008. switch(pt->nTypeCounter)
  3009. {
  3010. case 0:
  3011. if(byRevData==0x68)
  3012. {
  3013. pt->nTypeCounter=1;
  3014. }
  3015. else if(byRevData==0x10)
  3016. {
  3017. pt->nTypeCounter=4;
  3018. pt->nRecvLenth=2;
  3019. }
  3020. else
  3021. {
  3022. _maintain_recv_rst(pt);
  3023. }
  3024. break;
  3025. case 1:
  3026. pt->nTypeCounter=2;
  3027. pt->nRecvLenth=byRevData; //长帧长度
  3028. if(pt->nRecvLenth>IEC101_RECVBUF_MAX)
  3029. {
  3030. _maintain_recv_rst(pt);
  3031. }
  3032. break;
  3033. case 2:
  3034. if(pt->nRecvLenth==byRevData)
  3035. {
  3036. pt->nTypeCounter=3;
  3037. }
  3038. else
  3039. {
  3040. _maintain_recv_rst(pt);
  3041. }
  3042. break;
  3043. case 3:
  3044. if(byRevData==0x68)
  3045. {
  3046. pt->nTypeCounter=4;
  3047. }
  3048. else
  3049. {
  3050. _maintain_recv_rst(pt);
  3051. }
  3052. break;
  3053. case 4: //控制域
  3054. pt->sum=byRevData;
  3055. pt->nTypeCounter=5;
  3056. break;
  3057. case 5: //目标地址
  3058. pt->sum+=byRevData;
  3059. pt->nRecvCnt=0;
  3060. pt->nTypeCounter=6;
  3061. if(pt->nRecvLenth==2)//短帧
  3062. pt->nTypeCounter=7;
  3063. break;
  3064. case 6: //有效数据 //有效数据
  3065. if(++pt->nRecvCnt>=pt->nRecvLenth-2)
  3066. {
  3067. pt->nTypeCounter=7;
  3068. }
  3069. pt->sum+=byRevData;
  3070. break;
  3071. case 7: //校验和
  3072. pt->recvsum=byRevData;
  3073. pt->nTypeCounter=8;
  3074. break;
  3075. case 8: //结束符
  3076. _maintain_recv_rst(pt);
  3077. if(byRevData==0x16) //校验结束字符,报文接收完毕,
  3078. {
  3079. if(pt->sum!=pt->recvsum)
  3080. {
  3081. return;
  3082. }
  3083. else
  3084. {
  3085. pt->bData=true;
  3086. // 唤醒主循环
  3087. mainloop_wakeup();
  3088. }
  3089. return ;
  3090. }
  3091. break;
  3092. default:
  3093. _maintain_recv_rst(pt);
  3094. break;
  3095. } //类型校验结束
  3096. return ;
  3097. }
  3098. /******************************************************************************
  3099. 函数名称: filelist_getlen
  3100. 函数版本: 01.01
  3101. 创建作者: xxxxxx
  3102. 创建日期: 2015-2-13
  3103. 函数说明: 获取文件列表长度
  3104. 参数说明:
  3105. fname:文件列表名
  3106. 返回值: 文件列表长度
  3107. 修改记录:
  3108. */
  3109. static unsigned int filelist_getlen(struct file_item *file_list)
  3110. {
  3111. int len = 0;
  3112. int i = 0;
  3113. int fd = 0;
  3114. char file_name[64];
  3115. //遍历文件列表
  3116. for(i=0;i<FILE_LIST_NUM;i++)
  3117. {
  3118. memset(file_name, 0, 64);
  3119. // 组合文件路径和文件名
  3120. sprintf(file_name,"%s%s",file_list[i].file_dir,file_list[i].file_name);
  3121. //打开文件
  3122. fd = sys_open(file_name, O_RDONLY, 0);
  3123. //打不开表示文件不存在
  3124. if(fd < 0) continue;
  3125. //计算长度
  3126. len += strlen(file_name) + 2;
  3127. //关闭文件
  3128. sys_close(fd);
  3129. }
  3130. return len;
  3131. }
  3132. /******************************************************************************
  3133. 函数名称: filelist_memcpy
  3134. 函数版本: 01.01
  3135. 创建作者: xxxxxx
  3136. 创建日期: 2015-2-13
  3137. 函数说明: 拷贝文件列表内容到目的地址
  3138. 参数说明:
  3139. dst: 目的地址
  3140. fname:文件列表名
  3141. 返回值: 文件列表长度
  3142. 修改记录:
  3143. */
  3144. static void filelist_memcpy(char *dst, struct file_item *file_list)
  3145. {
  3146. int len = 0;
  3147. int i = 0;
  3148. int fd = 0;
  3149. char file_name[64];
  3150. //遍历文件列表
  3151. for(i=0; i<FILE_LIST_NUM; i++)
  3152. {
  3153. memset(file_name, 0, 64);
  3154. // 组合文件路径和文件名
  3155. sprintf(file_name,"%s%s",file_list[i].file_dir,file_list[i].file_name);
  3156. // 在系统中打开对应文件
  3157. fd = sys_open(file_name, O_RDONLY, 0);
  3158. // 打不开表示文件不存在
  3159. if(fd < 0) continue;
  3160. // 如果文件不需要放入文件列表,关闭文件并退出
  3161. if ((file_list[i].file_attr & ATTR_UP) == 0)
  3162. {
  3163. sys_close(fd);
  3164. continue;
  3165. }
  3166. if((strcmp(file_name, file_list[i].file_dir)==0)
  3167. && (strlen(file_name) == strlen(file_list[i].file_dir)))
  3168. {
  3169. continue;
  3170. }
  3171. // 文件名拷贝,并添加回车
  3172. len = strlen(file_name);
  3173. memcpy(dst, file_name, len);
  3174. dst = dst + len;
  3175. memcpy(dst, "\r\n", 2);
  3176. dst = dst + 2;
  3177. // 关闭文件
  3178. sys_close(fd);
  3179. }
  3180. }
  3181. /******************************************************************************
  3182. 函数名称: filelist_createfile
  3183. 函数版本: 01.01
  3184. 创建作者: xxxxxx
  3185. 创建日期: 2015-10-23
  3186. 函数说明: 创建文件列表
  3187. 参数说明: 无
  3188. 返回值: 成功返回0.
  3189. 修改记录:
  3190. */
  3191. int filelist_createfile(void)
  3192. {
  3193. unsigned int addr,file_length;
  3194. u16 crc;
  3195. char *p;
  3196. loff_t pos;
  3197. struct file * pfile;
  3198. struct cfg_file_head filelist_file;
  3199. // 写文件头
  3200. memset(&filelist_file,0,sizeof(filelist_file));
  3201. filelist_file.signature = SIG_FILELIST_FILE;
  3202. filelist_file.version = FILELIST_FILE_VERSION;
  3203. addr = FILE_ADDR_ALGIN(sizeof(filelist_file));
  3204. // 得到文件长度
  3205. file_length = addr + filelist_getlen(g_file_item);
  3206. file_length = FILE_ADDR_ALGIN(file_length);
  3207. // 分配并初始化空间
  3208. p = rt_malloc(file_length + 2);
  3209. if(!p)
  3210. {
  3211. return -1;
  3212. }
  3213. memset(p, 0, file_length + 2);
  3214. // 写入文件头
  3215. memcpy(p, (char *)&filelist_file, sizeof(filelist_file));
  3216. // 写文件列表
  3217. filelist_memcpy(p+addr, g_file_item);
  3218. // 计算CRC
  3219. crc = CrcStr(p, file_length);
  3220. memcpy(p+file_length, &crc, 2);
  3221. // 创建数据文件
  3222. pfile = rt_file_open("/tmp/file_list.bin",O_CREAT|O_RDWR,0);
  3223. if(IS_ERR(pfile))
  3224. {
  3225. rt_free(p);
  3226. return -2;
  3227. }
  3228. pos = 0;
  3229. rt_file_write(pfile, p, file_length+2, &pos);
  3230. rt_file_close(pfile,0);
  3231. rt_free(p);
  3232. return 0;
  3233. }
  3234. /*------------------------------ 内部函数 -------------------------------------
  3235. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  3236. */
  3237. static void _maintain_state_reset(void)
  3238. {
  3239. g_maintain.state = MS_IDLE;
  3240. }
  3241. static void _maintain_echo(struct maintain_def *pt,u8 * cmd_buf,u8 cmd_len) //确认帧
  3242. {
  3243. u8 cnt,checksum ,len;
  3244. u8 *p;
  3245. p=pt->sendbuf;
  3246. // 101规约len域的值 +4=控制域、地址 、类型标识 、 文件命令
  3247. len = cmd_len+2;
  3248. // 报文帧长度 +6=报文头(4字节)校验和、结束符
  3249. p[0] = len + 6 ;
  3250. // 帧头
  3251. p[1] = 0x68; //报文头
  3252. p[2] = len;
  3253. p[3] = len;
  3254. p[4] = 0x68;
  3255. p[5] = IEC101_ECHO_DATA; //控制域
  3256. p[6] = 0x01; //链路地址
  3257. // 命令
  3258. p = &pt->sendbuf[7]; // 调整位置
  3259. memcpy(p,cmd_buf,cmd_len);
  3260. // 计算检验和
  3261. p = &pt->sendbuf[5];
  3262. checksum = 0;
  3263. for(cnt=0; cnt<len; cnt++)
  3264. {
  3265. checksum += *p++;
  3266. }
  3267. *p++=checksum;
  3268. // 帧尾
  3269. if (pt->hmi_mode)
  3270. {
  3271. *p++ = 0x80 | (MAIN_BOARD << 3) | MAINTAIN_BOARD;
  3272. }
  3273. else
  3274. {
  3275. *p++ = 0x16;
  3276. }
  3277. }
  3278. /**************************************************************************
  3279. 函数名称:IEC101_Recv_Rst
  3280. 函数版本:1.00
  3281. 作者:
  3282. 创建日期:2008.9.1
  3283. 函数功能说明:复归数据的接受
  3284. 输入参数:
  3285. 输出参数:
  3286. 返回值:
  3287. 更新信息:
  3288. 更新日志1:
  3289. 日期:
  3290. 修改者:
  3291. 修改内容:
  3292. 修改原因:
  3293. ***************************************************************************/
  3294. static void _maintain_recv_rst(struct maintain_def *pt)
  3295. {
  3296. pt->nTypeCounter=0;
  3297. pt->nRecvLenth=0;
  3298. pt->nRecvCounter=0;
  3299. }
  3300. static int _maintain_comm(struct maintain_def *pt,u8 *buf,int len)
  3301. {
  3302. static u8 cmd_buf[256];
  3303. u8 cmd_len;
  3304. g_mt_rs232 = 0;
  3305. memset(cmd_buf,0,sizeof(cmd_buf));
  3306. cmd_len = Maintain_Manage(buf, len, &cmd_buf[0]);
  3307. // 按内部101格式组帧
  3308. _maintain_echo(pt, &cmd_buf[0], cmd_len);
  3309. g_mtbuf.bSend = true;
  3310. return 0;
  3311. }
  3312. static int _trans_file_comm(struct maintain_def *pt,u8 *buf,int len)
  3313. {
  3314. static u8 cmd_buf[256] = {0};
  3315. u8 cmd_len;
  3316. cmd_len = com_trans_file(buf, len, &cmd_buf[0]);
  3317. // 按内部101格式组帧
  3318. _maintain_echo(pt, &cmd_buf[0], cmd_len);
  3319. g_mtbuf.bSend = true;
  3320. return 0;
  3321. }
  3322. /**************************************************************************
  3323. 函数名称:_maintain_Send
  3324. 函数版本:1.00
  3325. 作者:
  3326. 创建日期:2013.03.28
  3327. 函数功能说明:启动数据发送
  3328. 输入参数:
  3329. 输出参数:无
  3330. 返回值:
  3331. 函数扇入清单:
  3332. ***************************************************************************/
  3333. static void _maintain_send(void)
  3334. {
  3335. u8 length;
  3336. length = g_mtbuf.sendbuf[0];
  3337. if(g_mtbuf.bSend)
  3338. {
  3339. //print_mem("PCTX:",&g_mtbuf.sendbuf[1],length);
  3340. if (!g_mtbuf.hmi_mode)
  3341. {
  3342. if (net_maintain_send(&g_mtbuf.sendbuf[1],length))
  3343. {
  3344. g_mtbuf.bSend = FALSE;
  3345. }
  3346. }
  3347. else
  3348. {
  3349. Add_Uart_Frame(PDA_BOARD, (int)g_mtbuf.sendbuf[0], &g_mtbuf.sendbuf[1]);
  3350. g_mtbuf.bSend = FALSE;
  3351. }
  3352. }
  3353. }
  3354. /******************************************************************************
  3355. 函数名称: _maintain_pwd_createfile
  3356. 函数版本: 01.01
  3357. 创建作者: xxxxxx
  3358. 创建日期: 2015-10-23
  3359. 函数说明: 创建直流系数文件
  3360. 参数说明: 无
  3361. 返回值: 成功返回0.
  3362. 修改记录:
  3363. */
  3364. static int _maintain_pwd_createfile(u8 *pwd)
  3365. {
  3366. unsigned int addr,file_length;
  3367. u16 crc;
  3368. char *p;
  3369. loff_t pos;
  3370. struct file * pfile;
  3371. struct mtpwd_file_head_data mtpwd_file;
  3372. // 写文件头
  3373. memset(&mtpwd_file,0,sizeof(mtpwd_file));
  3374. mtpwd_file.cfh.signature = SIG_MTPWD_FILE;
  3375. mtpwd_file.cfh.version = MTPWD_FILE_VERSION;
  3376. memcpy (&mtpwd_file.pwd, pwd, 16);
  3377. // 得到文件长度
  3378. addr = FILE_ADDR_ALGIN(sizeof(mtpwd_file));
  3379. file_length = FILE_ADDR_ALGIN(addr);
  3380. // 分配并初始化空间
  3381. p = rt_malloc(file_length + 2);
  3382. if(!p)
  3383. {
  3384. return -1;
  3385. }
  3386. memset(p, 0, file_length + 2);
  3387. // 写入文件头
  3388. memcpy(p, (char *)&mtpwd_file, sizeof(mtpwd_file));
  3389. // 计算CRC
  3390. crc = CrcStr(p, file_length);
  3391. memcpy(p+file_length, &crc, 2);
  3392. // 创建数据文件
  3393. pfile = rt_file_open("/app/data/mt_pwd.bin",O_CREAT|O_RDWR,0);
  3394. if(IS_ERR(pfile))
  3395. {
  3396. rt_free(p);
  3397. return -2;
  3398. }
  3399. pos = 0;
  3400. rt_file_write(pfile, p, file_length+2, &pos);
  3401. rt_file_close(pfile,0);
  3402. rt_free(p);
  3403. return 0;
  3404. }
  3405. /******************************************************************************
  3406. 函数名称: _maintain_pwd_readfile
  3407. 函数版本: 01.01
  3408. 创建作者: xxxxxx
  3409. 创建日期: 2015-10-23
  3410. 函数说明: 读取直流系数文件
  3411. 参数说明: 无
  3412. 返回值: 成功返回0.
  3413. 修改记录:
  3414. */
  3415. static int _maintain_pwd_readfile(void)
  3416. {
  3417. u32 len;
  3418. u16 crc;
  3419. u8 *buf;
  3420. loff_t pos;
  3421. struct file * pfile;
  3422. u8 i,pwd[16];
  3423. struct mtpwd_file_head_data *brh;
  3424. // 创建并打开文件
  3425. pfile = rt_file_open("/app/data/mt_pwd.bin",O_RDWR,0);
  3426. if(IS_ERR(pfile))
  3427. {
  3428. return -1;
  3429. }
  3430. // 得到文件长度
  3431. len = rt_file_getfile_size(pfile);
  3432. if(len <= 0)
  3433. {
  3434. rt_file_close(pfile,0);
  3435. return -11;
  3436. }
  3437. // 分配内存
  3438. buf = rt_malloc(len);
  3439. if((buf) == NULL)
  3440. {
  3441. rt_file_close(pfile,0);
  3442. return -2;
  3443. }
  3444. // 读出内容
  3445. pos = 0;
  3446. if(rt_file_read(pfile,buf,len,&pos) != len)
  3447. {
  3448. rt_file_close(pfile,0);
  3449. rt_free(buf);
  3450. return -3;
  3451. }
  3452. // 关闭文件
  3453. rt_file_close(pfile,0);
  3454. // 检查CRC
  3455. crc = CrcStr(buf,len-2);
  3456. if(crc != *(u16*)(buf+len-2))
  3457. {
  3458. rt_free(buf);
  3459. return -4;
  3460. }
  3461. // 检查文件签名
  3462. brh = (struct mtpwd_file_head_data*)buf;
  3463. if(brh->cfh.signature != SIG_MTPWD_FILE)
  3464. {
  3465. rt_free(buf);
  3466. return -5;
  3467. }
  3468. // 检查文件长度
  3469. if(len < sizeof(*brh) + 2)
  3470. {
  3471. rt_free(buf);
  3472. return -7;
  3473. }
  3474. //取出文件中存储内容
  3475. memcpy (&pwd, brh->pwd, 16);
  3476. // 此处需将密码解密
  3477. for (i=0; i<16; i++)
  3478. {
  3479. mt_pwd[i] = ~pwd[i];
  3480. }
  3481. rt_free(buf);
  3482. return 0;
  3483. }
  3484. /*------------------------------ 测试函数 -------------------------------------
  3485. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  3486. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  3487. */
  3488. int printf_maintian(void)
  3489. {
  3490. return 0;
  3491. }
  3492. /*------------------------------ 文件结束 -------------------------------------
  3493. */