ZigbeeDataHandle.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. /*--------------------------------------------------------------------------------------
  2. * @file ZigbeeDataHandle.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief Zigbee数据处理
  7. ---------------------------------------------------------------------------------------*/
  8. #include "stm32f10x_rcc.h"
  9. #include "stm32f10x_gpio.h"
  10. #include "TypeDefine.h"
  11. #include "Driver.h"
  12. #include "USARTSetup.h"
  13. #include "DrawLCDGUI.h"
  14. #include "SystemAlarm.h"
  15. #include "ParameterSet.h"
  16. #include "ZigbeeDataHandle.h"
  17. //#include "ZigbeeNet.h"
  18. #include "ControlSystem.h"
  19. #include "lorawan.h"
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. uint8_t zigbeeXmitCounts = 0;//zigbee发送累计
  23. extern uint8_t Recive_lorawanID_flag; //接收LORAWAN ID号
  24. extern uint8_t mcu_id[8]; //mcu ID号缓冲区
  25. extern uint8_t lorawan_send_data_flag;////数据发送标志
  26. extern uint8_t Start_send ; //开始发送标志
  27. //uint16_t random_cont=0; //随机数种子值
  28. //uint32_t random_data=0; //随机数
  29. uint8_t RunToLorawawn_flag=0; //在运行时,发送lorawan数据的标志
  30. uint8_t StartToRun_flag=0; //当按下运行按键的时候,置位该标志
  31. uint8_t Running_flag=0; //在正在输注状态下,置位该标志
  32. uint8_t check_succeed=0; //收到上位发送的数据,校验成功后,置位该标
  33. uint8_t send_number=0; //数据发送次数
  34. uint16_t FailureSendNumber =0; //长包发送失败次数
  35. uint8_t lorawan_to_sleep=0; //lorawan模块进入睡眠标志
  36. uint8_t StartToRunSend_flag = 0; //发送数据完成标志
  37. uint8_t PauseSend_flag = 0; //暂停发送数据完成标志
  38. /***************************************************************************************
  39. * Function: CommandToZigbeeHandle
  40. * Object: 发给zigbee模块的命令
  41. * 输入: 无
  42. * 输出: 无
  43. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  44. * uint8_t tempXOR = 0;计算校验值
  45. * 2、USART2Send发送
  46. ****************************************************************************************/
  47. void CommandToZigbeeHandle( void )
  48. {
  49. uint8_t tempIndex = 0;
  50. uint8_t tempXOR = 0;
  51. uint8_t i;
  52. //读设备ID
  53. usart2XmitBuffer[tempIndex++] = 0xfc;
  54. usart2XmitBuffer[tempIndex++] = 0x03;
  55. usart2XmitBuffer[tempIndex++] = 0x05;
  56. usart2XmitBuffer[tempIndex++] = 0x00;
  57. usart2XmitBuffer[tempIndex++] = 0x00;
  58. usart2XmitBuffer[tempIndex++] = 0x00;
  59. for( i = 0; i < 6; i++ )
  60. {
  61. tempXOR ^= usart2XmitBuffer[i];
  62. }
  63. usart2XmitBuffer[tempIndex++] = tempXOR;//校验
  64. USART2Send( usart2XmitBuffer, tempIndex );
  65. }
  66. /***************************************************************************************
  67. * Function: CommandToZigbeeReadNet
  68. * Object: 发给zigbee模块的读网络命令
  69. * 输入: 无
  70. * 输出: 无
  71. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  72. * 2、USART2Send发送
  73. ****************************************************************************************/
  74. void CommandToZigbeeReadNet( void )
  75. {
  76. uint8_t tempIndex = 0;
  77. usart2XmitBuffer[tempIndex++] = 0xfc;
  78. usart2XmitBuffer[tempIndex++] = 0x03;
  79. usart2XmitBuffer[tempIndex++] = 0x05;
  80. usart2XmitBuffer[tempIndex++] = 0x00;
  81. usart2XmitBuffer[tempIndex++] = 0x00;
  82. usart2XmitBuffer[tempIndex++] = 0x00;
  83. usart2XmitBuffer[tempIndex++] = 0xfa;//校验
  84. USART2Send( usart2XmitBuffer, tempIndex );
  85. }
  86. /***************************************************************************************
  87. * Function: CommandToZigbeeReadFatherADDR
  88. * Object: 发给zigbee模块的读父节点MAC地址命令
  89. * 输入: 无
  90. * 输出: 无
  91. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  92. * uint8_t tempXOR = 0;计算校验值
  93. * 2、USART2Send发送
  94. ****************************************************************************************/
  95. void CommandToZigbeeReadFatherADDR( void )
  96. {
  97. uint8_t tempIndex = 0;
  98. uint8_t tempXOR = 0;
  99. uint8_t i;
  100. //读设备ID
  101. usart2XmitBuffer[tempIndex++] = 0xfc;
  102. usart2XmitBuffer[tempIndex++] = 0x03;
  103. usart2XmitBuffer[tempIndex++] = 0x1d;
  104. usart2XmitBuffer[tempIndex++] = 0x00;
  105. usart2XmitBuffer[tempIndex++] = 0x00;
  106. usart2XmitBuffer[tempIndex++] = 0x00;
  107. for( i = 0; i < 6; i++ )
  108. {
  109. tempXOR ^= usart2XmitBuffer[i];
  110. }
  111. usart2XmitBuffer[tempIndex++] = tempXOR;//校验
  112. USART2Send( usart2XmitBuffer, tempIndex );
  113. }
  114. /***************************************************************************************
  115. * Function: DataFromZigbeeHandle
  116. * Object: 处理来自zigbee的数据
  117. * 输入: uint8_t *recvDataBuf 待处理的数据缓冲;
  118. * uint8_t recvDataLen 待处理的数据长度;
  119. * 输出: 无
  120. * 备注:
  121. ****************************************************************************************/
  122. void DataFromZigbeeHandle( uint8_t *recvDataBuf, uint8_t recvDataLen )
  123. {
  124. }
  125. /***************************************************************************************
  126. * Function: RTDToZigbeeHandle
  127. * Object: 实时数据发送到zigbee的数据
  128. * 输入: 无
  129. * 输出: 无
  130. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  131. * uint8_t tempXOR = 0;计算校验值
  132. * 2、USART2Send发送
  133. ****************************************************************************************/
  134. void RTDToZigbeeHandle( void )
  135. {
  136. // uint8_t tempIndex = 0;
  137. uint8_t i;
  138. uint16_t tempCRC = 0;
  139. usart2XmitBuffer[0] = 33;
  140. usart2XmitBuffer[1] = 0x15;//包类型
  141. for( i = 0 ; i <8 ; i++ )//泵号
  142. {
  143. usart2XmitBuffer[i+2] = setParamInfo.deviceID[i];
  144. }
  145. /*usart2XmitBuffer[tempIndex++] = (uint8_t)( displayTimeBuf.year - 2015 );//时间
  146. usart2XmitBuffer[tempIndex++] = displayTimeBuf.month;
  147. usart2XmitBuffer[tempIndex++] = displayTimeBuf.date;
  148. usart2XmitBuffer[tempIndex++] = displayTimeBuf.hour;
  149. usart2XmitBuffer[tempIndex++] = displayTimeBuf.minute;
  150. usart2XmitBuffer[tempIndex++] = displayTimeBuf.seconds;*/
  151. usart2XmitBuffer[10] = (uint8_t)( ( verifyInfo.hospitalNO & 0x000000ff ) ) ;
  152. usart2XmitBuffer[11] = (uint8_t)( ( verifyInfo.hospitalNO & 0x0000ff00 ) >> 8 );
  153. usart2XmitBuffer[12] = (uint8_t)( ( verifyInfo.hospitalNO & 0x00ff0000 ) >> 16 );
  154. usart2XmitBuffer[13] = (uint8_t)( ( verifyInfo.hospitalNO & 0xff000000 ) >> 24 );
  155. //usart2XmitBuffer[14] = 0;//住院号
  156. usart2XmitBuffer[14] = (uint8_t)( verifyInfo.sickroom & 0x00ff );
  157. usart2XmitBuffer[15] = (uint8_t)( ( verifyInfo.sickroom &0xff00 ) >> 8 );//病区号
  158. usart2XmitBuffer[16] = (uint8_t)( verifyInfo.bedNO & 0x00ff );
  159. usart2XmitBuffer[17] = (uint8_t)( ( verifyInfo.bedNO &0xff00 ) >> 8 );//病床号
  160. //usart2XmitBuffer[tempIndex++] = (uint8_t)( realTimeData.surplusDose & 0x00ff );
  161. //usart2XmitBuffer[tempIndex++] = (uint8_t)( ( realTimeData.surplusDose & 0xff00 ) >> 8 );//剩余量
  162. usart2XmitBuffer[18] = (uint8_t)( setParamInfo.continueDose1 & 0x00ff );
  163. usart2XmitBuffer[19] = (uint8_t)( ( setParamInfo.continueDose1 & 0xff00 ) >> 8 );//持续量
  164. // usart2XmitBuffer[tempIndex++] = (uint8_t)( EngineeringModeValue.selfcontrol & 0x00ff );
  165. // usart2XmitBuffer[tempIndex++] = (uint8_t)( ( EngineeringModeValue.selfcontrol & 0xff00 ) >> 8 );//自控量
  166. usart2XmitBuffer[20] = (uint8_t)( setParamInfo.lockTime1 & 0x00ff );
  167. usart2XmitBuffer[21] = (uint8_t)( ( setParamInfo.lockTime1 & 0xff00 ) >> 8 );//锁时
  168. usart2XmitBuffer[22] = (uint8_t)( setParamInfo.limitDose1 & 0x00ff );
  169. usart2XmitBuffer[23] = (uint8_t)( ( setParamInfo.limitDose1 & 0xff00 ) >> 8 );//极限量
  170. //usart2XmitBuffer[tempIndex++] = (uint8_t)( realTimeData.inputDose & 0x00ff );
  171. //usart2XmitBuffer[tempIndex++] = (uint8_t)( ( realTimeData.inputDose & 0xff00 ) >> 8 );//输入量
  172. usart2XmitBuffer[24] = setParamInfo.firstDose;//首次量
  173. usart2XmitBuffer[25] = (uint8_t)( setParamInfo.superaddition1 & 0x00ff );
  174. usart2XmitBuffer[26] = (uint8_t)( ( setParamInfo.superaddition1 & 0xff00 ) >> 8 );//追加量
  175. usart2XmitBuffer[27] = (uint8_t)( FailureSendNumber & 0x00ff );
  176. usart2XmitBuffer[28] = (uint8_t)( ( FailureSendNumber & 0xff00 ) >> 8 );//发送失败条数
  177. /* usart2XmitBuffer[29] = (uint8_t)( realTimeData.validCount & 0x00ff );
  178. usart2XmitBuffer[30] = (uint8_t)( ( realTimeData.validCount & 0xff00 ) >> 8 );//有效次数
  179. usart2XmitBuffer[31] = (uint8_t)( realTimeData.invalidCount & 0x00ff );
  180. usart2XmitBuffer[32] = (uint8_t)( ( realTimeData.invalidCount & 0xff00 ) >> 8 );//无效次数 */
  181. //usart2XmitBuffer[tempIndex++] = (uint8_t)( realTimeData.validCount + realTimeData.invalidCount );//总按次数
  182. if(realTimeData.stateRun!=Poweroff)
  183. {
  184. if( sysAlarmFlag.BubbleFault == ALARM_ON )
  185. {
  186. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xfc) | 0x01);//气泡或无液故障 0000 0001
  187. }
  188. else if( sysAlarmFlag.JamFault == ALARM_ON )
  189. {
  190. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xfc) | 0x02);//堵塞故障 0000 0010
  191. }
  192. else if( sysAlarmFlag.NonePillCase == ALARM_ON )
  193. {
  194. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xfc) | 0x03);//未装药盒故障 0000 0011
  195. }
  196. else
  197. {
  198. usart2XmitBuffer[29] &= 0xfc;// 1111 1100
  199. }
  200. /*if( sysAlarmFlag.InstallFalt == ALARM_ON )
  201. {
  202. usart2XmitBuffer[tempIndex++] = 1;//未装夹到位故障
  203. }
  204. else
  205. {
  206. usart2XmitBuffer[tempIndex++] = 0;
  207. }*/
  208. if( sysAlarmFlag.MaxFault == ALARM_ON )//极限量状态
  209. {
  210. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xc7) | 0x08);// 0000 1000
  211. }
  212. else if( ( sysAlarmFlag.InputEnding == ALARM_ON ) && ( sysAlarmFlag.InputEnd == ALARM_OFF ) )//输液将结束
  213. {
  214. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xc7) | 0x10);// 0001 0000
  215. }
  216. else if( ( sysAlarmFlag.InputEnding == ALARM_OFF ) && ( sysAlarmFlag.InputEnd == ALARM_ON ) )//输液结束
  217. {
  218. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0xc7) | 0x20);// 0010 0000
  219. }
  220. else
  221. {
  222. usart2XmitBuffer[29] &= 0xc7;
  223. }
  224. if( sysAlarmFlag.VoltLowest == ALARM_ON )//电池电量偏低状态
  225. {
  226. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0x3f) | 0x40);// 0100 0000
  227. }
  228. else if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低预报警
  229. {
  230. usart2XmitBuffer[29] = (( usart2XmitBuffer[29] & 0x3f) | 0x80);// 1000 0000
  231. }
  232. else
  233. {
  234. usart2XmitBuffer[29] &= 0x3f;
  235. }
  236. }
  237. else
  238. {
  239. usart2XmitBuffer[29] &= 0x00;
  240. }
  241. if( sysAlarmFlag.MotorFalt == ALARM_ON )//电机失控
  242. {
  243. usart2XmitBuffer[30] = (( usart2XmitBuffer[30] & 0xfc) | 0x01);// 0000 0001;
  244. }
  245. else if( ( sysAlarmFlag.MechanicalFault == ALARM_ON ) || ( sysAlarmFlag.MechanicalFault == ALARM_CONTINUE ) )//机械故障
  246. {
  247. usart2XmitBuffer[30] = (( usart2XmitBuffer[30] & 0xfc) | 0x02);// 0000 0010;
  248. }
  249. else
  250. {
  251. usart2XmitBuffer[30] &= 0xfc;
  252. }
  253. /*
  254. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_SET )//呼叫功能
  255. {
  256. usart2XmitBuffer[34] = (( usart2XmitBuffer[34] & 0xfb) | 0x04);// 0000 0100;
  257. }
  258. else
  259. {
  260. usart2XmitBuffer[34] &= 0xfb;
  261. }
  262. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_ON )//镇痛效果
  263. {
  264. usart2XmitBuffer[34] |= 0x08; //0000 1000
  265. }
  266. else
  267. {
  268. usart2XmitBuffer[34] &= 0xf7;
  269. }*/
  270. switch( realTimeData.stateRun )
  271. {
  272. case FirstRun:
  273. case MainRun:
  274. case Airout:
  275. case PCARun:
  276. usart2XmitBuffer[30] = ((usart2XmitBuffer[30] & 0x0f) | 0x20);//运行状态 0010,xxxx
  277. break;
  278. case Pause:
  279. usart2XmitBuffer[30] = ((usart2XmitBuffer[30] & 0x0f) | 0x30);//暂停状态 0011,xxxx
  280. break;
  281. case Poweroff:
  282. usart2XmitBuffer[30] &= 0x0f;//关机状态 0000,xxxx
  283. break;
  284. case Poweron:
  285. usart2XmitBuffer[30] = ((usart2XmitBuffer[30] & 0x0f) | 0x10);//开机状态 0001,xxxx
  286. break;
  287. default:
  288. usart2XmitBuffer[30] = ((usart2XmitBuffer[30] & 0x0f) | 0x40);//待机状态,现在没有待机状态,全按开机传 0100,xxxx
  289. break;
  290. }
  291. if( realTimeData.batteryVolt > 100 )//电池电量,发送电量百分比
  292. {
  293. usart2XmitBuffer[31] = 100;
  294. }
  295. else
  296. {
  297. usart2XmitBuffer[31] = realTimeData.batteryVolt;
  298. }
  299. tempCRC = CalCRC16(&usart2XmitBuffer[1], 31 );
  300. usart2XmitBuffer[32] = tempCRC % 256;
  301. usart2XmitBuffer[33] = tempCRC / 256;
  302. // USART2Send( usart2XmitBuffer, USART2_XMIT_LEN );
  303. transparent_send_data(usart2XmitBuffer,USART2_XMIT_LEN); //通过LORAWAN模块发送数据
  304. }
  305. /***************************************************************************************
  306. * Function: RunToLorawawn
  307. * Object: 实时数据发送到zigbee的数据
  308. * 输入: 无
  309. * 输出: 无
  310. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  311. * uint8_t tempXOR = 0;计算校验值
  312. * 2、USART2Send发送
  313. ****************************************************************************************/
  314. void RunToLorawawn( void )
  315. {
  316. // uint8_t tempIndex = 0;
  317. // uint8_t i;
  318. uint16_t tempCRC = 0;
  319. usart2XmitBuffer[0] = 15;
  320. usart2XmitBuffer[1] = 0x13;//包类型
  321. /*
  322. for( i = 0 ; i <8 ; i++ )//泵号
  323. {
  324. usart2XmitBuffer[i+2] = setParamInfo.deviceID[i];
  325. }*/
  326. usart2XmitBuffer[2] = (uint8_t)( ( verifyInfo.hospitalNO & 0x000000ff ) ) ; //住院号
  327. usart2XmitBuffer[3] = (uint8_t)( ( verifyInfo.hospitalNO & 0x0000ff00 ) >> 8 );
  328. usart2XmitBuffer[4] = (uint8_t)( ( verifyInfo.hospitalNO & 0x00ff0000 ) >> 16 );
  329. usart2XmitBuffer[5] = (uint8_t)( ( verifyInfo.hospitalNO & 0xff000000 ) >> 24 );
  330. usart2XmitBuffer[6] = (uint8_t)( setParamInfo.totalDose & 0x00ff );
  331. usart2XmitBuffer[7] = (uint8_t)( ( setParamInfo.totalDose & 0xff00 ) >> 8 );//总量
  332. usart2XmitBuffer[8] = (uint8_t)( realTimeData.inputDose & 0x00ff );
  333. usart2XmitBuffer[9] = (uint8_t)( ( realTimeData.inputDose & 0xff00 ) >> 8 );//输入量
  334. if( realTimeData.batteryVolt > 100 )//电池电量,发送电量百分比
  335. {
  336. usart2XmitBuffer[10] = 100;
  337. }
  338. else
  339. {
  340. usart2XmitBuffer[10] = realTimeData.batteryVolt;
  341. }
  342. usart2XmitBuffer[11] = (uint8_t)( realTimeData.validCount & 0x00ff ); //有效次数
  343. usart2XmitBuffer[12] = (uint8_t)( realTimeData.invalidCount & 0x00ff );//无效次数
  344. if( TaskSchedulerFlag.callFunctionFlag == TASK_FLAG_SET )//呼叫功能
  345. {
  346. usart2XmitBuffer[13] = (( usart2XmitBuffer[13] & 0xfe) | 0x01);// 0000 0001;
  347. }
  348. else
  349. {
  350. usart2XmitBuffer[13] &= 0xfe;
  351. }
  352. if( sysAlarmFlag.Zhentongxiaoguo == ALARM_ON )//镇痛效果
  353. {
  354. usart2XmitBuffer[13] = (( usart2XmitBuffer[13] & 0xfd) | 0x02); //0000 0010
  355. }
  356. else
  357. {
  358. usart2XmitBuffer[13] &= 0xfd;
  359. }
  360. if( sysAlarmFlag.VoltLowest == ALARM_PREPARE )//电池电量低预报警
  361. {
  362. usart2XmitBuffer[13] = (( usart2XmitBuffer[13] & 0xfb) | 0x04);// 0000 0100
  363. }
  364. else
  365. {
  366. usart2XmitBuffer[13] &= 0xfb;
  367. }
  368. tempCRC = CalCRC16(&usart2XmitBuffer[1], 13 );
  369. usart2XmitBuffer[14] = tempCRC % 256;
  370. usart2XmitBuffer[15] = tempCRC / 256;
  371. transparent_send_data(usart2XmitBuffer,16); //通过LORAWAN模块发送数据
  372. }
  373. /***************************************************************************************
  374. * Function: EvaluateToZigbeeHandle
  375. * Object: 随访数据发送到zigbee的数据
  376. * 输入: 无
  377. * 输出: 无
  378. * 备注: 1、uint8_t tempIndex = 0;发送赋值索引
  379. * 2、USART2Send发送
  380. ****************************************************************************************/
  381. void EvaluateToZigbeeHandle( void )
  382. {
  383. uint8_t tempIndex = 0;
  384. uint8_t i;
  385. //usart2XmitBuffer[tempIndex++] = 0xaa;
  386. //usart2XmitBuffer[tempIndex++] = 0x55;
  387. usart2XmitBuffer[tempIndex++] = 26;
  388. usart2XmitBuffer[tempIndex++] = 3;//包类型
  389. for( i = 0 ; i < 8 ; i++ )
  390. {
  391. usart2XmitBuffer[tempIndex++] = setParamInfo.deviceID[i];
  392. }
  393. usart2XmitBuffer[tempIndex++] = (uint8_t)( displayTimeBuf.year - 2015 );//时间
  394. usart2XmitBuffer[tempIndex++] = displayTimeBuf.month;
  395. usart2XmitBuffer[tempIndex++] = displayTimeBuf.date;
  396. usart2XmitBuffer[tempIndex++] = displayTimeBuf.hour;
  397. usart2XmitBuffer[tempIndex++] = displayTimeBuf.minute;
  398. usart2XmitBuffer[tempIndex++] = displayTimeBuf.seconds;
  399. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.hospitalNO & 0x000000ff ) ) ;
  400. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.hospitalNO & 0x0000ff00 ) >> 8 );
  401. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.hospitalNO & 0x00ff0000 ) >> 16 );
  402. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.hospitalNO & 0xff000000 ) >> 24 );
  403. //usart2XmitBuffer[tempIndex++] = 0;//住院号
  404. usart2XmitBuffer[tempIndex++] = (uint8_t)( verifyInfo.sickroom & 0x00ff );
  405. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.sickroom &0xff00 ) >> 8 );//病区号
  406. usart2XmitBuffer[tempIndex++] = (uint8_t)( verifyInfo.bedNO & 0x00ff );
  407. usart2XmitBuffer[tempIndex++] = (uint8_t)( ( verifyInfo.bedNO &0xff00 ) >> 8 );//病床号
  408. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.Static;
  409. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.Activity;
  410. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.CACSI;
  411. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.PONV;
  412. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.pruritus;
  413. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.LeftArm;
  414. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.RightArm;
  415. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.LeftLeg;
  416. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.RightLeg;
  417. usart2XmitBuffer[tempIndex++] = evaluateTransfuseValue.Valuer;
  418. usart2XmitBuffer[tempIndex++] = 0;//CRC
  419. usart2XmitBuffer[tempIndex++] = 0;//CRC
  420. /*for( i = tempIndex; i < USART2_XMIT_LEN ; i++ )
  421. {
  422. usart2XmitBuffer[tempIndex++] = 0xff;
  423. }*/
  424. // USART2Send( usart2XmitBuffer, USART2_XMIT_LEN );
  425. transparent_send_data(usart2XmitBuffer,27); //通过LORAWAN模块发送数据
  426. }
  427. /***************************************************************************************
  428. * Function: ZigbeeXmitHandle
  429. * Object: 发送zigbee数据
  430. * 输入: 无
  431. * 输出: 无
  432. * 备注: 1、开机后先读取zigbee地址作为设备ID号,然后根据 TaskSchedulerFlag.zigbeeXmitFlag标志位发送实时数据
  433. * 2、为节省功耗,每次发送完数据需将zigbee电源关掉
  434. * 3、if( TaskSchedulerFlag.zigbeeETXmitFlag == TASK_FLAG_WAIT )//发送前8s做发送准备
  435. {
  436. ZigbeePWRCtl( DRIVER_ON );//zigbee电源开
  437. }
  438. ****************************************************************************************/
  439. void ZigbeeXmitHandle( void )
  440. {
  441. if( EngineeringModeValue.networkState == ENGINEERINGMODE_ON )
  442. {
  443. /* if( TaskSchedulerFlag.zigbeeETXmitFlag != TASK_FLAG_CLEAR )//zigbee发送随访信息
  444. {
  445. if( TaskSchedulerFlag.zigbeeETXmitFlag == TASK_FLAG_SET )
  446. {
  447. if( speakerWorkStep != emSpeakerNoneWork)
  448. return;
  449. EvaluateToZigbeeHandle();
  450. emEvaluateTransfuseChoose = UploadFinshed;
  451. if( emCurrentPicture == EvaluateUploadEnterDisp )
  452. {
  453. emDisplayPicture = EvaluateUploadEnterDisp;
  454. }
  455. TaskSchedulerFlag.zigbeeETXmitFlag = TASK_FLAG_CLEAR;
  456. }
  457. }*/
  458. if(Start_send == 1)
  459. {
  460. if( realTimeData.stateRun == Poweroff )
  461. {
  462. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;
  463. }
  464. return;
  465. }
  466. if(EngineeringModeValue.test == 0)
  467. {
  468. if( realTimeData.stateRun == Poweroff )
  469. {
  470. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;
  471. }
  472. else if(realTimeData.stateRun == MainRun)
  473. {
  474. if(TaskSchedulerFlag.zigbeeXmitFlag == TASK_FLAG_SET)
  475. {
  476. RunToLorawawn();
  477. TaskSchedulerTimer.rtdXmitTimer = TWENTY_SECOND_TIMER;//20s发送一次
  478. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  479. }
  480. }
  481. }
  482. else
  483. {
  484. if((( TaskSchedulerFlag.zigbeeXmitFlag != TASK_FLAG_CLEAR ) && (realTimeData.stateRun != MainRun) && (realTimeData.stateRun != FirstRun) && (realTimeData.stateRun != PCARun) ) || (StartToRun_flag ==1))//zigbee发送实时信息
  485. {
  486. if(( TaskSchedulerFlag.zigbeeXmitFlag == TASK_FLAG_SET ) || (StartToRun_flag == 1))
  487. {
  488. if( speakerWorkStep != emSpeakerNoneWork)
  489. return;
  490. /* if(check_succeed == 1)//首先判断是否收到上位机的握手信号,收到了,直接退出,不再发生信息
  491. {
  492. StartToRun_flag=0;//接收到上位机发送的数据,清除该标志
  493. check_succeed=0;
  494. send_number=0;
  495. TaskSchedulerTimer.rtdXmitTimer = TWO_MINUTE_TIMER; //接收到上位机发送的数据,开始定时20分钟
  496. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  497. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  498. return;
  499. }*/
  500. if(Running_flag == 1)//在输注状态下,出现报警或者暂停等情况,先发送一次输注信息,然后再延时发送报警信息
  501. {
  502. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)
  503. {
  504. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  505. StartToRun_flag=0;
  506. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //定时发送数据开始 10s
  507. if((check_succeed == 1) || (send_number >= 3))
  508. {
  509. check_succeed=0;
  510. send_number=0;
  511. Running_flag=0; //接收到上位机发送的数据,清除该标志
  512. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  513. }
  514. else
  515. {
  516. RunToLorawawn();//调用发送数据包
  517. send_number++;
  518. }
  519. }
  520. else
  521. {
  522. Running_flag = 0;
  523. }
  524. return ;
  525. }
  526. if( realTimeData.stateRun == Poweroff )
  527. {
  528. if( zigbeeXmitCounts < 2 )//增加发送两条,2s后发一次
  529. {
  530. TaskSchedulerTimer.rtdXmitTimer = TWO_SECOND_TIMER;
  531. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_WAIT;
  532. RTDToZigbeeHandle();
  533. }
  534. if( zigbeeXmitCounts >= 3 )
  535. {
  536. zigbeeXmitCounts = 0;
  537. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_WAIT;//如果不加此条语句,会重复发送多次
  538. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;
  539. speakerWorkStep = emSpeakerNoneWork;
  540. }
  541. else
  542. {
  543. zigbeeXmitCounts++;
  544. }
  545. }
  546. else
  547. {
  548. zigbeeXmitCounts = 0;
  549. //TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  550. if(( TaskSchedulerFlag.zigbeeXmitFlag == TASK_FLAG_SET )&&(StartToRun_flag ==1)) // 判断这次发送的数据是否是按下运行按键发送的,如果是,重新给定时寄存器写入时间
  551. {
  552. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  553. RunToLorawawn_flag=0;//把运行发送的标志清零
  554. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //定时10s再发送一次,重新给定时寄存器写入时间
  555. if(((check_succeed == 1) || (send_number >= 3))&&(StartToRunSend_flag == 1))
  556. {
  557. if(check_succeed == 1)
  558. {
  559. TaskSchedulerFlag.StartToRunDontSend = SendSuceed;//运行长数据包发送成功
  560. }
  561. else if(send_number >= 3)
  562. {
  563. FailureSendNumber ++;//长包发送失败次数
  564. TaskSchedulerFlag.StartToRunDontSend = SendFailure;//运行长数据包发送失败
  565. }
  566. StartToRunSend_flag=0;
  567. StartToRun_flag=0;//接收到上位机发送的数据,清除该标志
  568. check_succeed=0;
  569. send_number=0;
  570. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  571. }
  572. else
  573. {
  574. StartToRunSend_flag=1;
  575. RTDToZigbeeHandle();
  576. send_number++;
  577. }
  578. }
  579. else if( TaskSchedulerFlag.zigbeeXmitFlag == TASK_FLAG_SET )
  580. {
  581. TaskSchedulerFlag.zigbeeXmitFlag = TASK_FLAG_CLEAR;
  582. if(((check_succeed == 1) || (send_number >= 3))&&(PauseSend_flag == 1))
  583. {
  584. PauseSend_flag = 0;
  585. check_succeed=0;
  586. send_number=0;
  587. TaskSchedulerTimer.rtdXmitTimer = TWENTY_MINUTE_TIMER; //接收到上位机发送的数据,开始定时20分钟
  588. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  589. if( realTimeData.stateRun == Poweron)
  590. {
  591. realTimeData.stateRun = WaitState;//开机发送数据后状态切换为待机状态
  592. }
  593. }
  594. else
  595. {
  596. PauseSend_flag = 1;
  597. RTDToZigbeeHandle();
  598. send_number++;
  599. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //没有接收到上位机发送的数据,开始定时30s
  600. }
  601. }
  602. }
  603. }
  604. }
  605. else if(( RunToLorawawn_flag == 1) && ((realTimeData.stateRun == MainRun) || (realTimeData.stateRun == FirstRun) || (realTimeData.stateRun == PCARun) )) //在主运行、首次量、PCA正常运行情况发送这个协议包,第一次进入发送一次,以后就是定时发送+随机发送
  606. {
  607. RunToLorawawn_flag=0;
  608. Running_flag=1;//在输注状态下,置位该标志
  609. if(TaskSchedulerFlag.StartToRunDontSend == SendSuceed)
  610. {
  611. if(setParamInfo.continueDose1 == 500)//持续量为50ml时,长包发送成功后,运行过程中30s发送一次短包
  612. {
  613. if((check_succeed == 1) || (send_number >= 3))
  614. {
  615. check_succeed=0;
  616. send_number=0;
  617. TaskSchedulerTimer.rtdXmitTimer = TWENTY_SECOND_TIMER; //接收到上位机发送的数据,开始定时30秒
  618. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  619. }
  620. else
  621. {
  622. RunToLorawawn();//调用发送数据包
  623. send_number++;
  624. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //没有接收到上位机发送的数据,开始定时10s
  625. }
  626. }
  627. else
  628. {
  629. if((check_succeed == 1) || (send_number >= 3))
  630. {
  631. check_succeed=0;
  632. send_number=0;
  633. TaskSchedulerTimer.rtdXmitTimer = TWENTY_MINUTE_TIMER; //接收到上位机发送的数据,开始定时20分钟
  634. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  635. }
  636. else
  637. {
  638. RunToLorawawn();//调用发送数据包
  639. send_number++;
  640. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //没有接收到上位机发送的数据,开始定时10s
  641. }
  642. }
  643. }
  644. else if(TaskSchedulerFlag.StartToRunDontSend == SendFailure)
  645. {
  646. if((check_succeed == 1) || (send_number >= 3))
  647. {
  648. if(check_succeed == 1)
  649. {
  650. TaskSchedulerFlag.StartToRunDontSend = SendSuceed;//运行长数据包发送成功
  651. }
  652. else if(send_number >= 3)
  653. {
  654. FailureSendNumber ++;//长包发送失败次数
  655. TaskSchedulerFlag.StartToRunDontSend = SendFailure;//运行长数据包发送失败
  656. }
  657. check_succeed=0;
  658. send_number=0;
  659. TaskSchedulerTimer.rtdXmitTimer = TWENTY_MINUTE_TIMER; //接收到上位机发送的数据,开始定时20分钟
  660. lorawan_to_sleep=1;//接收到上位机发送的数据,让模块进入睡眠状态
  661. }
  662. else
  663. {
  664. RTDToZigbeeHandle();
  665. send_number++;
  666. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER; //没有接收到上位机发送的数据,开始定时10s
  667. }
  668. }
  669. }
  670. }
  671. }
  672. else
  673. {
  674. // 网络没开的情况下,进入了随访上传界面,则显示上传失败
  675. /* if( TaskSchedulerFlag.zigbeeETXmitFlag == TASK_FLAG_SET )//zigbee发送随访信息
  676. {
  677. emEvaluateTransfuseChoose = UploadFall;
  678. emDisplayPicture = EvaluateUploadEnterDisp;
  679. TaskSchedulerFlag.zigbeeETXmitFlag = TASK_FLAG_CLEAR;
  680. }*/
  681. if( realTimeData.stateRun == Poweroff )
  682. {
  683. TaskSchedulerFlag.sysPowerOffFlag = TASK_FLAG_SET;
  684. }
  685. }
  686. }
  687. /***************************************************************************************
  688. * Function: ZigbeeRecvHandle
  689. * Object: 接收zigbee数据
  690. * 输入: 无
  691. * 输出: 无
  692. * 备注: 处理从zibgee通信接收到的数据
  693. ****************************************************************************************/
  694. void ZigbeeRecvHandle( void )
  695. {
  696. uint8_t i;
  697. uint8_t j = 7;
  698. //收到ZIGBEE 数据(ZIGBEE 模块对命令的响应)
  699. if( Recive_lorawanID_flag == TASK_FLAG_SET )
  700. {
  701. Recive_lorawanID_flag = TASK_FLAG_CLEAR;
  702. // if( usart2RecvBuffer[0] == 0xfc )
  703. {
  704. // if( ( usart2RecvBuffer[1] == 0x03 ) && ( usart2RecvBuffer[2] == 0x05 ) )
  705. {
  706. for( i = 0 ; i < 8 ; i++ )
  707. {
  708. setParamInfo.deviceID[j] = mcu_id[j];
  709. j--;
  710. }
  711. //接收到数据ID完成在此处保存一下
  712. WriteParameterRecord();
  713. }
  714. }
  715. }
  716. }
  717. /***************************************************************************************
  718. * Function: Uart2RecvHandle
  719. * Object: 接收zigbee数据
  720. * 输入: 无
  721. * 输出: 无
  722. * 备注: 处理从zibgee通信接收到的数据
  723. ****************************************************************************************/
  724. void Uart2RecvHandle( void )
  725. {
  726. uint8_t i,j=0;
  727. uint8_t check_hospitalNO[10];
  728. check_hospitalNO[0] = (uint8_t)( ( verifyInfo.hospitalNO & 0x000000ff ) ) ;
  729. check_hospitalNO[1] = (uint8_t)( ( verifyInfo.hospitalNO & 0x0000ff00 ) >> 8 );
  730. check_hospitalNO[2] = (uint8_t)( ( verifyInfo.hospitalNO & 0x00ff0000 ) >> 16 );
  731. check_hospitalNO[3] = (uint8_t)( ( verifyInfo.hospitalNO & 0xff000000 ) >> 24 );
  732. //if(lorawan_send_data_flag != 1)//没有发送数据的时候,直接退出
  733. // return;
  734. if( TaskSchedulerFlag.zigbeeRecvFlag == TASK_FLAG_SET )
  735. {
  736. TaskSchedulerFlag.zigbeeRecvFlag = TASK_FLAG_CLEAR;
  737. if(( usart2RecvBuffer[0] == 0xad ) && ( usart2RecvBuffer[1] == 0xfc ))
  738. {
  739. for( i = 0 ; i < 4 ; i++ )
  740. {
  741. if(usart2RecvBuffer[i+2] == check_hospitalNO[i])
  742. {
  743. j++;
  744. }
  745. }
  746. if(j>=4)
  747. {
  748. check_succeed=1;//所有位都校验对了,置位该标志
  749. //USART1Send(usart2RecvBuffer,10);
  750. }
  751. }
  752. }
  753. }