blob: 7e60b5d80c7b5e4138d9b3dff788c81dbe79bf64 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "diagnostics/wilco_dtc_supportd/telemetry/powerd_event_service_impl.h"
#include <base/logging.h>
using PowerEventType =
diagnostics::PowerdEventService::Observer::PowerEventType;
namespace diagnostics {
PowerdEventServiceImpl::PowerdEventServiceImpl(PowerdAdapter* powerd_adapter)
: powerd_adapter_(powerd_adapter) {
DCHECK(powerd_adapter_);
powerd_adapter_->AddPowerObserver(this);
}
PowerdEventServiceImpl::~PowerdEventServiceImpl() {
powerd_adapter_->RemovePowerObserver(this);
}
void PowerdEventServiceImpl::AddObserver(
PowerdEventService::Observer* observer) {
DCHECK(observer);
observers_.AddObserver(observer);
}
void PowerdEventServiceImpl::RemoveObserver(
PowerdEventService::Observer* observer) {
DCHECK(observer);
observers_.RemoveObserver(observer);
}
void PowerdEventServiceImpl::OnPowerSupplyPollSignal(
const power_manager::PowerSupplyProperties& power_supply) {
if (!power_supply.has_external_power()) {
return;
}
PowerEventType event_type;
switch (power_supply.external_power()) {
case power_manager::PowerSupplyProperties::AC:
case power_manager::PowerSupplyProperties::USB:
event_type = PowerEventType::kAcInsert;
break;
case power_manager::PowerSupplyProperties::DISCONNECTED:
event_type = PowerEventType::kAcRemove;
break;
default:
LOG(ERROR) << "Unknown external power type: "
<< power_supply.external_power();
return;
}
// Do not send event if the previous AC event was the same.
if (external_power_ac_event_.has_value() &&
external_power_ac_event_.value() == event_type) {
VLOG(2) << "Received the same AC event: " << static_cast<int>(event_type);
return;
}
external_power_ac_event_ = event_type;
for (auto& observer : observers_)
observer.OnPowerdEvent(event_type);
}
void PowerdEventServiceImpl::OnSuspendImminentSignal(
const power_manager::SuspendImminent& suspend_imminent) {
OnAnySuspendImminentSignal(suspend_imminent);
}
void PowerdEventServiceImpl::OnDarkSuspendImminentSignal(
const power_manager::SuspendImminent& suspend_imminent) {
OnAnySuspendImminentSignal(suspend_imminent);
}
void PowerdEventServiceImpl::OnSuspendDoneSignal(
const power_manager::SuspendDone& suspend_done) {
for (auto& observer : observers_)
observer.OnPowerdEvent(PowerEventType::kOsResume);
}
void PowerdEventServiceImpl::OnAnySuspendImminentSignal(
const power_manager::SuspendImminent& suspend_imminent) {
for (auto& observer : observers_)
observer.OnPowerdEvent(PowerEventType::kOsSuspend);
}
} // namespace diagnostics