Maintain.c 101 KB

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