例子

#ifndef __PROJ_CANBMS_H__
#define __PROJ_CANBMS_H__

#include <stdint.h>
#include "double_list.h"

#define BMS_CAN                 CANFD0  //CANFD1
#define BMS_DEVICE_MAX_BUM      100
#define CAN_RECV_BUFF_NUM       50
#define Device_Max_Num          300     //BMS最大设备数

//设置Location空闲超时时间
#define DEVICE_LOCATION_IDLE_TIMEOUT    50000   //设备定位空闲超时时间 *1ms
//设置Search空闲超时时间
#define DEVICE_SEARCH_IDLE_TIMEOUT      50000   //设备搜索空闲超时时间 *1ms

//Search升级设备搜索时间
#define DEVICE_UPGRADE_SEARCH_TIMEOUT   10000
//Location升级设备定位时间
#define DEVICE_UPGRADE_LOCATION_TIMEOUT 10000

//设置BMS-OTA超时时间
#define DEVICE_LOCATIONH_TIMEOUT        30000   //设备定位超时时间 *1ms
#define DEVICE_SEARCH_TIMEOUT           30000   //设备搜索超时时间 *1ms
#define DEVICE_REQUEST_TIMEOUT          30000   //设备下载申请超时时间 *1ms
#define DEVICE_ERASE_TIMEOUT            50000   //设备下载擦除超时时间 *1ms
#define DEVICE_WRITE_TIMEOUT            6000    //设备下载写入超时时间 *1ms
#define DEVICE_WRITE_END_TIMEOUT        2000    //设备下载写入完成超时时间 *1ms

//设备发送超时时间   < 与设备数有关 - 与缓冲区有关 - 与BMS设备超时时间有关 >
#define DEVICE_SEARCH_TIMEOUT_SEND      250//300     //设备搜索超时发送时间 *1ms
#define DEVICE_REQUEST_TIMEOUT_SEND     300     //设备下载申请超时发送时间 *1ms
#define DEVICE_ERASE_TIMEOUT_SEND       300     //设备下载擦除超时发送时间 *1ms
#define DEVICE_WRITE_END_TIMEOUT_SEND   300     //设备下载写入超时发送完成时间 *1ms

/*  DeviceIndex
    ALL         0XFF
    BCU         1H
    BSMU        2H
    BAMU        3H
    ITMU        4H
    ITPU        5H
    EMU         6H
    PC          FH
*/

//BMS设备信息
typedef struct{
    int macAddr[4];
    uint8_t arch_id[3];     //arch1_id arch2_id arch3_id
    uint8_t routeLevel;
    uint16_t tempID;
    uint16_t setID;
    uint32_t timeout;
    //uint8_t info;      //firmwareVersion + device_grade
    uint8_t firmwareVersion;
    uint8_t device_grade;
    uint8_t device_type;
    uint8_t isSelect;
    uint8_t isReady;
    uint8_t randomid;   //随机码
}BMSDeviceInfo_t;

//Location Search Page
typedef struct{
    uint8_t macAddr[4];
    uint8_t arch_id[3];
}Location_Search_Pack_t;

//BMS设备链表
typedef struct{
    BMSDeviceInfo_t BMSDeviceInfo_Member;
    double_list_t list;
}BMSDeviceInfo_Member_List_t;

//BMS升级设备链表
typedef struct{
    uint8_t arch_id[3];
    uint8_t Select_Flag;
    uint8_t ota_status;
    double_list_t list;
}Device_Upgrade_List_t;

//BMS升级设备类型信息 -- 设备类型链表嵌套设备链表
typedef struct{
    Device_Upgrade_List_t Device_Upgrade_List_Head;
    uint8_t device_type;
    uint8_t Select_Flag;
    double_list_t list;
}Device_Type_List_t;

//定位包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[50];
    uint8_t onoff;
    uint8_t type;
    uint8_t file_type;
    uint16_t timeInterval;      //主动上报发送间隔/ms 和 被动模式
}Location_Pack_t;
extern Location_Pack_t Location_Pack;

//搜索包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[50];
    uint8_t onoff;
    uint8_t type;
    uint8_t info;
    uint16_t layer_num; //MAX  100
    int macAddr[100][4];
    int arch_id[100][3]; //arch3_id  arch2_id  arch1_id
    uint8_t file_type;
    uint16_t timeInterval;      //主动上报发送间隔/ms 和 被动模式
}Search_Pack_t;
extern Search_Pack_t Search_Pack;

//BMS升级包
typedef struct{
    uint64_t Server_id;
    uint8_t data_id[20];
    uint8_t file_id[20];
    uint8_t file_name[50];
    uint32_t crc;
    uint8_t type;       //1:bin  2:s19
    uint8_t file_path[50];
    uint8_t version[10];
    uint8_t deviceList[300][4];
    uint32_t select_device_num;
}Updown_Pack_t;
extern Updown_Pack_t Updown_Pack;

//终端升级包
typedef struct{
    uint64_t Server_id;
    uint32_t crc;
    uint8_t data_id[20];
    uint8_t file_id[20];
    uint8_t file_name[50];
    uint8_t file_path[50];
    uint8_t version[13];
}Ars_Updown_Pack_t;
extern Ars_Updown_Pack_t Ars_Updown_Pack;

//Boot流程
enum CANBootStep{
    BOOT_IDLE = 0,
    BOOT_DEVICE_LOCATION = 8,
    BOOT_DEVICE_SEARCH = 1,
    BOOT_BURNING_REQUEST = 2,
    BOOT_MEM_ERASE = 3,
    BOOT_MEM_WRITE = 4,
    BOOT_MEM_WRITE_END = 5,
    BOOT_MEM_READ = 6,
    BOOT_APP_GO = 7,
};

//OTA流程
enum OtaStep{
    OTA_IDLE = 0,
    OTA_ARS = 1,
    OTA_BMS = 2,
};

//BMS Position错误码
enum BMS_Position_Failed_Code{
    POSITION_CAN_SEND_FAILED = 12900,                   //定位CAN发送失败
    POSITION_JSON_PARSE_FAILED = 12901,                 //Position包json数据解析异常
    POSITION_ARS_Upgrading_FAILED = 12902,              //定位ARS正在升级,拒绝搜索
    POSITION_BMS_Upgrading_FAILED = 12903,              //定位BMS正在升级,拒绝搜索
};

//BMS Search错误码
enum BMS_Search_Failed_Code{
    SEARCH_CAN_SEND_FAILED = 13000,                      //搜索CAN发送失败
    SEARCH_JSON_PARSE_FAILED = 13001,                    //Search包json数据解析异常
    SEARCH_ARS_Upgrading_FAILED = 13002,                 //搜索ARS正在升级,拒绝搜索
    SEARCH_BMS_Upgrading_FAILED = 13003,                 //搜索BMS正在升级,拒绝搜索
};

//BMS OTA升级错误码
enum BMS_Ota_Step_Failed_Code{
    BMS_ALL_TYPE_DEVICE_NOT_ALLOW_UPGRADE = 13211,       //BMS全类型设备,不允许升级
    BMS_UPGRAD_JSON_PARSE_FAILED = 13200,                //BMS升级包json数据解析异常
    BMS_DEVICE_HAPPEN_OFFLINE_FAILED = 13201,            //BMS设备发生掉线,片选设备与在线设备不一致
    BMS_REQUEST_SEND_FAILED = 13202,                     //BMS设备升级请求发送失败
    BMS_REQUEST_TIMEOUT_FAILED = 13203,                  //BMS设备升级请求接收超时失败
    BMS_MEM_ERASE_SEND_FAILED = 13204,                   //BMS设备升级擦除发送失败
    BMS_MEM_ERASE_TIMEOUT_FAILED = 13205,                //BMS设备升级擦除接收超时失败
    BMS_MEM_WRITE_SEND_FAILED = 13206,                   //BMS设备升级数据传输发送失败
    BMS_MEM_WRITE_TIMEOUT_FAILED = 13207,                //BMS设备升级数据传输接收超时失败
    BMS_DATA_CRC_FAILED = 13208,                         //BMS设备升级数据传输校验失败
    BMS_FLASH_WRITE_READ_CRC_SEND_FAILED = 13209,        //BMS设备升级数据存储校验发送失败
    BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED = 13210,     //BMS设备升级数据存储校验接收超时失败
    BMS_DEVICE_POS_FAILED = 13212,                       //BMS设备列表位置错误
};

//ARS OTA升级错误码
enum ARS_Ota_Step_Failed_Code{
    ARS_UPGRAD_JSON_PARSE_FAILED = 13400,                //升级包json数据解析异常
    ARS_VERSION_TOO_LOW_FAILED = 13401,                  //ARS设备升级版本太低升级失败
    ARS_MEM_WRITE_FAILED = 13402,                        //ARS设备升级数据传输失败
    ARS_DATA_CRC_FAILED = 13403,                         //ARS设备升级数据传输校验失败
    ARS_FLASH_WRITE_READ_CRC_FAILED = 13404,             //ARS设备升级数据存储校验失败
};

//FTP错误码
enum FTP_ERROR_CODE{
    FTP_LOGIN_FAILED = 13600,                            //FTP登录失败
    FTP_FILE_PATH_FAILED = 13601,                        //FTP文件路径失败
    FTP_PASV_FAILED = 13602,                             //FTP被动模式失败
    FTP_DATA_PORT_CONNECT_FAILED = 13603,                //FTP服务器数据端口连接失败
    FTP_FILE_SIZE_FAILED = 13604,                        //FTP文件大小格式失败
    FTP_RETR_FAILED = 13605,                             //FTP指令下载失败
};

typedef struct{
    uint32_t address;
    uint16_t data_length;
    uint8_t data[256];
}S19_Record;

//Ota队列数据
typedef struct{
    /*
        1:data
        2:Crc_Data
    */
    uint8_t type;
    uint8_t data[8];
}Ota_Queue_Data_t;

/* Global variables */
extern BMSDeviceInfo_Member_List_t Device_list_Head;
extern BMSDeviceInfo_Member_List_t Device_Location_list_Head;
extern QueueHandle_t OTA_Data_QueueHandle;
extern QueueHandle_t Can_Recv_Data_QueueHandle;
extern SemaphoreHandle_t OTA_Topic_BinarySemHandle;
extern SemaphoreHandle_t OTA_Last_Data_BinarySemHandle;
extern SemaphoreHandle_t OTA_Crc_Data_BinarySemHandle;
extern SemaphoreHandle_t OTA_Data_Done_BinarySemHandle;
extern uint16_t DeviceIndex;            //设备ID
extern volatile uint8_t CANBootStep;    //升级流程
extern uint8_t CANBootStatus;
extern uint64_t Device_Upgrade_Search_Timeout_Num;
extern uint64_t Device_Upgrade_Location_Timeout_Num;

void Bms_Boot_Init(void);
void Bms_Upgrade_Send_Recv_Pro(void);
int8_t Boot_Device_Location(uint16_t deviceIndex);
int8_t Boot_Device_Search(uint16_t deviceIndex);
int8_t Boot_Device_Search_t(uint16_t deviceIndex);
int8_t Boot_Device_Request(void);
//int8_t Boot_Mem_Erase(void);
int8_t Boot_Mem_Erase(uint16_t deviceIndex);
int8_t Boot_Mem_Write_End(uint16_t deviceIndex);
int8_t Boot_Mem_Write_S19_Bin(uint16_t deviceIndex, uint8_t *au8Data, uint32_t data_len);
int8_t Parse_S19_Record(const char *line, S19_Record *record);
int8_t Parse_S19_AddressLen(char *line);
void CANBootStep_Set(uint8_t BootStep);
void Clean_Search_Device_List(void);
void Clean_Location_Device_List(void);
void Bms_Boot_List_Pro(void);
void Bms_Boot_Arr_Pro(void);

#endif

  

 

 

/**
 * @Author: wangxy
 * @Date: 2024-08-15
 * @LastEditTime: 2024-08-15
 * @LastEditors: wangxy
 * @Description: proj_canbms
 * @FilePath: proj_canbms.c
 */

#include "main.h"
#include "proj_canbms.h"
#include "proj_fifo.h"
#include "FTP_client.h"
#include "sal_netdb.h"
#include "net_sockets.h"
#include "mqttclient.h"

/* Global variables */
QueueHandle_t OTA_Data_QueueHandle;
QueueHandle_t Can_Recv_Data_QueueHandle;
SemaphoreHandle_t OTA_Topic_BinarySemHandle;
SemaphoreHandle_t OTA_Last_Data_BinarySemHandle;
SemaphoreHandle_t OTA_Crc_Data_BinarySemHandle;
SemaphoreHandle_t OTA_Data_Done_BinarySemHandle;
BMSDeviceInfo_Member_List_t Device_list_Head;           //定义设备头节点
BMSDeviceInfo_Member_List_t Device_Location_list_Head;  //定义设备定位头节点
Device_Type_List_t Device_Type_List_Head;               //定义升级设备类型头节点 -- 设备类型链表再嵌套设备链表
double_list_t *ptr =NULL;
volatile uint8_t CANBootStep = BOOT_IDLE;  //BOOT_DEVICE_SEARCH;   //0;
fifo_t *Can_Recv_Buff;
uint16_t DeviceIndex = 0;    //设备ID
uint8_t OTA_Data_Done_BinarySemHandle_Flag =0;
Search_Pack_t Search_Pack;
Location_Pack_t Location_Pack;
Updown_Pack_t Updown_Pack;
Ars_Updown_Pack_t Ars_Updown_Pack;
uint16_t BOOT_Send_Timeout_Num;
extern TaskHandle_t CAN_BMS_Upgrade_handle;
volatile uint8_t CAN_BMS_BOOT_Flag =0;
Location_Search_Pack_t Location_Search_Pack;
//Search升级设备搜索时间
uint64_t Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
//Location升级设备定位时间
uint64_t Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;

/**
 * @details: This function is Bms Boot Init
 */
void Bms_Boot_Init(void)
{
    /* 初始化设备链表头 */
    memset(&Device_list_Head,0,sizeof(Device_list_Head));
    double_list_init(&Device_list_Head.list);
    /* 初始化设备定位链表头 */
    memset(&Device_Location_list_Head,0,sizeof(Device_Location_list_Head));
    double_list_init(&Device_Location_list_Head.list);
    /* 初始化设备类型链表头和升级设备链表头 */
    memset(&Device_Type_List_Head,0,sizeof(Device_Type_List_Head));
    double_list_init(&Device_Type_List_Head.list);
    memset(&Device_Type_List_Head.Device_Upgrade_List_Head,0,sizeof(Device_Type_List_Head.Device_Upgrade_List_Head));
    double_list_init(&Device_Type_List_Head.Device_Upgrade_List_Head.list);
    /* 初始化CAN-Fifo缓冲区 */
    Can_Recv_Buff =fifo_alloc(CAN_RECV_BUFF_NUM, sizeof(CANFD_FD_MSG_T));
    if(Can_Recv_Buff==NULL){
        RS_LOGE("Can_Recv_Buff fifo_alloc Failed\n");
    }
    /* 初始化CAN-Queue缓冲区 */
    Can_Recv_Data_QueueHandle =xQueueCreate(CAN_RECV_BUFF_NUM, sizeof(CANFD_FD_MSG_T));
    if(Can_Recv_Data_QueueHandle ==NULL){
        RS_LOGE("Can_Recv_Data_QueueHandle xQueueCreate failed!");
    }
    /* 初始化OTA数据缓冲队列 */
    OTA_Data_QueueHandle =xQueueCreate(1, sizeof(Ota_Queue_Data_t));
    if(OTA_Data_QueueHandle ==NULL){
        RS_LOGE("OTA_Data_QueueHandle xQueueCreate failed!");
    }
    /* CreateBinary OTA_Data_Done_BinarySemHandle */
    OTA_Data_Done_BinarySemHandle =xSemaphoreCreateBinary();
    //vSemaphoreCreateBinary(OTA_Data_Done_BinarySemHandle);
    //OTA_Data_Done_BinarySemHandle = xSemaphoreCreateMutex();
    if(OTA_Data_Done_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Data_Done_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Crc_Data_BinarySemHandle */
    OTA_Crc_Data_BinarySemHandle =xSemaphoreCreateBinary();
    if(OTA_Crc_Data_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Crc_Data_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Last_Data_BinarySemHandle */
    OTA_Last_Data_BinarySemHandle =xSemaphoreCreateBinary();
    if(OTA_Last_Data_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Last_Data_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
    /* CreateBinary OTA_Topic_BinarySemHandle */
    //OTA_Topic_BinarySemHandle =xSemaphoreCreateBinary();
    vSemaphoreCreateBinary(OTA_Topic_BinarySemHandle);
    if(OTA_Topic_BinarySemHandle ==NULL){
        RS_LOGE("OTA_Topic_BinarySemHandle vSemaphoreCreateBinary failed!");
    }
}

/**
 * @details: This function is Bms Boot Deinit
 */
void Bms_Boot_Deinit(void)
{
     //no use
}



/**链表形式
 * @details: This function is Bms Boot List Pro
 */
void Bms_Boot_List_Pro(void)
{
    int8_t device_type =-1;
    /* 1.遍历设备类型 --> 选定设备类型 --> 开启路线定位 */
    {
        /* 1.逐一获取所有设备类型的节点 --> 获取当前类型的所有路线 */
        if(double_list_isempty(&Device_Type_List_Head.list) ==0){
            //登录FTP服务器
            if(zFTP_Connect_Fun()<0){
                RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                vTaskDelete(NULL);
            }
            //逐一遍历设备类型
            double_list_t *Device_Type_List_ptr =NULL;
            double_list_for_each(Device_Type_List_ptr,&Device_Type_List_Head.list){
                Device_Type_List_t *Device_Type_Member =double_list_entry(Device_Type_List_ptr, Device_Type_List_t, list);
                device_type =Device_Type_Member->device_type;
                //设置设备类型,开启BMS定位
                DeviceIndex =device_type;
                CANBootStep_Set(BOOT_DEVICE_LOCATION);
                //等待设备路线索引完成,通过设备类型,定位所有路线
                //...  Wait delay()  ...
                uint16_t Loop_Timeout =1000; 
                do{
                    vTaskDelay(100);
                    //超时结束处理
                    if(!(Loop_Timeout--)){
                        RS_LOGW("Bms_Boot_List_Pro Location_Timeout Thread Exit");
                        CANBootStep_Set(BOOT_IDLE);
                        vTaskDelete(NULL);
                    }
                }while(Device_Upgrade_Location_Timeout_Num !=0);
                /* 2.逐一定位所有路线 --> 再搜索当前路线下的所有设备 */
                {
                    //1.逐一选定路线索引所有设备
                    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                        double_list_t *Device_Location_list_Head_ptr =NULL;
                        //开始逐个遍历所有路线
                        double_list_for_each(Device_Location_list_Head_ptr,&Device_Location_list_Head.list){
                            //先通过遍历判断当前设备链表是否已全部升级成功且完成?
                            int8_t Device_Upgrade_Member_Flag= 0;
                            double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                            double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){
                                Device_Upgrade_List_t *Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                if(Device_Upgrade_Member->Select_Flag ==0){
                                    //当前设备升级链表没有全部升级完成
                                    Device_Upgrade_Member_Flag =1;
                                }
                            }
                            if(Device_Upgrade_Member_Flag){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                memset(&Location_Search_Pack, 0, sizeof(Location_Search_Pack));
                                Location_Search_Pack.macAddr[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                Location_Search_Pack.macAddr[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                Location_Search_Pack.macAddr[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                Location_Search_Pack.macAddr[3] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                Location_Search_Pack.arch_id[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0];
                                Location_Search_Pack.arch_id[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1];
                                Location_Search_Pack.arch_id[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2];
                                //发送定位,开启BMS搜索
                                CANBootStep_Set(BOOT_DEVICE_SEARCH);
                                //等待当前路线下的设备搜索完成
                                //...  Wait delay()  ...
                                uint16_t Loop_Timeout =1000;
                                do{
                                    vTaskDelay(100);
                                    //超时结束处理
                                    if(!(Loop_Timeout--)){
                                        RS_LOGW("Bms_Boot_List_Pro Search_Timeout Thread Exit");
                                        CANBootStep_Set(BOOT_IDLE);
                                        vTaskDelete(NULL);
                                    }
                                }while(Device_Upgrade_Search_Timeout_Num !=0);
                                /* 3.当前路线下设备与升级设备进行匹配和片选 */
                                uint8_t Route_Select_Flag =0;
                                double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                                Device_Upgrade_List_t *Device_Upgrade_Member =NULL;
                                double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){  //设备类型下--所有设备
                                    Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                    double_list_t *Device_list_Head_ptr =NULL;
                                    double_list_for_each(Device_list_Head_ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                        //匹配片选
                                        if(memcmp(Device_Upgrade_Member->arch_id, BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id, sizeof(BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id))==0){
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect =1;
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                                            Device_Upgrade_Member->Select_Flag =1;
                                            Route_Select_Flag =1;
                                        }
                                    }
                                }
                                if(Route_Select_Flag){
                                    #if 0
                                    //匹配和片选成功,开始升级
                                    int8_t download_rel =download_S19_Bin_file_fun(1);
                                    //开始启动升级!
                                    int8_t download_rel =download_S19_Bin_file_fun(&Bms_Ota_Info_Arr.bms_ota_info[i]);
                                    //升级结束,成功则置位,片选标志清零。
                                    double_list_for_each(Device_Upgrade_List_Head_ptr,&Device_Type_Member->Device_Upgrade_List_Head.list){
                                        Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                                        if(Device_Upgrade_Member->Select_Flag ==1){
                                            Device_Upgrade_Member->Select_Flag =0;
                                            if(download_rel==0){
                                                Device_Upgrade_Member->ota_status =1;
                                            }
                                        }
                                    }
                                    #endif
                                }
                            }
                        }
                    }
                }
            }
            //关闭FTP服务器
            zFTP_Close_Fun();
            //全部升级完成,遍历是否全部升级成功
            double_list_for_each(Device_Type_List_ptr,&Device_Type_List_Head.list){
                Device_Type_List_t *Device_Type_Member =double_list_entry(Device_Type_List_ptr, Device_Type_List_t, list);
                double_list_t *Device_Upgrade_List_Head_ptr =NULL;
                double_list_for_each(Device_Upgrade_List_Head_ptr, &Device_Type_Member->Device_Upgrade_List_Head.list){
                    Device_Upgrade_List_t *Device_Upgrade_Member =double_list_entry(Device_Upgrade_List_Head_ptr, Device_Upgrade_List_t, list);
                    if(Device_Upgrade_Member->ota_status == 0){
                        //完全升级失败
                        /* deal result */
                    }
                }
            }
        }else{
            //链表为空,无升级需求!
        }
    }
    vTaskDelete(NULL);
}

/**数组形式
 * @details: This function is Bms Boot Arr Pro
 */
void Bms_Boot_Arr_Pro(void)
{
    int8_t device_type =-1;
    /* 1.遍历设备类型 --> 选定设备类型 --> 开启路线定位 */
    {
        /* 1.逐一获取所有设备类型的节点 --> 获取当前类型的所有路线 */
        if(Bms_Ota_Info_Arr.bms_ota_info_num !=0){
            #if 0
            //登录FTP服务器
            if(zFTP_Connect_Fun()<0){
                RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                zFTP_Close_Fun();
                vTaskDelete(NULL);
            }
            #endif
            /* 逐一遍历每个升级的设备类型 */
            for(uint8_t i=0; i<Bms_Ota_Info_Arr.bms_ota_info_num; i++){
                device_type =Bms_Ota_Info_Arr.bms_ota_info[i].device_type;
                //设置设备类型,开启BMS定位
                DeviceIndex =device_type;
                CANBootStep_Set(BOOT_DEVICE_LOCATION);
                //等待设备路线索引完成,通过设备类型,定位所有路线
                //...  Wait delay()  ...
                uint16_t Loop_Timeout =200;
                do{
                    vTaskDelay(100);
                    //超时结束处理
                    if(!(Loop_Timeout--)){
                        RS_LOGW("Bms_Boot_Arr_Pro Location_Timeout Thread Exit");
                        CANBootStep_Set(BOOT_IDLE);
                        //zFTP_Close_Fun();
                        goto Bms_Boot_Arr_Pro_Exit;
                    }
                }while(Device_Upgrade_Location_Timeout_Num !=0);
                /* 2.逐一定位所有路线 --> 再搜索当前路线下的所有设备 */ 
                {
                    //1.逐一选定路线索引所有设备
                    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                        double_list_t *Device_Location_list_Head_ptr =NULL;
                        #if 0
                        /***********打印出所有的链表节点***********/
                        double_list_t *Device_Location_list_Head_ptr_t =NULL;
                        double_list_for_each(Device_Location_list_Head_ptr_t,&Device_Location_list_Head.list){
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr_t, BMSDeviceInfo_Member_List_t, list);
                            RS_LOGI("macAddr[0]:%x macAddr[1]:%x macAddr[2]:%x macAddr[3]:%x\n\
                                    arch_id[0]:%d arch_id[1]:%d arch_id[2]:%d \n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2]);
                        }
                        #endif
                        //开始逐个遍历所有路线
                        double_list_for_each(Device_Location_list_Head_ptr,&Device_Location_list_Head.list){
                            //先通过遍历判断当前设备链表是否已全部升级成功且完成?
                            int8_t Device_Upgrade_Member_Flag =0;
                            for(uint8_t m=0; m<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; m++){
                                if(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].Select_Flag==0){
                                    //当前设备升级链表没有全部升级完成
                                    Device_Upgrade_Member_Flag =1;
                                }
                            }
                            if(Device_Upgrade_Member_Flag){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_Location_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                memset(&Location_Search_Pack, 0, sizeof(Location_Search_Pack));
                                Location_Search_Pack.macAddr[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                Location_Search_Pack.macAddr[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                Location_Search_Pack.macAddr[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                Location_Search_Pack.macAddr[3] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //层级编号
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==3){
                                    Location_Search_Pack.arch_id[0] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[0] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0];
                                }
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==2){
                                    Location_Search_Pack.arch_id[1] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[1] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1];
                                }
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel ==1){
                                    Location_Search_Pack.arch_id[2] =0xFF;
                                }else{
                                    Location_Search_Pack.arch_id[2] =BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2];
                                }
                                //发送定位,开启BMS搜索
                                CANBootStep_Set(BOOT_DEVICE_SEARCH);
                                //等待当前路线下的设备搜索完成
                                //...  Wait delay()  ...
                                uint16_t Loop_Timeout =200;
                                do{
                                    vTaskDelay(100);
                                    //超时结束处理
                                    if(!(Loop_Timeout--)){
                                        RS_LOGW("Bms_Boot_Arr_Pro Search_Timeout Thread Exit");
                                        CANBootStep_Set(BOOT_IDLE);
                                        //zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                }while(Device_Upgrade_Search_Timeout_Num !=0);
                                /* 3.当前路线下设备与升级设备进行匹配和片选 */
                                uint8_t Route_Select_Flag =0;
                                for(uint8_t m=0; m<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; m++){
                                    double_list_t *Device_list_Head_ptr =NULL;
                                    double_list_for_each(Device_list_Head_ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(Device_list_Head_ptr, BMSDeviceInfo_Member_List_t, list);
                                        if(memcmp(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].arch_id, BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id, sizeof(BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id))==0){
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect =1;
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[m].Select_Flag=1;
                                            Route_Select_Flag =1;
                                        }
                                    }
                                }
                                if(Route_Select_Flag){
                                    //开始连接服务器,启动升级!
                                    if(zFTP_Connect_Fun()<0){
                                        RS_LOGW("zFTP_Connect_Fun Failed and Thread Exit");
                                        zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                    //下载升级设备固件
                                    int8_t download_rel =download_S19_Bin_file_fun(&Bms_Ota_Info_Arr.bms_ota_info[i]);
                                    if(download_rel<0){
                                        RS_LOGW("download_S19_Bin_file_fun Failed and Thread Exit");
                                        zFTP_Close_Fun();
                                        goto Bms_Boot_Arr_Pro_Exit;
                                    }
                                    //清除匹配片选标志和置位升级标志
                                    for(uint8_t n=0; n<Bms_Ota_Info_Arr.bms_ota_info[i].positions_device_num; n++){
                                        if(Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].Select_Flag ==1){
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].Select_Flag =0;
                                            Bms_Ota_Info_Arr.bms_ota_info[i].devces_positions_info[n].ota_status =1;
                                        }
                                    }
                                    //关闭Ftp客户端
                                    zFTP_Close_Fun();
                                }
                            }
                        }
                    }
                }
            }
            #if 0
            //关闭FTP客户端
            zFTP_Close_Fun();
            #endif
            //检测是否设备全部升级成功
            uint8_t ALL_Type_Device_Success_Flag =1;
            for(uint8_t p=0; p<Bms_Ota_Info_Arr.bms_ota_info_num; p++){
                for(uint8_t q=0; q<Bms_Ota_Info_Arr.bms_ota_info[p].positions_device_num; q++){
                    if(Bms_Ota_Info_Arr.bms_ota_info[p].devces_positions_info[q].ota_status == 0){
                        //所有设备完全升级失败
                        ALL_Type_Device_Success_Flag =0;
                    }
                }
            }
            Bms_Ota_Info_Arr.bms_ota_info_num =0;
            if(ALL_Type_Device_Success_Flag){
                //上报服务器成功
                BMS_Upgrade_Result_Report(1,0);
                RS_LOGV("BMS OTA ALL Transmit Success!\n");
            }else{
                //失败
                BMS_Upgrade_Result_Report(0,BMS_DEVICE_POS_FAILED);
                RS_LOGV("BMS OTA ALL Transmit Failed : DEVICE_POS ERROR!\n");
            }
        }else{
            //链表为空,无升级需求!
            RS_LOGI("List NO Device Need Upgrade!\n");
        }
    }
Bms_Boot_Arr_Pro_Exit:
    //关闭 Bms_Upgrade_Send_Recv_Pro 线程
    if(CAN_BMS_BOOT_Flag){
        CAN_BMS_BOOT_Flag =0;
        vTaskDelete(CAN_BMS_Upgrade_handle);
    }
    //清空链表上所有的搜索设备
    Clean_Search_Device_List();
    //清空链表上所有的定位设备
    Clean_Location_Device_List();
    RS_LOGI("Bms_Boot_Arr_Pro Thread Exit");
    //释放升级信号量
    if(xSemaphoreGive(OTA_Topic_BinarySemHandle) != pdTRUE){
        RS_LOGW("xSemaphoreGive OTA_Topic_BinarySemHandle Full\n");
    }
    CANBootStep_Set(BOOT_IDLE);
    vTaskDelete(NULL);
}

/**
 * @details: This function is Bms Send Recv Pro
 */
void Bms_Upgrade_Send_Recv_Pro(void)
{
    RS_LOGV("Bms_Upgrade_Send_Recv_Pro Begin Run...");
    for(;;){
        /* Upgrade Recv Deal Data */
        CANFD_FD_MSG_T RxMsgFrame;
        memset(&RxMsgFrame, 0, sizeof(RxMsgFrame));
        //if(fifo_unuse(Can_Recv_Buff)){
        //if(fifo_get(Can_Recv_Buff, &RxMsgFrame, sizeof(RxMsgFrame)) >0){
        if(xQueueReceive(Can_Recv_Data_QueueHandle, &RxMsgFrame, 0) == pdTRUE){
            switch(CANBootStep){
                case BOOT_DEVICE_LOCATION: //定位
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F010000 + (DeviceIndex << 8))
                            break;
                        //重置设备搜索发送
                        //BOOT_Send_Timeout_Num =0;
                        uint8_t New_Device_Flag =1;     //遍历新设备标志
                        uint16_t Device_Curr_Num =0;    //当前在线设备数
                        //遍历当前设备链表
                        if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                            double_list_for_each(ptr,&Device_Location_list_Head.list){
                                Device_Curr_Num++;
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0){
                                    //当前设备已经存在设备链表
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //更新固件版本号
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //更新设备层级
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //更新设备Arch3 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //更新设备Arch2 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //更新设备Arch1 ID    
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //更新设备类型
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //更新重置超时时间
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel = RxMsgFrame.au8Data[0] & 0x0f;               //更新架构层级
                                    New_Device_Flag =0;
                                }
                            }
                        }
                        //扫描新设备,且小于设备总数
                        if(New_Device_Flag && (Device_Curr_Num < Device_Max_Num)){
                            //从新设置升级定位时间
                            Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member = pvPortMalloc(sizeof(BMSDeviceInfo_Member_List_t));
                            memset(BMSDeviceInfo_Member, 0, sizeof(*BMSDeviceInfo_Member));
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0] = RxMsgFrame.au8Data[4];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1] = RxMsgFrame.au8Data[5];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2] = RxMsgFrame.au8Data[6];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3] = RxMsgFrame.au8Data[7];
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);              //获取固件版本号
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);                      //获取设备层级
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                               //获取设备Arch3 ID
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                               //获取设备Arch2 ID
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                               //获取设备Arch1 ID    
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);            //获取设备类型
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_LOCATIONH_TIMEOUT;                              //设置超时时间
                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel = (RxMsgFrame.au8Data[0]&0x0f);                       //获取架构层级
                            double_list_insert_after(&Device_Location_list_Head.list,&BMSDeviceInfo_Member->list);                      //添加到设备定位链表
                            #if 1   //for debug test
                            RS_LOGI("Location Add a new device MacAddr: %02x-%02x-%02x-%02x\n",
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                            );
                            #endif
                        }
                        break;
                    }
                case BOOT_DEVICE_SEARCH: //搜索 0x1F01YYFF
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F020000 + (DeviceIndex << 8))
                            break;
                        //重置设备搜索发送
                        //BOOT_Send_Timeout_Num =0;
                        uint8_t New_Device_Flag =1; //遍历新设备标志
                        uint16_t Device_Curr_Num =0; //当前在线设备数
                        //遍历当前设备链表
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            double_list_for_each(ptr,&Device_list_Head.list){
                                Device_Curr_Num++;
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //if(memcmp(&RxMsgFrame.au8Data[2],BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,6)==0){
                                //if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0){
                                if( (memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0) && (BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid == (((uint8_t)(RxMsgFrame.u32Id))&0xff))){
                                    //当前设备已经存在设备链表
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //更新固件版本号
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //更新设备层级
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //更新设备Arch3 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //更新设备Arch2 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //更新设备Arch1 ID
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //更新设备类型
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid =(((uint8_t)(RxMsgFrame.u32Id))&0xff);          //更新随机码
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //更新重置超时时间
                                    //预设ID
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==1){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[3];
                                    }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==2){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[2];
                                    }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==3){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[1];
                                    }
                                    New_Device_Flag =0;                                                                                 //已存设备
                                }
                            }
                        }
                        //扫描新设备,且小于设备总数
                        if(New_Device_Flag && (Device_Curr_Num < Device_Max_Num)){    
                            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member = pvPortMalloc(sizeof(BMSDeviceInfo_Member_List_t));
                            if(BMSDeviceInfo_Member !=NULL){
                                //从新设置升级搜索时间
                                Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
                                //memcpy(BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,&RxMsgFrame.au8Data[2],6);             //获取MAC地址
                                memset(BMSDeviceInfo_Member, 0, sizeof(*BMSDeviceInfo_Member));
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0] = RxMsgFrame.au8Data[4];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1] = RxMsgFrame.au8Data[5];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2] = RxMsgFrame.au8Data[6];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3] = RxMsgFrame.au8Data[7];
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type =(((uint8_t)(RxMsgFrame.u32Id>>8))&0xff);    //获取设备类型
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid =(((uint8_t)(RxMsgFrame.u32Id))&0xff);          //获取随机码
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion =((RxMsgFrame.au8Data[0]>>4)&0x0f);      //获取固件版本号
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade =(RxMsgFrame.au8Data[0]&0x0f);              //获取设备层级
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[0] =RxMsgFrame.au8Data[1];                       //获取设备Arch3 ID
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[1] =RxMsgFrame.au8Data[2];                       //获取设备Arch2 ID
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.arch_id[2] =RxMsgFrame.au8Data[3];                       //获取设备Arch1 ID   
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout = DEVICE_SEARCH_TIMEOUT;                         //设置超时时间
                                double_list_insert_after(&Device_list_Head.list,&BMSDeviceInfo_Member->list);                       //添加到设备链表
                                //预设ID
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==1){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[3];
                                }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==2){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[2];
                                }else if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_grade ==3){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID = RxMsgFrame.au8Data[1];
                                }
                                #if 1   //for debug test
                                RS_LOGI("Search Add a new device MacAddr: %02x-%02x-%02x-%02x\n",
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                            BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                                );
                                #endif
                                //Report_Search_Device_Info();
                            }else{
                                RS_LOGW("BOOT_DEVICE_SEARCH new device pvPortMalloc failed!");
                            }
                        }
                        //unsigned int num_list =double_list_len(&Device_list_Head.list);
                        //printf("Device_list num :%d\n",num_list);
                        break;
                    }
                case BOOT_BURNING_REQUEST: //请求
                    {
                        //if(RxMsgFrame.u32Id != 0x1F0300FF + (DeviceIndex << 8))
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F030000 + (DeviceIndex << 8))
                            break;
                        //重置设备申请发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                uint8_t macAddr_temp[4] ={0};
                                macAddr_temp[0] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                                macAddr_temp[1] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                                macAddr_temp[2] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                                macAddr_temp[3] =(uint8_t)BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                                //if(memcmp(&RxMsgFrame.au8Data[2],BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr,6)==0 && RxMsgFrame.au8Data[0]== BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                if(memcmp(&RxMsgFrame.au8Data[4],macAddr_temp,4)==0 && RxMsgFrame.au8Data[0]== BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT; //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                CANBootStep_Set(BOOT_MEM_ERASE);
                            }
                        }
                        break;
                    }
                case BOOT_MEM_ERASE: //擦除
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F040000 + (DeviceIndex << 8))
                            break;
                        //重置设备擦除发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID && RxMsgFrame.au8Data[0]==2){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_ERASE_TIMEOUT;   //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                CANBootStep_Set(BOOT_MEM_WRITE);
                                RS_LOGV("Flash Erase Finish, and begin download bms firmware...\n");
                                //发送成功指令,接收到所有片选设备应答ACK,开始升级下一帧数据
                                if(xSemaphoreGive(OTA_Data_Done_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Data_Done_BinarySemHandle Error\n");
                                }
                            }
                        }
                        break;
                    }
                case BOOT_MEM_WRITE: //写入 
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F050000 + (DeviceIndex << 8))
                            break;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if(((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID) && RxMsgFrame.au8Data[0]==1){
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_TIMEOUT;   //设置更新超时时间
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            if(All_Ready){
                                if(xSemaphoreTake(OTA_Crc_Data_BinarySemHandle, 0)==pdPASS){
                                    CANBootStep_Set(BOOT_MEM_WRITE_END);
                                    break;
                                }
                                //再次清除链表所有节点isReady标志
                                if(double_list_isempty(&Device_list_Head.list) ==0){
                                    double_list_for_each(ptr,&Device_list_Head.list){
                                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =0;
                                    }
                                }
                                //发送成功指令,接收到所有片选设备应答ACK,开始升级下一帧数据
                                if(xSemaphoreGive(OTA_Data_Done_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Data_Done_BinarySemHandle Error\n");
                                }
                            }
                        }
                        break;
                    }
                case BOOT_MEM_WRITE_END: //写完
                    {
                        if((RxMsgFrame.u32Id & 0xFFFFFF00) != 0x1F060000 + (DeviceIndex << 8))
                            break;
                        //重置设备写结束发送
                        //BOOT_Send_Timeout_Num =0;
                        if(double_list_isempty(&Device_list_Head.list) ==0){
                            uint8_t All_Ready =1;
                            double_list_for_each(ptr,&Device_list_Head.list){
                                BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                                if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID && RxMsgFrame.au8Data[0]==0){
                                //if((uint8_t)RxMsgFrame.u32Id == BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID){
                                    if(RxMsgFrame.au8Data[0]==0){
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =1;
                                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_END_TIMEOUT;       //设置更新超时时间
                                    }else if(RxMsgFrame.au8Data[0]==1){
                                        //BMS Flash FAILED
                                        BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED);
                                        CANBootStep_Set(BOOT_IDLE);
                                        break;
                                    }
                                }
                                //BMS DEVICES ALL Ready?
                                if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady ==0){
                                        All_Ready =0;
                                    }
                                }
                            }
                            //升级成功,进入空闲模式
                            if(All_Ready){
                                //释放信号量,本次升级成功
                                if(xSemaphoreGive(OTA_Last_Data_BinarySemHandle) != pdTRUE){
                                    RS_LOGE("xSemaphoreGive OTA_Last_Data_BinarySemHandle Error\n");
                                }
                                //上报服务器成功
                                //BMS_Upgrade_Result_Report(1,0);
                                //RS_LOGV("BMS OTA Transmit Success!\n");
                                //CANBootStep_Set(BOOT_IDLE);
                            }
                        }
                        break;
                    }
                default: break;
            }
        }
        //}
        /* Boot Send Can Data */
        switch(CANBootStep){
            case BOOT_IDLE:
                {
                    break;
                }
            case BOOT_DEVICE_LOCATION:
                {
                    //设置Location空闲超时时间
                    if(Device_Upgrade_Location_Timeout_Num !=0){
                        Device_Upgrade_Location_Timeout_Num--;
                    }
                    //检测超时发送Location
                    if(BOOT_Send_Timeout_Num++ > DEVICE_SEARCH_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Device_Location(DeviceIndex) != RS_OK){
                            //定位发送失败,进入idle, 结束升级
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Location Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_DEVICE_SEARCH:
                {
                    //设置Search空闲超时时间
                    if(Device_Upgrade_Search_Timeout_Num !=0){
                        Device_Upgrade_Search_Timeout_Num--;
                    }
                    //检测超时发送Search
                    if(BOOT_Send_Timeout_Num++ > DEVICE_SEARCH_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        //if(Boot_Device_Search(DeviceIndex) != RS_OK){
                        if(Boot_Device_Search_t(DeviceIndex) != RS_OK){
                            //搜索发送失败,进入idle, 结束升级
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Search Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_BURNING_REQUEST:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_REQUEST_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Device_Request() != RS_OK){
                            //申请发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_REQUEST_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Request Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_MEM_ERASE:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_ERASE_TIMEOUT_SEND){
                        BOOT_Send_Timeout_Num =0;
                        if(Boot_Mem_Erase(DeviceIndex) != RS_OK){
                            //擦除发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_MEM_ERASE_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Erase Send Failed\n");
                        }
                    }
                    break;
                }
            case BOOT_MEM_WRITE:
                {
                    break;
                }
            case BOOT_MEM_WRITE_END:
                {
                    if(BOOT_Send_Timeout_Num++ > DEVICE_WRITE_END_TIMEOUT_SEND){
                        if(Boot_Mem_Write_End(DeviceIndex) != RS_OK){
                            //写完成发送失败,进入idle, 结束升级
                            BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_SEND_FAILED);
                            CANBootStep_Set(BOOT_IDLE);
                            RS_LOGE("Boot Device Write End Send Failed\n");
                        }
                    }
                    break;
                }
            default: break;
        }
        /* 设备超时处理 */
        if(CANBootStep == BOOT_DEVICE_LOCATION){ //BOOT_DEVICE_LOCATION TIMEOUT DEAL
            if(double_list_isempty(&Device_Location_list_Head.list) ==0){
                double_list_for_each(ptr,&Device_Location_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    ////////////////////////////////////////////////////////////////////
                    #if 0       //for debug test
                    RS_LOGI("------------------------------------------------------------------------------>");
                    RS_LOGI("BMSDeviceInfo_Member.macAddr: %x-%x-%x-%x-%x-%x\n",
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[4],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[5]
                    );
                    RS_LOGI("BMSDeviceInfo_Member.firmwareVersion: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion);
                    RS_LOGI("BMSDeviceInfo_Member.routeLevel: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel);
                    RS_LOGI("BMSDeviceInfo_Member.tempID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                    RS_LOGI("BMSDeviceInfo_Member.setID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                    RS_LOGI("BMSDeviceInfo_Member.timeout: %d\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout);
                    RS_LOGI("BMSDeviceInfo_Member.device_type: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type);
                    RS_LOGI("BMSDeviceInfo_Member.isSelect: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect);
                    RS_LOGI("BMSDeviceInfo_Member.isReady: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady);
                    #endif
                    ////////////////////////////////////////////////////////////////////
                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;//时间步长
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                        //移除设备链表
                        #if 1   //for debug test
                        RS_LOGI("Location Device Timeout Remove a device MacAddr: %02x-%02x-%02x-%02x\n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                        );
                        #endif
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                    }
                }
            }
        }else if(CANBootStep == BOOT_DEVICE_SEARCH){      //SEARCH TIMEOUT DEAL
            if(double_list_isempty(&Device_list_Head.list) ==0){
                double_list_for_each(ptr,&Device_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    ////////////////////////////////////////////////////////////////////
                    #if 0       //for debug test
                    RS_LOGI("------------------------------------------------------------------------------>");
                    RS_LOGI("BMSDeviceInfo_Member.macAddr: %x-%x-%x-%x-%x-%x\n",
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[4],
                                BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[5]
                    );
                    RS_LOGI("BMSDeviceInfo_Member.firmwareVersion: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.firmwareVersion);
                    RS_LOGI("BMSDeviceInfo_Member.routeLevel: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.routeLevel);
                    RS_LOGI("BMSDeviceInfo_Member.tempID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                    RS_LOGI("BMSDeviceInfo_Member.setID: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                    RS_LOGI("BMSDeviceInfo_Member.timeout: %d\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout);
                    RS_LOGI("BMSDeviceInfo_Member.device_type: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type);
                    RS_LOGI("BMSDeviceInfo_Member.isSelect: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect);
                    RS_LOGI("BMSDeviceInfo_Member.isReady: %x\n",BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady);
                    #endif
                    ////////////////////////////////////////////////////////////////////
                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;   //时间步长
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                        //移除设备链表
                        #if 1   //for debug test
                        RS_LOGI("Search Device Timeout Remove a device MacAddr: %02x-%02x-%02x-%02x\n",
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2],
                                    BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3]
                        );
                        #endif
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                        //Report_Search_Device_Info();
                    }
                }
            }
        }else if((CANBootStep == BOOT_BURNING_REQUEST) || (CANBootStep == BOOT_MEM_ERASE) || (CANBootStep == BOOT_MEM_WRITE) || (CANBootStep == BOOT_MEM_WRITE_END)){ //TIMEOUT DEAL
            if(double_list_isempty(&Device_list_Head.list) ==0){
                uint8_t Request_Timeout =0;
                double_list_for_each(ptr,&Device_list_Head.list){
                    BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                    if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                        BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout--;   //时间步长
                        if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout==0){
                            //设备超时标志
                            Request_Timeout =1;
                        }
                    }
                }
                //但凡一台设备超时,移除链表所有设备,本次升级失败,进入IDLE
                if(Request_Timeout){
                    double_list_for_each(ptr,&Device_list_Head.list){
                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                        double_list_remove(ptr);
                        vPortFree(BMSDeviceInfo_Member);
                    }
                    //上报服务器任务失败
                    switch(CANBootStep){
                        case BOOT_BURNING_REQUEST:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_REQUEST_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA REQUEST Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_ERASE:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_MEM_ERASE_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA ERASE Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_WRITE:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_MEM_WRITE_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA WRITE Timeout!\n");
                                break;
                            }
                        case BOOT_MEM_WRITE_END:
                            {
                                BMS_Upgrade_Result_Report(0, BMS_FLASH_WRITE_READ_CRC_TIMEOUT_FAILED);
                                RS_LOGV("BMS OTA WRITE END Timeout!\n");
                                break;
                            }
                        default:break;
                    }
                    RS_LOGV("BMS OTA Transmit Failed!\n");
                    //判断是否为BOOT_MEM_WRITE,结束升级线程
                    if(CANBootStep == BOOT_BURNING_REQUEST || CANBootStep == BOOT_MEM_WRITE || CANBootStep == BOOT_MEM_WRITE_END){
                        //重置OTA的数据消息队列
                        xQueueReset(OTA_Data_QueueHandle);
                    }
                    //超时失败,本次升级失败,进入空闲模式
                    CANBootStep_Set(BOOT_IDLE);
                }
            }
        }
        //vTaskDelay(300);
        //vTaskDelay(5);
        //vTaskDelay(2);
        vTaskDelay(1);
    }
}

/**
 * @details: This function is Boot Location Devices
 */
int8_t Boot_Device_Location(uint16_t deviceIndex)
{
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0100FF + (deviceIndex << 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    return RS_OK;
}

/**
 * @details: This function is Boot Search Devices
 */
int8_t Boot_Device_Search(uint16_t deviceIndex)
{
    for(int i=0;i<Search_Pack.layer_num; i++){
        CANFD_FD_MSG_T TxMsgFrame;
        memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
        /* Set the ID Number */
        TxMsgFrame.u32Id = 0x0F0200FF + (deviceIndex << 8);
        /* Set the frame type */
        TxMsgFrame.eIdType = eCANFD_XID;
        /* CAN FD frame type */
        TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
        /* Set FD frame format attribute */
        TxMsgFrame.bFDFormat = 1;
        /* Set the bitrate switch attribute */
        TxMsgFrame.bBitRateSwitch = 1;
        /*Set data length*/
        TxMsgFrame.u32DLC = 8;
        /*Set data */
        //arch_id
        TxMsgFrame.au8Data[1] = (uint8_t)Search_Pack.arch_id[i][0];
        TxMsgFrame.au8Data[2] = (uint8_t)Search_Pack.arch_id[i][1];
        TxMsgFrame.au8Data[3] = (uint8_t)Search_Pack.arch_id[i][2];
        //mac
        TxMsgFrame.au8Data[4] = (uint8_t)Search_Pack.macAddr[i][0];
        TxMsgFrame.au8Data[5] = (uint8_t)Search_Pack.macAddr[i][1];
        TxMsgFrame.au8Data[6] = (uint8_t)Search_Pack.macAddr[i][2];
        TxMsgFrame.au8Data[7] = (uint8_t)Search_Pack.macAddr[i][3];
        if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
            return RS_ERROR;
        }
        //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
        //delay_ms(50);
    }
    return RS_OK;
}

/**
 * @details: This function is Boot_Device_Search_t
 */
int8_t Boot_Device_Search_t(uint16_t deviceIndex)
{
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0200FF + (deviceIndex << 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 8;
    /*Set data */
    //arch_id
    TxMsgFrame.au8Data[1] = (uint8_t)Location_Search_Pack.arch_id[0];
    TxMsgFrame.au8Data[2] = (uint8_t)Location_Search_Pack.arch_id[1];
    TxMsgFrame.au8Data[3] = (uint8_t)Location_Search_Pack.arch_id[2];
    //mac
    TxMsgFrame.au8Data[4] = (uint8_t)Location_Search_Pack.macAddr[0];
    TxMsgFrame.au8Data[5] = (uint8_t)Location_Search_Pack.macAddr[1];
    TxMsgFrame.au8Data[6] = (uint8_t)Location_Search_Pack.macAddr[2];
    TxMsgFrame.au8Data[7] = (uint8_t)Location_Search_Pack.macAddr[3];
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    return RS_OK;
}


/**
 * @details: This function is Boot Request Devices
 */
int8_t Boot_Device_Request(void)
{
    //给选中设备分配临时ID
    if(double_list_isempty(&Device_list_Head.list) ==0){
        uint16_t TempID_Count =0;
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                TempID_Count =TempID_Count+1;
                //烧录请求时,给所有片选的设备,分配临时ID
                BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID = TempID_Count;
                //发送CAN数据帧
                CANFD_FD_MSG_T TxMsgFrame;
                memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
                /*Set the ID Number*/
                TxMsgFrame.u32Id = 0x0F0300FF + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8);
                //TxMsgFrame.u32Id = 0x0F030000 + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8) + (BMSDeviceInfo_Member->BMSDeviceInfo_Member.randomid);
                /*Set the frame type*/
                TxMsgFrame.eIdType = eCANFD_XID;
                /*CAN FD frame type */
                TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
                /*Set FD frame format attribute */
                TxMsgFrame.bFDFormat = 1;
                /*Set the bitrate switch attribute*/
                TxMsgFrame.bBitRateSwitch = 1;
                /*Set data length*/
                TxMsgFrame.u32DLC = 8;
                /*Set data */
                TxMsgFrame.au8Data[0] = (uint8_t)(BMSDeviceInfo_Member->BMSDeviceInfo_Member.tempID);
                TxMsgFrame.au8Data[1] = (uint8_t)(BMSDeviceInfo_Member->BMSDeviceInfo_Member.setID);
                TxMsgFrame.au8Data[4] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[0];
                TxMsgFrame.au8Data[5] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[1];
                TxMsgFrame.au8Data[6] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[2];
                TxMsgFrame.au8Data[7] = BMSDeviceInfo_Member->BMSDeviceInfo_Member.macAddr[3];
                if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
                    return RS_ERROR;
                }
                //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
                delay_ms(50);
            }
        }
        return RS_OK;
    }
    return RS_OK;
}

/**
 * @details: This function is Boot Devices Mem Erase
 */
//int8_t Boot_Mem_Erase(void)
int8_t Boot_Mem_Erase(uint16_t deviceIndex)
{
#if 0
    //给每个片选设备发送擦除指令
    if(double_list_isempty(&Device_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.isSelect){
                //发送CAN数据帧
                CANFD_FD_MSG_T TxMsgFrame;
                memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
                /*Set the ID Number*/
                TxMsgFrame.u32Id = 0x0F0400FF + ((BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type)<< 8);
                /*Set the frame type*/
                TxMsgFrame.eIdType = eCANFD_XID;
                /*CAN FD frame type */
                TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
                /*Set FD frame format attribute */
                TxMsgFrame.bFDFormat = 1;
                /*Set the bitrate switch attribute*/
                TxMsgFrame.bBitRateSwitch = 1;
                /*Set data length*/
                TxMsgFrame.u32DLC = 0;
                if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
                    return RS_ERROR;
                }
                //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
                delay_ms(50);
            }
        }
    }
#endif
    
#if 1
    //广播发送CAN数据帧
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /*Set the ID Number*/
    TxMsgFrame.u32Id = 0x0F0400FF + (deviceIndex<< 8);
    /*Set the frame type*/
    TxMsgFrame.eIdType = eCANFD_XID;
    /*CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /*Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /*Set the bitrate switch attribute*/
    TxMsgFrame.bBitRateSwitch = 1;
    /*Set data length*/
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    delay_ms(50);
#endif
    
    return RS_OK;
}

/**
 * @details: This function is Boot Devices Write End
 */
int8_t Boot_Mem_Write_End(uint16_t deviceIndex)
{
    //广播发送CAN数据帧
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0600FF + (deviceIndex<< 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /* Set data length */
    TxMsgFrame.u32DLC = 0;
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    delay_ms(50);
    return RS_OK;
}

/**
 * @details: This function is Boot Devices Mem Write S19
 */
int8_t Boot_Mem_Write_S19_Bin(uint16_t deviceIndex, uint8_t *au8Data, uint32_t data_len)
{
    if((au8Data == NULL) || data_len >8)
        RS_LOGE("Boot_Mem_Write_S19 para error\n");
    CANFD_FD_MSG_T TxMsgFrame;
    memset(&TxMsgFrame, 0, sizeof(TxMsgFrame));
    /* Set the ID Number */
    TxMsgFrame.u32Id = 0x0F0500FF + (deviceIndex<< 8);
    /* Set the frame type */
    TxMsgFrame.eIdType = eCANFD_XID;
    /* CAN FD frame type */
    TxMsgFrame.eFrmType = eCANFD_DATA_FRM;
    /* Set FD frame format attribute */
    TxMsgFrame.bFDFormat = 1;
    /* Set the bitrate switch attribute */
    TxMsgFrame.bBitRateSwitch = 1;
    /* Set data length */
    TxMsgFrame.u32DLC = data_len;
    /* Set data */
    memcpy(TxMsgFrame.au8Data, au8Data, data_len);
    if(CANFD_TransmitDMsg(BMS_CAN, 0, &TxMsgFrame) != 1){
        return RS_ERROR;
    }
    //xSemaphoreTake(CAN0_Transfer_Done_BinarySemHandle, portMAX_DELAY);
    //delay_ms(50);
    return RS_OK;
}

/**
 * @details: This function is Parse_S19 Record
 */
int8_t Parse_S19_Record(const char *line, S19_Record *record)
{
    int i, checksum;
    char type[3]={0};
    int length;
    int8_t Address_length;
    uint8_t byte;
    //获取类型和长度
    if(sscanf(line, "%2c%2x", type, &length) != 2){
        RS_LOGE("Error parsing type length");
        return RS_ERROR;
    }
    //类型检查
    if(type[0] != 'S'){
        RS_LOGE("Error Invalid record type");
        return RS_ERROR;
    }
    //类型 s0 s5 s7 s8 s9 不进行数据解析
    if(type[1]=='0' || type[1]=='5' || type[1]=='7' || type[1]=='8' || type[1]=='9'){
        return -3;
    }
    //通过类型解析地址长度
    Address_length =Parse_S19_AddressLen(type);
    if(Address_length == RS_ERROR){
        RS_LOGE("Parse_S19_AddressLen");
        return RS_ERROR;
    }
    //获取行地址
    switch(Address_length){
        case 4:
            {
                if(sscanf(line+4, "%4x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        case 6:
            {
                if(sscanf(line+4, "%6x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        case 8:
            {
                if(sscanf(line+4, "%8x", &record->address) != 1){
                    RS_LOGE("Error parsing address");
                    return RS_ERROR;
                }
                break;
            }
        default:break;
    }
    //length = address + data + checksum  字节数总和
    if(length > 256){
        RS_LOGE("Error Invalid data length");
        return RS_ERROR;
    }
    //记录数据字节大小
    record->data_length = (length*2 - Address_length - 2) / 2;
    //解析数据
    for(i = 0; i < (length*2 - Address_length - 2)/2; ++i){
        if(sscanf((line+2+2+Address_length)+i*2, "%2hhx", &byte) != 1){
            RS_LOGE("Error parsing data bytes");
            return RS_ERROR;
        }
        record->data[i] = byte;
    }
    //获取行数据校验和
    int checksum_line =0;
    if(sscanf((line+length*2+2), "%2x", &checksum_line) != 1){
        RS_LOGE("Error parsing checksum_line bytes");
        return RS_ERROR;
    }
    //计算对比行校验和
    checksum = 0;
    int checksum_data =0;
    for(i=0; i<length; i++){
        if(sscanf((line+2+i*2), "%2x", &checksum_data) != 1){
            RS_LOGE("Error parsing checksum bytes");
            return RS_ERROR;
        }
        checksum +=checksum_data;
    }
    checksum = 0xFF -(checksum & 0xFF);
    //比较计算值与原始值的一致性
    if(checksum != checksum_line){
        RS_LOGE("Error Invalid checksum");
        return RS_ERROR;
    }
    return RS_OK;
}

/**
 * @details: This function is Parse_S19 AddressLen
 */
int8_t Parse_S19_AddressLen(char *line)
{
    int8_t AddressLen = 0;
    if(line[0] != 'S' || line == NULL || strlen(line) != 2){
        return RS_ERROR;
    }
    switch(line[1]){
        case '0': AddressLen = 2 * 2;
                  break;
        case '1': AddressLen = 2 * 2;
                  break;
        case '2': AddressLen = 3 * 2;
                  break;
        case '3': AddressLen = 4 * 2;
                  break;
        case '7': AddressLen = 4 * 2;
                  break;
        case '8': AddressLen = 3 * 2;
                  break;
        case '9': AddressLen = 2 * 2;
                  break;
        default:break;
    }
    return AddressLen;
}

/**
 * @details: This function is CANBootStep_Set
 */
void CANBootStep_Set(uint8_t BootStep)
{
    CANBootStep =BootStep;
    //只要跳转,清除BMS的CAN当前发送超时计数
    BOOT_Send_Timeout_Num =0;
    /* 
        跳转 :
                1.对接口进行统一管理操作
                2.清除链表所有节点isReady标志
                3.重置链表所有节点超时时间
    */
    if(double_list_isempty(&Device_list_Head.list) ==0){
         double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            //遍历清除所有准备状态标志
            BMSDeviceInfo_Member->BMSDeviceInfo_Member.isReady =0;
            switch(BootStep){
                case BOOT_IDLE:
                    break;
                case BOOT_DEVICE_LOCATION: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_LOCATIONH_TIMEOUT;
                    break;
                case BOOT_DEVICE_SEARCH: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_SEARCH_TIMEOUT;
                    break;
                case BOOT_BURNING_REQUEST: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_REQUEST_TIMEOUT;
                    break;
                case BOOT_MEM_ERASE: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_ERASE_TIMEOUT;
                    break;
                case BOOT_MEM_WRITE: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_TIMEOUT;
                    break;
                case BOOT_MEM_WRITE_END: BMSDeviceInfo_Member->BMSDeviceInfo_Member.timeout =DEVICE_WRITE_END_TIMEOUT;
                    break;
                default:break;
            }
        }
    }
    /* CAN Boot Step Deal */
    switch(BootStep){
        case BOOT_IDLE:
            {
                //关闭 Search上报开关
                Search_Pack.onoff =0;
                //OTA最后一帧数据标志置位
                xSemaphoreTake(OTA_Crc_Data_BinarySemHandle, 0);
                #if 1
                //关闭 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag){
                    CAN_BMS_BOOT_Flag =0;
                    vTaskDelete(CAN_BMS_Upgrade_handle);
                }
                #endif
                break;
            }
        case BOOT_DEVICE_LOCATION:
            {
                //设置Location升级设备定位时间
                Device_Upgrade_Location_Timeout_Num =DEVICE_UPGRADE_LOCATION_TIMEOUT;
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F010000,0x1F010000,DeviceIndex);
                //清空定位设备链表节点
                Clean_Location_Device_List();
                //关闭 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag){
                    CAN_BMS_BOOT_Flag =0;
                    vTaskDelete(CAN_BMS_Upgrade_handle);
                }
                //创建 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag == 0){
                    if(xTaskCreate((TaskFunction_t )Bms_Upgrade_Send_Recv_Pro,
                                (const char*    )"Bms_Upgrade_Send_Recv_Pro",
                                (uint16_t       )512*3,//15 *1024,//512*6, //512*2,
                                (void*          )NULL,
                                (UBaseType_t    )7, //8, //7,//6, //3,
                                (TaskHandle_t*  )&CAN_BMS_Upgrade_handle) != pdPASS)
                    {
                        RS_LOGE("xTaskCreate Bms_Upgrade_Send_Recv_Pro Task Failed!\n");
                    }else{
                        CAN_BMS_BOOT_Flag =1;
                    }
                }
                break;
            }
        case BOOT_DEVICE_SEARCH:
            {
                //设置Search升级设备搜索时间
                Device_Upgrade_Search_Timeout_Num =DEVICE_UPGRADE_SEARCH_TIMEOUT;
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F020000,0x1F020000,DeviceIndex);
                //清空搜索设备链表节点
                Clean_Search_Device_List();
                //剔除不同的设备类型节点,保留相同设备
                if(double_list_isempty(&Device_list_Head.list) ==0){
                    double_list_for_each(ptr,&Device_list_Head.list){
                        BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
                        if(BMSDeviceInfo_Member->BMSDeviceInfo_Member.device_type != DeviceIndex){
                            double_list_remove(ptr);
                            vPortFree(BMSDeviceInfo_Member);
                        }
                    }
                }
                //创建 Bms_Upgrade_Send_Recv_Pro 线程
                if(CAN_BMS_BOOT_Flag == 0){
                    if(xTaskCreate((TaskFunction_t )Bms_Upgrade_Send_Recv_Pro,
                                (const char*    )"Bms_Upgrade_Send_Recv_Pro",
                                (uint16_t       )512*3,//15 *1024,//512*6, //512*2,
                                (void*          )NULL,
                                (UBaseType_t    )7, //8, //6, //3,
                                (TaskHandle_t*  )&CAN_BMS_Upgrade_handle) != pdPASS)
                    {
                        RS_LOGE("xTaskCreate Bms_Upgrade_Send_Recv_Pro Task Failed!\n");
                    }else{
                        CAN_BMS_BOOT_Flag =1;
                    }
                }
                break;
            }
        case BOOT_BURNING_REQUEST:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F030000,0x1F030000,DeviceIndex);
                break;
            }
        case BOOT_MEM_ERASE:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F040000,0x1F040000,DeviceIndex);
                break;
            }
        case BOOT_MEM_WRITE:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F050000,0x1F050000,DeviceIndex);
                break;
            }
        case BOOT_MEM_WRITE_END:
            {
                //清空重置队列缓冲区
                xQueueReset(Can_Recv_Data_QueueHandle);
                //针对设备类型进行过滤
                CANFD_SetXIDFltr_BMS_DeviceIndex(0x1F060000,0x1F060000,DeviceIndex);
                break;
            }
        default:break;
    }
}

/**清空搜索设备链表节点
 * @details: This function is Clean_Search_Device_List
 */
void Clean_Search_Device_List(void)
{
    if(double_list_isempty(&Device_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            double_list_remove(ptr);
            vPortFree(BMSDeviceInfo_Member);
        }
    }
}

/**清空定位设备链表节点
 * @details: This function is Clean_Location_Device_List
 */
void Clean_Location_Device_List(void)
{
    if(double_list_isempty(&Device_Location_list_Head.list) ==0){
        double_list_for_each(ptr,&Device_Location_list_Head.list){
            BMSDeviceInfo_Member_List_t *BMSDeviceInfo_Member =double_list_entry(ptr, BMSDeviceInfo_Member_List_t, list);
            double_list_remove(ptr);
            vPortFree(BMSDeviceInfo_Member);
        }
    }
}

  

posted @ 2025-03-01 13:46  panda_w  阅读(33)  评论(0)    收藏  举报