Merge "Implement host wake/sleep notifications for AOC" into sc-d1-dev
diff --git a/platform/aoc/power_control_manager.cc b/platform/aoc/power_control_manager.cc
index 9caef07..fcf2bb5 100644
--- a/platform/aoc/power_control_manager.cc
+++ b/platform/aoc/power_control_manager.cc
@@ -16,12 +16,26 @@
#include "chre/platform/power_control_manager.h"
+#include "chre/core/event_loop_manager.h"
+
namespace chre {
PowerControlManagerBase::PowerControlManagerBase() : mHostIsAwake(true) {}
-void PowerControlManagerBase::onHostWakeSuspendEvent(bool /* awake */) {
- // TODO: stubbed out, Implement this.
+void PowerControlManagerBase::onHostWakeSuspendEvent(bool awake) {
+ if (mHostIsAwake != awake) {
+ mHostIsAwake = awake;
+
+ if (!awake) {
+ EventLoopManagerSingleton::get()
+ ->getHostCommsManager()
+ .resetBlameForNanoappHostWakeup();
+ }
+
+ EventLoopManagerSingleton::get()->getEventLoop().postEventOrDie(
+ awake ? CHRE_EVENT_HOST_AWAKE : CHRE_EVENT_HOST_ASLEEP,
+ nullptr /* eventData */, nullptr /* freeCallback */);
+ }
}
void PowerControlManager::postEventLoopProcess(size_t /* numPendingEvents */) {
diff --git a/platform/usf/platform_sensor_manager.cc b/platform/usf/platform_sensor_manager.cc
index 9e77462..1b35b39 100644
--- a/platform/usf/platform_sensor_manager.cc
+++ b/platform/usf/platform_sensor_manager.cc
@@ -70,6 +70,9 @@
void PlatformSensorManager::init() {
mHelper.init(this);
+ if (!mHelper.registerForApPowerStateUpdates()) {
+ LOGE("Failed to register for AP power state updates.");
+ }
}
DynamicVector<Sensor> PlatformSensorManager::getSensors() {
diff --git a/platform/usf/usf_helper.cc b/platform/usf/usf_helper.cc
index 292b094..4a1e58e 100644
--- a/platform/usf/usf_helper.cc
+++ b/platform/usf/usf_helper.cc
@@ -71,7 +71,7 @@
const usf::UsfSensorSamplingEvent *updateEvent =
static_cast<usf::UsfSensorSamplingEvent *>(event);
- if (updateEvent != nullptr) {
+ if (context != nullptr && updateEvent != nullptr) {
auto *mgr = static_cast<UsfHelper *>(context);
mgr->processStatusUpdate(updateEvent);
}
@@ -81,16 +81,20 @@
const auto *updateEvent =
static_cast<usf::UsfSensorTransformConfigEvent *>(event);
- if (updateEvent != nullptr) {
+ if (context != nullptr && updateEvent != nullptr) {
auto *mgr = static_cast<UsfHelper *>(context);
mgr->processBiasUpdate(updateEvent);
}
}
-// Commented out because of unused compiler error
-// void apPowerStateUpdateHandler(void *context, usf::UsfEvent *event) {
-// TODO: Implement
-// }
+void apPowerStateUpdateHandler(void *context, usf::UsfEvent *event) {
+ const auto *updateEvent = static_cast<usf::UsfApPowerStateEvent *>(event);
+
+ if (context != nullptr && updateEvent != nullptr) {
+ auto *mgr = static_cast<UsfHelper *>(context);
+ mgr->processApPowerStateUpdate(updateEvent);
+ }
+}
void asyncCallback(usf::UsfReq *req, const usf::UsfResp *resp, void *data) {
auto callbackData = static_cast<AsyncCallbackData *>(data);
@@ -402,8 +406,19 @@
}
bool UsfHelper::registerForApPowerStateUpdates() {
- // TODO: Implement
- return true;
+ bool success = false;
+ if (!mUsfEventListeners.emplace_back()) {
+ LOG_OOM();
+ } else {
+ UsfErr err = usf::UsfPowerMgr::GetApPowerEventType()->AddListener(
+ mWorker.get(), apPowerStateUpdateHandler, this,
+ &mUsfEventListeners.back());
+ success = (err == kErrNone);
+ if (!success) {
+ LOG_USF_ERR(err);
+ }
+ }
+ return success;
}
void UsfHelper::unregisterForBiasUpdates(
@@ -565,7 +580,12 @@
void UsfHelper::processApPowerStateUpdate(
const usf::UsfApPowerStateEvent *update) {
- // TODO: Implement
+ usf::UsfApPowerState state = update->GetState();
+ if (state == usf::kUsfApPowerStateInvalid) {
+ LOGE("Invalid AP power state received.");
+ } else {
+ mCallback->onHostWakeSuspendEvent(state == usf::kUsfApPowerStateOn);
+ }
}
bool UsfHelper::createSensorEvent(