|
|
@@ -43,6 +43,39 @@ bms_state_t *bms_state_get(void){
|
|
|
return &_bms_state;
|
|
|
}
|
|
|
|
|
|
+int bms_work_is_normal(void){
|
|
|
+ return _bms_state.work_mode == WORK_MODE_NORMAL;
|
|
|
+}
|
|
|
+
|
|
|
+int bms_work_is_aging_test(void){
|
|
|
+ return _bms_state.work_mode == WORK_MODE_AGING_TEST;
|
|
|
+}
|
|
|
+
|
|
|
+int bms_work_is_pcba_test(void){
|
|
|
+ return _bms_state.work_mode == WORK_MODE_PCBA_TEST;
|
|
|
+}
|
|
|
+
|
|
|
+int bms_work_is_pack_test(void){
|
|
|
+ return _bms_state.work_mode == WORK_MODE_PCBA_TEST;
|
|
|
+}
|
|
|
+
|
|
|
+int bms_work_is_calibrating(void){
|
|
|
+ return _bms_state.work_mode == WORK_MODE_CALIBRATE;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int bms_work_mode_set(int mode, int start){
|
|
|
+ if (mode < WORK_MODE_AGING_TEST || mode > WORK_MODE_CALIBRATE){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ if (start){
|
|
|
+ _bms_state.work_mode = mode;
|
|
|
+ }else {
|
|
|
+ _bms_state.work_mode = WORK_MODE_NORMAL;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
放电mos和充电mos的开关要小心:
|
|
|
1. 大部分的情况下,尽量能做到同时开关,主要是用来保护被关闭那路mos的体二极管(不能过大电流)
|
|
|
@@ -190,8 +223,16 @@ static void _process_deepsleep(s32 health){
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+/*when work as test mode, we do'n need close the discharger */
|
|
|
+static int _can_close_mos_no_hall(void){
|
|
|
+ if (bms_work_is_normal()){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void _process_iostate_changed(void){
|
|
|
- if (!(io_state()->hall_detect)){
|
|
|
+ if (!(io_state()->hall_detect) && _can_close_mos_no_hall()){
|
|
|
if (ml5238_is_discharging()){
|
|
|
discharger_open(0);
|
|
|
}
|