soft_water_device.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. #ifndef _SOFT_WATER_DEVICE_H_
  2. #define _SOFT_WATER_DEVICE_H_
  3. #include "common.h"
  4. #pragma pack(1)
  5. typedef struct{
  6. short liquid_percent;
  7. uint8_t warn_falg;
  8. int serial_num;
  9. }liquid;
  10. #pragma pack()
  11. extern liquid liquid_inf;
  12. extern comp_status liquid_link_status;
  13. #pragma pack(1)
  14. typedef struct
  15. {
  16. uint16_t speed;
  17. uint16_t ml;
  18. uint8_t warn;
  19. uint16_t last_ml;
  20. uint16_t overturn;
  21. uint16_t k;
  22. uint16_t k_multiple;
  23. bool get_k;
  24. bool set_k;
  25. uint16_t cal_k;
  26. bool clear_background;
  27. }flow_info;
  28. #pragma pack()
  29. #pragma pack(1)
  30. typedef struct
  31. {
  32. uint8_t ch;
  33. flow_info ch1,ch2;
  34. }flow;
  35. #pragma pack()
  36. extern flow flow_inf;
  37. extern comp_status vkflow_link_status;
  38. typedef struct
  39. {
  40. uint8_t arm_sensor1;
  41. uint8_t arm_sensor2;
  42. uint16_t nozzle1;
  43. uint16_t nozzle2;
  44. }distributor_info;
  45. extern distributor_info distributor;
  46. extern Connect_check Distributor_Link;
  47. /**************************************** Hobbywing ESC***************************************/
  48. /**************************************** Hobbywing ESC***************************************/
  49. /**************************************** Hobbywing ESC***************************************/
  50. //===========current sensor test================
  51. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE 55
  52. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_SIGNATURE (0x249C26548A711966ULL)
  53. #define UAVCAN_EQUIPMENT_POWER_BATTERYINFO_ID 1092
  54. struct uavcan_equipment_power_BatteryInfo
  55. {
  56. float temperature; // 16bit
  57. float voltage; // 16bit
  58. float current; // 16bit
  59. float average_power_10sec; // 16bit
  60. float remaining_capacity_wh; // 16bit
  61. float full_charge_capacity_wh; // 16bit
  62. float hours_to_full_charge; // 16bit
  63. uint16_t status_flags; // 11bit
  64. uint8_t state_of_health_pct; // 7bit
  65. uint8_t state_of_charge_pct; // 7bit
  66. uint8_t state_of_charge_pct_stdev; // 7bit
  67. uint8_t battery_id; // 8bit
  68. uint32_t model_instance_id; // 32bit
  69. struct { uint8_t len; uint8_t data[31]; }model_name;
  70. };
  71. extern struct uavcan_equipment_power_BatteryInfo power_BatteryInfo;
  72. /*
  73. Set_Id_Mode
  74. 0x55:可直接通过广播帧设置 ID
  75. 0xAA:需要在正常 0 油门下才能通过广播帧设置 ID
  76. */
  77. #define HW_SETIDMODE_MODE1 0x55
  78. #define HW_SETIDMODE_MODE2 0xAA
  79. /*
  80. Ready_Control
  81. 0x55:不需要启动命令就能驱动电调
  82. 0xAA:驱动电调之前必须发生启动命令
  83. */
  84. #define HW_SETIDMODE_CONTROL1 0x55
  85. #define HW_SETIDMODE_CONTROL2 0xAA
  86. /*
  87. 0x00:节点 ESC 开启总线测试模式后定时上报使用该值
  88. 0xAA:开启节点 ESC 总线测试模式
  89. 0x55:关闭节点 ESC 总线测试模式
  90. */
  91. #define HW_CANTEST_OPTDEF 0x00
  92. #define HW_CANTEST_OPTOPE 0xAA
  93. #define HW_CANTEST_OPTCLS 0x55
  94. #define HW_PRI_MEDIUM 0x10
  95. #define HW_CANID_PRI_POS (24)
  96. #define HW_CANID_PRI_MASK (0x1F000000) // 1 1111 0000 0000 0000 0000 0000 0000
  97. #define HW_PRI_HIGHEST 0x00
  98. #define HW_PRI_HIGH 0x08
  99. #define HW_PRI_MEDIUM 0x10
  100. #define HW_PRI_LOW 0x18
  101. #define HW_PRI_LOWEST 0x1F
  102. #define HW_CANID_MSGID_POS (8)
  103. #define HW_CANID_MSGID_MASK (0x00FFFF00) // 0 0000 1111 1111 1111 1111 0000 0000
  104. #define HW_CANID_SNM_POS (7)
  105. #define HW_CANID_SNM_MASK (0x00000080) // 0 0000 0000 0000 0000 0000 1000 0000
  106. #define HW_TYPE_MSG 0x0 // 广播帧(message farm)
  107. #define HW_TYPE_SER 0x1 // 服务帧
  108. #define HW_CANID_SRCNODE_POS (0)
  109. #define HW_CANID_SRCNODE_MASK (0x0000007F) // 0 0000 0000 0000 0000 0000 0111 1111
  110. #define HW_NODE_BDC 0x10 // 广播节点
  111. //================================SER FRAM==============================================
  112. #define HW_CANID_SERID_POS (16)
  113. #define HW_CANID_SERID_MASK (0x00FF0000) // 0 0000 1111 1111 0000 0000 0000 0000
  114. #define HW_CANID_RNR_POS (15)
  115. #define HW_CANID_RNR_MASK (0x00008000) // 0 0000 0000 0000 1000 0000 0000 0000
  116. #define HW_TYPE_RES 0x0
  117. #define HW_TYPE_REQ 0x1
  118. #define HW_CANID_DESNODE_POS (8)
  119. #define HW_CANID_DESNODE_MASK (0x00007F00) // 0 0000 0000 0000 0111 1111 0000 0000
  120. //===========================广播帧==================================
  121. #define HW_MSGCONTROL_ID (20010) //暂停/恢复主动数据上报指令
  122. #define HW_FRAME_MSG_GET_ESC_ID (20013) //查询电调 ID 及油门通道命令为广播帧
  123. #define HW_FRAME_MSG_SET_ID_MODE (20014) //进入 ID 及油门通道设置模式为广播帧
  124. #define HW_MSG1_ID (20050) //MSG1 数据是 ESC 主动上报给主节点的数据,50HZ
  125. #define HW_MSG2_ID (20051) //MSG2 数据是 ESC 主动上报给主节点的数据,10HZ
  126. #define HW_MSG3_ID (20052) //MSG3 数据是 ESC 主动上报给主节点的数据,1HZ
  127. #define HW_RAWCOMMAND_ID (20100) //RawCommand 发送油门的命令,为广播帧不需要应答,总线上所有 ESC 同时接收解析。
  128. #define HW_MSGACCLE_ID (20150) //MSG Accel 是 ESC 主动上报给主节点的数据,仅对配有六轴传感器的 ESC 有效
  129. #define HW_MSGGYRO_ID (20151) //MSG Gyro 是 ESC 主动上报给主节点的数据,仅对配有六轴传感器的 ESC 有效。
  130. #define HW_MSGBRUSHESC_ID (20200) //MSG BrushEsc 是有刷电调节点自动上报数据实时数据的数据帧
  131. #define HW_RAWCOMMANDB_ID (20250) //RawCommand2 是飞控(FMU)发送有刷电调油门的命令,广播帧不需要应答,总线上所有 ESC 同时接收解析。
  132. #define HW_DLKMSG1_ID (20800) //DLK MSG1 数据是 DATALINK 转发的数据帧(DATALINK 将串口协议电调数据转换为 CAN 数据帧)
  133. #define HW_DLKMSG2_ID (20801) //DLK MSG2 数据是 DATALINK 转发的数据帧(DATALINK 将串口协议电调数据转换为 CAN 数据帧)
  134. //===========================服务帧==================================
  135. #define HW_MSGCOMMAND_ID (200) //供应商命令-消息命令
  136. #define HW_UPGCOMMAND_ID (201) //供应商命令-升级命令
  137. #define HW_DBGCOMMAND_ID (202) //供应商命令-调试命令
  138. #define HW_SETID_ID (210) //Set Id 是给 ESC 节点设置 ID 的命令,每个 ESC 对应一个 ID。(ID 0x01~0x7F,油门通道 1~8)
  139. #define HW_SETBAUD_ID (211) //设置 CAN 总线速率,设置后重新上电生效。
  140. #define HW_SETLED_ID (212) //Set Led Color 是主节点发送给 ESC 设置 Led 灯颜色的命令。
  141. #define HW_SETROTATION_ID (213) //Set Rotation 是主节点发送给 ESC 设置电机旋转方向(顺时针/逆时针)的命令。
  142. #define HW_SETGET_FREQ_ID (214) //Set Freq 是主节点发送给 ESC 设置数据上报频率的命令,会保存 FLASH 内,掉电不丢失,
  143. #define HW_THRSELEXT_ID (215) //Throttle Select 是飞控 FMU 发送选择油门信号源的命令,支持 PWM 脉宽油门与 CAN 数字油门。
  144. #define HW_SELFTEST_ID (216) //Self Test 是查询电调自检状态的命令。
  145. #define HW_SETANGLE_ID (217) //Set Angle 是主节点设置 ESC 桨叶定位角度的命令,ESC 停止运行时桨叶会停止在设置的角度位置。
  146. #define HW_ACCGYROCONFIG_ID (218) //Accel-Gyro Configuration 是六轴加速度计陀螺仪传感器配置命令,仅对配有六轴传感器的 ESC 有效。
  147. #define HW_BRUSHESCCONFIG_ID (219) //Brush Esc Configuration 是主节点设置有刷电调配置参数的命令。
  148. #define HW_SERSETID_ID (220) //Ser Set Id 是给 ESC 节点设置 ID 的命令,每个 ESC 对应一个 ID。
  149. #define HW_ESCINFO_ID (240) //ESC Information 是获取当前电调驱动程序信息的命令。
  150. #define HW_GETMAJORCONF_ID (242) //Get Major Configuration 是主节点快速获取电调主要参数配置信息的数据帧
  151. #define HW_MSGCOMMAND_SIG ((uint64_t)0x8c4acf8adb0375cf)
  152. #define HW_UPGCOMMAND_SIG ((uint64_t)0xada98653b52de435)
  153. #define HW_DBGCOMMAND_SIG ((uint64_t)0xe524989ae0471097)
  154. #define HW_SETID_SIG ((uint64_t)0xc323cb5e9ec2b6f7)
  155. #define HW_SETBAUD_SIG ((uint64_t)0xed47dea06da1d619)
  156. #define HW_SETLED_SIG ((uint64_t)0xb493bd48c0853ee5)
  157. #define HW_SETROTATION_SIG ((uint64_t)0x9d793111d262ba68)
  158. #define HW_SETGET_FREQ_SIG ((uint64_t)0x1fd0404420983deb)
  159. #define HW_THRSELEXT_SIG ((uint64_t)0x0c248faaefe5e29a)
  160. #define HW_SELFTEST_SIG ((uint64_t)0xc48d4de61c5295df)
  161. #define HW_SETANGLE_SIG ((uint64_t)0x81d9b10761c28e0a)
  162. #define HW_ACCGYROCONFIG_SIG ((uint64_t)0xa1ed58b0897d7d5a)
  163. #define HW_BRUSHESCCONFIG_SIG ((uint64_t)0x1302d2cf8a1a5a71)
  164. #define HW_SERSETID_SIG ((uint64_t)0xc323cb5e9ec2b6f7)
  165. #define HW_ESCINFO_SIG ((uint64_t)0xd7fe2a212374089b)
  166. #define HW_MAINTANCEINFO_SIG ((uint64_t)0xb81dbd4ec9a5977d)
  167. #define HW_GETMAJORCONF_SIG ((uint64_t)0x1506774da3930bfd)
  168. #define HW_CRC_INITVALUE 0xFFFF
  169. #define HW_ESCINFO_OPT00 0x00 //电调通信程序版本
  170. #define HW_ESCINFO_OPT01 0x01 //电调驱动程序版本
  171. #define HW_ESCINFO_OPT02 0x02 //电调硬件版本
  172. #define HW_MAJORCONF_OPT0 0x00 //获取配置信息
  173. #define HW_GETESCID_OPT0 0x00 //获取ESCID及通道信息
  174. typedef struct
  175. {
  176. Connect_check Esc_Link;
  177. //MSG1(20050)
  178. uint16_t motorRPM; //转速
  179. uint16_t pwm_value; //PWM
  180. /*
  181. bit14:油门信号源 bit14:保留 bit13:通信异常 bit10、11、12、14保留 bit9:方向标志位 bit8:定位完成
  182. bit7:短路 bit6:电机断相 bit5:油门异常 bit4:电压异常 bit3:停转 bit2:堵转 bit1:过流 bit0:过温*/
  183. uint16_t warn_flag;
  184. //MSG2(20051)
  185. float esc_voltage; //电调输入电压V(float16_t 类型)
  186. float esc_current; //母线电流A(float16_t 类型)
  187. uint8_t esc_temperature; //电调温度C
  188. //MSG3(20052)
  189. uint8_t esc_mosTemp; //电调MOS温度C
  190. uint8_t esc_capTemp; //电调电容温度C
  191. uint8_t esc_motorTemp; //电机温度C
  192. //ack
  193. uint8_t MsgCtrOpt; //0x4EA2
  194. uint32_t MsgCtrCmd; //0x4EA2
  195. bool GetESCid;
  196. uint8_t GetEscNodeID; //0x4E2D ID
  197. uint8_t GetEscThrCh; //0X4E2D 油门通道
  198. bool ResSetIDModeExit; //
  199. bool ResSetID; //设置CANid的反馈
  200. uint8_t SetIDNodeID; //设置CAN总线连接电调的node id(1~0x7D)
  201. uint8_t SetIDThrCh; //选择当前node id所使用的数字油门通道
  202. uint8_t SetBaud; //CAN总线速率设置
  203. uint8_t SetLEDOpt; //设置灯的颜色
  204. uint8_t SetLEDClr; //颜色
  205. uint8_t SetLEDBlk; //闪烁时间
  206. uint8_t SetRotDir; //ESC电机旋转方向设置
  207. uint8_t SetFreqOpt; //设置MSG23上报频率
  208. uint16_t SetFreqID;
  209. uint8_t SetFreqFreq;
  210. uint8_t ThrSrc; //设置油门输出方式
  211. uint8_t SelfCheckSta; //自检状态
  212. uint8_t _VerBuf[68]; //版本信息buf
  213. uint8_t _VerBufIndex;
  214. bool _VerBufGetS;
  215. bool GetESCInfoOpt00;
  216. uint8_t LinkSoftVer[16]; //电调通讯软件版本
  217. uint8_t LinkHardVer[16]; //电调通讯硬件版本
  218. uint8_t LinkDevVer[16]; //电调通讯设备类型
  219. uint8_t LinkSN[8]; //电调通讯软件唯一码
  220. bool GetESCInfoOpt01;
  221. uint8_t DriveSoftVer[16]; //电调驱动软件版本
  222. uint8_t DriveHardVer[16]; //电调驱动硬件版本
  223. uint8_t DriveDevVer[16]; //电调驱动设备类型
  224. uint8_t DriveSN[8]; //电调驱动软件唯一码
  225. bool GetESCInfoOpt02;
  226. uint8_t HardSN[16]; //电调硬件
  227. uint8_t ProtocolVer[8]; //电调协议版本号
  228. uint8_t rsv[32]; //预留
  229. bool GetMInfo;
  230. uint32_t MTLifeCycle; //运作总共时间
  231. uint32_t MTLatestCycle; //上一次运作时间
  232. bool GetMajorConf;
  233. uint8_t MajorConfRot;
  234. uint8_t MajorConfThrSrc;
  235. uint8_t MajorConfThrCh;
  236. uint8_t MajorConfLEDBlink;
  237. uint8_t MajorConfLEDColor;
  238. uint8_t MajorConfMSG2UPHZ;
  239. uint8_t MajorConfMSG1UPHZ;
  240. uint8_t MajorConfInstAngle;
  241. } _EscLinkDevice;
  242. extern _EscLinkDevice EscMsg[4+1];
  243. typedef enum
  244. {
  245. SETESCID_INIT = 0,
  246. SETESCID_ENTER = 1,
  247. SETESCID_SET = 2,
  248. SETESCID_EXIT = 3,
  249. SETESCID_END,
  250. }_setescid_t;
  251. typedef struct
  252. {
  253. int8_t reTxMaxCnt;
  254. _setescid_t setESCidStep;
  255. bool getSetIDModeRes;
  256. uint16_t getSetIDModeResCnt;
  257. uint8_t setESCidNum; //配置第几个电调
  258. uint32_t setEscIDDelayTime; //步骤2的PWM失能判定时间
  259. }_setESCidInfo;
  260. extern _setESCidInfo setESCidInfo;
  261. typedef struct _hwCanTail
  262. {
  263. uint8_t tranid: 5; /* 1:数值范围 0~31。
  264. 2:对于相同 Data Type ID 的数据,每发送一包数据,Transfer ID 加 1,0~31 循环累加。
  265. 3:对于同一包数据中的多个数据帧,该值不变。*/
  266. uint8_t toggle: 1; /* 1:对于 Single frame transfer,Toggle bit 这一位永远为 0。
  267. 2:对于 Multi frame transfer,数据包的首帧该位为 0,此后每发一帧该位翻转一次。*/
  268. uint8_t end: 1; /* 1:对于 Single frame transfer,End of transfer 这一 bit 位永远为 1。
  269. 2:对于 Multi frame transfer,如果当前帧是数据包的最后一帧,该位为 1,否则为 0。*/
  270. uint8_t start: 1; /* 1:对于 Single frame transfer,start of transfer 位永远为 1。
  271. 2:对于 Multi frame transfer,如果当前帧是数据包的首帧,该位为 1,否则为 0。*/
  272. } __PACKED hwCanTail;
  273. typedef union _HWTail
  274. {
  275. uint8_t HWTailByte;
  276. hwCanTail HWTailBit;
  277. } HWTail;
  278. extern bool set_HWesc_ESCid;
  279. /**************************************** Hobbywing ESC***************************************/
  280. /**************************************** Hobbywing ESC***************************************/
  281. /**************************************** Hobbywing ESC***************************************/
  282. void Flow_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len);
  283. void liquid_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len);
  284. void distributor_recieved_hookfuction(uint32_t cellCanID,uint8_t data[], uint8_t len);
  285. void Can_sendmsg_to_distributor(void);
  286. void check_flow_link(void);
  287. int decode_liquid_info(void);
  288. void can_sendmsg_flow(void);
  289. void can_sendmsg_esc(void);
  290. void HobbywingCanRecvHookFunction(uint32_t id, uint8_t data[], uint8_t len);
  291. void Hobbywing_esc_func(void);
  292. #endif