Pump_Dicts_Util.c 10 KB

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