📄 lcc_handle_timers.c
字号:
/******************************************************************************
* Power Task (pwr)
* Design and coding by Svend Kristian Lindholm, skl@ti.com
*
* Timers
*
* $Id: lcc_handle_timers.c,v 1.1.1.1 2004/06/19 06:00:29 root Exp $
*
******************************************************************************/
#ifndef __PWR_HANDLE_TIMERS_C_
#define __PWR_HANDLE_TIMERS_C_
UINT32 rvf_get_tick_count(void);
void pwr_check_timers(void);
T_RVM_RETURN pwr_create_timer(UINT32 *timer_begin);
T_RVM_RETURN pwr_start_timer(UINT32 *timer_begin);
void stop_ci_charge(void);
void pwr_modulate_off(void);
void pwr_send_msg(uint32 msg_id ,T_RVF_ADDR_ID src_addr_id, T_RVF_ADDR_ID dest_addr_id);
int pwr_capacity(uint16 Vbat);
void mmi_send_msg(struct mmi_info_ind_s *event);
void end_charging_house_keeping(void);
void cv_charging_house_keeping(void);
// Timer functions
UINT32 pwr_timer_elapsed(UINT32 time_begin, UINT32 current_timer)
{
// return elapsed time in [ms]
return (current_timer - time_begin) * 60 / 13;
}
T_RVM_RETURN pwr_start_timer(UINT32 *timer_begin)
{
ttw(ttr(TTrTimer, "pwr_start_timer(%d)" NL, 0));
// Start timer (will be checked each time an ADC measurement is received)
*timer_begin = rvf_get_tick_count();
ttw(ttr(TTrTimer, "pwr_start_timer(%d)" NL, 0xFF));
return (RV_OK);
}
T_RVM_RETURN pwr_stop_timer(UINT32 *timer_begin)
{
ttw(ttr(TTrTimer, "pwr_stop_timer(%d)" NL, 0));
*timer_begin = 0;
ttw(ttr(TTrTimer, "pwr_stop_timer(%d)" NL, 0xFF));
return (RV_OK);
}
void pwr_stop_timers(void)
{
// Only stop charging related timers - not supervision timers
pwr_stop_timer(&pwr_ctrl->time_begin_T1);
pwr_stop_timer(&pwr_ctrl->time_begin_T2);
pwr_stop_timer(&pwr_ctrl->time_begin_T3);
pwr_stop_timer(&pwr_ctrl->time_begin_T4);
pwr_stop_timer(&pwr_ctrl->time_begin_mod_cycle);
}
T_RVM_RETURN pwr_create_timer(UINT32 *timer_begin)
{
ttw(ttr(TTrTimer, "pwr_create_timer(%d)" NL, 0));
*timer_begin = 0;
ttw(ttr(TTrTimer, "pwr_create_timer(%d)" NL, 0xFF));
return (RV_OK);
}
T_RV_RET process_pwr_handle_T1_expiration (T_PWR_REQ *request)
{
ttw(ttr(TTrTimer, "process_pwr_handle_T1_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
break;
case CCI :
case CCV :
case LCI :
case LCV :
// Change state
pwr_ctrl->state = SUP;
end_charging_house_keeping();
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_T1_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
ttw(ttr(TTrTimer, "process_pwr_handle_T1_expiration(%d)" NL, 0xFF));
pwr_free(request);
}
T_RV_RET process_pwr_handle_T2_expiration (T_PWR_REQ *request)
{
ttw(ttr(TTrTimer, "process_pwr_handle_T2_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
// Another timer did expire prior to the T2 timer - ignore this expiration
break;
case CCV :
case LCV :
// Change state
pwr_ctrl->state = SUP;
end_charging_house_keeping();
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_T2_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_T2_expiration(%d)" NL, 0xFF));
}
T_RV_RET process_pwr_handle_T3_expiration (T_PWR_REQ *request)
{
ttw(ttr(TTrTimer, "process_pwr_handle_T3_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
// Stop & reset timers
pwr_stop_timers();
break;
case CCI :
case CCV :
case LCI :
case LCV :
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_T3_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_T3_expiration(%d)" NL, 0xFF));
}
T_RV_RET process_pwr_handle_T4_expiration (T_PWR_REQ *request)
{
ttw(ttr(TTrTimer, "process_pwr_handle_T4_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
// Yes - since timing issues can make this timer expire in SUP state
// It can take a long time before we know if a charger has been unplugged
break;
case CCV :
case LCV :
pwr_stop_timer(&pwr_ctrl->time_begin_T4);
pwr_modulate_off();
// Wait for duty cycle timer to expire before restarting this timer
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_T4_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_T4_expiration(%d)" NL, 0xFF));
}
T_RV_RET process_pwr_handle_mod_cycle_expiration (T_PWR_REQ *request)
{
ttw(ttr(TTrTimer, "process_pwr_handle_mod_cycle_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
// Yes - since timing issues can make this timer expire in SUP state
// It can take a long time before we know if a charger has been unplugged
break;
case CCV :
case LCV :
// Calculate k value
// Start DC timer
// Start T4 timer based on k value
// Modulation ON
cv_charging_house_keeping();
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_mod_cycle_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_mod_cycle_expiration(%d)" NL, 0xFF));
}
#if (LCC_ALWAYS_MMI_INFO == 0) /*Robert.Chen add, 2004-05-28 */
T_RV_RET process_pwr_handle_mmi_info_expiration(T_PWR_REQ *request)
{
struct mmi_info_ind_s MMI_Event;
ttw(ttr(TTrTimer, "process_pwr_handle_mmi_info_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
// Send MMI info events according to configured repetition interval
if (pwr_ctrl->flag_mmi_registered == 1) {
pwr_ctrl->mmi_ptr->header.msg_id = MMI_BAT_SUPERVISION_INFO_IND;
pwr_ctrl->mmi_ptr->Vbat = pwr_cfg->data.Vbat_avg_mV;
pwr_ctrl->mmi_ptr->Tbat = pwr_cfg->data.Tbat_avg;
pwr_ctrl->mmi_ptr->Cbat = pwr_capacity(pwr_cfg->data.Vbat_avg_mV);
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
// Restart timer
ttw(ttr(TTrTimerLow,"MMI info timer started(%d)" NL, 0));
pwr_start_timer(&pwr_ctrl->time_begin_mmi_rep);
break;
case INI :
case CCI :
case CCV :
case LCI :
case LCV :
// DON'T send any events when charging or initializing
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_mmi_info_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_mmi_info_expiration(%d)" NL, 0xFF));
}
#else /* LCC_ALWAYS_MMI_INFO == 1 */
/* Robert.Chen added, 2004-05-28, to get battery info in each states */
T_RV_RET process_pwr_handle_mmi_info_expiration(T_PWR_REQ *request)
{
struct mmi_info_ind_s MMI_Event;
ttw(ttr(TTrTimer, "process_pwr_handle_mmi_info_expiration(%d)" NL, 0));
switch (pwr_ctrl->state) {
case SUP :
case CCI :
case CCV :
case LCI :
case LCV :
case PRE :
// Send MMI info events according to configured repetition interval
if (pwr_ctrl->flag_mmi_registered == 1) {
pwr_ctrl->mmi_ptr->header.msg_id = MMI_BAT_SUPERVISION_INFO_IND;
pwr_ctrl->mmi_ptr->Vbat = pwr_cfg->data.Vbat_avg_mV;
pwr_ctrl->mmi_ptr->Tbat = pwr_cfg->data.Tbat_avg;
pwr_ctrl->mmi_ptr->Cbat = pwr_capacity(pwr_cfg->data.Vbat_avg_mV);
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
// Restart timer
ttw(ttr(TTrTimerLow,"MMI info timer started(%d)" NL, 0));
pwr_start_timer(&pwr_ctrl->time_begin_mmi_rep);
break;
case INI :
case CAL :
// Send MMI info events according to configured repetition interval
/* zhq, 2004/06/16, add these for in CAL and INI state , MMI do not have bat info,
so MMI can not display corrent bat info. */
if (pwr_ctrl->flag_mmi_registered == 1) {
pwr_ctrl->mmi_ptr->header.msg_id = MMI_BAT_SUPERVISION_INFO_IND;
pwr_ctrl->mmi_ptr->Vbat = pwr_cfg->data.Vbat_avg_mV;
pwr_ctrl->mmi_ptr->Tbat = pwr_cfg->data.Tbat_avg;
pwr_ctrl->mmi_ptr->Cbat = pwr_capacity_CAL_INI(pwr_cfg->data.Vbat_avg_mV);
mmi_send_msg(pwr_ctrl->mmi_ptr);
}
pwr_start_timer(&pwr_ctrl->time_begin_mmi_rep);
break;
default :
{
// Exception Handling - Unknown State
ttr(TTrFatal, "process_pwr_handle_mmi_info_expiration: Unknown State: %d" NL, pwr_ctrl->state);
break;
}
}
pwr_free(request);
ttw(ttr(TTrTimer, "process_pwr_handle_mmi_info_expiration(%d)" NL, 0xFF));
}
#endif
void pwr_check_timers()
{
UINT32 timer;
ttw(ttr(TTrTimer, "pwr_check_timers(%d)" NL, 0));
// Check timers T1, T2, T3, T4, duty cycle & mmi timer - if expired send timer expired events
timer = rvf_get_tick_count();
// T1
if (pwr_ctrl->time_begin_T1 != 0) {
// Started - but is it expired?
pwr_ctrl->time_elapsed_T1 = pwr_timer_elapsed(pwr_ctrl->time_begin_T1, timer);
if (pwr_ctrl->time_elapsed_T1 > pwr_cfg->bat.T1) {
// EXPIRED!
ttw(ttr(TTrTimer, "T1 expired (%d):" NL, pwr_ctrl->time_elapsed_T1));
// 'Stop' timer
pwr_ctrl->time_elapsed_T1 = 0;
pwr_ctrl->time_begin_T1 = 0;
// Send timer expired event
pwr_send_msg(TIMER_T1_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
// T2
if (pwr_ctrl->time_begin_T2 != 0) {
// Started - but is it expired?
pwr_ctrl->time_elapsed_T2 = pwr_timer_elapsed(pwr_ctrl->time_begin_T2, timer);
ttw(ttr(0xff000000, "T2 expired (%d):" NL, pwr_ctrl->time_elapsed_T2));
if (pwr_ctrl->time_elapsed_T2 > pwr_cfg->bat.T2) {
// EXPIRED!
ttw(ttr(TTrTimer, "T2 expired (%d):" NL, pwr_ctrl->time_elapsed_T2));
// 'Stop' timer
pwr_ctrl->time_elapsed_T2 = 0;
pwr_ctrl->time_begin_T2 = 0;
// Send timer expired event
pwr_send_msg(TIMER_T2_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
// T3
if (pwr_ctrl->time_begin_T3 != 0) {
// Started - but is it expired?
pwr_ctrl->time_elapsed_T3 = pwr_timer_elapsed(pwr_ctrl->time_begin_T3, timer);
if (pwr_ctrl->time_elapsed_T3 > pwr_cfg->bat.T3) {
// EXPIRED!
ttw(ttr(TTrTimer, "T3 expired (%d):" NL, pwr_ctrl->time_elapsed_T3));
// 'Stop' timer
pwr_ctrl->time_elapsed_T3 = 0;
pwr_ctrl->time_begin_T3 = 0;
// Send timer expired event
pwr_send_msg(TIMER_T3_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
// T4
if (pwr_ctrl->time_begin_T4 != 0) {
// Started - but is it expired?
pwr_ctrl->time_elapsed_T4 = pwr_timer_elapsed(pwr_ctrl->time_begin_T4, timer);
if (pwr_ctrl->time_elapsed_T4 > pwr_cfg->data.T4) {
// EXPIRED!
ttw(ttr(TTrTimer, "T4 expired (%d):" NL, pwr_ctrl->time_elapsed_T4));
// 'Stop' timer
pwr_ctrl->time_elapsed_T4 = 0;
pwr_ctrl->time_begin_T4 = 0;
// Send timer expired event
pwr_send_msg(TIMER_T4_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
// Duty cycle timer (Lithium only)
if (pwr_ctrl->time_begin_mod_cycle != 0) {
// Started - but is it expired?
pwr_ctrl->time_elapsed_mod_cycle = pwr_timer_elapsed(pwr_ctrl->time_begin_mod_cycle, timer);
if (pwr_ctrl->time_elapsed_mod_cycle > pwr_cfg->common.mod_cycle) {
// EXPIRED!
ttw(ttr(TTrTimer, "DC expired (%d):" NL, pwr_ctrl->time_elapsed_mod_cycle));
// 'Stop' timer
pwr_ctrl->time_elapsed_mod_cycle = 0;
pwr_ctrl->time_begin_mod_cycle = 0;
// Send timer expired event
pwr_send_msg(TIMER_MOD_CYCLE_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
// MMI repetition timer
if (pwr_ctrl->time_begin_mmi_rep != 0) {
// Started - but has it expired?
pwr_ctrl->time_elapsed_mmi_rep = pwr_timer_elapsed(pwr_ctrl->time_begin_mmi_rep, timer);
ttw(ttr(TTrTimer, "MMI info timer expired (%d):" NL, pwr_ctrl->time_elapsed_mmi_rep));
if (pwr_ctrl->time_elapsed_mmi_rep > pwr_cfg->mmi.repetition) {
// EXPIRED!
// 'Stop' timer
pwr_ctrl->time_elapsed_mmi_rep = 0;
pwr_ctrl->time_begin_mmi_rep = 0;
// Send timer expired event
pwr_send_msg(TIMER_MMI_INFO_EXPIRED, pwr_ctrl->addr_id, pwr_ctrl->addr_id);
}
}
ttw(ttr(TTrTimer, "pwr_check_timers(%d)" NL, 0xFF));
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -