charger: process hall_sensor event to show charging animation

Bug: 191831427
Test: charging animation can show in display correctly
Signed-off-by: Jack Wu <wjack@google.com>
Change-Id: Id99a7401f53f647790e179e995dad9841f8284bb
This commit is contained in:
Jack Wu 2021-09-27 17:40:40 +08:00
parent c1b171138e
commit 3d637a9abb
2 changed files with 56 additions and 0 deletions

View File

@ -348,6 +348,14 @@ void Charger::UpdateScreenState(int64_t now) {
disp_time = batt_anim_.frames[batt_anim_.cur_frame].disp_time;
/* turn off all screen */
if (screen_switch_ == SCREEN_SWITCH_ENABLE) {
healthd_draw_->blank_screen(true, 0 /* drm */);
healthd_draw_->blank_screen(true, 1 /* drm */);
screen_blanked_ = true;
screen_switch_ = SCREEN_SWITCH_DISABLE;
}
if (screen_blanked_) {
healthd_draw_->blank_screen(false, static_cast<int>(drm_));
screen_blanked_ = false;
@ -452,7 +460,26 @@ int Charger::SetKeyCallback(int code, int value) {
return 0;
}
int Charger::SetSwCallback(int code, int value) {
if (code > SW_MAX) return -1;
if (code == SW_LID) {
if ((screen_switch_ == SCREEN_SWITCH_DEFAULT) || ((value != 0) && (drm_ == DRM_INNER)) ||
((value == 0) && (drm_ == DRM_OUTER))) {
screen_switch_ = SCREEN_SWITCH_ENABLE;
drm_ = (value != 0) ? DRM_OUTER : DRM_INNER;
keys_[code].pending = true;
}
}
return 0;
}
void Charger::UpdateInputState(input_event* ev) {
if (ev->type == EV_SW && ev->code == SW_LID) {
SetSwCallback(ev->code, ev->value);
return;
}
if (ev->type != EV_KEY) return;
SetKeyCallback(ev->code, ev->value);
}
@ -511,10 +538,26 @@ void Charger::ProcessKey(int code, int64_t now) {
key->pending = false;
}
void Charger::ProcessHallSensor(int code) {
key_state* key = &keys_[code];
if (code == SW_LID) {
if (key->pending) {
reset_animation(&batt_anim_);
kick_animation(&batt_anim_);
RequestDisableSuspend();
}
}
key->pending = false;
}
void Charger::HandleInputState(int64_t now) {
ProcessKey(KEY_POWER, now);
if (next_key_check_ != -1 && now > next_key_check_) next_key_check_ = -1;
ProcessHallSensor(SW_LID);
}
void Charger::HandlePowerSupplyState(int64_t now) {
@ -744,9 +787,13 @@ void Charger::OnInit(struct healthd_config* config) {
}
}
drm_ = DRM_INNER;
screen_switch_ = SCREEN_SWITCH_DEFAULT;
ev_sync_key_state(std::bind(&Charger::SetKeyCallback, this, std::placeholders::_1,
std::placeholders::_2));
(void)ev_sync_sw_state(
std::bind(&Charger::SetSwCallback, this, std::placeholders::_1, std::placeholders::_2));
next_screen_transition_ = -1;
next_key_check_ = -1;
next_pwr_check_ = -1;

View File

@ -49,6 +49,12 @@ enum DirectRenderManager {
DRM_OUTER,
};
enum SrceenSwitch {
SCREEN_SWITCH_DEFAULT,
SCREEN_SWITCH_DISABLE,
SCREEN_SWITCH_ENABLE,
};
// Configuration interface for charger. This includes:
// - HalHealthLoop APIs that interests charger.
// - configuration values that used to be provided by sysprops
@ -90,9 +96,11 @@ class Charger {
void InitDefaultAnimationFrames();
void UpdateScreenState(int64_t now);
int SetKeyCallback(int code, int value);
int SetSwCallback(int code, int value);
void UpdateInputState(input_event* ev);
void SetNextKeyCheck(key_state* key, int64_t timeout);
void ProcessKey(int code, int64_t now);
void ProcessHallSensor(int code);
void HandleInputState(int64_t now);
void HandlePowerSupplyState(int64_t now);
int InputCallback(int fd, unsigned int epevents);
@ -108,6 +116,7 @@ class Charger {
int64_t wait_batt_level_timestamp_ = 0;
DirectRenderManager drm_;
SrceenSwitch screen_switch_;
key_state keys_[KEY_MAX + 1] = {};