Pump_Dicts_Util.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. /**
  2. ******************************************************************************
  3. * 版 本 :V1.0.0
  4. * 作 者 :zhaodecheng,liuyanbin
  5. * 版权所有,盗版必究。
  6. * Copyright(C) All rights reserved
  7. ******************************************************************************
  8. * 历史记录
  9. * 序号 版本 变更内容 作者 日期
  10. * 1 V0.0.1 实现协议封装代码 刘艳斌 2023/12/23
  11. * 2 V1.0.0 优化协议封装代码 赵得逞 2024/1/5
  12. *
  13. ******************************************************************************
  14. */
  15. #include "stm32f10x.h"
  16. #include <stdio.h>
  17. #include "Pump_Dicts_Util.h"
  18. static uint16_t LastIDNumber = 0; // 上一个编号
  19. void computeOptionDelta(uint32_t OptionNumber,uint8_t *OptionDelta,uint16_t *ExOptionDelta)
  20. {
  21. if(OptionNumber <= 12)
  22. {
  23. *OptionDelta = OptionNumber;
  24. *ExOptionDelta = 0;
  25. //Log_Printf("发送成功:%d\r\n", *OptionDelta);
  26. }
  27. else if(OptionNumber >= 13 && OptionNumber <= 268)
  28. {
  29. *OptionDelta = 13;
  30. *ExOptionDelta = OptionNumber - 13;
  31. }
  32. else if(OptionNumber >= 269 && OptionNumber <= 655349)
  33. {
  34. *OptionDelta = 14;
  35. *ExOptionDelta = OptionNumber - 255;
  36. }
  37. }
  38. void computeOptionLength(uint32_t Length,uint8_t *OptionLength,uint16_t *ExOptionLength)
  39. {
  40. if(Length <= 12)
  41. {
  42. *OptionLength = Length;
  43. *ExOptionLength = 0;
  44. //Log_Printf("发送成功:%d\r\n", *OptionLength);
  45. }
  46. else if(Length >= 13 && Length <= 268)
  47. {
  48. *OptionLength = 13;
  49. *ExOptionLength = Length - 13;
  50. }
  51. else if(Length >= 269 && Length <= 655349)
  52. {
  53. *OptionLength = 14;
  54. *ExOptionLength = Length - 255;
  55. }
  56. }
  57. void setPumpOption(uint16_t IDNumber,uint16_t Length,uint8_t * pump_data, uint16_t * pump_data_length)
  58. {
  59. uint16_t OptionNumber = 0;
  60. uint16_t ExOptionDelta = 0;
  61. uint16_t ExOptionLength = 0;
  62. uint8_t OptionDelta = 0;
  63. uint8_t OptionLength = 0;
  64. uint16_t length = * pump_data_length;
  65. OptionNumber = IDNumber - LastIDNumber; // 计算联合偏移量
  66. LastIDNumber = IDNumber;
  67. computeOptionDelta(OptionNumber,&OptionDelta,&ExOptionDelta); // 计算OptionDelta和ExOptionDelta
  68. computeOptionLength(Length,&OptionLength,&ExOptionLength); // 计算OptionLength和ExOptionLength
  69. pump_data[length++] = OptionDelta << 4 | (OptionLength & 0x0f);
  70. // 设置ExOptionDelta
  71. if(OptionDelta >= 13)
  72. {
  73. pump_data[length++] = (uint8_t)(ExOptionDelta & 0x00ff);
  74. }
  75. if(OptionDelta == 14)
  76. {
  77. pump_data[length++] = (uint8_t)(ExOptionDelta & 0xff00) >> 8;
  78. }
  79. // 设置ExOptionLength
  80. if(OptionLength >= 13)
  81. {
  82. pump_data[length++] = (uint8_t)(ExOptionLength & 0x00ff);
  83. }
  84. if(OptionLength == 14)
  85. {
  86. pump_data[length++] = (uint8_t)(ExOptionLength & 0xff00) >> 8;
  87. }
  88. *pump_data_length = length;
  89. }
  90. /**
  91. * 协议编码
  92. * 输入<<
  93. * pump_params 泵参数。
  94. * 输出>>
  95. * pump_data 编码后的二进制数据。
  96. * pump_data_length 编码后的二进制数据的长度。
  97. **/
  98. void business_protocol_encode(struct Pump_Params pump_params, uint8_t * pump_data, uint16_t * pump_data_length)
  99. {
  100. uint16_t length = 0;
  101. LastIDNumber = 0;
  102. pump_data[length++] = 0x54; // 大写字母“T”。“驼”字的首字母。
  103. pump_data[length++] = 0x52; // 大写字母“R”。“人”字的首字母。
  104. pump_data[length++] = 0x01; // 协议版本。
  105. pump_data[length++] = 0x01; // 数据类型。
  106. //用户编号
  107. setPumpOption(1,2,pump_data,&length);
  108. pump_data[length++] = (uint8_t)( ( pump_params.userId & 0xff00 ) >> 8 );
  109. pump_data[length++] = (uint8_t)( ( pump_params.userId & 0x00ff ) );
  110. // 泵类型
  111. setPumpOption(101,1,pump_data,&length);
  112. pump_data[length++] = pump_params.pumpType;
  113. // 输注编号
  114. setPumpOption(103,4,pump_data,&length);
  115. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0xff000000 ) >> 24 );
  116. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0x00ff0000 ) >> 16 );
  117. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0x0000ff00 ) >> 8 );
  118. pump_data[length++] = (uint8_t)( pump_params.infusionId & 0x000000ff );
  119. // 数据编号
  120. setPumpOption(104,4,pump_data,&length);
  121. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0xff000000 ) >> 24 );
  122. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0x00ff0000 ) >> 16 );
  123. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0x0000ff00) >> 8 );
  124. pump_data[length++] = (uint8_t)( pump_params.dataNumber & 0x000000ff );
  125. // 住院号
  126. setPumpOption(105,8,pump_data,&length);
  127. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0xff00000000000000 ) >> 56 );
  128. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00ff000000000000 ) >> 48 );
  129. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x0000ff0000000000 ) >> 40 );
  130. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x000000ff00000000 ) >> 32 );
  131. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00000000ff000000 ) >> 24 );
  132. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x0000000000ff0000 ) >> 16 );
  133. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x000000000000ff00 ) >> 8 );
  134. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00000000000000ff ) );
  135. // 持续量
  136. setPumpOption(106,2,pump_data,&length);
  137. pump_data[length++] = (uint8_t)( ( pump_params.continueDose & 0xff00 ) >> 8 );
  138. pump_data[length++] = (uint8_t)( ( pump_params.continueDose & 0x00ff ) );
  139. // 锁定时间
  140. setPumpOption(107,1,pump_data,&length);
  141. pump_data[length++] = pump_params.lockTime;
  142. // 极限量
  143. setPumpOption(108,1,pump_data,&length);
  144. pump_data[length++] = pump_params.ultimateDose;
  145. // 首次量
  146. setPumpOption(109,1,pump_data,&length);
  147. pump_data[length++] = pump_params.firstDose;
  148. // 追加量
  149. setPumpOption(110,1,pump_data,&length);
  150. pump_data[length++] = pump_params.appendDose;
  151. // 总量
  152. setPumpOption(111,2,pump_data,&length);
  153. pump_data[length++] = (uint8_t)( ( pump_params.totalDose & 0xff00 ) >> 8 );
  154. pump_data[length++] = (uint8_t)( pump_params.totalDose & 0x00ff );
  155. // 已输注量
  156. setPumpOption(112,2,pump_data,&length);
  157. pump_data[length++] = (uint8_t)( ( pump_params.finishDose & 0xff00 ) >> 8 );
  158. pump_data[length++] = (uint8_t)( pump_params.finishDose & 0x00ff );
  159. // 有效追加次数
  160. setPumpOption(113,1,pump_data,&length);
  161. pump_data[length++] = pump_params.validTimes;
  162. // 无效追加次数
  163. setPumpOption(114,1,pump_data,&length);
  164. pump_data[length++] = pump_params.invalidTimes;
  165. // 报警
  166. if(pump_params.alarm_BubbleOrAneroid == 1)
  167. {
  168. setPumpOption(115,1,pump_data,&length);
  169. pump_data[length++] = 1; // 气泡或无液报警
  170. }
  171. if(pump_params.alarm_Blocked == 1)
  172. {
  173. setPumpOption(115,1,pump_data,&length);
  174. pump_data[length++] = 2; // 堵塞报警
  175. }
  176. if(pump_params.alarm_Total == 1)
  177. {
  178. setPumpOption(115,1,pump_data,&length);
  179. pump_data[length++] = 3; // 输入总量报警
  180. }
  181. if(pump_params.alarm_Ultimate == 1)
  182. {
  183. setPumpOption(115,1,pump_data,&length);
  184. pump_data[length++] = 4; // 极限量报警
  185. }
  186. if(pump_params.alarm_LowPower == 1)
  187. {
  188. setPumpOption(115,1,pump_data,&length);
  189. pump_data[length++] = 5; // 电量耗尽报警
  190. }
  191. if(pump_params.alarm_Finished == 1)
  192. {
  193. setPumpOption(115,1,pump_data,&length);
  194. pump_data[length++] = 6; // 输液结束报警
  195. }
  196. if(pump_params.alarm_MotorOutofcontrol ==1)
  197. {
  198. setPumpOption(115,1,pump_data,&length);
  199. pump_data[length++] = 7; // 电机失控报警
  200. }
  201. if(pump_params.alarm_MechanicalBreakdown ==1)
  202. {
  203. setPumpOption(115,1,pump_data,&length);
  204. pump_data[length++] = 8; // 机械故障报警
  205. }
  206. if(pump_params.alarm_UnfilledPillBox ==1)
  207. {
  208. setPumpOption(115,1,pump_data,&length);
  209. pump_data[length++] = 9; // 未装药盒报警
  210. }
  211. // 预报
  212. if(pump_params.forcast_WillFinished ==1)
  213. {
  214. setPumpOption(116,1,pump_data,&length);
  215. pump_data[length++] = 1; // 输液将结束
  216. }
  217. if(pump_params.forcast_InsufficientAnalgesia ==1)
  218. {
  219. setPumpOption(116,1,pump_data,&length);
  220. pump_data[length++] = 2; // 镇痛不足
  221. }
  222. if(pump_params.forcast_LowPowerForecast ==1)
  223. {
  224. setPumpOption(116,1,pump_data,&length);
  225. pump_data[length++] = 3; // 电量偏低
  226. }
  227. // 运行状态
  228. setPumpOption(117,1,pump_data,&length);
  229. if( pump_params.runStatus == 0 )pump_data[length++] = 0; // 关机
  230. if( pump_params.runStatus == 1 )pump_data[length++] = 1; // 开机
  231. if( pump_params.runStatus == 2 )pump_data[length++] = 2; // 运行
  232. if( pump_params.runStatus == 3 )pump_data[length++] = 3; // 暂停
  233. if( pump_params.runStatus == 4 )pump_data[length++] = 4; // 待机
  234. // 电量
  235. setPumpOption(118,1,pump_data,&length);
  236. pump_data[length++] = pump_params.electricity;
  237. // 基站位置区号
  238. setPumpOption(119,2,pump_data,&length);
  239. pump_data[length++] = (uint8_t)( ( pump_params.lac & 0xff00 ) >> 8 );
  240. pump_data[length++] = (uint8_t)( pump_params.lac & 0x00ff );
  241. // 基站小区ID
  242. setPumpOption(120,4,pump_data,&length);
  243. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0xff000000 ) >> 24 );
  244. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x00ff0000 ) >> 16 );
  245. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x0000ff00 ) >> 8 );
  246. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x000000ff ) );
  247. // 脉冲量锁时
  248. setPumpOption(121,1,pump_data,&length);
  249. pump_data[length++] = pump_params.pulseLockTime;
  250. // 脉冲首次锁时
  251. setPumpOption(122,1,pump_data,&length);
  252. pump_data[length++] = pump_params.firstLockTime;
  253. // 脉冲量
  254. setPumpOption(123,1,pump_data,&length);
  255. pump_data[length++] = pump_params.pulseDose;
  256. //病区
  257. setPumpOption(124,2,pump_data,&length);
  258. pump_data[length++] = (uint8_t)( ( pump_params.ward & 0xff00 ) >> 8 );
  259. pump_data[length++] = (uint8_t)( pump_params.ward & 0x00ff );
  260. //床号
  261. setPumpOption(125,2,pump_data,&length);
  262. pump_data[length++] = (uint8_t)( ( pump_params.bedNo & 0xff00 ) >> 8 );
  263. pump_data[length++] = (uint8_t)( pump_params.bedNo & 0x00ff );
  264. *pump_data_length = length;
  265. }
  266. /**
  267. * 协议解码
  268. * 输出<<
  269. * pump_data 编码后的二进制数据。
  270. * pump_data_length 编码后的二进制数据的长度。
  271. * 输出>>
  272. * pump_params 泵参数。
  273. **/
  274. struct Pump_Params business_protocol_decode(uint8_t * pump_data, uint16_t * pump_data_length)
  275. {
  276. struct Pump_Params pump_params;
  277. return pump_params;
  278. }