
#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
