ytsf.c 82 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786
  1. /**
  2. ******************************** STM32F10x *********************************
  3. * @文件名 : ytsf.c
  4. * @作者 : sun
  5. * @库版本 : V3.5.0
  6. * @文件版本 : V1.0.0
  7. * @日期 : 2016年05月09日
  8. * @摘要 : USART源文件
  9. ******************************************************************************/
  10. /*----------------------------------------------------------------------------
  11. 更新日志:
  12. 2016-05-09 V1.0.0:初始版本
  13. ----------------------------------------------------------------------------*/
  14. /* 包含的头文件 --------------------------------------------------------------*/
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include "stm32f10x.h"
  18. #include "ytsf.h"
  19. #include "sx1276_api.h"
  20. #include "usart.h"
  21. #include "queue.h"
  22. #include "systick.h"
  23. #include "timer.h"
  24. #include "eeprom.h"
  25. #include "led.h"
  26. uint8_t Ytsf_CMD_BUF[Ytsf_CMD_BUF_SIZE]={0x00}; //命令缓冲区
  27. uint8_t Ytsf_CMD_PARM[Ytsf_CMD_PARM_SIZE]={0x00}; //命令参数
  28. uint8_t MAX_CMD_LIST=0; //命令列表数量
  29. bool YTSF_OnUse=true; //英泰赛福模块在位
  30. volatile bool Port0_OnUse=true; //端口0使用标记
  31. volatile bool Port1_OnUse=true; //端口1使用标记
  32. bool Port0_GunTotal=1; //端口0枪数
  33. bool Port1_GunTotal=1; //端口0枪数
  34. bool PORT0_SN_CHANGED=false;
  35. bool PORT1_SN_CHANGED=false;
  36. bool PORT0_ZLJ_CHANGED = false;
  37. bool PORT1_ZLJ_CHANGED = false;
  38. volatile uint32_t YTSF_PORT0_Send_Delay = 0;
  39. volatile uint32_t YTSF_PORT1_Send_Delay = 0;
  40. volatile uint32_t YTSF_PORT0_Send_CNT = 0;
  41. volatile uint32_t YTSF_PORT1_Send_CNT = 0;
  42. uint8_t mYTSF_state=YTSF_STATE_IDLE;
  43. //uint8_t mYTSF_state_port0=YTSF_STATE_IDLE;
  44. //uint8_t mYTSF_state_port1=YTSF_STATE_IDLE;
  45. tYTSFRxFrame_t YTSF_rx_frame;
  46. tYTSFRxFrame_t YTSF_rx_frame_port[2];
  47. tYTSFRxFrame_t Tax_rx_frame[2];
  48. tDevice_t mDevice;
  49. //tYtsfDeviceReg_t mDeviceReg;
  50. uint8_t Ytsf_CMD_A1[]={
  51. 0xbb, //前导码
  52. 0x10, //长度码
  53. 0x81, //帧号
  54. 0x00, //端口号
  55. 0xa1, //命令码
  56. 0x11, //累计类型
  57. 0x00, //gun_num,00H:1号枪,01H:2号枪
  58. 0x00,0x00,0x00,0x00, //参数,默认0
  59. 0x00,0x00,0x00,0x00,0x00, //监控序列号
  60. 0x00,0x00 //校验码
  61. };
  62. uint8_t Ytsf_CMD_A2[]={
  63. 0xbb, //前导码
  64. 0x0d, //长度码
  65. 0x81, //帧号
  66. 0x00, //端口号
  67. 0xa2, //命令码
  68. 0x11, //信息类型
  69. 0x00, //gun_num,00H:1号枪,01H:2号枪
  70. 0x00,0x00,0x00,0x00, //参数,默认0
  71. 0x00,0x00, //预留
  72. 0x00,0x00 //校验码
  73. };
  74. uint8_t Ytsf_CMD_A5[]={
  75. 0xbb, //前导码
  76. 0x0d, //长度码
  77. 0x81, //帧号
  78. 0x00, //端口号
  79. 0xa5, //命令码
  80. 0x11, //信息类型
  81. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //参数,时钟8字节
  82. 0x00,0x00 //校验码
  83. };
  84. uint8_t CMD_LIST_polling=0;
  85. uint16_t CMD_LIST_polling_port0=0;
  86. uint16_t CMD_LIST_polling_port1=0;
  87. //YTSF_CMD_Tx(Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  88. uint8_t CMD_LIST[][6]={ //命令列表
  89. //第0个元素表示是否使能
  90. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00},
  91. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_01},
  92. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_02},
  93. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_10},
  94. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_11},
  95. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_20},
  96. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_21},
  97. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00},
  98. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_01},
  99. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_02},
  100. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_10},
  101. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_11},
  102. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_20},
  103. {CMD_dn,Ytsf_CMD_A2_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_21},
  104. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  105. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  106. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  107. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  108. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  109. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  110. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  111. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  112. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  113. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  114. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  115. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  116. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  117. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  118. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  119. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  120. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  121. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  122. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  123. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  124. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  125. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  126. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  127. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  128. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  129. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  130. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  131. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  132. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  133. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  134. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  135. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  136. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  137. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  138. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  139. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  140. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  141. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  142. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  143. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  144. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  145. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  146. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  147. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  148. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  149. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  150. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  151. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  152. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  153. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_1,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  154. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  155. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  156. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  157. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  158. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_2,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  159. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  160. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  161. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  162. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  163. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_3,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  164. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  165. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  166. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  167. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  168. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_4,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  169. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  170. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  171. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  172. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  173. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_5,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  174. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  175. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  176. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  177. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  178. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_6,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  179. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11},
  180. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_12},
  181. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_13},
  182. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14},
  183. {CMD_dn,Ytsf_CMD_A1_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_7,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_20},
  184. {CMD_dn,Ytsf_CMD_A5_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_00},
  185. {CMD_dn,Ytsf_CMD_A5_SIZE+1,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_01},
  186. {CMD_dn,Ytsf_CMD_A5_SIZE,Ytsf_PORT_0,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_FF},
  187. {CMD_dn,Ytsf_CMD_A5_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_00},
  188. {CMD_dn,Ytsf_CMD_A5_SIZE+1,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_01},
  189. {CMD_dn,Ytsf_CMD_A5_SIZE,Ytsf_PORT_1,Ytsf_GUN_NUM_0,Ytsf_CMD_INSTRUCT_A5,Ytsf_CMD_TYPE_FF},
  190. //
  191. {CMD_dn,0x06,TAX_PORT_0,TAX_GUN_NUM_0,0x83,0x00},
  192. {CMD_dn,0x06,TAX_PORT_1,TAX_GUN_NUM_0,0x83,0x00},
  193. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  194. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  195. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  196. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  197. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  198. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  199. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  200. {CMD_dn,0x07,TAX_PORT_0,TAX_GUN_NUM_0,0x86,0x00},
  201. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  202. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  203. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  204. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  205. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  206. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  207. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  208. {CMD_dn,0x08,TAX_PORT_0,TAX_GUN_NUM_0,0x89,0x00},
  209. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  210. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  211. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  212. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  213. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  214. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  215. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  216. {CMD_dn,0x07,TAX_PORT_1,TAX_GUN_NUM_0,0x86,0x00},
  217. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  218. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  219. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  220. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  221. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  222. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  223. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00},
  224. {CMD_dn,0x08,TAX_PORT_1,TAX_GUN_NUM_0,0x89,0x00}
  225. };
  226. int16_t YTSF_SET_STATE_port(uint8_t mport,uint8_t s,uint8_t mode);
  227. int16_t TAX_SET_STATE_port(uint8_t mport,uint8_t s,uint8_t mode);
  228. /********************************
  229. 获取命令列表总数
  230. ********************************/
  231. uint8_t Get_MAX_CMD_LIST(void)
  232. {
  233. MAX_CMD_LIST = sizeof(CMD_LIST)/sizeof(CMD_LIST[0]);
  234. return MAX_CMD_LIST;
  235. }
  236. void YTSF_GPIO_Init(void)
  237. {
  238. GPIO_InitTypeDef GPIO_InitStructure;
  239. //YTSF_GPIO_REV1_RST_N PC8
  240. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 //复位
  241. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PC.8 端口配置
  242. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  243. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度为2MHz
  244. GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC 8
  245. GPIO_SetBits(GPIOC,GPIO_Pin_8); //置高PC8
  246. //YTSF_GPIO_REV2 PB4
  247. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 预留的
  248. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PB.4 端口配置
  249. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
  250. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度为2MHz
  251. GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB 4
  252. //GPIO_SetBits(GPIOB,GPIO_Pin_4); //置高PB4
  253. //YTSF_GPIO_REV3_DETECT_N A11
  254. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
  255. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //Pin_11 Pin_12 端口配置
  256. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //推挽输出
  257. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度为2MHz
  258. GPIO_Init(GPIOA, &GPIO_InitStructure);
  259. //GPIO_SetBits(GPIOA,GPIO_Pin_11); //在位
  260. //YTSF_GPIO_REV4_EN_N A12
  261. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟
  262. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //Pin_12 端口配置
  263. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  264. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度为2MHz
  265. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.11,12
  266. GPIO_ResetBits(GPIOA,GPIO_Pin_12); //使能 //低使能
  267. }
  268. /********************************
  269. 初始化
  270. ********************************/
  271. uint8_t Get_Ytsf_init(void){
  272. // uint32_t mID=0x83010001;
  273. uint16_t temp=0;
  274. uint8_t returncode = 1;
  275. YTSF_GPIO_Init();
  276. if(YTSF_GPIO_DETECT==0)
  277. {
  278. YTSF_OnUse=true;
  279. YTSF_GPIO_EN();
  280. YTSF_DEBUG1("YTSF_GPIO_DETECT=%d,there is a YTSF DATA MODEL!\r\n",YTSF_GPIO_DETECT);
  281. GPIO_ResetBits(GPIOB,GPIO_Pin_10);
  282. YTSF_GPIO_RST();
  283. TIMDelay_Nms(1000);
  284. YTSF_GPIO_SET();
  285. GPIO_SetBits(GPIOB,GPIO_Pin_10);
  286. //TIMDelay_Nms(1000);
  287. }
  288. else{
  289. YTSF_OnUse=false;
  290. YTSF_GPIO_DN();
  291. YTSF_DEBUG1("YTSF_GPIO_DETECT=%d,there is no YTSF DATA MODEL!\r\n",YTSF_GPIO_DETECT);
  292. //return 1;
  293. }
  294. memset(&mDevice,0,sizeof(mDevice));
  295. //mDevice.port[0].state_m=1;
  296. mDevice.port[0].gun[0].state=1;
  297. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT0_SN0], &temp)==0)
  298. {
  299. mDevice.port[0].mntr_sn[0] = temp & 0xff;
  300. }
  301. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT0_SN1], &temp)==0)
  302. {
  303. mDevice.port[0].mntr_sn[1] = (temp>>8) & 0xff;
  304. mDevice.port[0].mntr_sn[2] = (temp>>0) & 0xff;
  305. }
  306. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT0_SN2], &temp)==0)
  307. {
  308. mDevice.port[0].mntr_sn[3] = (temp>>8) & 0xff;
  309. mDevice.port[0].mntr_sn[4] = (temp>>0) & 0xff;
  310. }
  311. //mDevice.port[1].state=1;
  312. mDevice.port[1].gun[0].state=1;
  313. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT1_SN0], &temp)==0)
  314. {
  315. mDevice.port[1].mntr_sn[0] = temp & 0xff;
  316. }
  317. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT1_SN1], &temp)==0)
  318. {
  319. mDevice.port[1].mntr_sn[1] = (temp>>8) & 0xff;
  320. mDevice.port[1].mntr_sn[2] = (temp>>0) & 0xff;
  321. }
  322. if(EE_ReadVariable(VirtAddVarTab[CURSET_YTSF_PORT1_SN2], &temp)==0)
  323. {
  324. mDevice.port[1].mntr_sn[3] = (temp>>8) & 0xff;
  325. mDevice.port[1].mntr_sn[4] = (temp>>0) & 0xff;
  326. }
  327. //读取ID信息
  328. if(EE_ReadVariable(VirtAddVarTab[CURSET_DEVICE_DevAddr0], &temp)==0)
  329. {
  330. mDevice.device_id = (((uint32_t)temp) << 16);
  331. }
  332. else{
  333. mDevice.device_id = ((uint32_t)(0xFFFF) << 16);
  334. }
  335. if(EE_ReadVariable(VirtAddVarTab[CURSET_DEVICE_DevAddr1], &temp)==0)
  336. {
  337. mDevice.device_id += (uint32_t)temp;
  338. }
  339. else{
  340. mDevice.device_id += (0xFFFF);
  341. }
  342. mDevice.chan_index = 0;
  343. mDevice.chan_total = 0;
  344. mDevice.port[Ytsf_PORT_0].zlj_state=0;
  345. mDevice.port[Ytsf_PORT_1].zlj_state=0;
  346. mDevice.chk_zlj = 0;
  347. mDevice.lora_send_state = 1;
  348. mDevice.encrypt = YTSF_OnUse;
  349. mDevice.ytsf_state = YTSF_OnUse;
  350. mDevice.lora_nosend_timeout = 60*1000;
  351. mDevice.lora_nosend_period = TickCounter - mDevice.lora_nosend_timeout;
  352. //LoRa_SendTimeCouter = TickCounter - LoRa_SendTimeOut;
  353. mDevice.port[Ytsf_PORT_0].loop_sn_timeout = 5*1000;
  354. mDevice.port[Ytsf_PORT_0].loop_sn_period = TickCounter;// - mDevice.port[Ytsf_PORT_0].loop_sn_timeout;
  355. mDevice.port[Ytsf_PORT_0].loop_zlj_timeout = 20*1000;
  356. mDevice.port[Ytsf_PORT_0].loop_zlj_period = TickCounter - mDevice.port[Ytsf_PORT_0].loop_zlj_timeout;
  357. mDevice.port[Ytsf_PORT_0].loop_dc_timeout = 8*1000;
  358. mDevice.port[Ytsf_PORT_0].loop_dc_period = TickCounter - mDevice.port[Ytsf_PORT_0].loop_dc_timeout;
  359. mDevice.port[Ytsf_PORT_1].loop_sn_timeout = 5*1000;
  360. mDevice.port[Ytsf_PORT_1].loop_sn_period = TickCounter - mDevice.port[Ytsf_PORT_1].loop_sn_timeout/2 + 1;
  361. mDevice.port[Ytsf_PORT_1].loop_zlj_timeout = 20*1000;
  362. mDevice.port[Ytsf_PORT_1].loop_zlj_period = TickCounter - mDevice.port[Ytsf_PORT_1].loop_zlj_timeout/2 +1;
  363. mDevice.port[Ytsf_PORT_1].loop_dc_timeout = 8*1000;
  364. mDevice.port[Ytsf_PORT_1].loop_dc_period = TickCounter - mDevice.port[Ytsf_PORT_1].loop_dc_timeout+1;
  365. //mDeviceReg init
  366. if(mDevice.lora_send_state)
  367. Get_MAX_CMD_LIST();
  368. YTSF_SET_STATE_port(Ytsf_PORT_0,YTSF_STATE_IDLE,STATE_M_MODE_INIT);
  369. YTSF_SET_STATE_port(Ytsf_PORT_1,YTSF_STATE_IDLE,STATE_M_MODE_INIT);
  370. TAX_SET_STATE_port(TAX_PORT_0,YTSF_STATE_IDLE,STATE_M_MODE_INIT);
  371. TAX_SET_STATE_port(TAX_PORT_1,YTSF_STATE_IDLE,STATE_M_MODE_INIT);
  372. #ifdef XXXXYTSF_DEBUG_EN
  373. for(i=0;i<MAX_CMD_LIST;i++)
  374. {
  375. for(j=0;j<6;j++)
  376. //YTSF_DEBUG("%02x ",CMD_LIST[i][j]);
  377. //YTSF_DEBUG("\r\n");
  378. printf("%02x ",CMD_LIST[i][j]);
  379. printf("\r\n");
  380. }
  381. #endif
  382. /*
  383. index = Get_CMD_Index_ByParm(Ytsf_PORT_0,0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  384. YTSF_DEBUG1("index=%d\r\n",index);
  385. if(index >=0)
  386. YTSF_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  387. TIMDelay_Nms(500);
  388. index = Get_CMD_Index_ByParm(Ytsf_PORT_1,0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  389. YTSF_DEBUG1("index=%d\r\n",index);
  390. if(index >=0)
  391. YTSF_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  392. TIMDelay_Nms(500);
  393. */
  394. returncode = 0;
  395. return returncode;
  396. }
  397. /********************************
  398. 命令使能,通过索引寻址
  399. ********************************/
  400. int16_t Set_CMD_Enable_ByIndex(uint16_t index)
  401. {
  402. if(index >= MAX_CMD_LIST)
  403. return -1;
  404. CMD_LIST[index][0] = CMD_en;
  405. return 0;
  406. }
  407. /********************************
  408. 命令去使能,通过索引寻址
  409. ********************************/
  410. int16_t ReSet_CMD_Enable_ByIndex(uint16_t index)
  411. {
  412. if(index >= MAX_CMD_LIST)
  413. return -1;
  414. CMD_LIST[index][0] = CMD_dn;
  415. return 0;
  416. }
  417. /********************************
  418. 命令使能,通过参数寻址
  419. ********************************/
  420. int16_t Set_CMD_Enable_ByParm(uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type)
  421. {
  422. uint16_t i=0;
  423. for(i=0;i<MAX_CMD_LIST;i++)
  424. {
  425. if((CMD_LIST[i][2] == port)&&(CMD_LIST[i][3] == gun)&&(CMD_LIST[i][4] == instruct)&&(CMD_LIST[i][5] == type))
  426. CMD_LIST[i][0] = CMD_en;
  427. }
  428. return i;
  429. }
  430. /********************************
  431. 命令去使能,通过参数寻址
  432. ********************************/
  433. int16_t ReSet_CMD_Enable_ByParm(uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type)
  434. {
  435. uint16_t i=0;
  436. for(i=0;i<MAX_CMD_LIST;i++)
  437. {
  438. if((CMD_LIST[i][2] == port)&&(CMD_LIST[i][3] == gun)&&(CMD_LIST[i][4] == instruct)&&(CMD_LIST[i][5] == type))
  439. CMD_LIST[i][0] = CMD_dn;
  440. }
  441. return i;
  442. }
  443. /********************************
  444. 命令使能,通过端口寻址
  445. ********************************/
  446. int16_t Set_CMD_Enable_ByPort(uint8_t port)
  447. {
  448. uint16_t i=0;
  449. for(i=0;i<MAX_CMD_LIST;i++)
  450. {
  451. if(CMD_LIST[i][2] == port)
  452. CMD_LIST[i][0] = CMD_en;
  453. }
  454. return i;
  455. }
  456. /********************************
  457. 命令去使能,通过端口寻址
  458. ********************************/
  459. int16_t ReSet_CMD_Enable_ByPort(uint8_t port)
  460. {
  461. uint16_t i=0;
  462. for(i=0;i<MAX_CMD_LIST;i++)
  463. {
  464. if(CMD_LIST[i][2] == port)
  465. CMD_LIST[i][0] = CMD_dn;
  466. }
  467. return i;
  468. }
  469. /********************************
  470. 命令使能,通过端口及枪号寻址
  471. ********************************/
  472. int16_t Set_CMD_Enable_ByGun(uint8_t port,uint8_t gun)
  473. {
  474. uint16_t i=0;
  475. for(i=0;i<MAX_CMD_LIST;i++)
  476. {
  477. if((CMD_LIST[i][2] == port)&&(CMD_LIST[i][3] == gun))
  478. CMD_LIST[i][0] = CMD_en;
  479. }
  480. return i;
  481. }
  482. /********************************
  483. 命令去使能,通过端口及枪号寻址
  484. ********************************/
  485. int16_t ReSet_CMD_Enable_ByGun(uint8_t port,uint8_t gun)
  486. {
  487. uint8_t i=0;
  488. for(i=0;i<MAX_CMD_LIST;i++)
  489. {
  490. if((CMD_LIST[i][2] == port)&&(CMD_LIST[i][3] == gun))
  491. CMD_LIST[i][0] = CMD_dn;
  492. }
  493. return i;
  494. }
  495. /********************************
  496. 获取索引,通过参数寻址
  497. ********************************/
  498. int16_t Get_CMD_Index_ByParm(uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type)
  499. {
  500. uint8_t i =0;
  501. for(i=0;i<MAX_CMD_LIST;i++)
  502. {
  503. if((CMD_LIST[i][2]==port)&&(CMD_LIST[i][3]==gun)&&(CMD_LIST[i][4]==instruct)&&(CMD_LIST[i][5]==type))
  504. return i;
  505. }
  506. YTSF_DEBUG1("port=%d,gun=%d,instruct=%d,type=%d\r\n",port,gun,instruct,type);
  507. return -1;
  508. }
  509. /************************************************
  510. 函数名称 : Get_Ytsf_CMD_A1
  511. 功 能 : 发送命令
  512. 参 数 : cmd 命令指针
  513. size 命令长度
  514. port 端口
  515. type 命令类型
  516. gun 抢号
  517. parameter 参数
  518. 返 回 值 : 无
  519. 作 者 : scx
  520. *************************************************/
  521. int8_t Get_Ytsf_CMD(uint8_t size,uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type){
  522. uint8_t i=0;
  523. // uint8_t j=0;
  524. uint8_t sum_check=0;
  525. uint8_t temp=0;
  526. uint8_t index=0;
  527. uint16_t crc=0;
  528. uint8_t *cmd=Ytsf_CMD_BUF;
  529. // uint8_t tbuf[128];
  530. // uint8_t tlen=0;
  531. //0xa1 累计数读取指令
  532. //0xa2 油机信息读取指令
  533. //0xa5 模块操作指令
  534. //0xaf 中转指令
  535. switch(instruct){
  536. case Ytsf_CMD_INSTRUCT_A1:
  537. index = 0;
  538. if(size!=Ytsf_CMD_A1_SIZE)
  539. return YTSF_CMD_ERROR_LEN;//帧长度错误.
  540. if(cmd==NULL)
  541. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  542. if((type==Ytsf_CMD_TYPE_11)|(type==Ytsf_CMD_TYPE_12)|(type==Ytsf_CMD_TYPE_13)|(type==Ytsf_CMD_TYPE_14)|(type==Ytsf_CMD_TYPE_20))
  543. {
  544. index=0;
  545. }
  546. else{
  547. return YTSF_CMD_ERROR_TYPE;//累计类型错误
  548. }
  549. cmd[index++]=0xbb; //前导码,固定0xbb
  550. cmd[index++]=size-2; //帧长度
  551. cmd[index++]=0x81; //帧号,单帧固定0x81
  552. cmd[index++]=port; //端口号,税控口号
  553. cmd[index++]=instruct; //指令码
  554. cmd[index++]=type; //类型码
  555. cmd[index++]=gun; //枪号
  556. if((type==0x11)|(type==0x14))
  557. {
  558. cmd[index++]=0x00; //操作参数
  559. cmd[index++]=0x00;
  560. cmd[index++]=0x00;
  561. cmd[index++]=0x00;
  562. }
  563. else if(type==0x20)
  564. {
  565. cmd[index++]=0x01; //操作参数
  566. cmd[index++]=0x00;
  567. cmd[index++]=0x00;
  568. cmd[index++]=0x00;
  569. }
  570. else
  571. {
  572. cmd[index++]=Ytsf_CMD_PARM[0]; //操作参数
  573. cmd[index++]=Ytsf_CMD_PARM[1];
  574. cmd[index++]=Ytsf_CMD_PARM[2];
  575. cmd[index++]=Ytsf_CMD_PARM[3];
  576. }
  577. temp = 0;
  578. for(i=0;i<5;i++){
  579. if((mDevice.port[port].mntr_sn[i]==0)|(mDevice.port[port].mntr_sn[i]==0xff))
  580. temp++;
  581. }
  582. if(temp>=5)
  583. return YTSF_CMD_ERROR_SN;
  584. cmd[index++]=mDevice.port[port].mntr_sn[0]; //监控序列号
  585. cmd[index++]=mDevice.port[port].mntr_sn[1]; //监控序列号
  586. cmd[index++]=mDevice.port[port].mntr_sn[2]; //监控序列号
  587. cmd[index++]=mDevice.port[port].mntr_sn[3]; //监控序列号
  588. cmd[index++]=mDevice.port[port].mntr_sn[4]; //监控序列号
  589. crc = GetCRC16(cmd,size-2);
  590. cmd[index++]=crc>>8; //crc16校验,
  591. cmd[index++]=crc>>0;
  592. break;
  593. case Ytsf_CMD_INSTRUCT_A2:
  594. index = 0;
  595. if(size!=Ytsf_CMD_A2_SIZE)
  596. return YTSF_CMD_ERROR_LEN;//帧长度错误.
  597. if(cmd==NULL)
  598. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  599. if((type==Ytsf_CMD_TYPE_00)|(type==Ytsf_CMD_TYPE_01)|(type==Ytsf_CMD_TYPE_02)|(type==Ytsf_CMD_TYPE_10)|(type==Ytsf_CMD_TYPE_11)|(type==Ytsf_CMD_TYPE_20)|(type==Ytsf_CMD_TYPE_21))
  600. {
  601. index=0;
  602. }
  603. else{
  604. return YTSF_CMD_ERROR_TYPE;//信息类型错误
  605. }
  606. cmd[index++]=0xbb; //前导码,固定0xbb
  607. cmd[index++]=size-2; //帧长度
  608. cmd[index++]=0x81; //帧号,单帧固定0x81
  609. cmd[index++]=port; //端口号,税控口号
  610. cmd[index++]=instruct; //指令码
  611. cmd[index++]=type; //类型码
  612. cmd[index++]=gun; //枪号
  613. cmd[index++]=0x00; //操作参数
  614. cmd[index++]=0x00;
  615. cmd[index++]=0x00;
  616. cmd[index++]=0x00;
  617. cmd[index++]=0x00; //预留参数
  618. cmd[index++]=0x00; //预留参数
  619. crc = GetCRC16(cmd,size-2);
  620. cmd[index++]=crc>>8; //crc16校验,
  621. cmd[index++]=crc>>0;
  622. break;
  623. case Ytsf_CMD_INSTRUCT_A5:
  624. index = 0;
  625. if(cmd==NULL)
  626. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  627. if((type==0x00)|(type==0xff))
  628. {
  629. if(size!=8)
  630. return YTSF_CMD_ERROR_LEN; //帧长度错误.
  631. }
  632. if(type==0x01)
  633. {
  634. if(size!=9)
  635. return YTSF_CMD_ERROR_LEN; //帧长度错误.
  636. }
  637. if((type==Ytsf_CMD_TYPE_00)|(type==Ytsf_CMD_TYPE_01)|(type==Ytsf_CMD_TYPE_FF))
  638. {
  639. index=0;
  640. }
  641. else{
  642. return YTSF_CMD_ERROR_TYPE;//操作类型错误
  643. }
  644. cmd[index++]=0xbb; //前导码,固定0xbb
  645. cmd[index++]=size-2; //帧长度
  646. cmd[index++]=0x81; //帧号,单帧固定0x81
  647. cmd[index++]=port; //端口号,税控口号
  648. cmd[index++]=instruct; //指令码
  649. cmd[index++]=type; //类型码
  650. if(type==0x01)
  651. {
  652. cmd[index++]=0x00; //0x00读,0x01写
  653. /*
  654. cmd[index++]=Ytsf_CMD_PARM[1]; //时间
  655. cmd[index++]=Ytsf_CMD_PARM[2]; //时间
  656. cmd[index++]=Ytsf_CMD_PARM[3]; //时间
  657. cmd[index++]=Ytsf_CMD_PARM[4]; //时间
  658. cmd[index++]=Ytsf_CMD_PARM[5]; //时间
  659. cmd[index++]=Ytsf_CMD_PARM[6]; //时间
  660. cmd[index++]=Ytsf_CMD_PARM[7]; //时间
  661. */
  662. }
  663. crc = GetCRC16(cmd,size-2);
  664. cmd[index++]=crc>>8; //crc16校验,
  665. cmd[index++]=crc>>0;
  666. break;
  667. case 0x83:
  668. index = 0;
  669. if(cmd==NULL)
  670. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  671. if(size!=6)
  672. return YTSF_CMD_ERROR_LEN; //帧长度错误.
  673. cmd[index++]=0xbb; //前导码,固定0xbb
  674. cmd[index++]=size-2; //帧长度
  675. cmd[index++]=0xff; //帧号,
  676. cmd[index++]=0x83; //指令码
  677. cmd[index++]=0x00; //参数,枪号
  678. for(i=2;i<index;i++){
  679. sum_check ^=cmd[i];
  680. }
  681. cmd[index++] = sum_check; //和校验
  682. break;
  683. case 0x86:
  684. index = 0;
  685. if(cmd==NULL)
  686. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  687. if(size!=7)
  688. return YTSF_CMD_ERROR_LEN; //帧长度错误.
  689. cmd[index++]=0xbb; //前导码,固定0xbb
  690. cmd[index++]=size-2; //帧长度
  691. cmd[index++]=0xff; //帧号,
  692. cmd[index++]=0x86; //指令码
  693. cmd[index++]=gun; //参数,枪号
  694. cmd[index++]=0x01; //return_method,01明文输出
  695. for(i=2;i<index;i++){
  696. sum_check ^=cmd[i];
  697. }
  698. cmd[index++] = sum_check; //和校验
  699. break;
  700. case 0x89:
  701. index = 0;
  702. if(cmd==NULL)
  703. return YTSF_CMD_ERROR_CMD;//指令指针为空.
  704. if(size!=8)
  705. return YTSF_CMD_ERROR_LEN; //帧长度错误.
  706. cmd[index++]=0xbb; //前导码,固定0xbb
  707. cmd[index++]=size-2; //帧长度
  708. cmd[index++]=0xff; //帧号,
  709. cmd[index++]=0x86; //指令码
  710. cmd[index++]=gun; //参数,枪号
  711. cmd[index++]=0x00; //mode,0x00累计加油,0x01出厂调试用油量,0x02剂量后油量
  712. cmd[index++]=0x01; //return_method,0x01明文输出
  713. for(i=2;i<index;i++){
  714. sum_check ^=cmd[i];
  715. }
  716. cmd[index++] = sum_check; //和校验
  717. break;
  718. default:
  719. return YTSF_CMD_ERROR_CMD;
  720. }
  721. return index;
  722. }
  723. /************************************************
  724. 函数名称 : YTSF_CMD_Tx_A1
  725. 功 能 : 发送命令
  726. 参 数 : cmd 命令指针
  727. size 命令长度
  728. port 端口
  729. type 命令类型
  730. gun 抢号
  731. parameter 参数
  732. 返 回 值 : 无
  733. 作 者 : scx
  734. *************************************************/
  735. uint8_t YTSF_CMD_Tx(uint8_t size,uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type){
  736. int8_t cmd_l=0;
  737. // uint8_t sout[64]={0};
  738. // uint8_t lout=0;
  739. // uint8_t tmp=0;
  740. // uint16_t i=0;
  741. //uint8_t result=0;
  742. //cmd_l=Get_Ytsf_CMD(Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_00,Ytsf_GUN_NUM_0);
  743. cmd_l=Get_Ytsf_CMD(size,port,gun,instruct,type);
  744. if(cmd_l<0)
  745. switch(cmd_l){
  746. case YTSF_CMD_ERROR_CMD:
  747. YTSF_DEBUG1("YTSF_CMD_ERROR_CMD\r\n");
  748. break;
  749. case YTSF_CMD_ERROR_LEN:
  750. YTSF_DEBUG1("YTSF_CMD_ERROR_LEN\r\n");
  751. break;
  752. case YTSF_CMD_ERROR_TYPE:
  753. YTSF_DEBUG1("YTSF_CMD_ERROR_TYPE\r\n");
  754. break;
  755. case YTSF_CMD_ERROR_SN:
  756. YTSF_DEBUG1("YTSF_CMD_ERROR_SN\r\n");
  757. break;
  758. default:
  759. break;
  760. }
  761. if(cmd_l < 0)
  762. YTSF_DEBUG1("YTSF SEND CMD,获取发送指令失败\r\n");
  763. else if(cmd_l < 100)
  764. {
  765. YTSF_DEBUG1("YTSF SEND CMD=");
  766. YTSF_DEBUG2(Ytsf_CMD_BUF,cmd_l);
  767. }
  768. else
  769. YTSF_DEBUG1("YTSF SEND CMD,指令长达太长,>100.\r\n");
  770. if(cmd_l>0)
  771. {
  772. UART4_SendNByte(Ytsf_CMD_BUF,cmd_l);
  773. if(port==0){
  774. YTSF_PORT0_Send_CNT++;
  775. YTSF_PORT0_Send_Delay = TickCounter;
  776. start_led(2,cmd_l,10,30*10);//(led,delay*0.1ms,duty,period*0.1ms)
  777. }
  778. if(port==1){
  779. YTSF_PORT1_Send_CNT++;
  780. YTSF_PORT1_Send_Delay = TickCounter;
  781. start_led(3,cmd_l,10,30*10);//(led,delay*0.1ms,duty,period*0.1ms)
  782. }
  783. }
  784. return 0;
  785. }
  786. /*
  787. uint8_t Ytsf_CMD_polling(void){
  788. uint8_t i =0;
  789. if(CMD_LIST[CMD_LIST_polling][0]!=CMD_en)
  790. {
  791. for(i=0;i<MAX_CMD_LIST;i++)
  792. {
  793. if(CMD_LIST[(i+CMD_LIST_polling+1) % MAX_CMD_LIST][0]==CMD_dn)
  794. {
  795. continue;
  796. }else{
  797. CMD_LIST_polling=(i+CMD_LIST_polling+1) % MAX_CMD_LIST;
  798. break;
  799. }
  800. }
  801. }
  802. if(CMD_LIST[CMD_LIST_polling][0]==CMD_en)
  803. {
  804. YTSF_DEBUG("\r\n\r\n");
  805. YTSF_DEBUG1("CMD_LIST_polling=%d\r\n",CMD_LIST_polling);
  806. //YTSF_CMD_Tx(Ytsf_CMD_A2_SIZE, Ytsf_PORT_0, Ytsf_GUN_NUM_0, Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  807. YTSF_CMD_Tx(CMD_LIST[CMD_LIST_polling][1],CMD_LIST[CMD_LIST_polling][2],CMD_LIST[CMD_LIST_polling][3],CMD_LIST[CMD_LIST_polling][4],CMD_LIST[CMD_LIST_polling][5]);
  808. }
  809. CMD_LIST_polling++;
  810. CMD_LIST_polling%=MAX_CMD_LIST;
  811. return CMD_LIST_polling;
  812. }
  813. */
  814. uint8_t Ytsf_CMD_polling_port(uint8_t mport){
  815. uint8_t i =0;
  816. uint16_t *poll;
  817. if(mport == Ytsf_PORT_0){
  818. poll = &CMD_LIST_polling_port0;
  819. }
  820. if(mport == Ytsf_PORT_1){
  821. poll = &CMD_LIST_polling_port1;
  822. }
  823. YTSF_DEBUG1("Ytsf_CMD_polling_port mport=%d,poll=%d.\r\n",mport,*poll);
  824. if(CMD_LIST[*poll][0]!=CMD_en)
  825. {
  826. for(i=0;i<MAX_CMD_LIST;i++)
  827. {
  828. if((CMD_LIST[(i+*poll+1) % MAX_CMD_LIST][0]!=CMD_en) || (CMD_LIST[(i+*poll+1) % MAX_CMD_LIST][2]!=mport))
  829. {
  830. continue;
  831. }else{
  832. *poll=(i+*poll+1) % MAX_CMD_LIST;
  833. break;
  834. }
  835. }
  836. }
  837. if((CMD_LIST[*poll][0]==CMD_en)&&(CMD_LIST[*poll][2]==mport))
  838. {
  839. YTSF_DEBUG("\r\n\r\n");
  840. YTSF_DEBUG1("CMD port[%d] index =%d\r\n",mport,*poll);
  841. //YTSF_CMD_Tx(Ytsf_CMD_A2_SIZE, Ytsf_PORT_0, Ytsf_GUN_NUM_0, Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  842. YTSF_CMD_Tx(CMD_LIST[*poll][1],CMD_LIST[*poll][2],CMD_LIST[*poll][3],CMD_LIST[*poll][4],CMD_LIST[*poll][5]);
  843. }
  844. *poll = *poll +1;
  845. *poll = *poll % MAX_CMD_LIST;
  846. return *poll;
  847. }
  848. /************************************************
  849. 函数名称 : GetYtsfStatus
  850. 功 能 : 获取英泰赛福状态
  851. 参 数 : 无
  852. 返 回 值 : 无
  853. 作 者 : scx
  854. *************************************************/
  855. uint8_t GetYtsfStatus(void){
  856. return 0;
  857. }
  858. /************************************************
  859. 函数名称 : GetYtsfStatus
  860. 功 能 : 获取英泰赛福状态
  861. 参 数 : 无
  862. 返 回 值 : crc
  863. 作 者 : scx
  864. *************************************************/
  865. uint16_t GetCRC16(uint8_t *_buff,uint32_t _len)
  866. {
  867. uint32_t i,j;
  868. uint16_t crc;
  869. uint16_t temp;
  870. crc=(uint16_t)CRC_INIT_VALUE;
  871. for(i=0;i<_len;i++)
  872. {
  873. temp=_buff[i];
  874. temp &=0x00FF;
  875. crc^=temp;
  876. for(j=0;j<8;j++)
  877. {
  878. if((crc&0x0001)!=0x00)
  879. {
  880. crc>>=1;
  881. crc^=0xA001;
  882. }
  883. else
  884. {
  885. crc>>=1;
  886. }
  887. }
  888. }
  889. //printf("%x " ,crc);
  890. return crc;
  891. }
  892. int8_t Ytsf_CMD_Analysis2(tYTSFRxFrame_t *frame,uint8_t *sbuf,uint8_t slen){
  893. int8_t ReturnCode = -1;
  894. uint16_t scrc=0x0000;
  895. uint8_t tbuf[128];
  896. uint8_t tlen = 0;
  897. int16_t i=0;
  898. YTSF_DEBUG1("Rev len=%d,CMD=",slen);
  899. YTSF_DEBUG2(sbuf,slen);
  900. if(sbuf==NULL)
  901. {
  902. YTSF_DEBUG1("error:tbuf==NULL\r\n");
  903. return ReturnCode;
  904. }
  905. //帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前来计算。
  906. //检查0xba 0x00,并替换为0xba
  907. tlen = 0;
  908. for(i = 0;i < slen - 1; i ++){
  909. if((sbuf[i] == 0xba) && (sbuf[i+1] == 0x00)){
  910. tbuf[tlen++] = 0xba;
  911. i++;
  912. }
  913. else{
  914. tbuf[tlen++] = sbuf[i];
  915. }
  916. }
  917. if(!((sbuf[slen-2] == 0xba) && (sbuf[slen-1] == 0x00))){
  918. tbuf[tlen++] = sbuf[i];
  919. }
  920. //检查0xba 0x01,并替换为0xbb
  921. slen = 0;
  922. for(i = 0;i < tlen - 1; i ++){
  923. if((tbuf[i] == 0xba) && (tbuf[i+1] == 0x01)){
  924. sbuf[slen++] = 0xbb;
  925. i++;
  926. }
  927. else{
  928. sbuf[slen++] = tbuf[i];
  929. }
  930. }
  931. if(!((tbuf[tlen-2] == 0xba) && (tbuf[tlen-1] == 0x01))){
  932. sbuf[slen++] = tbuf[i];
  933. }
  934. //帧头(1Byte)
  935. frame->fhead = sbuf[0];
  936. if(frame->fhead!=0xbb)
  937. {
  938. YTSF_DEBUG1("error:frame->fhead != 0xbb,fhead=0x%02X\r\n",frame->fhead);
  939. return ReturnCode;
  940. }
  941. //帧长度(1Byte)
  942. frame->flen = sbuf[1];
  943. if(frame->flen>32)
  944. {
  945. YTSF_DEBUG1("error:len > 32,frame->flen=0x%02X\r\n",frame->flen);
  946. return ReturnCode;
  947. }
  948. if(frame->flen!=slen-2)
  949. {
  950. YTSF_DEBUG1("error:frame->flen!=slen-2,frame->flen=0x%02X,slen=0x%02X\r\n",frame->flen,slen);
  951. return ReturnCode;
  952. }
  953. //CRC校验(2Byte)
  954. frame->fcrc = GetCRC16(sbuf,frame->flen);
  955. scrc = (sbuf[frame->flen]<<8 | sbuf[frame->flen+1]);
  956. if(frame->fcrc != scrc)
  957. {
  958. YTSF_DEBUG1("error:crc error!,frame->fcrc=0x%04X,scrc=0x%04X\r\n",frame->fcrc,scrc);
  959. return ReturnCode;
  960. }
  961. //税控口编号(1Byte),0税控口1,1税控口2
  962. frame->fport = sbuf[3];
  963. frame->fcmd = sbuf[4];
  964. frame->ftype = sbuf[5];
  965. //start_led(frame->fport+2,slen,99,10*10);//(led,delay*0.1ms,duty,period*0.1ms)
  966. //枪号
  967. if(frame->fcmd == Ytsf_CMD_INSTRUCT_A1)
  968. frame->fgun = sbuf[6];
  969. else if(frame->fcmd == Ytsf_CMD_INSTRUCT_A2)
  970. frame->fgun = sbuf[6];
  971. else
  972. frame->fgun = 0x00;
  973. mDevice.port[frame->fport].gun_index = frame->fgun;
  974. //读取结果
  975. if(frame->fcmd == Ytsf_CMD_INSTRUCT_A1)
  976. frame->fresult = sbuf[7];
  977. else if(frame->fcmd == Ytsf_CMD_INSTRUCT_A2)
  978. frame->fresult = sbuf[7];
  979. else if(frame->fcmd == Ytsf_CMD_INSTRUCT_A5)
  980. frame->fresult = sbuf[6];
  981. else
  982. frame->fresult = 0xff;
  983. switch(frame->fresult){
  984. case 0x00:YTSF_DEBUG1("指令执行错误\r\n");break;
  985. case 0x01:YTSF_DEBUG1("指令执行成功\r\n");break;
  986. case 0x02:YTSF_DEBUG1("数据模块忙,稍后再试\r\n");break;
  987. case 0x03:YTSF_DEBUG1("监控微处理器忙,稍后再试\r\n");break;
  988. case 0x04:YTSF_DEBUG1("监控微处理器通讯超时,超时时间设定为10秒\r\n");break;
  989. case 0x05:YTSF_DEBUG1("查询的记录不存在\r\n");break;
  990. case 0x10:YTSF_DEBUG1("监控微处理器序列号不存在\r\n");break;
  991. case 0x11:YTSF_DEBUG1("密文数据解密错误\r\n");break;
  992. default :break;
  993. }
  994. if(frame->fresult!=0x01){
  995. mDevice.port[frame->fport].zlj_state=0;
  996. return ReturnCode;
  997. }
  998. //读取数据(NByte)
  999. if(frame->fcmd == Ytsf_CMD_INSTRUCT_A1){
  1000. frame->fldata = slen-10;
  1001. memcpy(frame->fdata,sbuf+8,slen-10);
  1002. }
  1003. else if(frame->fcmd == Ytsf_CMD_INSTRUCT_A2){
  1004. frame->fldata = slen-10;
  1005. memcpy(frame->fdata,sbuf+8,slen-10);
  1006. }
  1007. else if(frame->fcmd == Ytsf_CMD_INSTRUCT_A5){
  1008. frame->fldata = slen-9;
  1009. memcpy(frame->fdata,sbuf+7,slen-9);
  1010. }
  1011. else{
  1012. //frame->fldata = 0xff;
  1013. //memset(frame->fdata,0xff,32);
  1014. }
  1015. YTSF_DEBUG1("frame:\r\n");
  1016. YTSF_DEBUG("frame->fhead=0x%02X\r\n",frame->fhead);
  1017. YTSF_DEBUG("frame->flen=0x%02X\r\n",frame->flen);
  1018. YTSF_DEBUG("frame->findex=0x%02X\r\n",frame->findex);
  1019. YTSF_DEBUG("frame->fport=0x%02X\r\n",frame->fport);
  1020. YTSF_DEBUG("frame->fcmd=0x%02X\r\n",frame->fcmd);
  1021. YTSF_DEBUG("frame->ftype=0x%02X\r\n",frame->ftype);
  1022. if(frame->fgun!=0xff)
  1023. YTSF_DEBUG("frame->fgun=0x%02X\r\n",frame->fgun);
  1024. if(frame->fresult!=0xff)
  1025. YTSF_DEBUG("frame->fresult=0x%02X\r\n",frame->fresult);
  1026. YTSF_DEBUG("frame->fldata=0x%02X,frame->fdata=",frame->fldata);
  1027. if(frame->fldata!=0xff){
  1028. YTSF_DEBUG2(frame->fdata,frame->fldata);
  1029. //YTSF_DEBUG("\r\n");
  1030. }
  1031. YTSF_DEBUG("frame->fcrc=0x%04X\r\n",frame->fcrc);
  1032. if((frame->fcmd == Ytsf_CMD_INSTRUCT_A2)||(frame->ftype == Ytsf_CMD_TYPE_00)){
  1033. if((frame->fdata[5] >= '0') && (frame->fdata[5] <= '8') ){
  1034. mDevice.port[frame->fport].mntr_factory = 1;
  1035. YTSF_DEBUG1("税控口%d,芯片厂家为:英泰赛福\r\n",frame->fport);
  1036. }
  1037. if((frame->fdata[5] >= 'A') && (frame->fdata[5] <= 'H') ){
  1038. mDevice.port[frame->fport].mntr_factory = 2;
  1039. YTSF_DEBUG1("税控口%d,芯片厂家为:拓盛\r\n",frame->fport);
  1040. }
  1041. switch(frame->fdata[5]){
  1042. case '0':
  1043. case '1':
  1044. case 'A':
  1045. case 'a':
  1046. mDevice.port[frame->fport].gun_max = 1;
  1047. break;
  1048. case '2':
  1049. case '3':
  1050. case 'B':
  1051. case 'b':
  1052. mDevice.port[frame->fport].gun_max = 2;
  1053. break;
  1054. case 'C':
  1055. case 'c':
  1056. mDevice.port[frame->fport].gun_max = 3;
  1057. break;
  1058. case '4':
  1059. case 'D':
  1060. case 'd':
  1061. mDevice.port[frame->fport].gun_max = 4;
  1062. break;
  1063. case '6':
  1064. case 'F':
  1065. case 'f':
  1066. mDevice.port[frame->fport].gun_max = 6;
  1067. break;
  1068. case '8':
  1069. case 'H':
  1070. case 'h':
  1071. mDevice.port[frame->fport].gun_max = 8;
  1072. break;
  1073. default:
  1074. mDevice.port[frame->fport].gun_max = 1;
  1075. break;
  1076. }
  1077. for(i=0;i<(mDevice.port[frame->fport].gun_max);i++){
  1078. Set_CMD_Enable_ByParm(frame->fport,i,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14);
  1079. }
  1080. for(i=0;i<(sizeof(CMD_LIST)/sizeof(CMD_LIST[0])-1);i++)
  1081. {
  1082. if((CMD_LIST[i][2]==frame->fport)&&(CMD_LIST[i][3]>mDevice.port[frame->fport].gun_max))
  1083. CMD_LIST[i][0]=CMD_dn;
  1084. };
  1085. }
  1086. if((frame->fcmd == Ytsf_CMD_INSTRUCT_A1) || (frame->fcmd == Ytsf_CMD_INSTRUCT_A2)){
  1087. //接收帧,按端口分开
  1088. memcpy(&YTSF_rx_frame_port[frame->fport],frame,sizeof(tYTSFRxFrame_t));
  1089. }
  1090. if((frame->fcmd == Ytsf_CMD_INSTRUCT_A1) && (frame->ftype == Ytsf_CMD_TYPE_14)){
  1091. //接收帧,按端口分开
  1092. YTSF_SET_STATE_port(frame->fport,YTSF_STATE_GUN_GET_ZongLeiJi_INIT,STATE_M_MODE_FORCE);
  1093. }
  1094. if((frame->fcmd == Ytsf_CMD_INSTRUCT_A1) && (frame->ftype == Ytsf_CMD_TYPE_11)){
  1095. //接收帧,按端口分开
  1096. memcpy(mDevice.port[frame->fport].dangci_frame,sbuf,slen);
  1097. mDevice.port[frame->fport].dangci_lframe = slen;
  1098. YTSF_SET_STATE_port(frame->fport,YTSF_STATE_GUN_GET_DangCi_INIT,STATE_M_MODE_FORCE);
  1099. }
  1100. if((frame->fcmd == Ytsf_CMD_INSTRUCT_A5) && (frame->ftype == Ytsf_CMD_TYPE_00)){
  1101. memcpy(mDevice.ytsf_id,frame->fdata,frame->fldata);
  1102. YTSF_DEBUG1("获取英泰赛福模块ID正常,mDevice.ytsf_id=");
  1103. YTSF_DEBUG2(mDevice.ytsf_id,12);
  1104. }
  1105. ReturnCode = frame->fport;
  1106. return ReturnCode;
  1107. }
  1108. uint8_t YTSF_GET_STATE(void){
  1109. return mYTSF_state;
  1110. }
  1111. uint8_t YTSF_SET_STATE(uint8_t s){
  1112. if(YTSF_GET_STATE()==YTSF_STATE_IDLE){
  1113. mYTSF_state = s;
  1114. return 0;
  1115. }
  1116. return 1;
  1117. }
  1118. int16_t YTSF_SET_STATE_port(uint8_t mport,uint8_t s,uint8_t mode){
  1119. static uint8_t status[2][8]={YTSF_STATE_IDLE};
  1120. static uint8_t front=sizeof(status[0]);
  1121. static uint8_t rear=sizeof(status[0]);
  1122. static uint8_t sum=0;
  1123. uint8_t f=0;
  1124. uint8_t r=0;
  1125. if((mport != 0)&&(mport != 1))
  1126. return -1;
  1127. if(mode == STATE_M_MODE_INIT){ //初始化队列
  1128. front=sizeof(status[0]);
  1129. rear=sizeof(status[0]);
  1130. sum=0;
  1131. memset(status,YTSF_STATE_IDLE,sizeof(status));
  1132. return 0;
  1133. }
  1134. if(mode == STATE_M_MODE_En){ //mode=1入队列(队尾写入)
  1135. if(sum==sizeof(status[0])){ //满队列判断
  1136. return -1;
  1137. }
  1138. r = (rear+1) % (sizeof(status[0])); //循环存储
  1139. status[mport][r] = s;
  1140. rear = r; //更新入队标记
  1141. sum++; //更新总数标记
  1142. return s;
  1143. }
  1144. if((mode == STATE_M_MODE_De)&&(mDevice.port[mport].state_m == YTSF_STATE_IDLE)){//mode=2出队列(队首读取)
  1145. if(sum==0){ //空队列判断
  1146. mDevice.port[mport].state_m = YTSF_STATE_IDLE;
  1147. return -1;
  1148. }
  1149. f = (front+1) % (sizeof(status[0])); //循环存储
  1150. mDevice.port[mport].state_m = status[mport][f]; //读取队首值
  1151. front = f; //更新出队标记
  1152. sum--; //更新总数标记
  1153. return status[mport][f];
  1154. }
  1155. return -1;
  1156. }
  1157. uint8_t YTSF_SN_Compare(uint8_t mport,tDevice_t *device,tYTSFRxFrame_t *frame){
  1158. int8_t i=0;
  1159. for(i=0;i<5;i++){
  1160. if(device->port[mport].mntr_sn[i]!=frame->fdata[i]){
  1161. return 1;
  1162. }
  1163. }
  1164. return 0;
  1165. }
  1166. uint8_t YTSF_SN_Update(tDevice_t *device,tYTSFRxFrame_t *frame){
  1167. int8_t i=0;
  1168. for(i=0;i<5;i++){
  1169. device->port[frame->fport].mntr_sn[i]=frame->fdata[i];
  1170. }
  1171. if(frame->fport == Ytsf_PORT_0){
  1172. EE_WriteVariable(CURSET_YTSF_PORT0_SN0, (frame->fdata[5]<<8)+(frame->fdata[0]));
  1173. EE_WriteVariable(CURSET_YTSF_PORT0_SN1, (frame->fdata[1]<<8)+(frame->fdata[2]));
  1174. EE_WriteVariable(CURSET_YTSF_PORT0_SN2, (frame->fdata[3]<<8)+(frame->fdata[4]));
  1175. /*
  1176. for(i=0;i<(sizeof(CMD_LIST)/sizeof(CMD_LIST[0])-1);i++)
  1177. {
  1178. if((CMD_LIST[i][2]==Ytsf_PORT_0)&&(CMD_LIST[i][3]>Port0_GunTotal))
  1179. CMD_LIST[i][0]=CMD_dn;
  1180. };
  1181. */
  1182. }
  1183. if(frame->fport == Ytsf_PORT_1){
  1184. EE_WriteVariable(CURSET_YTSF_PORT1_SN0, (frame->fdata[5]<<8)+(frame->fdata[0]));
  1185. EE_WriteVariable(CURSET_YTSF_PORT1_SN1, (frame->fdata[1]<<8)+(frame->fdata[2]));
  1186. EE_WriteVariable(CURSET_YTSF_PORT1_SN2, (frame->fdata[3]<<8)+(frame->fdata[4]));
  1187. }
  1188. if((frame->fdata[5] >= '0') && (frame->fdata[5] <= '8') )
  1189. YTSF_DEBUG1("税控口%d,芯片厂家为:英泰赛福\r\n",frame->fport);
  1190. if((frame->fdata[5] >= 'A') && (frame->fdata[5] <= 'H') )
  1191. YTSF_DEBUG1("税控口%d,芯片厂家为:拓盛\r\n",frame->fport);
  1192. switch(frame->fdata[5]){
  1193. case '0':
  1194. case '1':
  1195. case 'A':
  1196. case 'a':
  1197. device->port[frame->fport].gun_max = 1;
  1198. break;
  1199. case '2':
  1200. case '3':
  1201. case 'B':
  1202. case 'b':
  1203. device->port[frame->fport].gun_max = 2;
  1204. break;
  1205. case 'C':
  1206. case 'c':
  1207. device->port[frame->fport].gun_max = 3;
  1208. break;
  1209. case '4':
  1210. case 'D':
  1211. case 'd':
  1212. device->port[frame->fport].gun_max = 4;
  1213. break;
  1214. case '6':
  1215. case 'F':
  1216. case 'f':
  1217. device->port[frame->fport].gun_max = 6;
  1218. break;
  1219. case '8':
  1220. case 'H':
  1221. case 'h':
  1222. device->port[frame->fport].gun_max = 8;
  1223. break;
  1224. default:
  1225. device->port[frame->fport].gun_max = 1;
  1226. break;
  1227. }
  1228. for(i=0;i<(device->port[frame->fport].gun_max);i++){
  1229. Set_CMD_Enable_ByParm(frame->fport,i,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_14);
  1230. }
  1231. for(i=0;i<(sizeof(CMD_LIST)/sizeof(CMD_LIST[0])-1);i++)
  1232. {
  1233. if((CMD_LIST[i][2]==frame->fport)&&(CMD_LIST[i][3]>=device->port[frame->fport].gun_max))
  1234. CMD_LIST[i][0]=CMD_dn;
  1235. };
  1236. return 0;
  1237. }
  1238. uint8_t YTSF_CreateMsg_0D(uint8_t mport,tDevice_t *device,tYTSFRxFrame_t *frame,uint8_t *fbuf,uint8_t flen){
  1239. uint16_t index=0;
  1240. // uint16_t temp=0;
  1241. uint8_t check=0;
  1242. uint16_t i=0;
  1243. YTSF_DEBUG1(\
  1244. "deviceReg->port=0x%02X,frame->fport=0x%02X,deviceg->gun=0x%02X,frame->fgun=0x%02X\r\n",\
  1245. frame->fport,frame->fport,device->port[mport].gun_index,frame->fgun);
  1246. if((mport == frame->fport)&&(device->port[mport].gun_index == frame->fgun)){
  1247. device->port[mport].lora_send_msg[index++]=0xFF; //UDP帧头
  1248. device->port[mport].lora_send_msg[index++]=0xEE;
  1249. device->port[mport].lora_send_msg[index++]=0x00; //UDP长度(2B)
  1250. device->port[mport].lora_send_msg[index++]=0x00;
  1251. device->port[mport].lora_send_msg[index++]=0x0D; //消息类型
  1252. device->port[mport].lora_send_msg[index++]=(device->device_id >> 0)&0xff;//0x4A; //主板号设备ID(4B),比如01 02 03 04
  1253. device->port[mport].lora_send_msg[index++]=(device->device_id >> 8)&0xff;//0x27;
  1254. device->port[mport].lora_send_msg[index++]=(device->device_id >>16)&0xff;//0x00;
  1255. device->port[mport].lora_send_msg[index++]=(device->device_id >>24)&0xff;//0x00;
  1256. device->port[mport].lora_send_msg[index++]=mport; //UDP消息内容,借用通道号的字段(1B),(高4位表示通道编号,第3位表示通道总数,如0x46,意思是共6个通道,本设备编号为第4个通道。
  1257. device->port[mport].lora_send_msg[index++]=device->port[mport].gun_index;//0x01; //UDP消息内容,枪号(1B)
  1258. device->port[mport].lora_send_msg[index++]=device->ytsf_state;//标记加密版还是非加密版,0非加密,1加密(带英泰赛福)
  1259. //
  1260. if(device->ytsf_state){ //加密(带英泰赛福)
  1261. //总累计,油量7字节,金额7字节
  1262. for(i=0;i<14;i++){
  1263. device->port[mport].lora_send_msg[index++]=device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi[i];
  1264. }
  1265. //当次加油信息,数据格式来自英泰赛福
  1266. for(i=0;i<flen;i++){
  1267. device->port[mport].lora_send_msg[index++]=fbuf[i];
  1268. }
  1269. //和校验
  1270. device->port[mport].lora_send_msg[index++] = 0x00;
  1271. device->port[mport].lora_send_lmsg = index;
  1272. //计算UDP帧,帧长度
  1273. device->port[mport].lora_send_msg[2] = ((index-5) >> 0) & 0xff;
  1274. device->port[mport].lora_send_msg[3] = ((index-5) >> 8) & 0xff;
  1275. check = 0x00;
  1276. //UDP,校验和
  1277. for(i=0;i<index-1;i++)
  1278. {
  1279. check = check ^ device->port[mport].lora_send_msg[i];
  1280. }
  1281. device->port[mport].lora_send_msg[index-1] = check;
  1282. YTSF_DEBUG1("UDP_0D_frame=\r\n");
  1283. for(i=0;i<index;i++)
  1284. YTSF_DEBUG("%02X",device->port[mport].lora_send_msg[i]);
  1285. YTSF_DEBUG("\r\n");
  1286. YTSF_DEBUG1("\r\n端口号=%d",mport);
  1287. YTSF_DEBUG("枪号=%d\r\n",device->port[mport].gun_index);
  1288. YTSF_DEBUG("总油量=");
  1289. YTSF_DEBUG2(device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi,7);
  1290. YTSF_DEBUG("总金额=");
  1291. YTSF_DEBUG2(device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi+7,7);
  1292. YTSF_DEBUG("时间=");
  1293. YTSF_DEBUG2(fbuf+8,3);
  1294. YTSF_DEBUG("油量=");
  1295. YTSF_DEBUG2(fbuf+11,5);
  1296. YTSF_DEBUG("金额=");
  1297. YTSF_DEBUG2(fbuf+16,5);
  1298. YTSF_DEBUG("单价=");
  1299. YTSF_DEBUG2(fbuf+21,3);
  1300. YTSF_DEBUG("\r\n");
  1301. }
  1302. else{ //非加密
  1303. //总累计,油量7字节,金额7字节
  1304. for(i=0;i<24;i++){
  1305. device->port[mport].lora_send_msg[index++]=device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi[i];
  1306. }
  1307. //当次加油信息,数据格式来自英泰赛福
  1308. for(i=0;i<flen;i++){
  1309. device->port[mport].lora_send_msg[index++]=fbuf[i];
  1310. }
  1311. //和校验
  1312. device->port[mport].lora_send_msg[index++] = 0x00;
  1313. device->port[mport].lora_send_lmsg = index;
  1314. //计算UDP帧,帧长度
  1315. device->port[mport].lora_send_msg[2] = ((index-5) >> 0) & 0xff;
  1316. device->port[mport].lora_send_msg[3] = ((index-5) >> 8) & 0xff;
  1317. check = 0x00;
  1318. //UDP,校验和
  1319. for(i=0;i<index-1;i++)
  1320. {
  1321. check = check ^ device->port[mport].lora_send_msg[i];
  1322. }
  1323. device->port[mport].lora_send_msg[index-1] = check;
  1324. YTSF_DEBUG1("UDP_0D_frame=\r\n");
  1325. for(i=0;i<index;i++)
  1326. YTSF_DEBUG("%02X",device->port[mport].lora_send_msg[i]);
  1327. YTSF_DEBUG("\r\n");
  1328. YTSF_DEBUG1("\r\n端口号=%d",mport);
  1329. YTSF_DEBUG("枪号=%d\r\n",device->port[mport].gun_index);
  1330. YTSF_DEBUG("总油量=");
  1331. YTSF_DEBUG_SN(device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi,12);
  1332. YTSF_DEBUG("\r\n");
  1333. YTSF_DEBUG("总金额=");
  1334. YTSF_DEBUG_SN(device->port[mport].gun[device->port[mport].gun_index].ZongLeiJi+12,12);
  1335. YTSF_DEBUG("\r\n");
  1336. YTSF_DEBUG("时间=");
  1337. YTSF_DEBUG_SN(fbuf+5,6);
  1338. YTSF_DEBUG("\r\n");
  1339. YTSF_DEBUG("油量=");
  1340. YTSF_DEBUG_SN(fbuf+11,6);
  1341. YTSF_DEBUG("\r\n");
  1342. YTSF_DEBUG("金额=");
  1343. YTSF_DEBUG_SN(fbuf+17,6);
  1344. YTSF_DEBUG("\r\n");
  1345. YTSF_DEBUG("单价=");
  1346. YTSF_DEBUG_SN(fbuf+23,4);
  1347. YTSF_DEBUG("\r\n");
  1348. }
  1349. }
  1350. return index;
  1351. }
  1352. uint8_t YTSF_CreateMsg_0C(tDevice_t *device){
  1353. uint16_t index=0;
  1354. uint8_t check=0;
  1355. uint16_t i=0;
  1356. device->msg[index++]=0xFF; //UDP帧头
  1357. device->msg[index++]=0xEE;
  1358. device->msg[index++]=0x00; //UDP长度(2B)
  1359. device->msg[index++]=0x00;
  1360. device->msg[index++]=0x0C; //消息类型
  1361. device->msg[index++]=(device->device_id >> 0)&0xff;//0x4A; //主板号设备ID(4B),比如01 02 03 04
  1362. device->msg[index++]=(device->device_id >> 8)&0xff;//0x27;
  1363. device->msg[index++]=(device->device_id >>16)&0xff;//0x00;
  1364. device->msg[index++]=(device->device_id >>24)&0xff;//0x00;
  1365. device->msg[index++]=(device->ver >> 0)&0xff; //版本号
  1366. device->msg[index++]=(device->ver >> 8)&0xff; //版本号
  1367. //和校验
  1368. device->msg[index++] = 0x00;
  1369. device->lmsg = index;
  1370. //计算UDP帧,帧长度
  1371. device->msg[2] = ((index-5) >> 0) & 0xff;
  1372. device->msg[3] = ((index-5) >> 8) & 0xff;
  1373. check = 0x00;
  1374. //UDP,校验和
  1375. for(i=0;i<index-1;i++)
  1376. {
  1377. check = check ^ device->msg[i];
  1378. }
  1379. device->msg[index-1] = check;
  1380. YTSF_DEBUG1("UDP_0C_frame=\r\n");
  1381. for(i=0;i<index;i++)
  1382. YTSF_DEBUG("%02X",device->msg[i]);
  1383. YTSF_DEBUG("\r\n");
  1384. return index;
  1385. }
  1386. uint8_t Ytsf_UartRx_Process(void){
  1387. uint8_t ReturnCode=1;
  1388. if(mYTSF_state!=YTSF_STATE_IDLE)
  1389. YTSF_DEBUG1("mYTSF_state=%d\r\n",mYTSF_state);
  1390. switch(mYTSF_state){
  1391. case YTSF_STATE_IDLE:
  1392. mYTSF_state=(YTSF_STATE_IDLE);
  1393. ReturnCode = 0;
  1394. break;
  1395. case YTSF_STATE_DEVICE_HEARTBEAT_INIT:
  1396. mYTSF_state=(YTSF_STATE_DEVICE_HEARTBEAT_RUNNING);
  1397. ReturnCode = 0;
  1398. break;
  1399. case YTSF_STATE_DEVICE_HEARTBEAT_RUNNING:
  1400. YTSF_CreateMsg_0C(&mDevice);
  1401. En_Queue(lora_tx_sq,mDevice.msg,sizeof(mDevice.msg),mDevice.lmsg);
  1402. mYTSF_state=(YTSF_STATE_DEVICE_HEARTBEAT_DONE);
  1403. ReturnCode = 0;
  1404. break;
  1405. case YTSF_STATE_DEVICE_HEARTBEAT_DONE:
  1406. mYTSF_state=(YTSF_STATE_IDLE);
  1407. ReturnCode = 0;
  1408. break;
  1409. case YTSF_STATE_DEVICE_HEARTBEAT_FAILED:
  1410. mYTSF_state=(YTSF_STATE_IDLE);
  1411. ReturnCode = 1;
  1412. break;
  1413. default:
  1414. mYTSF_state=(YTSF_STATE_IDLE);
  1415. ReturnCode = 0;
  1416. }
  1417. return ReturnCode;
  1418. }
  1419. uint8_t Ytsf_UartRx_Process_port(uint8_t mport){
  1420. uint8_t temp =0;
  1421. // static uint8_t sbuf[32];
  1422. // static uint8_t slen=0;
  1423. uint8_t ReturnCode=1;
  1424. //mDevice.port = YTSF_rx_frame.fport;
  1425. //mDevice.gun = YTSF_rx_frame.fgun;
  1426. //YTSF_SET_STATE_port(mport,YTSF_STATE_IDLE,STATE_M_MODE_De);
  1427. if(mDevice.port[mport].state_m!=YTSF_STATE_IDLE)
  1428. YTSF_DEBUG1("mDevice.port[%d].state_m=%d\r\n",mport,mDevice.port[mport].state_m);
  1429. switch(mDevice.port[mport].state_m){
  1430. case YTSF_STATE_IDLE:
  1431. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1432. ReturnCode = 0;
  1433. break;
  1434. case YTSF_STATE_PORT_GET_MONITOR_SN_INIT:
  1435. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_RUNNING);
  1436. ReturnCode = 0;
  1437. break;
  1438. case YTSF_STATE_PORT_GET_MONITOR_SN_RUNNING:
  1439. //
  1440. temp=YTSF_SN_Compare(mport,&mDevice,&YTSF_rx_frame_port[mport]);
  1441. if(temp == 0x00){//ok
  1442. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_DONE);
  1443. }
  1444. else{//sn changed
  1445. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_CHANGED);
  1446. }
  1447. ReturnCode = 0;
  1448. break;
  1449. case YTSF_STATE_PORT_GET_MONITOR_SN_DONE:
  1450. mDevice.port[mport].sn_init_st = 0x88;
  1451. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1452. ReturnCode = 0;
  1453. break;
  1454. case YTSF_STATE_PORT_GET_MONITOR_SN_TIMEOUT:
  1455. ReturnCode = 0;
  1456. break;
  1457. case YTSF_STATE_PORT_GET_MONITOR_SN_CHANGED:
  1458. YTSF_SN_Update(&mDevice,&YTSF_rx_frame_port[mport]);
  1459. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_DONE);
  1460. ReturnCode = 0;
  1461. break;
  1462. case YTSF_STATE_PORT_GET_MONITOR_SN_FAILED:
  1463. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1464. ReturnCode = 1;
  1465. break;
  1466. case YTSF_STATE_GUN_GET_ZongLeiJi_INIT:
  1467. //todo时间赋值
  1468. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_RUNNING);
  1469. ReturnCode = 0;
  1470. break;
  1471. case YTSF_STATE_GUN_GET_ZongLeiJi_RUNNING:
  1472. //TODO,总累计状态更新
  1473. //YTSF_DEBUG1("mDevice.port=%d,mDevice.gun=%d\r\n",mDevice.port,mDevice.gun);
  1474. if(mDevice.chk_zlj)
  1475. temp = memcmp(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,YTSF_rx_frame_port[mport].fdata,14);
  1476. else
  1477. temp = 1;
  1478. //持续发送数据
  1479. if(temp!=0)
  1480. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_CHANGED);
  1481. else
  1482. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1483. ReturnCode = 0;
  1484. break;
  1485. case YTSF_STATE_GUN_GET_ZongLeiJi_DONE:
  1486. mDevice.port[mport].zlj_state = 0x01;
  1487. YTSF_DEBUG1("mDevice.port[%d].zlj_state==1,fgun=%d\r\n",mport,YTSF_rx_frame_port[mport].fgun);
  1488. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1489. ReturnCode = 0;
  1490. break;
  1491. case YTSF_STATE_GUN_GET_ZongLeiJi_TIMEOUT:
  1492. //超时判断
  1493. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1494. ReturnCode = 0;
  1495. break;
  1496. case YTSF_STATE_GUN_GET_ZongLeiJi_CHANGED:
  1497. memcpy(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,YTSF_rx_frame_port[mport].fdata,14);
  1498. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_DONE);
  1499. ReturnCode = 0;
  1500. break;
  1501. case YTSF_STATE_GUN_GET_ZongLeiJi_FAILED:
  1502. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1503. ReturnCode = 1;
  1504. break;
  1505. case YTSF_STATE_GUN_GET_DangCi_INIT:
  1506. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_DangCi_RUNNING);
  1507. ReturnCode = 0;
  1508. break;
  1509. case YTSF_STATE_GUN_GET_DangCi_RUNNING:
  1510. YTSF_CreateMsg_0D(mport,&mDevice,&YTSF_rx_frame_port[mport],mDevice.port[mport].dangci_frame,mDevice.port[mport].dangci_lframe);
  1511. if(mDevice.lora_send_state)
  1512. En_Queue(lora_tx_sq,mDevice.port[mport].lora_send_msg,sizeof(mDevice.port[mport].lora_send_msg),mDevice.port[mport].lora_send_lmsg);
  1513. else
  1514. YTSF_DEBUG1("LoRa_Send_En=0\r\n");
  1515. //缓冲区清零
  1516. memset(mDevice.port[mport].lora_send_msg,0,128);
  1517. mDevice.port[mport].lora_send_lmsg=0;
  1518. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_DangCi_DONE);
  1519. ReturnCode = 0;
  1520. break;
  1521. case YTSF_STATE_GUN_GET_DangCi_DONE:
  1522. mDevice.port[mport].zlj_state=0;
  1523. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1524. ReturnCode = 0;
  1525. break;
  1526. case YTSF_STATE_GUN_GET_DangCi_TIMEOUT:
  1527. mDevice.port[mport].zlj_state=0;
  1528. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1529. ReturnCode = 0;
  1530. break;
  1531. case YTSF_STATE_GUN_GET_DangCi_CHANGED:
  1532. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1533. ReturnCode = 0;
  1534. break;
  1535. case YTSF_STATE_GUN_GET_DangCi_FAILED:
  1536. mDevice.port[mport].zlj_state=0;
  1537. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1538. ReturnCode = 1;
  1539. break;
  1540. default:
  1541. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  1542. ReturnCode = 0;
  1543. }
  1544. return ReturnCode;
  1545. }
  1546. void Ytsf_loop_port(uint8_t mport){
  1547. int8_t index=0;
  1548. uint8_t zlj_state=0;
  1549. uint8_t sn_init_st=0;
  1550. uint32_t loop_dc_period=0;
  1551. uint32_t loop_dc_timeout=0;
  1552. uint32_t loop_zlj_period=0;
  1553. uint32_t loop_zlj_timeout=0;
  1554. static uint32_t loop_state_period_port[2];
  1555. Ytsf_UartRx_Process_port(mport);
  1556. if(mDevice.ytsf_state==1){
  1557. sn_init_st = mDevice.port[mport].sn_init_st;
  1558. //若SN未初始化,则进行初始化
  1559. if((sn_init_st == 0x00)&&(TickCounter - mDevice.port[mport].loop_sn_period > mDevice.port[mport].loop_sn_timeout)){
  1560. mDevice.port[mport].loop_sn_period = TickCounter;
  1561. mDevice.port[mport].zlj_state = 0;
  1562. index = Get_CMD_Index_ByParm(mport,0,Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  1563. YTSF_DEBUG1("index=%d\r\n",index);
  1564. if(index >=0)
  1565. YTSF_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  1566. }
  1567. //总累计已读取,且当次查询定时时间到
  1568. if(sn_init_st == 0x88){
  1569. zlj_state = mDevice.port[mport].zlj_state;
  1570. loop_dc_period = mDevice.port[mport].loop_dc_period;
  1571. loop_dc_timeout = mDevice.port[mport].loop_dc_timeout;
  1572. loop_zlj_period = mDevice.port[mport].loop_zlj_period;
  1573. loop_zlj_timeout = mDevice.port[mport].loop_zlj_timeout;
  1574. //读当次条件符合后,尝试3次。zlj_state在状态机里更新,如果当次读取成功则zlj_state=0x88;
  1575. if((zlj_state!=0)&&(TickCounter - loop_dc_period >loop_dc_timeout)){
  1576. mDevice.port[mport].loop_dc_period = TickCounter;
  1577. loop_state_period_port[mport] = TickCounter;
  1578. if((zlj_state > 0)&&(zlj_state < 3)){
  1579. mDevice.port[mport].zlj_state++;
  1580. index = Get_CMD_Index_ByParm(mport,mDevice.port[mport].gun_index,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_11);
  1581. YTSF_DEBUG1("index=%d\r\n",index);
  1582. if(index >=0)
  1583. YTSF_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  1584. }
  1585. //当次读取失败或超时,总累计记录清零
  1586. if((zlj_state >= 3) && (zlj_state < 10)){
  1587. memset(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,0,14);
  1588. }
  1589. }
  1590. //总累计
  1591. if((zlj_state == 0x00)&&(TickCounter - loop_zlj_period > loop_zlj_timeout)){
  1592. mDevice.port[mport].loop_zlj_period = TickCounter;
  1593. mDevice.port[mport].loop_dc_period = TickCounter;
  1594. loop_state_period_port[mport] = TickCounter;
  1595. //轮询
  1596. Ytsf_CMD_polling_port(mport);
  1597. //英泰赛福
  1598. if(mDevice.port[mport].mntr_factory == 1)
  1599. mDevice.port[mport].loop_zlj_timeout = 20*1000;//1小时
  1600. //拓盛
  1601. if(mDevice.port[mport].mntr_factory == 2)
  1602. mDevice.port[mport].loop_zlj_timeout = 20*1000;//20秒
  1603. }
  1604. if((zlj_state != 0x00)&&(TickCounter - loop_state_period_port[mport] > 60*1000)){
  1605. loop_state_period_port[mport] = TickCounter;
  1606. mDevice.port[mport].zlj_state = 0;
  1607. }
  1608. }
  1609. }
  1610. }
  1611. void Ytsf_loop(void){
  1612. int8_t temp =0;
  1613. static uint8_t sbuf[128];
  1614. static uint8_t slen=0;
  1615. if(mDevice.ytsf_state==0)
  1616. return;
  1617. if(!Check_Seqeue_Empty(uart4_rx_sq)){
  1618. slen = 0;
  1619. memset(sbuf,0,sizeof(sbuf));
  1620. De_Queue(uart4_rx_sq,sbuf,sizeof(sbuf),(uint8_t *)&slen);
  1621. temp=Ytsf_CMD_Analysis2(&YTSF_rx_frame,sbuf,slen);
  1622. if(temp == -1){
  1623. YTSF_DEBUG1("Ytsf_CMD_Analysis2 is failed\r\n");
  1624. YTSF_DEBUG2(sbuf,slen);
  1625. }
  1626. else{
  1627. YTSF_DEBUG1("Ytsf_CMD_Analysis2 is succeed\r\n");
  1628. //mYTSF_state=(YTSF_STATE_UART_ANALYSIS_DONE);
  1629. if((YTSF_rx_frame.fcmd == Ytsf_CMD_INSTRUCT_A2) && (YTSF_rx_frame.ftype == Ytsf_CMD_TYPE_00)){
  1630. //YTSF_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_PORT_GET_MONITOR_SN_INIT,STATE_M_MODE_En);
  1631. mDevice.port[YTSF_rx_frame.fport].state_m = YTSF_STATE_PORT_GET_MONITOR_SN_INIT;
  1632. }
  1633. if((YTSF_rx_frame.fcmd == Ytsf_CMD_INSTRUCT_A1) && (YTSF_rx_frame.ftype == Ytsf_CMD_TYPE_14)){
  1634. //YTSF_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_ZongLeiJi_INIT,STATE_M_MODE_En);
  1635. mDevice.port[YTSF_rx_frame.fport].state_m = YTSF_STATE_GUN_GET_ZongLeiJi_INIT;
  1636. }
  1637. if((YTSF_rx_frame.fcmd == Ytsf_CMD_INSTRUCT_A1) && (YTSF_rx_frame.ftype == Ytsf_CMD_TYPE_11)){
  1638. //YTSF_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_DangCi_INIT,STATE_M_MODE_En);
  1639. mDevice.port[YTSF_rx_frame.fport].state_m = YTSF_STATE_GUN_GET_DangCi_INIT;
  1640. }
  1641. }
  1642. }
  1643. Ytsf_loop_port(Ytsf_PORT_0);
  1644. Ytsf_loop_port(Ytsf_PORT_1);
  1645. //心跳长时间无数据发送,则产生心跳
  1646. if(TickCounter - LoRa_SendTimeCouter > LoRa_SendTimeOut){
  1647. LoRa_SendTimeCouter = TickCounter;
  1648. YTSF_CreateMsg_0C(&mDevice);
  1649. En_Queue(lora_tx_sq,mDevice.msg,sizeof(mDevice.msg),mDevice.lmsg);
  1650. YTSF_DEBUG1("LoRa_SendTimeOut\r\n");
  1651. }
  1652. }
  1653. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1654. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1655. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1656. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1657. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1658. //以下为非加密版
  1659. uint8_t TAX_CMD_Tx(uint8_t size,uint8_t port,uint8_t gun,uint8_t instruct,uint8_t type){
  1660. int16_t cmd_l=0;
  1661. // uint8_t sout[64]={0};
  1662. // uint8_t lout=0;
  1663. // uint8_t tmp=0;
  1664. // uint16_t i=0;
  1665. //uint8_t result=0;
  1666. //cmd_l=Get_Ytsf_CMD(Ytsf_CMD_A2_SIZE,Ytsf_PORT_0,Ytsf_CMD_INSTRUCT_A1,Ytsf_CMD_TYPE_00,Ytsf_GUN_NUM_0);
  1667. cmd_l=Get_Ytsf_CMD(size,port,gun,instruct,0x00);
  1668. if(cmd_l<0){
  1669. YTSF_DEBUG1("TAX SEND CMD,获取发送指令失败\r\n");
  1670. switch(cmd_l){
  1671. case YTSF_CMD_ERROR_CMD:
  1672. YTSF_DEBUG1("TAX_CMD_ERROR_CMD\r\n");
  1673. break;
  1674. case YTSF_CMD_ERROR_LEN:
  1675. YTSF_DEBUG1("TAX_CMD_ERROR_LEN\r\n");
  1676. break;
  1677. case YTSF_CMD_ERROR_TYPE:
  1678. YTSF_DEBUG1("TAX_CMD_ERROR_TYPE\r\n");
  1679. break;
  1680. case YTSF_CMD_ERROR_SN:
  1681. YTSF_DEBUG1("TAX_CMD_ERROR_SN\r\n");
  1682. break;
  1683. default:
  1684. break;
  1685. }
  1686. }
  1687. else if(cmd_l > 100)
  1688. {
  1689. YTSF_DEBUG1("TAX SEND CMD,指令长达太长,>100.\r\n");
  1690. }
  1691. else{
  1692. YTSF_DEBUG1("TAX SEND CMD=");
  1693. YTSF_DEBUG2(Ytsf_CMD_BUF,cmd_l);
  1694. if(port == TAX_PORT_0){
  1695. UART5_SendNByte(Ytsf_CMD_BUF,cmd_l);
  1696. YTSF_PORT0_Send_CNT++;
  1697. YTSF_PORT0_Send_Delay = TickCounter;
  1698. start_led(2,cmd_l,10,30*10);//(led,delay*0.1ms,duty,period*0.1ms)
  1699. }
  1700. if(port == TAX_PORT_1){
  1701. USART1_SendNByte(Ytsf_CMD_BUF,cmd_l);
  1702. YTSF_PORT1_Send_CNT++;
  1703. YTSF_PORT1_Send_Delay = TickCounter;
  1704. start_led(3,cmd_l,10,30*10);//(led,delay*0.1ms,duty,period*0.1ms)
  1705. }
  1706. }
  1707. return 0;
  1708. }
  1709. uint8_t TAX_CMD_polling_port(uint8_t mport){
  1710. uint8_t i =0;
  1711. uint16_t *poll;
  1712. if(mport == Ytsf_PORT_0){
  1713. poll = &CMD_LIST_polling_port0;
  1714. }
  1715. if(mport == Ytsf_PORT_1){
  1716. poll = &CMD_LIST_polling_port1;
  1717. }
  1718. YTSF_DEBUG1("TAX_CMD_polling_port mport=%d,poll=%d.\r\n",mport,*poll);
  1719. if(CMD_LIST[*poll][0]!=CMD_en)
  1720. {
  1721. for(i=0;i<MAX_CMD_LIST;i++)
  1722. {
  1723. if((CMD_LIST[(i+*poll+1) % MAX_CMD_LIST][0]!=CMD_en) || (CMD_LIST[(i+*poll+1) % MAX_CMD_LIST][2]!=mport))
  1724. {
  1725. continue;
  1726. }else{
  1727. *poll=(i+*poll+1) % MAX_CMD_LIST;
  1728. break;
  1729. }
  1730. }
  1731. }
  1732. if((CMD_LIST[*poll][0]==CMD_en)&&(CMD_LIST[*poll][2]==mport))
  1733. {
  1734. YTSF_DEBUG("\r\n\r\n");
  1735. YTSF_DEBUG1("CMD port[%d] index =%d\r\n",mport,*poll);
  1736. mDevice.port[mport].gun_index = CMD_LIST[*poll][3];
  1737. //YTSF_CMD_Tx(Ytsf_CMD_A2_SIZE, Ytsf_PORT_0, Ytsf_GUN_NUM_0, Ytsf_CMD_INSTRUCT_A2,Ytsf_CMD_TYPE_00);
  1738. TAX_CMD_Tx(CMD_LIST[*poll][1],CMD_LIST[*poll][2],CMD_LIST[*poll][3],CMD_LIST[*poll][4],CMD_LIST[*poll][5]);
  1739. }
  1740. *poll = *poll +1;
  1741. *poll = *poll % MAX_CMD_LIST;
  1742. return *poll;
  1743. }
  1744. //mode=1入队列(队尾写入),mode=2出队列(队首读取)
  1745. int16_t TAX_SET_STATE_port(uint8_t mport,uint8_t s,uint8_t mode){
  1746. static uint8_t status[2][8]={YTSF_STATE_IDLE};
  1747. static uint8_t front=sizeof(status[0]);
  1748. static uint8_t rear=sizeof(status[0]);
  1749. static uint8_t sum=0;
  1750. uint8_t f=0;
  1751. uint8_t r=0;
  1752. if((mport != 0)&&(mport != 1))
  1753. return -1;
  1754. if(mode == STATE_M_MODE_INIT){ //初始化队列
  1755. front=sizeof(status[0]);
  1756. rear=sizeof(status[0]);
  1757. sum=0;
  1758. memset(status,YTSF_STATE_IDLE,sizeof(status));
  1759. return 0;
  1760. }
  1761. if(mode == STATE_M_MODE_En){ //mode=1入队列(队尾写入)
  1762. if(sum==sizeof(status[0])){ //满队列判断
  1763. return -1;
  1764. }
  1765. r = (rear+1) % (sizeof(status[0])); //循环存储
  1766. status[mport][r] = s;
  1767. rear = r; //更新入队标记
  1768. sum++; //更新总数标记
  1769. return s;
  1770. }
  1771. if((mode == STATE_M_MODE_De)&&(mDevice.port[mport].state_m == YTSF_STATE_IDLE)){//mode=2出队列(队首读取)
  1772. if(sum==0){ //空队列判断
  1773. mDevice.port[mport].state_m = YTSF_STATE_IDLE;
  1774. return -1;
  1775. }
  1776. f = (front+1) % (sizeof(status[0])); //循环存储
  1777. mDevice.port[mport].state_m = status[mport][f]; //读取队首值
  1778. front = f; //更新出队标记
  1779. sum--; //更新总数标记
  1780. return status[mport][f];
  1781. }
  1782. if(mode == STATE_M_MODE_FORCE){ //mode=3强制设置状态机
  1783. mDevice.port[mport].state_m =s; //更新总数标记
  1784. return s;
  1785. }
  1786. return -1;
  1787. }
  1788. uint8_t TAX_SN_Compare(uint8_t mport,tDevice_t *device,tYTSFRxFrame_t *frame){
  1789. int8_t i=0;
  1790. for(i=0;i<10;i++){
  1791. if(device->port[mport].mntr_sn[i]!=frame->fdata[i]){
  1792. return 1;
  1793. }
  1794. }
  1795. return 0;
  1796. }
  1797. uint8_t TAX_SN_Update(tDevice_t *device,tYTSFRxFrame_t *frame){
  1798. int8_t i=0;
  1799. for(i=0;i<10;i++){
  1800. device->port[frame->fport].mntr_sn[i]=frame->fdata[i];
  1801. }
  1802. if(frame->fport == Ytsf_PORT_0){
  1803. EE_WriteVariable(CURSET_YTSF_PORT0_SN0, (frame->fdata[5]<<8)+(frame->fdata[0]));
  1804. EE_WriteVariable(CURSET_YTSF_PORT0_SN1, (frame->fdata[1]<<8)+(frame->fdata[2]));
  1805. EE_WriteVariable(CURSET_YTSF_PORT0_SN2, (frame->fdata[3]<<8)+(frame->fdata[4]));
  1806. /*
  1807. for(i=0;i<(sizeof(CMD_LIST)/sizeof(CMD_LIST[0])-1);i++)
  1808. {
  1809. if((CMD_LIST[i][2]==Ytsf_PORT_0)&&(CMD_LIST[i][3]>Port0_GunTotal))
  1810. CMD_LIST[i][0]=CMD_dn;
  1811. };
  1812. */
  1813. }
  1814. if(frame->fport == Ytsf_PORT_1){
  1815. EE_WriteVariable(CURSET_YTSF_PORT1_SN0, (frame->fdata[5]<<8)+(frame->fdata[0]));
  1816. EE_WriteVariable(CURSET_YTSF_PORT1_SN1, (frame->fdata[1]<<8)+(frame->fdata[2]));
  1817. EE_WriteVariable(CURSET_YTSF_PORT1_SN2, (frame->fdata[3]<<8)+(frame->fdata[4]));
  1818. }
  1819. if((frame->fdata[0] >= '0') && (frame->fdata[0] <= '8') )
  1820. YTSF_DEBUG1("税控口%d,芯片厂家为:英泰赛福\r\n",frame->fport);
  1821. if((frame->fdata[0] >= 'A') && (frame->fdata[0] <= 'H') )
  1822. YTSF_DEBUG1("税控口%d,芯片厂家为:拓盛\r\n",frame->fport);
  1823. switch(frame->fdata[0]){
  1824. case '0':
  1825. case '1':
  1826. case 'A':
  1827. case 'a':
  1828. device->port[frame->fport].gun_max = 1;
  1829. break;
  1830. case '2':
  1831. case '3':
  1832. case 'B':
  1833. case 'b':
  1834. device->port[frame->fport].gun_max = 2;
  1835. break;
  1836. case 'C':
  1837. case 'c':
  1838. device->port[frame->fport].gun_max = 3;
  1839. break;
  1840. case '4':
  1841. case 'D':
  1842. case 'd':
  1843. device->port[frame->fport].gun_max = 4;
  1844. break;
  1845. case '6':
  1846. case 'F':
  1847. case 'f':
  1848. device->port[frame->fport].gun_max = 6;
  1849. break;
  1850. case '8':
  1851. case 'H':
  1852. case 'h':
  1853. device->port[frame->fport].gun_max = 8;
  1854. break;
  1855. default:
  1856. device->port[frame->fport].gun_max = 1;
  1857. break;
  1858. }
  1859. for(i=0;i<(device->port[frame->fport].gun_max);i++){
  1860. Set_CMD_Enable_ByParm(frame->fport,i,0x89,0x00);
  1861. }
  1862. for(i=0;i<(sizeof(CMD_LIST)/sizeof(CMD_LIST[0])-1);i++)
  1863. {
  1864. if((CMD_LIST[i][2]==frame->fport)&&(CMD_LIST[i][3]>=device->port[frame->fport].gun_max))
  1865. CMD_LIST[i][0]=CMD_dn;
  1866. };
  1867. return 0;
  1868. }
  1869. int8_t Tax_CMD_Analysis(uint8_t mport,tYTSFRxFrame_t *frame,uint8_t *sbuf,uint8_t slen){
  1870. int8_t ReturnCode = -1;
  1871. uint8_t scrc=0x0000;
  1872. // uint8_t tbuf[128];
  1873. // uint8_t tlen = 0;
  1874. int16_t i=0;
  1875. uint8_t check=0;
  1876. YTSF_DEBUG1("Rev len=%d,CMD=",slen);
  1877. YTSF_DEBUG2(sbuf,slen);
  1878. if(sbuf==NULL)
  1879. {
  1880. YTSF_DEBUG1("error:tbuf==NULL\r\n");
  1881. return ReturnCode;
  1882. }
  1883. //帧头(1Byte)
  1884. frame->fhead = sbuf[0];
  1885. if(frame->fhead!=0xbb)
  1886. {
  1887. YTSF_DEBUG1("error:frame->fhead != 0xbb,fhead=0x%02X\r\n",frame->fhead);
  1888. return ReturnCode;
  1889. }
  1890. //帧长度(1Byte)
  1891. frame->flen = sbuf[1];
  1892. if(frame->flen>64)
  1893. {
  1894. YTSF_DEBUG1("error:len > 64,frame->flen=0x%02X\r\n",frame->flen);
  1895. return ReturnCode;
  1896. }
  1897. if(frame->flen!=slen-2)
  1898. {
  1899. YTSF_DEBUG1("error:frame->flen!=slen-2,frame->flen=0x%02X,slen=0x%02X\r\n",frame->flen,slen);
  1900. return ReturnCode;
  1901. }
  1902. //和校验
  1903. check = 0;
  1904. for(i=2;i<slen-1;i++)
  1905. {
  1906. check = check ^ sbuf[i];
  1907. }
  1908. scrc = sbuf[slen-1];
  1909. if(check != scrc)
  1910. {
  1911. YTSF_DEBUG1("error:Sum check error!,check0x%02X,scrc=0x%02X\r\n",check,scrc);
  1912. return ReturnCode;
  1913. }
  1914. //税控口编号(1Byte),0税控口1,1税控口2
  1915. frame->fport = mport;
  1916. frame->fcmd = sbuf[3];//0x83,0x86,0x89
  1917. frame->fstatus = sbuf[4];
  1918. //读取数据(NByte)
  1919. frame->fldata = slen-5;
  1920. memcpy(frame->fdata,sbuf+5,slen-5);
  1921. //
  1922. if(frame->fcmd == 0x83){
  1923. if((frame->fdata[0] >= '0') && (frame->fdata[0] <= '8') ){
  1924. mDevice.port[frame->fport].mntr_factory = 1;
  1925. YTSF_DEBUG1("税控口%d,芯片厂家为:英泰赛福\r\n",frame->fport);
  1926. }
  1927. if((frame->fdata[0] >= 'A') && (frame->fdata[0] <= 'H') ){
  1928. mDevice.port[frame->fport].mntr_factory = 2;
  1929. YTSF_DEBUG1("税控口%d,芯片厂家为:拓盛\r\n",frame->fport);
  1930. }
  1931. switch(frame->fdata[5]){
  1932. case '0':
  1933. case '1':
  1934. case 'A':
  1935. case 'a':
  1936. mDevice.port[frame->fport].gun_max = 1;
  1937. break;
  1938. case '2':
  1939. case '3':
  1940. case 'B':
  1941. case 'b':
  1942. mDevice.port[frame->fport].gun_max = 2;
  1943. break;
  1944. case 'C':
  1945. case 'c':
  1946. mDevice.port[frame->fport].gun_max = 3;
  1947. break;
  1948. case '4':
  1949. case 'D':
  1950. case 'd':
  1951. mDevice.port[frame->fport].gun_max = 4;
  1952. break;
  1953. case '6':
  1954. case 'F':
  1955. case 'f':
  1956. mDevice.port[frame->fport].gun_max = 6;
  1957. break;
  1958. case '8':
  1959. case 'H':
  1960. case 'h':
  1961. mDevice.port[frame->fport].gun_max = 8;
  1962. break;
  1963. default:
  1964. mDevice.port[frame->fport].gun_max = 1;
  1965. break;
  1966. }
  1967. }
  1968. memcpy(&YTSF_rx_frame_port[frame->fport],frame,sizeof(tYTSFRxFrame_t));
  1969. if(frame->fcmd == 0x89){
  1970. //接收帧,按端口分开
  1971. TAX_SET_STATE_port(frame->fport,YTSF_STATE_GUN_GET_ZongLeiJi_INIT,STATE_M_MODE_FORCE);
  1972. }
  1973. if(frame->fcmd == 0x86){
  1974. //接收帧,按端口分开
  1975. memcpy(mDevice.port[frame->fport].dangci_frame,sbuf,slen);
  1976. mDevice.port[frame->fport].dangci_lframe = slen;
  1977. TAX_SET_STATE_port(frame->fport,YTSF_STATE_GUN_GET_DangCi_INIT,STATE_M_MODE_FORCE);
  1978. }
  1979. ReturnCode = frame->fport;
  1980. return ReturnCode;
  1981. }
  1982. uint8_t Tax_HeartBeat_Process(void){
  1983. uint8_t ReturnCode=1;
  1984. if(mYTSF_state!=YTSF_STATE_IDLE)
  1985. YTSF_DEBUG1("mYTSF_state=%d\r\n",mYTSF_state);
  1986. switch(mYTSF_state){
  1987. case YTSF_STATE_IDLE:
  1988. mYTSF_state=(YTSF_STATE_IDLE);
  1989. ReturnCode = 0;
  1990. break;
  1991. case YTSF_STATE_DEVICE_HEARTBEAT_INIT:
  1992. mYTSF_state=(YTSF_STATE_DEVICE_HEARTBEAT_RUNNING);
  1993. ReturnCode = 0;
  1994. break;
  1995. case YTSF_STATE_DEVICE_HEARTBEAT_RUNNING:
  1996. YTSF_CreateMsg_0C(&mDevice);
  1997. En_Queue(lora_tx_sq,mDevice.msg,sizeof(mDevice.msg),mDevice.lmsg);
  1998. mYTSF_state=(YTSF_STATE_DEVICE_HEARTBEAT_DONE);
  1999. ReturnCode = 0;
  2000. break;
  2001. case YTSF_STATE_DEVICE_HEARTBEAT_DONE:
  2002. mYTSF_state=(YTSF_STATE_IDLE);
  2003. ReturnCode = 0;
  2004. break;
  2005. case YTSF_STATE_DEVICE_HEARTBEAT_FAILED:
  2006. mYTSF_state=(YTSF_STATE_IDLE);
  2007. ReturnCode = 1;
  2008. break;
  2009. default:
  2010. mYTSF_state=(YTSF_STATE_IDLE);
  2011. ReturnCode = 0;
  2012. }
  2013. return ReturnCode;
  2014. }
  2015. uint8_t Tax_UartRx_Process_port(uint8_t mport){
  2016. uint8_t temp =0;
  2017. //static uint8_t sbuf[32];
  2018. //static uint8_t slen=0;
  2019. uint8_t ReturnCode=1;
  2020. TAX_SET_STATE_port(mport,YTSF_STATE_IDLE,STATE_M_MODE_De);//若当前状态机为,YTSF_STATE_IDLE,则出队列且更新状态。
  2021. if(mDevice.port[mport].state_m!=YTSF_STATE_IDLE)
  2022. YTSF_DEBUG1("mDevice.port[%d].state_m=%d\r\n",mport,mDevice.port[mport].state_m);
  2023. switch(mDevice.port[mport].state_m){
  2024. case YTSF_STATE_IDLE:
  2025. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2026. ReturnCode = 0;
  2027. break;
  2028. case YTSF_STATE_PORT_GET_MONITOR_SN_INIT:
  2029. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_RUNNING);
  2030. ReturnCode = 0;
  2031. break;
  2032. case YTSF_STATE_PORT_GET_MONITOR_SN_RUNNING:
  2033. //
  2034. temp=TAX_SN_Compare(mport,&mDevice,&YTSF_rx_frame_port[mport]);
  2035. if(temp == 0x00){//ok
  2036. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_DONE);
  2037. }
  2038. else{//sn changed
  2039. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_CHANGED);
  2040. }
  2041. ReturnCode = 0;
  2042. break;
  2043. case YTSF_STATE_PORT_GET_MONITOR_SN_DONE:
  2044. mDevice.port[mport].sn_init_st = 0x88;
  2045. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2046. ReturnCode = 0;
  2047. break;
  2048. case YTSF_STATE_PORT_GET_MONITOR_SN_TIMEOUT:
  2049. ReturnCode = 0;
  2050. break;
  2051. case YTSF_STATE_PORT_GET_MONITOR_SN_CHANGED:
  2052. TAX_SN_Update(&mDevice,&YTSF_rx_frame_port[mport]);
  2053. mDevice.port[mport].state_m=(YTSF_STATE_PORT_GET_MONITOR_SN_DONE);
  2054. ReturnCode = 0;
  2055. break;
  2056. case YTSF_STATE_PORT_GET_MONITOR_SN_FAILED:
  2057. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2058. ReturnCode = 1;
  2059. break;
  2060. case YTSF_STATE_GUN_GET_ZongLeiJi_INIT:
  2061. //todo时间赋值
  2062. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_RUNNING);
  2063. ReturnCode = 0;
  2064. break;
  2065. case YTSF_STATE_GUN_GET_ZongLeiJi_RUNNING:
  2066. //TODO,总累计状态更新
  2067. //YTSF_DEBUG1("mDevice.port=%d,mDevice.gun=%d\r\n",mDevice.port,mDevice.gun);
  2068. if(mDevice.chk_zlj)
  2069. temp = memcmp(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,YTSF_rx_frame_port[mport].fdata,24);
  2070. else
  2071. temp = 1;
  2072. //持续发送数据
  2073. if(temp!=0)
  2074. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_CHANGED);
  2075. else
  2076. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2077. ReturnCode = 0;
  2078. break;
  2079. case YTSF_STATE_GUN_GET_ZongLeiJi_DONE:
  2080. mDevice.port[mport].zlj_state = 0x01;
  2081. YTSF_DEBUG1("mDevice.port[%d].zlj_state==1,fgun=%d\r\n",mport,YTSF_rx_frame_port[mport].fgun);
  2082. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2083. ReturnCode = 0;
  2084. break;
  2085. case YTSF_STATE_GUN_GET_ZongLeiJi_TIMEOUT:
  2086. //超时判断
  2087. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2088. ReturnCode = 0;
  2089. break;
  2090. case YTSF_STATE_GUN_GET_ZongLeiJi_CHANGED:
  2091. memcpy(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,YTSF_rx_frame_port[mport].fdata,24);
  2092. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_ZongLeiJi_DONE);
  2093. ReturnCode = 0;
  2094. break;
  2095. case YTSF_STATE_GUN_GET_ZongLeiJi_FAILED:
  2096. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2097. ReturnCode = 1;
  2098. break;
  2099. case YTSF_STATE_GUN_GET_DangCi_INIT:
  2100. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_DangCi_RUNNING);
  2101. ReturnCode = 0;
  2102. break;
  2103. case YTSF_STATE_GUN_GET_DangCi_RUNNING:
  2104. YTSF_CreateMsg_0D(mport,&mDevice,&YTSF_rx_frame_port[mport],mDevice.port[mport].dangci_frame,mDevice.port[mport].dangci_lframe);
  2105. if(mDevice.lora_send_state)
  2106. En_Queue(lora_tx_sq,mDevice.port[mport].lora_send_msg,sizeof(mDevice.port[mport].lora_send_msg),mDevice.port[mport].lora_send_lmsg);
  2107. else
  2108. YTSF_DEBUG1("LoRa_Send_En=0\r\n");
  2109. //缓冲区清零
  2110. memset(mDevice.port[mport].lora_send_msg,0,128);
  2111. mDevice.port[mport].lora_send_lmsg=0;
  2112. mDevice.port[mport].state_m=(YTSF_STATE_GUN_GET_DangCi_DONE);
  2113. ReturnCode = 0;
  2114. break;
  2115. case YTSF_STATE_GUN_GET_DangCi_DONE:
  2116. mDevice.port[mport].zlj_state=0;
  2117. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2118. ReturnCode = 0;
  2119. break;
  2120. case YTSF_STATE_GUN_GET_DangCi_TIMEOUT:
  2121. mDevice.port[mport].zlj_state=0;
  2122. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2123. ReturnCode = 0;
  2124. break;
  2125. case YTSF_STATE_GUN_GET_DangCi_CHANGED:
  2126. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2127. ReturnCode = 0;
  2128. break;
  2129. case YTSF_STATE_GUN_GET_DangCi_FAILED:
  2130. mDevice.port[mport].zlj_state=0;
  2131. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2132. ReturnCode = 1;
  2133. break;
  2134. default:
  2135. mDevice.port[mport].state_m=(YTSF_STATE_IDLE);
  2136. ReturnCode = 0;
  2137. }
  2138. return ReturnCode;
  2139. }
  2140. void Tax_loop_port(uint8_t mport){
  2141. int16_t index=0;
  2142. uint8_t zlj_state=0;
  2143. uint8_t sn_init_st=0;
  2144. uint32_t loop_dc_period=0;
  2145. uint32_t loop_dc_timeout=0;
  2146. uint32_t loop_zlj_period=0;
  2147. uint32_t loop_zlj_timeout=0;
  2148. static uint32_t loop_state_period_port[2];
  2149. Tax_UartRx_Process_port(mport);
  2150. if(mDevice.ytsf_state==0){
  2151. sn_init_st = mDevice.port[mport].sn_init_st;
  2152. //若SN未初始化,则进行初始化
  2153. if((sn_init_st == 0x00)&&(TickCounter - mDevice.port[mport].loop_sn_period > mDevice.port[mport].loop_sn_timeout)){
  2154. mDevice.port[mport].loop_sn_period = TickCounter;
  2155. mDevice.port[mport].zlj_state = 0;
  2156. index = Get_CMD_Index_ByParm(mport,0x00,0x83,0x00);
  2157. YTSF_DEBUG1("index=%d\r\n",index);
  2158. if(index >=0)
  2159. TAX_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  2160. }
  2161. //总累计已读取,且当次查询定时时间到
  2162. if(sn_init_st == 0x88){
  2163. zlj_state = mDevice.port[mport].zlj_state;
  2164. loop_dc_period = mDevice.port[mport].loop_dc_period;
  2165. loop_dc_timeout = mDevice.port[mport].loop_dc_timeout;
  2166. loop_zlj_period = mDevice.port[mport].loop_zlj_period;
  2167. loop_zlj_timeout = mDevice.port[mport].loop_zlj_timeout;
  2168. //读当次条件符合后,尝试3次。zlj_state在状态机里更新,如果当次读取成功则zlj_state=0x88;
  2169. if((zlj_state!=0)&&(TickCounter - loop_dc_period >loop_dc_timeout)){
  2170. mDevice.port[mport].loop_dc_period = TickCounter;
  2171. loop_state_period_port[mport] = TickCounter;
  2172. if((zlj_state > 0)&&(zlj_state < 3)){
  2173. mDevice.port[mport].zlj_state++;
  2174. index = Get_CMD_Index_ByParm(mport,mDevice.port[mport].gun_index,0x86,0x00);
  2175. YTSF_DEBUG1("index=%d\r\n",index);
  2176. if(index >=0)
  2177. TAX_CMD_Tx(CMD_LIST[index][1],CMD_LIST[index][2],CMD_LIST[index][3],CMD_LIST[index][4],CMD_LIST[index][5]);
  2178. }
  2179. //当次读取失败或超时,总累计记录清零
  2180. if((zlj_state >= 3) && (zlj_state < 10)){
  2181. memset(mDevice.port[mport].gun[YTSF_rx_frame_port[mport].fgun].ZongLeiJi,0,24);
  2182. }
  2183. }
  2184. //总累计
  2185. if((zlj_state == 0x00)&&(TickCounter - loop_zlj_period > loop_zlj_timeout)){
  2186. mDevice.port[mport].loop_zlj_period = TickCounter;
  2187. mDevice.port[mport].loop_dc_period = TickCounter;
  2188. loop_state_period_port[mport] = TickCounter;
  2189. //轮询
  2190. TAX_CMD_polling_port(mport);
  2191. //英泰赛福
  2192. if(mDevice.port[mport].mntr_factory == 1)
  2193. mDevice.port[mport].loop_zlj_timeout = 20*1000;//1小时
  2194. //拓盛
  2195. if(mDevice.port[mport].mntr_factory == 2)
  2196. mDevice.port[mport].loop_zlj_timeout = 20*1000;//20秒
  2197. }
  2198. if((zlj_state != 0x00)&&(TickCounter - loop_state_period_port[mport] > 60*1000)){
  2199. loop_state_period_port[mport] = TickCounter;
  2200. mDevice.port[mport].zlj_state = 0;
  2201. }
  2202. }
  2203. }
  2204. }
  2205. void Tax_loop(void){
  2206. int8_t temp =0;
  2207. static uint8_t sbuf[128];
  2208. static uint8_t slen=0;
  2209. if(mDevice.ytsf_state==1)
  2210. return;
  2211. if(!Check_Seqeue_Empty(uart5_rx_sq)){
  2212. slen = 0;
  2213. memset(sbuf,0,sizeof(sbuf));
  2214. De_Queue(uart5_rx_sq,sbuf,sizeof(sbuf),(uint8_t *)&slen);
  2215. temp=Tax_CMD_Analysis(TAX_PORT_0,&Tax_rx_frame[TAX_PORT_0],sbuf,slen);
  2216. if(temp == -1){
  2217. YTSF_DEBUG1("Tax_CMD_Analysis is failed\r\n");
  2218. YTSF_DEBUG2(sbuf,slen);
  2219. }
  2220. else{
  2221. YTSF_DEBUG1("Tax_CMD_Analysis is succeed\r\n");
  2222. //mYTSF_state=(YTSF_STATE_UART_ANALYSIS_DONE);
  2223. if(Tax_rx_frame[TAX_PORT_0].fcmd == 0x83){
  2224. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_PORT_GET_MONITOR_SN_INIT,STATE_M_MODE_En);
  2225. mDevice.port[TAX_PORT_0].state_m = YTSF_STATE_PORT_GET_MONITOR_SN_INIT;
  2226. }
  2227. if(Tax_rx_frame[TAX_PORT_0].fcmd == 0x89){
  2228. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_ZongLeiJi_INIT,STATE_M_MODE_En);
  2229. mDevice.port[TAX_PORT_0].state_m = YTSF_STATE_GUN_GET_ZongLeiJi_INIT;
  2230. }
  2231. if(Tax_rx_frame[TAX_PORT_0].fcmd == 0x86){
  2232. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_DangCi_INIT,STATE_M_MODE_En);
  2233. mDevice.port[TAX_PORT_0].state_m = YTSF_STATE_GUN_GET_DangCi_INIT;
  2234. }
  2235. }
  2236. }
  2237. Tax_loop_port(TAX_PORT_0);
  2238. if(!Check_Seqeue_Empty(usart1_rx_sq)){
  2239. slen = 0;
  2240. memset(sbuf,0,sizeof(sbuf));
  2241. De_Queue(usart1_rx_sq,sbuf,sizeof(sbuf),(uint8_t *)&slen);
  2242. temp=Tax_CMD_Analysis(TAX_PORT_1,&Tax_rx_frame[TAX_PORT_1],sbuf,slen);
  2243. if(temp == -1){
  2244. YTSF_DEBUG1("Tax_CMD_Analysis is failed\r\n");
  2245. YTSF_DEBUG2(sbuf,slen);
  2246. }
  2247. else{
  2248. YTSF_DEBUG1("Tax_CMD_Analysis is succeed\r\n");
  2249. //mYTSF_state=(YTSF_STATE_UART_ANALYSIS_DONE);
  2250. if(Tax_rx_frame[TAX_PORT_1].fcmd == 0x83){
  2251. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_PORT_GET_MONITOR_SN_INIT);
  2252. mDevice.port[TAX_PORT_1].state_m = YTSF_STATE_PORT_GET_MONITOR_SN_INIT;
  2253. }
  2254. if(Tax_rx_frame[TAX_PORT_1].fcmd == 0x89){
  2255. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_ZongLeiJi_INIT);
  2256. mDevice.port[TAX_PORT_1].state_m = YTSF_STATE_GUN_GET_ZongLeiJi_INIT;
  2257. }
  2258. if(Tax_rx_frame[TAX_PORT_1].fcmd == 0x86){
  2259. //TAX_SET_STATE_port(YTSF_rx_frame.fport,YTSF_STATE_GUN_GET_DangCi_INIT);
  2260. mDevice.port[TAX_PORT_1].state_m = YTSF_STATE_GUN_GET_DangCi_INIT;
  2261. }
  2262. }
  2263. }
  2264. Tax_loop_port(TAX_PORT_1);
  2265. //心跳长时间无数据发送,则产生心跳
  2266. if(TickCounter - LoRa_SendTimeCouter > LoRa_SendTimeOut){
  2267. LoRa_SendTimeCouter = TickCounter;
  2268. YTSF_CreateMsg_0C(&mDevice);
  2269. En_Queue(lora_tx_sq,mDevice.msg,sizeof(mDevice.msg),mDevice.lmsg);
  2270. YTSF_DEBUG1("LoRa_SendTimeOut\r\n");
  2271. }
  2272. }
  2273. /**** Copyright (C)2016 sun. All Rights Reserved **** END OF FILE ****/