Эх сурвалжийг харах

update charger detect logic

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 жил өмнө
parent
commit
baa3c1a8ba

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V11_11191852
+PS100XX_V11_11201527

+ 11 - 504
Source/app.c

@@ -115,6 +115,10 @@ shark_bool battery_wait_voltage_parallel(void)
 		return shark_false;
 	}
 
+	if (shark_charger_state != SHARK_CHG_REMOVE && QD_Dect() == 0) {
+		return shark_true;
+	}
+
 	voltage_min = voltage_max - SHARK_BATT_VOLTAGE_FUZZ;
 
 	if (shark_charger_enabled) {
@@ -403,7 +407,7 @@ static u8 shark_battery_switch_auto(u8 operate)
 				return operate;
 			} else if (shark_battery_check_parrallel(operate)) {
 				return shark_battery_switch_parrallel();
-			} else if (shark_charger_state == SHARK_CHG_INSERT) {
+			} else if (shark_charger_state != SHARK_CHG_REMOVE) {
 				return shark_battery_switch_charge();
 			} else {
 				return shark_battery_switch_single();
@@ -422,514 +426,17 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 {
 	println("switch: %d -> %d", cb_operate_state, cb_operate);
 
-#if 1
 	shark_battery_switch_busy = shark_true;
 	cb_operate_state = shark_battery_switch_auto(cb_operate);
+	shark_battery_switch_busy = shark_false;
+
 	sub_bms_info_1.exit_times = 0;
 	sub_bms_info_2.exit_times = 0;
-	shark_battery_switch_busy = shark_false;
+	shark_charger_set_enable(shark_true);
 
 	println("switch: %d", cb_operate_state);
 
-	if (shark_charger_state == SHARK_CHG_INSERT) {
-		shark_charger_set_enable(shark_true);
-	}
-
-	return cb_operate_state;
-#else
-#define COM_TIMEOUT  (15)
-
-	switch(cb_operate)
-	{
-		case CB_BAT1_BAT2_AUTO:
-			cb_operate = shark_battery_switch_auto(shark_false);
-			println("single auto: %d", cb_operate);
-			break;
-
-		case CB_BAT1:
-			shark_bms_set_mos_close();
-
-			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
-				goto SWITCH_ERROR;
-			}
-					
-			switch(cb_operate_state)
-			{
-				case CB_BAT_NO:
-					//
-					if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
-					{
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_2)
-							delay_1ms(10);
-						
-						if(RS485_busy_2)
-							goto SWITCH_ERROR;
-						if(Operate_Sub_BMS_2_CD(0) == 0)
-							goto SWITCH_ERROR;
-					}
-					else if(sub_bms_info_2.conn_state == SUB_BMS_DISC_NO485)
-					{
-						if(Check_Battery_2_On())
-							goto SWITCH_ERROR;
-						
-					}
-					else
-					{
-						goto SWITCH_ERROR;
-					}
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-
-					if(one_bat_initial == 0)
-					{
-						if(Operate_Sub_BMS_1_CD(2) == 0)
-							goto SWITCH_ERROR;
-				
-						delay_1ms(200);
-					}
-					
-					
-					if(Operate_Sub_BMS_1_CD(1) == 0)
-						goto SWITCH_ERROR;
-
-					
-					break;
-				case CB_BAT1:
-					break;
-				case CB_BAT2:
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-
-					if(Operate_Sub_BMS_1_CD(1) == 0)
-						goto SWITCH_ERROR;
-
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-					if(Operate_Sub_BMS_2_CD(0) == 0)
-						goto SWITCH_ERROR;
-					
-					break;
-				case CB_BAT1_BAT2_PARRALLEL:
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-					if(Operate_Sub_BMS_2_CD(0) == 0)
-						goto SWITCH_ERROR;
-					break;
-				case CB_BAT1_BAT2_SERIES:
-					//
-					if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
-					{
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_2)
-							delay_1ms(10);
-						
-						//if(RS485_busy_2)
-						//	goto SWITCH_ERROR;
-						if(Operate_Sub_BMS_2_CD(0) == 0)
-						{
-							//	goto SWITCH_ERROR;
-						}
-					}
-					else
-						Operate_Sub_BMS_2_CD(0);
-					
-					break;
-				default:
-					goto SWITCH_ERROR;
-			}
-
-			shark_bms_set_mos_bat1();
-			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
-			sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
-			break;
-		case CB_BAT2:
-			shark_bms_set_mos_close();
-
-			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
-				goto SWITCH_ERROR;
-			}
-			
-			switch(cb_operate_state)
-			{
-				case CB_BAT_NO:
-					//
-					if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
-					{
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_1)
-							delay_1ms(10);
-						
-						if(RS485_busy_1)
-							goto SWITCH_ERROR;
-						if(Operate_Sub_BMS_1_CD(0) == 0)
-							goto SWITCH_ERROR;
-					}
-					else if(sub_bms_info_1.conn_state == SUB_BMS_DISC_NO485)
-					{
-						if(Check_Battery_1_On())
-							goto SWITCH_ERROR;
-					}
-					else
-					{
-						goto SWITCH_ERROR;
-					}
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-
-					if(one_bat_initial == 0)
-					{
-						if(Operate_Sub_BMS_2_CD(2) == 0)
-							goto SWITCH_ERROR;
-				
-						delay_1ms(200);
-					}
-					
-					if(Operate_Sub_BMS_2_CD(1) == 0)
-						goto SWITCH_ERROR;
-
-					
-					break;
-				case CB_BAT1:
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-					if(Operate_Sub_BMS_2_CD(1) == 0)
-						goto SWITCH_ERROR;
-					
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-
-					if(Operate_Sub_BMS_1_CD(0) == 0)
-						goto SWITCH_ERROR;
-					
-					break;
-				case CB_BAT2:
-					break;
-				case CB_BAT1_BAT2_PARRALLEL:
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-
-					if(Operate_Sub_BMS_1_CD(0) == 0)
-						goto SWITCH_ERROR;
-					break;
-				case CB_BAT1_BAT2_SERIES:
-					//
-					if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
-					{
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_1)
-							delay_1ms(10);
-						
-						//if(RS485_busy_1)
-						//	goto SWITCH_ERROR;
-
-						if(Operate_Sub_BMS_1_CD(0) == 0)
-						{
-							//goto SWITCH_ERROR;
-						}
-					}
-					else
-						Operate_Sub_BMS_1_CD(0);
-					
-					break;
-				default:
-					goto SWITCH_ERROR;
-			}
-			
-			shark_bms_set_mos_bat2();
-			sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
-			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
-			break;
-		case CB_BAT1_BAT2_PARRALLEL:
-			shark_bms_set_mos_close();
-
-			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
-				goto SWITCH_ERROR;
-			}
-			
-			switch(cb_operate_state)
-			{
-				case CB_BAT_NO:
-					goto SWITCH_ERROR;
-				case CB_BAT1:
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-					if(Operate_Sub_BMS_2_CD(1) == 0)
-						goto SWITCH_ERROR;
-									
-					break;
-				case CB_BAT2:
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-
-					if(Operate_Sub_BMS_1_CD(1) == 0)
-						goto SWITCH_ERROR;
-					break;
-				case CB_BAT1_BAT2_PARRALLEL:
-					break;
-				case CB_BAT1_BAT2_SERIES:
-					delay_1ms(10);
-					break;
-				default:
-					goto SWITCH_ERROR;
-			}
-			
-			shark_bms_set_mos_parrallel();
-			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
-			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
-			break;
-		case CB_BAT1_BAT2_SERIES:
-#if 1
-			cb_operate = shark_battery_switch_auto(shark_true);
-			println("series auto: %d", cb_operate);
-#else
-			Power_On_Normal(0,2);
-			shark_bms_set_mos_close();
-
-			//delay_1ms(2000);
-
-			//serise_low_qd_status = QD_Dect();
-			//Power_On_Normal(0,2);
-			
-			switch(cb_operate_state)
-			{
-				case CB_BAT_NO:
-					goto SWITCH_ERROR;
-				case CB_BAT1:
-					delay_1ms(10);
-					shark_bms_set_mos_series();
-
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_2)
-						delay_1ms(10);
-					
-					if(RS485_busy_2)
-						goto SWITCH_ERROR;
-
-					if(Operate_Sub_BMS_2_CD(2) == 0)
-						goto SWITCH_ERROR;
-					
-					/*for(uint16_t i = 0;i < 20;i++)
-					{
-						
-						if(Handle_Can_Data() == 1)
-						{
-							// output fail
-							
-							;
-						}
-						delay_1ms(10);
-					}*/
-					delay_1ms(200);
-					
-					if(Operate_Sub_BMS_2_CD(1) == 0)
-						goto SWITCH_ERROR;
-									
-					break;
-				case CB_BAT2:
-					delay_1ms(10);
-					shark_bms_set_mos_series();
-					//
-					i = 0;
-					while(i++ < COM_TIMEOUT && RS485_busy_1)
-						delay_1ms(10);
-					
-					if(RS485_busy_1)
-						goto SWITCH_ERROR;
-					
-					if(Operate_Sub_BMS_1_CD(2) == 0)
-						goto SWITCH_ERROR;
-					
-					/*for(uint16_t i = 0;i < 20;i++)
-					{
-						
-						if(Handle_Can_Data() == 1)
-						{
-							// output fail
-							
-							;
-						}
-						delay_1ms(10);
-					}*/
-
-					delay_1ms(200);
-					
-					if(Operate_Sub_BMS_1_CD(1) == 0)
-						goto SWITCH_ERROR;
-					break;
-				case CB_BAT1_BAT2_PARRALLEL:
-
-					if(sub_bms_info_1.packet_common.m_total_vol < sub_bms_info_2.packet_common.m_total_vol)
-					{
-						//
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_1)
-							delay_1ms(10);
-						
-						if(RS485_busy_1)
-							goto SWITCH_ERROR;
-
-						if(Operate_Sub_BMS_1_CD(0) == 0)
-							goto SWITCH_ERROR;
-
-						delay_1ms(50);
-
-						delay_1ms(10);
-						shark_bms_set_mos_series();
-
-							
-						if(Operate_Sub_BMS_1_CD(2) == 0)
-							goto SWITCH_ERROR;
-						
-						/*for(uint16_t i = 0;i < 20;i++)
-						{
-							
-							if(Handle_Can_Data() == 1)
-							{
-								// output fail
-								
-								;
-							}
-							delay_1ms(10);
-						}*/
-
-						delay_1ms(200);
-						
-						if(Operate_Sub_BMS_1_CD(1) == 0)
-							goto SWITCH_ERROR;
-					}
-					else
-					{
-						//
-						i = 0;
-						while(i++ < COM_TIMEOUT && RS485_busy_2)
-							delay_1ms(10);
-						
-						if(RS485_busy_2)
-							goto SWITCH_ERROR;
-
-						if(Operate_Sub_BMS_2_CD(0) == 0)
-							goto SWITCH_ERROR;
-
-						delay_1ms(50);
-
-						delay_1ms(10);
-						shark_bms_set_mos_series();
-						
-						if(Operate_Sub_BMS_2_CD(2) == 0)
-							goto SWITCH_ERROR;
-						
-						/*for(uint16_t i = 0;i < 20;i++)
-						{
-							
-							if(Handle_Can_Data() == 1)
-							{
-								// output fail
-								
-								;
-							}
-							delay_1ms(10);
-						}*/
-
-						delay_1ms(200);
-						
-						if(Operate_Sub_BMS_2_CD(1) == 0)
-							goto SWITCH_ERROR;
-					}
-					break;
-				case CB_BAT1_BAT2_SERIES:
-					break;
-				default:
-					goto SWITCH_ERROR;
-			}
-			delay_1ms(10);
-			shark_bms_set_mos_series();
-			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
-			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
-#endif
-			break;
-		case CB_BAT_NO:
-		default:
-			ACC2_Enable(0);
-			shark_bms_set_mos_close();
-			sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
-			sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
-			cb_operate = CB_BAT_NO;
-			if(Is_Soak())
-			{
-				sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
-				sub_bms_info_1.sub_bms_cmd.param = 0x00;
-				sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
-				sub_bms_info_2.sub_bms_cmd.param = 0x00;
-			}
-			break;
-	}
-
-	
-	// cb_val_last = cb_val_temp;
-
-	cb_operate_state = cb_operate;
-
-	return cb_operate;
-
-SWITCH_ERROR:
-	println("switch err");
-	shark_bms_set_mos_close();
-	cb_operate_state = CB_BAT_NO;
 	return cb_operate_state;
-	
-#undef COM_TIMEOUT
-#endif
 }
 void test_io(void)
 {
@@ -1179,7 +686,7 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
 	}
 #endif
 
-	if (shark_charger_state != SHARK_CHG_REMOVE)
+	if (shark_charger_state == SHARK_CHG_INSERT)
 	{
 		temp_op = Select_One_BAT();
 		return temp_op;
@@ -1515,7 +1022,7 @@ void Intelligent_Management_Battery(void)
 		switch(cb_operate_state)
 		{
 			case CB_BAT1:
-				if (shark_charger_enabled)
+				if (shark_charger_state != SHARK_CHG_REMOVE)
 				{
 					if (shark_battery_charge_complete1() || shark_battery_get_voltage2() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage1())
 					{
@@ -1528,7 +1035,7 @@ void Intelligent_Management_Battery(void)
 				}
 				break;
 			case CB_BAT2:
-				if (shark_charger_enabled)
+				if (shark_charger_state != SHARK_CHG_REMOVE)
 				{
 					if (shark_battery_charge_complete2() || shark_battery_get_voltage1() + SHARK_CHARGE_VOL_FUZZ < shark_battery_get_voltage2())
 					{

+ 1 - 2
Source/app_can.c

@@ -78,10 +78,9 @@ void ADAS_Self_Send_Up(void)
 
 void Check_Can_Self_Send_Status(void)
 {
+	Can_End_Ctr_Self_Send_Check(&app_can_ctr_frame);
 	Can_Bms_1_Self_Send_Check(&app_can_bms_1_frame);
 	Can_Bms_2_Self_Send_Check(&app_can_bms_2_frame);
-	Can_End_Ctr_Self_Send_Check(&app_can_ctr_frame);
-	
 }
 
 static int8_t Handle_Can_CMD(CAN_FRAME*can_frame)

+ 8 - 2
Source/app_end_ctr.c

@@ -544,6 +544,10 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					buf[len++] = shark_charger_state << 4 | shark_charger_enabled;
 					buf[len++] = sub_bms_info_1.packet_common.charge_flag << 4 | sub_bms_info_2.packet_common.charge_flag;
 					break;
+				case 8:
+					memcpy(buf + len, &shark_charge_times, sizeof(shark_charge_times));
+					len += sizeof(shark_charge_times);
+					break;
 				case 9:
 					memcpy(buf + len, &shark_mseconds, sizeof(shark_mseconds));
 					len += sizeof(shark_mseconds);
@@ -720,8 +724,10 @@ void Check_End_Ctr_Status(void)
 	}
 
 	//
-	end_ctr_self_ss_new.charger_in = shark_charger_enabled;
-	
+	end_ctr_self_ss_new.charger_in = shark_charger_is_normal();
+	end_ctr_self_ss_new.bat1_charge = shark_battery_charge_in1();
+	end_ctr_self_ss_new.bat2_charge = shark_battery_charge_in2();
+
 	end_ctr_self_ss_new.moto_temp = ctr_temperature[1];
 
 	end_ctr_self_ss_new.ps100_temp = ctr_temperature[0];

+ 3 - 1
Source/app_end_ctr.h

@@ -58,7 +58,9 @@ typedef struct
 
 	uint8_t acc12_sta:1;
 	uint8_t charger_in:1;
-	uint8_t res4_sta:6;
+	uint8_t bat1_charge:1;
+	uint8_t bat2_charge:1;
+	uint8_t res4_sta:4;
 
 	
 	int8_t moto_temp;

+ 4 - 0
Source/app_rs485_1.c

@@ -90,6 +90,10 @@ static int8_t Handle_Sub_BMS_CMD_1(SUB_BMS_INFO *info, const u8 *buff, u8 length
 		memcpy(&info->packet_common, buff + count,sizeof(info->packet_common));
 		count += sizeof(info->packet_common);
 
+		if (shark_battery_charge_in(info)) {
+			shark_charger_valid = shark_true;
+		}
+
 		//bang zi ce shi start
 		//temp_bms ->packet_common.m_percent /= 2;
 		//bang zi ce shi end

+ 15 - 0
Source/app_rs485_1.h

@@ -455,6 +455,21 @@ static inline shark_bool shark_battery_charge_complete2(void)
 	return shark_battery_charge_complete(&sub_bms_info_2);
 }
 
+static inline shark_bool shark_battery_charge_in(SUB_BMS_INFO *info)
+{
+	return info->packet_common.charge_flag != 0;
+}
+
+static inline shark_bool shark_battery_charge_in1(void)
+{
+	return shark_battery_charge_in(&sub_bms_info_1);
+}
+
+static inline shark_bool shark_battery_charge_in2(void)
+{
+	return shark_battery_charge_in(&sub_bms_info_2);
+}
+
 static inline shark_bool shark_battery_send_pending(SUB_BMS_INFO *info)
 {
 	return info->send_state == SHARK_SEND_PENDING;

+ 46 - 32
Source/shark_charge.c

@@ -5,7 +5,9 @@
 
 shark_charger_state_t shark_charger_state;
 shark_bool shark_charger_enabled;
+shark_bool shark_charger_valid;
 shark_u16 shark_charge_times;
+shark_u16 shark_charge_skip;
 
 static shark_u16 shark_charger_remove;
 static shark_u16 shark_charger_insert;
@@ -21,6 +23,11 @@ void shark_charge_init(void)
 	gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
 }
 
+shark_bool shark_charger_is_normal(void)
+{
+	return shark_charger_enabled && (shark_battery_charge_in1() || shark_battery_charge_in2());
+}
+
 void shark_charger_set_enable(shark_bool enable)
 {
 	if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
@@ -35,22 +42,28 @@ void shark_charger_set_enable(shark_bool enable)
 		enable = shark_false;
 	}
 
+	if (shark_charger_state != SHARK_CHG_INSERT) {
+		enable = shark_false;
+	}
+
 	if (enable) {
 		gpio_bit_set(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
+		shark_charge_times = 0;
 	} else {
 		gpio_bit_reset(GPIO_PORT_CHG_EN, GPIO_PIN_CHG_EN);
+		shark_charger_insert = 0;
+		shark_charger_state = SHARK_CHG_DETECT;
 	}
 
+	shark_charger_valid = shark_false;
 	shark_charger_enabled = enable;
-	shark_charge_times = 0;
 }
 
 void shark_charger_disable(void)
 {
-	if (shark_charge_times > SHARK_CHG_TIME_DETECT) {
+	if (shark_charge_times > SHARK_CHG_TIME_DETECT || shark_charger_valid) {
+		shark_charge_skip = 6000;
 		shark_charger_set_enable(shark_false);
-		shark_charger_insert = 0;
-		shark_charger_state = SHARK_CHG_DETECT;
 	}
 }
 
@@ -60,18 +73,21 @@ void shark_charge_tick(void)
 		shark_charger_remove = 0;
 
 		if (shark_charger_insert > SHARK_CHG_INSERT_MIN) {
-			if (shark_xl_check_with_qd() == shark_false) {
-				shark_charger_state = SHARK_CHG_INSERT;
-			}
-
 			if (shark_charger_enabled && shark_charge_times < SHARK_CHG_TIME_MAX) {
 				shark_charge_times++;
 			}
+		} else if (shark_charge_skip > 0) {
+			shark_charge_skip--;
 		} else {
+			if (shark_charger_insert == SHARK_CHG_INSERT_MIN && shark_xl_check_with_qd() == shark_false) {
+				shark_charger_state = SHARK_CHG_INSERT;
+			}
+
 			shark_charger_insert++;
 		}
 	} else {
 		shark_charger_insert = 0;
+		shark_charge_skip = 0;
 
 		if (shark_charger_remove > SHARK_CHG_REMOVE_MIN) {
 			shark_charger_state = SHARK_CHG_REMOVE;
@@ -83,37 +99,35 @@ void shark_charge_tick(void)
 
 void shark_charge_poll(void)
 {
-	if (shark_charger_state == SHARK_CHG_INSERT) {
-		if (shark_charger_enabled) {
-			switch (cb_operate_state) {
-			case CB_BAT1:
-				if (sub_bms_info_1.packet_common.charge_flag == 0) {
-					shark_charger_disable();
-				}
-				break;
+	if (shark_charger_enabled) {
+		switch (cb_operate_state) {
+		case CB_BAT1:
+			if (sub_bms_info_1.packet_common.charge_flag == 0) {
+				shark_charger_disable();
+			}
+			break;
+
+		case CB_BAT2:
+			if (sub_bms_info_2.packet_common.charge_flag == 0) {
+				shark_charger_disable();
+			}
+			break;
 
-			case CB_BAT2:
+		case CB_BAT1_BAT2_PARRALLEL:
+			if (sub_bms_info_1.packet_common.charge_flag == 0) {
 				if (sub_bms_info_2.packet_common.charge_flag == 0) {
 					shark_charger_disable();
 				}
-				break;
-
-			case CB_BAT1_BAT2_PARRALLEL:
-				if (sub_bms_info_1.packet_common.charge_flag == 0) {
-					if (sub_bms_info_2.packet_common.charge_flag == 0) {
-						shark_charger_disable();
-					}
-
-					if (shark_battery_get_current12() < 0) {
-						shark_charger_disable();
-					}
-				} else if (sub_bms_info_2.packet_common.charge_flag == 0 && shark_battery_get_current12() < 0) {
+
+				if (shark_battery_get_current12() < 0) {
 					shark_charger_disable();
 				}
-				break;
+			} else if (sub_bms_info_2.packet_common.charge_flag == 0 && shark_battery_get_current12() < 0) {
+				shark_charger_disable();
 			}
-		} else {
-			shark_charger_set_enable(shark_true);
+			break;
 		}
+	} else if (shark_charger_state == SHARK_CHG_INSERT) {
+		shark_charger_set_enable(shark_true);
 	}
 }

+ 5 - 3
Source/shark_charge.h

@@ -3,12 +3,12 @@
 #include "shark_types.h"
 #include "common.h"
 
-#define SHARK_CHG_TIME_DETECT		5000
-#define SHARK_CHG_TIME_SWITCH		10000
+#define SHARK_CHG_TIME_DETECT		10000
+#define SHARK_CHG_TIME_SWITCH		12000
 #define SHARK_CHG_TIME_MAX			60000
 
 #define SHARK_CHG_INSERT_MIN		50
-#define SHARK_CHG_REMOVE_MIN		2000
+#define SHARK_CHG_REMOVE_MIN		1500
 
 #define GPIO_PORT_CHG_DET			GPIOC
 #define GPIO_PIN_CHG_DET			GPIO_PIN_4
@@ -30,9 +30,11 @@ typedef enum {
 
 extern shark_charger_state_t shark_charger_state;
 extern shark_bool shark_charger_enabled;
+extern shark_bool shark_charger_valid;
 extern shark_u16 shark_charge_times;
 
 void shark_charger_set_enable(shark_bool enable);
+shark_bool shark_charger_is_normal(void);
 void shark_charger_disable(void);
 void shark_charge_init(void);
 void shark_charge_tick(void);

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V11_11191852"
+#define CONFIG_VERSION "PS100XX_V11_11201527"