#include "common.h" #include "drv_can.h" #include "app_rs485_1.h" #include "app_rs485_2.h" #include "app_can.h" #include "app.h" #include "app_bms_2.h" BMS_SELF_SEND_STATUS bms_2_self_ss; BMS_SELF_CUR_VOL_STATUS bms_2_cur_vol_ss; void Can_Bms_2_Cur_Vol_Self_Send_Check(CAN_FRAME*can_bms_2_frame) { uint16_t len; uint8_t *buf = can_bms_2_frame->data; do { if(bms_2_cur_vol_ss.m_cur != sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_50M) break; if(bms_2_cur_vol_ss.m_vol != sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_50M) break; return; }while(0); bms_2_cur_vol_ss.m_cur = sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_10M; bms_2_cur_vol_ss.m_vol = sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_10M; len = sizeof(bms_2_cur_vol_ss); // can_bms_2_frame->head.rsp = FRAME_PT_NO_RSP; can_bms_2_frame->head.dest = CTR_ID; can_bms_2_frame->head.sour = SELF_ID; can_bms_2_frame->head.index = 1; can_bms_2_frame->head.total = (len - 1)/8 + 1; can_bms_2_frame->head.pro =FRAME_PRO_D; // can_bms_2_frame->len = len; memcpy(buf,&bms_2_cur_vol_ss,len); // if(!Send_Data_Can(can_bms_2_frame,BMS_2_CUR_VOL_SELF)) { //g_event |= BMS_2_RESEND_CMD_EVENT; //return; } // bms_2_cur_vol_ss.m_cur = sub_bms_info_2.packet_common.m_current/RESOLUTION_DELTA_50M; bms_2_cur_vol_ss.m_vol = sub_bms_info_2.packet_common.m_total_vol/RESOLUTION_DELTA_50M; } void Can_Bms_2_Self_Send_Check(CAN_FRAME*can_bms_2_frame) { uint16_t len; uint8_t *buf = can_bms_2_frame->data; if (bms_2_self_ss.m_percent != sub_bms_info_2.packet_common.m_percent || bms_2_self_ss.charge_flag != sub_bms_info_2.packet_common.charge_flag || bms_2_self_ss.work_status != sub_bms_info_2.packet_common.work_status) { shark_can_send_pending |= SHARK_SEND_PENDING_3281; shark_can_send_times = 0; } if ((shark_can_send_pending & SHARK_SEND_PENDING_3281) == 0) { return; } bms_2_self_ss.m_percent = sub_bms_info_2.packet_common.m_percent; bms_2_self_ss.charge_flag = sub_bms_info_2.packet_common.charge_flag; bms_2_self_ss.work_status = sub_bms_info_2.packet_common.work_status; len = sizeof(bms_2_self_ss); // can_bms_2_frame->head.rsp = FRAME_PT_NEED_RSP; can_bms_2_frame->head.dest = CTR_ID; can_bms_2_frame->head.sour = SELF_ID; can_bms_2_frame->head.index = 1; can_bms_2_frame->head.total = (len - 1)/8 + 1; can_bms_2_frame->head.pro =FRAME_PRO_D; // can_bms_2_frame->len = len; memcpy(buf,&bms_2_self_ss,len); // if(!Send_Data_Can(can_bms_2_frame,BMS_2_SELF)) { //g_event |= BMS_2_RESEND_CMD_EVENT; //return; } } int8_t Handle_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame) { uint16_t key; memcpy(&key,can_bms_2_frame->data,sizeof(key)); switch(key) { case KEY_BMS_2_COMMON: break; case KEY_BMS_2_READ_INFO: case KEY_BMS_2_READ_VER: sub_bms_info_2.update_mask |= SHARK_BATT_INFO_VERTION; break; case KEY_BMS_2_ALARM_TIMES: case KEY_BMS_2_ALARM_TIMES_1: case KEY_BMS_2_ALARM_TIMES_2: sub_bms_info_2.update_mask |= SHARK_BATT_INFO_TIMES; break; case KEY_BMS_2_CELL_VOL: case KEY_BMS_2_CELL_VOL_1: case KEY_BMS_2_CELL_VOL_2: sub_bms_info_2.update_mask |= SHARK_BATT_INFO_CELL_VOL; break; case KEY_BMS_2_TEMP_OTHER: sub_bms_info_2.update_mask |= SHARK_BATT_INFO_TEMP; break; case KEY_BMS_2_SELF_UP: shark_can_send_pending &= ~SHARK_SEND_PENDING_3281; return 0; default: return 0; } return 1; } int8_t Rsp_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame) { uint16_t key,len; uint8_t *buf = can_bms_2_frame->data,*bt; uint16_t temp; if (can_bms_2_frame->head.rsp != FRAME_PT_NEED_RSP) { return 1; } memcpy(&key,can_bms_2_frame->data,sizeof(key)); switch(key) { case KEY_BMS_2_COMMON: len = 2; buf[len++] = 0; memcpy(&buf[len],&sub_bms_info_2.packet_common,sizeof(sub_bms_info_2.packet_common) - 1); if(sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng) { if(sheng_yu_li_cheng.sy_percent_total == sub_bms_info_2.packet_common.m_percent) buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng; else #if 0 //bang zi ce shi start buf[3] = sheng_yu_li_cheng.sy_yu_ji_ke_xing_shi_li_cheng*sub_bms_info_2.packet_common.m_percent/50; //bang zi ce shi start #else { if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS) { temp = (uint16_t)(sub_bms_info_2.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000); if(temp%10 >= 5) buf[3] = temp/10 + 1; else buf[3] = temp/10; } else buf[3] = 0; } #endif } len += sizeof(sub_bms_info_2.packet_common) - 1; break; case KEY_BMS_2_READ_INFO: len = 2; buf[len++] = 0; memcpy(&buf[len],sub_bms_info_2.bat_dev_info.sn,sizeof(sub_bms_info_2.bat_dev_info.sn)); len += sizeof(sub_bms_info_2.bat_dev_info.sn); break; case KEY_BMS_2_READ_VER: len = 2; buf[len++] = 0; memcpy(&buf[len],sub_bms_info_2.bat_dev_info.soft_ver,sizeof(sub_bms_info_2.bat_dev_info.soft_ver)); len += sizeof(sub_bms_info_2.bat_dev_info.soft_ver); break; case KEY_BMS_2_ALARM_TIMES: len = 2; buf[len++] = 0; //memcpy(&buf[len],&sub_bms_info_2.bat_times,sizeof(sub_bms_info_2.bat_times)); //len += sizeof(sub_bms_info_2.bat_times); bt = (uint8_t*)(&sub_bms_info_2.bat_times); memcpy(&buf[len],bt,14); len += 14; break; case KEY_BMS_2_ALARM_TIMES_1: len = 2; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.bat_times); memcpy(&buf[len],&bt[14],16); len += 16; break; case KEY_BMS_2_ALARM_TIMES_2: len = 2; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.bat_times); memcpy(&buf[len],&bt[30],12); len += 12; break; case KEY_BMS_2_CELL_VOL: len = 2; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.cell_vol); memcpy(&buf[len],bt,13); len += 13; break; case KEY_BMS_2_CELL_VOL_1: len = 2; buf[len++] = 0; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.cell_vol); memcpy(&buf[len],&bt[13],12); len += 12; break; case KEY_BMS_2_CELL_VOL_2: len = 2; buf[len++] = 0; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.cell_vol); memcpy(&buf[len],&bt[25],6); len += 6; // memset(&buf[len],0x00,6); len += 6; break; case KEY_BMS_2_TEMP_OTHER: len = 2; buf[len++] = 0; bt = (uint8_t*)(&sub_bms_info_2.temp_other); memcpy(&buf[len],bt,5); len += 5; break; case KEY_BMS_2_SELF_UP: return 0; default: return 0; } // can_bms_2_frame->head.rsp = FRAME_PT_RSP; can_bms_2_frame->head.dest = can_bms_2_frame->head.sour; can_bms_2_frame->head.sour = SELF_ID; can_bms_2_frame->head.index = 1; can_bms_2_frame->head.total = (len - 1)/8 + 1; can_bms_2_frame->head.pro =FRAME_PRO_D; // can_bms_2_frame->len = len; // if(!Send_Data_Can(can_bms_2_frame,BMS_2_RSP)) { g_event |= BMS_2_RESEND_CMD_EVENT; return 0; } return 1; }