pump_dicts.c 8.5 KB

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