FreeCalypso > hg > fc-tourmaline
comparison src/cs/drivers/drv_app/fchg/fchg_process.c @ 236:3c790d29748e
fchg_is_running startup sync flag change:
set the flag when the first ADC message has been processed,
and not merely when the task is running - this way the flag indicates
that meaningful info about the state of the battery is available.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Sun, 02 May 2021 04:25:48 +0000 |
| parents | 75067af48bfd |
| children | 305d3bb691a5 |
comparison
equal
deleted
inserted
replaced
| 235:ee04ca45053d | 236:3c790d29748e |
|---|---|
| 19 #if defined(CONFIG_TARGET_C155) || defined(CONFIG_TARGET_J100) | 19 #if defined(CONFIG_TARGET_C155) || defined(CONFIG_TARGET_J100) |
| 20 #define LEDC 0x20 | 20 #define LEDC 0x20 |
| 21 #else | 21 #else |
| 22 #define LEDC 0 | 22 #define LEDC 0 |
| 23 #endif | 23 #endif |
| 24 | |
| 25 /* | |
| 26 * The following global variable is a system startup synchronization flag: | |
| 27 * it indicates that FCHG is running and has processed at least one | |
| 28 * ADC message, signifying that meaningful information about the state | |
| 29 * of the battery is available. | |
| 30 */ | |
| 31 int fchg_is_running; | |
| 24 | 32 |
| 25 void pwr_init_discharge(void) | 33 void pwr_init_discharge(void) |
| 26 { | 34 { |
| 27 pwr_ctrl->curr_disch_thresh = 0; | 35 pwr_ctrl->curr_disch_thresh = 0; |
| 28 } | 36 } |
| 267 switch (pwr_ctrl->state) { | 275 switch (pwr_ctrl->state) { |
| 268 case FCHG_STATE_NO_EXT_PWR: | 276 case FCHG_STATE_NO_EXT_PWR: |
| 269 case FCHG_STATE_PWR_PLUG_TIMER: | 277 case FCHG_STATE_PWR_PLUG_TIMER: |
| 270 case FCHG_STATE_NO_CHARGING: | 278 case FCHG_STATE_NO_CHARGING: |
| 271 handle_discharge(); | 279 handle_discharge(); |
| 272 return; | 280 break; |
| 273 case FCHG_STATE_READY_TO_CHARGE: | 281 case FCHG_STATE_READY_TO_CHARGE: |
| 274 handle_discharge(); | 282 handle_discharge(); |
| 275 if (!(msg->data[9] & CHGPRES)) { | 283 if (!(msg->data[9] & CHGPRES)) { |
| 276 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 284 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 277 return; | 285 break; |
| 278 } | 286 } |
| 279 if (pwr_ctrl->batt_mv < pwr_ctrl->config.start_thresh) | 287 if (pwr_ctrl->batt_mv < pwr_ctrl->config.start_thresh) |
| 280 start_charge_condition_met(); | 288 start_charge_condition_met(); |
| 281 return; | 289 break; |
| 282 case FCHG_STATE_READY_TO_RECHARGE: | 290 case FCHG_STATE_READY_TO_RECHARGE: |
| 283 handle_discharge(); | 291 handle_discharge(); |
| 284 if (!(msg->data[9] & CHGPRES)) { | 292 if (!(msg->data[9] & CHGPRES)) { |
| 285 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 293 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 286 return; | 294 break; |
| 287 } | 295 } |
| 288 if (pwr_ctrl->batt_mv < pwr_ctrl->config.restart_thresh) | 296 if (pwr_ctrl->batt_mv < pwr_ctrl->config.restart_thresh) |
| 289 start_charge_condition_met(); | 297 start_charge_condition_met(); |
| 290 return; | 298 break; |
| 291 case FCHG_STATE_I2V_CAL_1: | 299 case FCHG_STATE_I2V_CAL_1: |
| 292 if (!(msg->data[9] & CHGPRES)) { | 300 if (!(msg->data[9] & CHGPRES)) { |
| 293 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 301 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 294 return; | 302 break; |
| 295 } | 303 } |
| 296 if (pwr_ctrl->config.bciconf) | 304 if (pwr_ctrl->config.bciconf) |
| 297 start_i2v_cal(); | 305 start_i2v_cal(); |
| 298 else { | 306 else { |
| 299 pwr_ctrl->i2v_offset = 0; | 307 pwr_ctrl->i2v_offset = 0; |
| 300 start_ci_charging(); | 308 start_ci_charging(); |
| 301 } | 309 } |
| 302 return; | 310 break; |
| 303 case FCHG_STATE_I2V_CAL_2: | 311 case FCHG_STATE_I2V_CAL_2: |
| 304 pwr_ctrl->i2v_offset = msg->data[2]; | 312 pwr_ctrl->i2v_offset = msg->data[2]; |
| 305 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); | 313 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); |
| 306 rvf_send_trace("i2v offset (MADC code) ", 23, | 314 rvf_send_trace("i2v offset (MADC code) ", 23, |
| 307 pwr_ctrl->i2v_offset, | 315 pwr_ctrl->i2v_offset, |
| 308 RV_TRACE_LEVEL_DEBUG_LOW, FCHG_USE_ID); | 316 RV_TRACE_LEVEL_DEBUG_LOW, FCHG_USE_ID); |
| 309 if (!(msg->data[9] & CHGPRES)) { | 317 if (!(msg->data[9] & CHGPRES)) { |
| 310 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 318 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 311 pwr_init_discharge(); | 319 pwr_init_discharge(); |
| 312 return; | 320 break; |
| 313 } | 321 } |
| 314 start_ci_charging(); | 322 start_ci_charging(); |
| 315 return; | 323 break; |
| 316 case FCHG_STATE_CI_CHARGING: | 324 case FCHG_STATE_CI_CHARGING: |
| 317 ci_progress_trace(msg->data[2]); | 325 ci_progress_trace(msg->data[2]); |
| 318 if (!(msg->data[9] & CHGPRES)) { | 326 if (!(msg->data[9] & CHGPRES)) { |
| 319 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); | 327 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); |
| 320 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 328 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 321 pwr_init_discharge(); | 329 pwr_init_discharge(); |
| 322 return; | 330 break; |
| 323 } | 331 } |
| 324 if (charging_time_limit_check()) | 332 if (charging_time_limit_check()) |
| 325 return; | 333 break; |
| 326 if (pwr_ctrl->batt_mv >= pwr_ctrl->config.ci2cv_thresh) | 334 if (pwr_ctrl->batt_mv >= pwr_ctrl->config.ci2cv_thresh) |
| 327 start_cv_charging(); | 335 start_cv_charging(); |
| 328 return; | 336 break; |
| 329 case FCHG_STATE_CV_CHARGING: | 337 case FCHG_STATE_CV_CHARGING: |
| 330 if (!(msg->data[9] & CHGPRES)) { | 338 if (!(msg->data[9] & CHGPRES)) { |
| 331 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); | 339 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); |
| 332 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; | 340 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; |
| 333 pwr_init_discharge(); | 341 pwr_init_discharge(); |
| 334 return; | 342 break; |
| 335 } | 343 } |
| 336 if (cv_ichg_process(msg->data[2])) | 344 if (cv_ichg_process(msg->data[2])) |
| 337 return; | 345 break; |
| 338 if (overvoltage_end_charge_check()) | 346 if (overvoltage_end_charge_check()) |
| 339 return; | 347 break; |
| 340 if (charging_time_limit_check()) | 348 if (charging_time_limit_check()) |
| 341 return; | 349 break; |
| 342 cv_ctrl_loop_high_check(); | 350 cv_ctrl_loop_high_check(); |
| 343 cv_ctrl_loop_low_check(); | 351 cv_ctrl_loop_low_check(); |
| 344 return; | 352 break; |
| 345 case FCHG_STATE_RECHARGE_TIMER: | 353 case FCHG_STATE_RECHARGE_TIMER: |
| 346 handle_discharge(); | 354 handle_discharge(); |
| 347 if ((rvf_get_tick_count() - pwr_ctrl->start_time) < | 355 if ((rvf_get_tick_count() - pwr_ctrl->start_time) < |
| 348 RVF_SECS_TO_TICKS(pwr_ctrl->config.recharge_delay)) | 356 RVF_SECS_TO_TICKS(pwr_ctrl->config.recharge_delay)) |
| 349 return; | 357 break; |
| 350 rvf_send_trace("Restart time met, allowing new charging", 39, | 358 rvf_send_trace("Restart time met, allowing new charging", 39, |
| 351 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, | 359 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, |
| 352 FCHG_USE_ID); | 360 FCHG_USE_ID); |
| 353 pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE; | 361 pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE; |
| 354 return; | 362 break; |
| 355 default: | 363 default: |
| 356 rvf_send_trace("Invalid state in pwr_process_adc()", 32, | 364 rvf_send_trace("Invalid state in pwr_process_adc()", 32, |
| 357 pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, | 365 pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, |
| 358 FCHG_USE_ID); | 366 FCHG_USE_ID); |
| 359 } | 367 } |
| 368 fchg_is_running = 1; | |
| 360 } | 369 } |
| 361 | 370 |
| 362 void pwr_handle_timer(void) | 371 void pwr_handle_timer(void) |
| 363 { | 372 { |
| 364 if (pwr_ctrl->state != FCHG_STATE_PWR_PLUG_TIMER) | 373 if (pwr_ctrl->state != FCHG_STATE_PWR_PLUG_TIMER) |
