📄 headset_charger.c
字号:
/****************************************************************************NAME monitorCharge DESCRIPTION This function is called to monitor the fast charge algorithm RETURNS TRUE if fast charge is complete, otherwise false*/static bool monitorCharge(power_type* power){ bool fast_charge_complete = FALSE; CH_DEBUG(("CH: state=%d\n", power->charger.state)); /* Look at current charging state */ switch(power->charger.state) { case trickle_charge: case charge_error: /* Check if fast charge was stopped as an abornal battery condition was detected */ if(power->charger.fast_charge_inhibit) { /* Check if battery is OK to continue fast charge */ if(batteryGetCurrentVoltage(power) > (power->config.charger.min_voltage + VBAT_OFFSET)) { if(batteryGetCurrentVoltage(power) < (power->config.charger.max_voltage - VBAT_OFFSET)) { if(batteryGetCurrentTemperature(power) > (power->config.charger.min_temp + TBAT_OFFSET)) { if(batteryGetCurrentTemperature(power) < (power->config.charger.max_temp - TBAT_OFFSET)) { /* Cancel current LED indication */ CH_DEBUG(("CH: Cancel LED Ind 1\n")); MessageSend(getAppTask(), EventCancelLedIndication, 0); /* Start fast charging */ startFastCharge(power); } } } } } else { /* Battery voltage out of range (potential divider is open circuit) */ if(batteryGetCurrentVoltage(power) < (VBAT_ABNORMAL - VBAT_OFFSET)) { /* Cancel current LED indication */ CH_DEBUG(("CH: Cancel LED Ind 2\n")); MessageSend(getAppTask(), EventCancelLedIndication, 0); /* Start fast charging */ startFastCharge(power); } } break; case fast_charge: /* Check for abnormal battery condition */ if((batteryGetCurrentVoltage(power) < power->config.charger.min_voltage) || (batteryGetCurrentVoltage(power) > power->config.charger.max_voltage) || (batteryGetCurrentTemperature(power) < power->config.charger.min_temp) || (batteryGetCurrentTemperature(power) > power->config.charger.max_temp)) { /* End fast charge */ endFastCharge(power); CH_DEBUG(("CH: FC End Abnormal\n")); /* Check for abnormal condition */ if(batteryGetCurrentVoltage(power) > VBAT_ABNORMAL) { CH_DEBUG(("CH: VBAT_ABNORMAL\n")); resetFastCharge(power); } /* Enter error state */ chargerError(power); } else { /* Battery voltage and temerature are within limits */ /* Check to ensure we have been fast charging for the minimum time */ if(power->charger.fast_charge_timer > power->config.charger.dv_inhibit_time) { /* -dV inhibit timer has expired */ if((batteryGetCurrentVoltage(power) > getVbatThreshold(power))) { /* Perform -dV detection */ if(dvDetect(power)) { /* Fast charge complete */ endFastCharge(power); fast_charge_complete = TRUE; CH_DEBUG(("CH: FC End -dV\n")); } else if(dtDetect(power)) { /* Fast charge complete */ endFastCharge(power); fast_charge_complete = TRUE; CH_DEBUG(("CH: FC End dT\n")); } } /* Check if fast charge timer has expired */ if(fastChargeTimeExpired(power)) { /* Fast charge complete */ endFastCharge(power); fast_charge_complete = TRUE; CH_DEBUG(("CH: FC End T\n")); } } else { /* Record battery temperature during inhibit period */ updateBatteryTemperature(power); } /* Update fast charger timer */ if(!power->charger.fast_charge_inhibit) power->charger.fast_charge_timer += power->config.charger.update_period; CH_DEBUG(("CH T=%d period=%d\n", power->charger.fast_charge_timer, power->config.charger.update_period)); } break; case disconnected: fast_charge_complete = TRUE; break; } return fast_charge_complete;}/****************************************************************************NAME trickleCharge DESCRIPTION This function is called to start the trickle charge algorithm RETURNS void*/static void trickleCharge(power_type* power){ CH_DEBUG(("CH: TC Start\n")); SET_CHARGER_STATE(trickle_charge); MessageSend(getAppTask(), EventTrickleCharge, 0);}/****************************************************************************NAME chargerError DESCRIPTION This function is called if a charger error is detected RETURNS void*/static void chargerError(power_type* power){ CH_DEBUG(("CH: Error\n")); SET_CHARGER_STATE(charge_error); /* Cancel current LED indication */ MessageSend(getAppTask(), EventCancelLedIndication, 0); /* Indicate charger error */ MessageSend(getAppTask(), EventChargeError, 0);}/****************************************************************************NAME chargerConnected DESCRIPTION This function is called by the Power Manager when the charger has been plugged into the headset RETURNS void*/void chargerConnected(power_type* power){ CH_DEBUG(("CH: Connected\n")); switch(power->charger.state) { case disconnected: if(power->config.chemistry == nimh) { /* Handle NiMH battery charging under software control */ /* Reset fast charge control */ resetFastCharge(power); /* Start fast charging the battery */ startFastCharge(power); /* Start monitoring battery */ MessageSend(&power->charger.task, CHARGER_UPDATE, 0); } else { /* LiON Handled automatically */ /* Fast charge state */ SET_CHARGER_STATE(fast_charge); /* Enable fast charge PIO line */ setChargeEnable(TRUE); } break; /* Disable deep sleep during charging */ VmDeepSleepEnable(FALSE); case trickle_charge: case fast_charge: case charge_error: break; } }/****************************************************************************NAME chargerDisconnected DESCRIPTION This function is called by the Power Manager when the charger has been unplugged from the headset RETURNS void*/void chargerDisconnected(power_type* power){ CH_DEBUG(("CH: Disconnected\n")); switch(power->charger.state) { case trickle_charge: case fast_charge: case charge_error: /* The charger has just been removed, move to disconnected state */ SET_CHARGER_STATE(disconnected); /* Cancel current LED indication */ CH_DEBUG(("CH: Cancel LED Ind 3\n")); MessageSend(getAppTask(), EventCancelLedIndication, 0); /* Disable fast charge enable PIO line */ setChargeEnable(FALSE); /* Enable deep sleep */ VmDeepSleepEnable(TRUE); break; case disconnected: break; }}/****************************************************************************NAME charger_handler DESCRIPTION Messages for the charger control task arrive here RETURNS void*/void charger_handler(Task task, MessageId id, Message message){ /* Get Power configuration data */ power_type* power = ((hsTaskData *)getAppTask())->power; /* Process message */ switch(id) { case CHARGER_UPDATE: CH_DEBUG(("CH: update\n")); if(!monitorCharge(power)) MessageSendLater(&power->charger.task, CHARGER_UPDATE, 0, D_SEC(power->config.charger.update_period * 60)); break; default: break; }}/****************************************************************************NAME chargerInit DESCRIPTION This function is called by the Power Manager to initialise the battery charger subsystem RETURNS void*/void chargerInit(power_type* power){ CH_DEBUG(("CH: Init\n")); /* Setup charger message task handler */ power->charger.task.handler = charger_handler; /* Assume charger disconnected at boot time */ power->charger.state = disconnected;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -