#ifndef SOFT_OKCELL_H #define SOFT_OKCELL_H #include "stdint.h" #include "stdbool.h" #include "common.h" /////////////////// /* 序号 内容 字段 说明 D0.1 电池总电压 N[0]-N[1] 单位(mv) D0.2 充放电电流 N[2]-N[3] 单位(10mA)正数充电,负数放电 D0.3 电池温度 N[4]-N[5] 单位(0.1℃) D0.4 相对充电状态 N[6]-N[7] 单位(%) D0.5 绝对充电状态 N[8]-N[9] 单位(%) D0.6 电池组状态 N[10]-N[11] N[10] : 飞控对接异常代码 0: 无异常 1: 电池超温 2: 电池组严重失衡 3: 电池组单体电压异常 4: 电池组严重过流 5: 电池组 SOH 值低 N[11]: 电池内部异常代码 Bit6:低压充电提醒 0:无效 1:充电提醒 Bit5:失衡报警 0:无效 1:失衡 Bit4:充电过压 0:无效 1:过压 Bit3:充电过流 0:无效 1:过流 Bit2:充电超温 0:无效 1:过温 Bit1:电池过放 0:无效 1:过放 D0.7 电池串数 N[12]-N[13] 单位(个) D0.8 电池1电压 N[14]-N[15] 单位(mv) D0.9 电池2电压 N[16]-N[17] 单位(mv) D0.10 电池3电压 N[18]-N[19] 单位(mv) D0.11 电池4电压 N[20]-N[21] 单位(mv) D0.12 电池5电压 N[22]-N[23] 单位(mv) D0.13 电池6电压 N[24]-N[25] 单位(mv) D0.14 电池7电压 N[26]-N[27] 单位(mv) D0.15 电池8电压 N[28]-N[29] 单位(mv) D0.16 电池9电压 N[30]-N[31] 单位(mv) D0.17 电池10电压 N[32]-N[33] 单位(mv) D0.18 电池11电压 N[34]-N[35] 单位(mv) D0.19 电池12电压 N[36]-N[37] 单位(mv) D0.20 电池13电压 N[36]-N[37] 单位(mv) D0.21 电池14电压 N[36]-N[37] 单位(mv) D0.22 电池15电压 N[36]-N[37] 单位(mv) ………………………………………………………… 根据电池串数不同,负载字节数不同 */ #pragma pack(1) typedef struct { uint16_t cell_d0[33]; //13s字节到20,扩展到15s。 }_CELL_D0; #pragma pack() #pragma pack(1) typedef struct { uint16_t cell_d1[3]; }_CELL_D1; #pragma pack() #pragma pack(1) typedef struct { uint16_t cell_d2[2]; }_CELL_D2; #pragma pack() #pragma pack(1) typedef struct { uint16_t cell_d3[9]; }_CELL_D3; #pragma pack() #pragma pack(1) typedef struct { uint16_t cell_d4[4]; }_CELL_D4; #pragma pack() #pragma pack(1) typedef struct { uint8_t cell_p2[4]; }_CELL_P2; #pragma pack() #pragma pack(1) typedef struct { uint8_t cell_p3[12]; }_CELL_P3; #pragma pack() #pragma pack(1) typedef struct { uint32_t cell_CanID; _CELL_D0 cell_D0; _CELL_D1 cell_D1; _CELL_D2 cell_D2; _CELL_D3 cell_D3; _CELL_D4 cell_D4; _CELL_P2 cell_P2; _CELL_P3 cell_P3; }_CELL_INF; #pragma pack() #define OKCELL_MAXLEN 200 /* 正方电池设备信息 */ #pragma pack(1) typedef struct { uint32_t deviceCanID; unsigned char Okcell_recv_buf[OKCELL_MAXLEN]; short Okcell_recv_index; //获取到起始标志位 bool Okcell_get_s; Connect_check Okcell_Link; //获取电池编号 bool get_cellNumber; //获取电池SHA1加密文 bool get_cellEncryption; uint32_t get_cellEncryption_counts; //电池波特率是否锁定 bool cell_bps_lock_success; //由于锁定波特率缺少反馈应答,5s内收到多于10包正确的数据则认为波特率锁定成功。 short recv_celldata_counts; uint32_t recv_celldata_time; _CELL_INF okcell_inf; }_OKCELL_DEVICE; extern uint8_t group_num; #pragma pack() extern _OKCELL_DEVICE okcell_device1, okcell_device2; extern unsigned char okcell_sha1_out[20]; #define CAN_OKCELL_SEND_ID (0x15350000) #pragma pack(1) struct OkCell_P80{ char ok_s[4]; char ok_cmd[2]; char ok_len; char ok_flag; char ok_data; char ok_crc[2]; char ok_e[3]; }; #pragma pack() extern struct OkCell_P80 okcell_p80; #pragma pack(1) struct OkCell_P82{ char ok_s[4]; char ok_cmd[2]; char ok_len; char ok_flag; char ok_data[4]; char ok_crc[2]; char ok_e[3]; }; #pragma pack() extern struct OkCell_P82 okcell_p82; #pragma pack(1) struct OkCell_P83{ char ok_s[4]; char ok_cmd[2]; char ok_len; char ok_flag; char ok_crc[2]; char ok_e[3]; }; #pragma pack() extern struct OkCell_P83 okcell_p83; void OkcellCanRecvHookFunction(uint32_t cellCanID, uint8_t* data, uint8_t len); void send_msg_to_okcell(void); #endif