pump_dicts.c 9.9 KB

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