FreeCalypso > hg > fc-tourmaline
diff src/cs/drivers/drv_app/fchg/fchg_process.c @ 253:769cf6273fe4
FCHG: beginning of battery simulation mode
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 May 2021 11:14:51 +0000 |
parents | 305d3bb691a5 |
children | 1a4413c4eb7e |
line wrap: on
line diff
--- a/src/cs/drivers/drv_app/fchg/fchg_process.c Wed May 12 03:18:50 2021 +0000 +++ b/src/cs/drivers/drv_app/fchg/fchg_process.c Wed May 12 11:14:51 2021 +0000 @@ -277,40 +277,36 @@ return 1; } -void pwr_process_adc(struct pwr_adc_ind_s *msg) +static void process_adc_regular(struct pwr_adc_ind_s *msg) { - pwr_ctrl->batt_mv = madc_vbat_2_physical(msg->data[0]); - if (!fchg_first_vbat) - capture_first_vbat(); - switch (pwr_ctrl->state) { case FCHG_STATE_NO_EXT_PWR: case FCHG_STATE_PWR_PLUG_TIMER: case FCHG_STATE_NO_CHARGING: handle_discharge(); - break; + return; case FCHG_STATE_READY_TO_CHARGE: handle_discharge(); if (!(msg->data[9] & CHGPRES)) { pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; - break; + return; } if (pwr_ctrl->batt_mv < pwr_ctrl->config.start_thresh) start_charge_condition_met(); - break; + return; case FCHG_STATE_READY_TO_RECHARGE: handle_discharge(); if (!(msg->data[9] & CHGPRES)) { pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; - break; + return; } if (pwr_ctrl->batt_mv < pwr_ctrl->config.restart_thresh) start_charge_condition_met(); - break; + return; case FCHG_STATE_I2V_CAL_1: if (!(msg->data[9] & CHGPRES)) { pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; - break; + return; } if (pwr_ctrl->config.bciconf) start_i2v_cal(); @@ -318,7 +314,7 @@ pwr_ctrl->i2v_offset = 0; start_ci_charging(); } - break; + return; case FCHG_STATE_I2V_CAL_2: pwr_ctrl->i2v_offset = msg->data[2]; ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); @@ -328,56 +324,96 @@ if (!(msg->data[9] & CHGPRES)) { pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; pwr_init_discharge(); - break; + return; } start_ci_charging(); - break; + return; case FCHG_STATE_CI_CHARGING: ci_progress_trace(msg->data[2]); if (!(msg->data[9] & CHGPRES)) { ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; pwr_init_discharge(); - break; + return; } if (charging_time_limit_check()) - break; + return; if (pwr_ctrl->batt_mv >= pwr_ctrl->config.ci2cv_thresh) start_cv_charging(); - break; + return; case FCHG_STATE_CV_CHARGING: if (!(msg->data[9] & CHGPRES)) { ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; pwr_init_discharge(); - break; + return; } if (cv_ichg_process(msg->data[2])) - break; + return; if (overvoltage_end_charge_check()) - break; + return; if (charging_time_limit_check()) - break; + return; cv_ctrl_loop_high_check(); cv_ctrl_loop_low_check(); - break; + return; case FCHG_STATE_RECHARGE_TIMER: handle_discharge(); if ((rvf_get_tick_count() - pwr_ctrl->start_time) < RVF_SECS_TO_TICKS(pwr_ctrl->config.recharge_delay)) - break; + return; rvf_send_trace("Restart time met, allowing new charging", 39, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, FCHG_USE_ID); pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE; - break; + return; default: - rvf_send_trace("Invalid state in pwr_process_adc()", 32, + rvf_send_trace("Invalid state in pwr_process_adc()", 34, pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); } } +static void process_adc_bsim(struct pwr_adc_ind_s *msg) +{ + switch (pwr_ctrl->state) { + case FCHG_STATE_READY_TO_CHARGE: + if (!pwr_ctrl->bsim.start_enable) + return; + rvf_send_trace("BSIM: simulated charging auto-start", 35, + NULL_PARAM, RV_TRACE_LEVEL_DEBUG_MEDIUM, + FCHG_USE_ID); + pwr_ctrl->state = FCHG_STATE_I2V_CAL_1; + return; + case FCHG_STATE_I2V_CAL_1: + rvf_send_trace("BSIM: advancing from I2V_CAL_1 to I2V_CAL_2", + 43, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, + FCHG_USE_ID); + pwr_ctrl->state = FCHG_STATE_I2V_CAL_2; + return; + case FCHG_STATE_I2V_CAL_2: + rvf_send_trace("BSIM: advancing from I2V_CAL_2 to CI charging", + 45, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, + FCHG_USE_ID); + pwr_ctrl->state = FCHG_STATE_CI_CHARGING; + return; + default: + /* remaining states require no action in BSIM */ + return; + } +} + +void pwr_process_adc(struct pwr_adc_ind_s *msg) +{ + pwr_ctrl->batt_mv = madc_vbat_2_physical(msg->data[0]); + if (!fchg_first_vbat) + capture_first_vbat(); + if (pwr_ctrl->bsim_mode) + process_adc_bsim(msg); + else + process_adc_regular(msg); +} + void pwr_handle_timer(void) { if (pwr_ctrl->state != FCHG_STATE_PWR_PLUG_TIMER) @@ -395,6 +431,14 @@ FCHG_USE_ID); return; } + if (pwr_ctrl->bsim_mode) { + rvf_send_trace("Charger plug in BSIM mode", 25, NULL_PARAM, + RV_TRACE_LEVEL_DEBUG_HIGH, FCHG_USE_ID); + pwr_ctrl->state = FCHG_STATE_READY_TO_CHARGE; + if (pwr_ctrl->event_handler) + pwr_ctrl->event_handler(FCHG_EVENT_CHARGER_PLUG); + return; + } if (!pwr_ctrl->config_present) { rvf_send_trace( "Charger plugged in, but no config: won't charge", 47, @@ -448,7 +492,7 @@ pwr_init_discharge(); break; default: - rvf_send_trace("Invalid state in pwr_charger_unplug()", 35, + rvf_send_trace("Invalid state in pwr_charger_unplug()", 37, pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); } @@ -464,7 +508,7 @@ NULL_PARAM, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); return; case FCHG_STATE_NO_CHARGING: - if (!pwr_ctrl->config_present) { + if (!pwr_ctrl->config_present && !pwr_ctrl->bsim_mode) { rvf_send_trace("No config set, cannot charge", 28, NULL_PARAM, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); @@ -489,7 +533,7 @@ 51, NULL_PARAM, RV_TRACE_LEVEL_WARNING, FCHG_USE_ID); return; default: - rvf_send_trace("Invalid state in pwr_charge_start_req()", 37, + rvf_send_trace("Invalid state in pwr_charge_start_req()", 39, pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); } @@ -525,7 +569,7 @@ pwr_ctrl->event_handler(FCHG_EVENT_CHARGING_STOPPED); return; default: - rvf_send_trace("Invalid state in pwr_charge_stop_req()", 36, + rvf_send_trace("Invalid state in pwr_charge_stop_req()", 38, pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, FCHG_USE_ID); }