Pump_Dicts_Util.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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(2,1,pump_data,&length);
  112. pump_data[length++] = pump_params.networkType;
  113. // 基站位置区号
  114. setPumpOption(5,2,pump_data,&length);
  115. pump_data[length++] = (uint8_t)( ( pump_params.lac & 0xff00 ) >> 8 );
  116. pump_data[length++] = (uint8_t)( pump_params.lac & 0x00ff );
  117. // 基站小区ID
  118. setPumpOption(6,4,pump_data,&length);
  119. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0xff000000 ) >> 24 );
  120. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x00ff0000 ) >> 16 );
  121. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x0000ff00 ) >> 8 );
  122. pump_data[length++] = (uint8_t)( ( pump_params.ci & 0x000000ff ) );
  123. // 泵类型
  124. setPumpOption(101,1,pump_data,&length);
  125. pump_data[length++] = pump_params.pumpType;
  126. // 输注编号
  127. setPumpOption(103,4,pump_data,&length);
  128. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0xff000000 ) >> 24 );
  129. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0x00ff0000 ) >> 16 );
  130. pump_data[length++] = (uint8_t)( ( pump_params.infusionId & 0x0000ff00 ) >> 8 );
  131. pump_data[length++] = (uint8_t)( pump_params.infusionId & 0x000000ff );
  132. // 数据编号
  133. setPumpOption(104,4,pump_data,&length);
  134. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0xff000000 ) >> 24 );
  135. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0x00ff0000 ) >> 16 );
  136. pump_data[length++] = (uint8_t)( ( pump_params.dataNumber & 0x0000ff00) >> 8 );
  137. pump_data[length++] = (uint8_t)( pump_params.dataNumber & 0x000000ff );
  138. // 住院号
  139. setPumpOption(105,8,pump_data,&length);
  140. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0xff00000000000000 ) >> 56 );
  141. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00ff000000000000 ) >> 48 );
  142. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x0000ff0000000000 ) >> 40 );
  143. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x000000ff00000000 ) >> 32 );
  144. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00000000ff000000 ) >> 24 );
  145. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x0000000000ff0000 ) >> 16 );
  146. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x000000000000ff00 ) >> 8 );
  147. pump_data[length++] = (uint8_t)( ( pump_params.patientCode & 0x00000000000000ff ) );
  148. // 持续量
  149. setPumpOption(106,2,pump_data,&length);
  150. pump_data[length++] = (uint8_t)( ( pump_params.continueDose & 0xff00 ) >> 8 );
  151. pump_data[length++] = (uint8_t)( ( pump_params.continueDose & 0x00ff ) );
  152. // 锁定时间
  153. setPumpOption(107,1,pump_data,&length);
  154. pump_data[length++] = pump_params.lockTime;
  155. // 极限量
  156. setPumpOption(108,1,pump_data,&length);
  157. pump_data[length++] = pump_params.ultimateDose;
  158. // 首次量
  159. setPumpOption(109,1,pump_data,&length);
  160. pump_data[length++] = pump_params.firstDose;
  161. // 追加量
  162. setPumpOption(110,1,pump_data,&length);
  163. pump_data[length++] = pump_params.appendDose;
  164. // 总量
  165. setPumpOption(111,2,pump_data,&length);
  166. pump_data[length++] = (uint8_t)( ( pump_params.totalDose & 0xff00 ) >> 8 );
  167. pump_data[length++] = (uint8_t)( pump_params.totalDose & 0x00ff );
  168. // 已输注量
  169. setPumpOption(112,2,pump_data,&length);
  170. pump_data[length++] = (uint8_t)( ( pump_params.finishDose & 0xff00 ) >> 8 );
  171. pump_data[length++] = (uint8_t)( pump_params.finishDose & 0x00ff );
  172. // 有效追加次数
  173. setPumpOption(113,1,pump_data,&length);
  174. pump_data[length++] = pump_params.validTimes;
  175. // 无效追加次数
  176. setPumpOption(114,1,pump_data,&length);
  177. pump_data[length++] = pump_params.invalidTimes;
  178. // 报警
  179. if(pump_params.alarm_BubbleOrAneroid == 1)
  180. {
  181. setPumpOption(115,1,pump_data,&length);
  182. pump_data[length++] = 1; // 气泡或无液报警
  183. }
  184. if(pump_params.alarm_Blocked == 1)
  185. {
  186. setPumpOption(115,1,pump_data,&length);
  187. pump_data[length++] = 2; // 堵塞报警
  188. }
  189. if(pump_params.alarm_Total == 1)
  190. {
  191. setPumpOption(115,1,pump_data,&length);
  192. pump_data[length++] = 3; // 输入总量报警
  193. }
  194. if(pump_params.alarm_Ultimate == 1)
  195. {
  196. setPumpOption(115,1,pump_data,&length);
  197. pump_data[length++] = 4; // 极限量报警
  198. }
  199. if(pump_params.alarm_LowPower == 1)
  200. {
  201. setPumpOption(115,1,pump_data,&length);
  202. pump_data[length++] = 5; // 电量耗尽报警
  203. }
  204. if(pump_params.alarm_Finished == 1)
  205. {
  206. setPumpOption(115,1,pump_data,&length);
  207. pump_data[length++] = 6; // 输液结束报警
  208. }
  209. if(pump_params.alarm_MotorOutofcontrol ==1)
  210. {
  211. setPumpOption(115,1,pump_data,&length);
  212. pump_data[length++] = 7; // 电机失控报警
  213. }
  214. if(pump_params.alarm_MechanicalBreakdown ==1)
  215. {
  216. setPumpOption(115,1,pump_data,&length);
  217. pump_data[length++] = 8; // 机械故障报警
  218. }
  219. if(pump_params.alarm_UnfilledPillBox ==1)
  220. {
  221. setPumpOption(115,1,pump_data,&length);
  222. pump_data[length++] = 9; // 未装药盒报警
  223. }
  224. // 预报
  225. if(pump_params.forcast_WillFinished ==1)
  226. {
  227. setPumpOption(116,1,pump_data,&length);
  228. pump_data[length++] = 1; // 输液将结束
  229. }
  230. if(pump_params.forcast_InsufficientAnalgesia ==1)
  231. {
  232. setPumpOption(116,1,pump_data,&length);
  233. pump_data[length++] = 2; // 镇痛不足
  234. }
  235. if(pump_params.forcast_LowPowerForecast ==1)
  236. {
  237. setPumpOption(116,1,pump_data,&length);
  238. pump_data[length++] = 3; // 电量偏低
  239. }
  240. // 运行状态
  241. setPumpOption(117,1,pump_data,&length);
  242. if( pump_params.runStatus == 0 )pump_data[length++] = 0; // 关机
  243. if( pump_params.runStatus == 1 )pump_data[length++] = 1; // 开机
  244. if( pump_params.runStatus == 2 )pump_data[length++] = 2; // 运行
  245. if( pump_params.runStatus == 3 )pump_data[length++] = 3; // 暂停
  246. if( pump_params.runStatus == 4 )pump_data[length++] = 4; // 待机
  247. // 电量
  248. setPumpOption(118,1,pump_data,&length);
  249. pump_data[length++] = pump_params.electricity;
  250. // 脉冲量锁时
  251. setPumpOption(121,1,pump_data,&length);
  252. pump_data[length++] = pump_params.pulseLockTime;
  253. // 脉冲首次锁时
  254. setPumpOption(122,1,pump_data,&length);
  255. pump_data[length++] = pump_params.firstLockTime;
  256. // 脉冲量
  257. setPumpOption(123,1,pump_data,&length);
  258. pump_data[length++] = pump_params.pulseDose;
  259. //病区
  260. setPumpOption(124,2,pump_data,&length);
  261. pump_data[length++] = (uint8_t)( ( pump_params.ward & 0xff00 ) >> 8 );
  262. pump_data[length++] = (uint8_t)( pump_params.ward & 0x00ff );
  263. //床号
  264. setPumpOption(125,2,pump_data,&length);
  265. pump_data[length++] = (uint8_t)( ( pump_params.bedNo & 0xff00 ) >> 8 );
  266. pump_data[length++] = (uint8_t)( pump_params.bedNo & 0x00ff );
  267. *pump_data_length = length;
  268. }
  269. /**
  270. * 协议解码
  271. * 输出<<
  272. * pump_data 编码后的二进制数据。
  273. * pump_data_length 编码后的二进制数据的长度。
  274. * 输出>>
  275. * pump_params 泵参数。
  276. **/
  277. struct Pump_Params business_protocol_decode(uint8_t * pump_data, uint16_t * pump_data_length)
  278. {
  279. struct Pump_Params pump_params;
  280. return pump_params;
  281. }