📄 pwr_disch.c
字号:
/*******************************************************************************
*
* pwr_disch.c
*
* Purpose: This file contains functions for battery discharge management.
*
* (C) Texas Instruments 2001
*
******************************************************************************/
#include "rv_defined_swe.h" // for RVM_PWR_SWE
#ifdef RVM_PWR_SWE
#include "abb.h"
#include "rvm_use_id_list.h"
#include "pwr_disch.h"
#include "power.h"
#include "spi_task.h"
#include "pwr_cust.h"
#include "pwr_messages.h"
#include "spi_env.h"
#include "pwr_env.h"
/* Define a pointer to the PWR Environment control block. */
extern T_PWR_ENV_CTRL_BLK *pwr_env_ctrl_blk;
/*******************************************************************************
** Function pwr_discharge_timer_process
**
** Description
**
*******************************************************************************/
void pwr_discharge_timer_process(void)
{
rvf_send_trace("TIMER3", 6, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_LOW, PWR_USE_ID);
if (SPI_GBL_INFO_PTR->is_gsm_on == TRUE)
{
pwr_handle_discharge(); /* battery discharge management */
}
}
/*******************************************************************************
** Function pwr_handle_discharge
**
** Description Compares the battery voltage with some thresholds and, if a
** threshold is passed, sends event(s) to the upper layer.
** Re-start the timer with a value depending on the discharge
** level.
**
*******************************************************************************/
void pwr_handle_discharge(void)
{
UINT16 timer_value;
UINT16 status;
UINT16 bat_madc_voltage, bat_voltage;
static T_PWR_PERCENT remain_capacity = 100; /* since this variable is declared as static */
/* it will keep its value from one function call to the other */
T_PWR_PERCENT current_capacity;
if (SPI_GBL_INFO_PTR->is_adc_on == FALSE)
{
/* Start VBAT channel conversion by writing in the result register */
ABB_Write_Register_on_page(PAGE0, VBATREG, 0x0000);
rvf_delay(RVF_MS_TO_TICKS(5));
bat_madc_voltage = ABB_Read_Register_on_page(PAGE0, VBATREG);
rvf_send_trace("battery voltage (MADC code) ", 28, bat_madc_voltage, RV_TRACE_LEVEL_DEBUG_LOW, PWR_USE_ID);
}
else /* The L1 asks for ADC conversions */
{
#ifndef _WINDOWS
bat_madc_voltage = SPI_GBL_INFO_PTR->adc_result[0];
#else
bat_madc_voltage = ABB_Read_Register_on_page(PAGE0, VBATREG);
#endif
}
/* Find the remaining capacity in the battery corresponding to this new voltage */
bat_voltage = pwr_adc_to_mvolt(bat_madc_voltage);
rvf_send_trace("battery voltage (mV) ", 21, bat_voltage, RV_TRACE_LEVEL_DEBUG_LOW, PWR_USE_ID);
current_capacity = pwr_get_capacity_vs_voltage(bat_voltage);
rvf_send_trace("current capacity (%) ", 21, current_capacity, RV_TRACE_LEVEL_DEBUG_LOW, PWR_USE_ID);
status = ABB_Read_Status();
/* Determine if a threshold has been passed */
if (current_capacity != remain_capacity)
{
/* a new threshold has been passed */
remain_capacity = current_capacity;
/* informs the upper layer */
pwr_send_bat_discharge_event(remain_capacity);
if (status & CHGPRES) /* charger plugged */
{
if (remain_capacity == CHARGE_START_AGAIN_CAPACITY)
{
PWR_Charger_Plug();
}
}
else /* charger not plugged */
{
if(remain_capacity <= pwr_env_ctrl_blk->power_alert.remain_capa_threshold)
{
/* informs the upper layer that the battery is low */
pwr_send_low_bat_event(remain_capacity);
timer_value = SPI_TIMER3_INTERVAL_BIS; /* 10 s */
}
else
{
#ifndef _WINDOWS
timer_value = SPI_TIMER3_INTERVAL; /* 1 minute */
#else
timer_value = SPI_TIMER3_INTERVAL_BIS; /* 10 s */
#endif
}
/* Start timer with a value depending on the remaining capacity in the battery */
rvf_start_timer (SPI_TIMER3,
RVF_MS_TO_TICKS (timer_value),
FALSE);
}
}
else /* the capacity has not changed */
{
#ifndef _WINDOWS
timer_value = SPI_TIMER3_INTERVAL; /* 1 minute */
#else
timer_value = SPI_TIMER3_INTERVAL_BIS; /* 10 s */
#endif
/* Start timer with a value depending on the remaining capacity in the battery */
rvf_start_timer (SPI_TIMER3,
RVF_MS_TO_TICKS (timer_value),
FALSE);
}
}
#endif /* #ifdef RVM_PWR_SWE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -