From 77d6d687d5ea299215e29b6c8acef4c70574e46f Mon Sep 17 00:00:00 2001 From: yanxuejun12 Date: Wed, 23 Jul 2025 11:39:11 +0800 Subject: [PATCH] fix: prevent repeated closing the lid Signed-off-by: yanxuejun12 --- services/native/src/power_mgr_service.cpp | 5 + .../src/native_power_state_machine_test.cpp | 113 ++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index 67360457..202188fe 100644 --- a/services/native/src/power_mgr_service.cpp +++ b/services/native/src/power_mgr_service.cpp @@ -476,12 +476,17 @@ void PowerMgrService::HallSensorCallback(SensorEvent* event) auto status = static_cast(data->status); if (status & LID_CLOSED_HALL_FLAG) { + if (isInLidMode_) { + POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] Lid close event received again"); + return; + } POWER_HILOGI(FEATURE_SUSPEND, "[UL_POWER] Lid close event received, begin to suspend"); isInLidMode_ = true; SuspendDeviceType reason = SuspendDeviceType::SUSPEND_DEVICE_REASON_LID; suspendController->ExecSuspendMonitorByReason(reason); } else { if (!isInLidMode_) { + POWER_HILOGI(FEATURE_WAKEUP, "[UL_POWER] Lid open event received again"); return; } POWER_HILOGI(FEATURE_WAKEUP, "[UL_POWER] Lid open event received, begin to wakeup"); diff --git a/test/unittest/src/native_power_state_machine_test.cpp b/test/unittest/src/native_power_state_machine_test.cpp index 719eb014..30676e7b 100644 --- a/test/unittest/src/native_power_state_machine_test.cpp +++ b/test/unittest/src/native_power_state_machine_test.cpp @@ -51,6 +51,8 @@ void PowerStateTest2Callback::OnAsyncPowerStateChanged(PowerState state) } namespace { +constexpr int ONE_SECOND = 1; + TransitResult TransitResultToStateChangeReason(StateChangeReason trigger) { return TransitResult::ALREADY_IN_STATE; @@ -402,4 +404,115 @@ HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine009, TestSize.Level #endif POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine009 function end!"); } + +/** + * @tc.name: NativePowerStateMachine011 + * @tc.desc: test Lid Sensor + * @tc.type: FUNC + */ +#ifdef HAS_SENSORS_SENSOR_PART +HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine011, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "NativePowerStateMachine011: Suspend Device start."; + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine011 function start!"); + auto pmsTest = DelayedSpSingleton::GetInstance(); + pmsTest->OnStart(); + pmsTest->SuspendControllerInit(); + pmsTest->WakeupControllerInit(); + auto stateMachine = pmsTest->GetPowerStateMachine(); + SensorEvent *event = new SensorEvent(); + event->data = new uint8_t(0); + HallData* data = reinterpret_cast(event->data); + event->sensorTypeId = SENSOR_TYPE_ID_HALL; + + EXPECT_TRUE(pmsTest->SuspendDevice(SUSCALLTIMEMS, SuspendDeviceType::SUSPEND_DEVICE_REASON_APPLICATION, false) + == PowerErrors::ERR_OK); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), false) << "NativePowerStateMachine011: Prepare Fail, Screen is On"; + + pmsTest->WakeupDevice(0, WakeupDeviceType::WAKEUP_DEVICE_APPLICATION, "NativePowerStateMachine011"); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), true) << "NativePowerStateMachine011: Prepare Fail, Screen is Off"; + + data->status = 0; + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + + data->status = 1; + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), false); + + pmsTest->WakeupDevice(0, WakeupDeviceType::WAKEUP_DEVICE_APPLICATION, "NativePowerStateMachine011"); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), true); + + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), true); + delete event->data; + event->data = nullptr; + data = nullptr; + delete event; + event = nullptr; + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine011 function end!"); + GTEST_LOG_(INFO) << "NativePowerStateMachine011: Suspend Device end."; +} +#endif + +/** + * @tc.name: NativePowerStateMachine012 + * @tc.desc: test Lid Sensor + * @tc.type: FUNC + */ +#ifdef HAS_SENSORS_SENSOR_PART +HWTEST_F(NativePowerStateMachineTest, NativePowerStateMachine012, TestSize.Level0) +{ + GTEST_LOG_(INFO) << "NativePowerStateMachine012: Suspend Device start."; + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine012 function start!"); + auto pmsTest = DelayedSpSingleton::GetInstance(); + pmsTest->OnStart(); + pmsTest->SuspendControllerInit(); + pmsTest->WakeupControllerInit(); + auto stateMachine = pmsTest->GetPowerStateMachine(); + SensorEvent *event = new SensorEvent(); + event->data = new uint8_t(0); + HallData* data = reinterpret_cast(event->data); + event->sensorTypeId = SENSOR_TYPE_ID_HALL; + + pmsTest->WakeupDevice(0, WakeupDeviceType::WAKEUP_DEVICE_APPLICATION, "NativePowerStateMachine012"); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), true) << "NativePowerStateMachine012: Prepare Fail, Screen is Off"; + + EXPECT_TRUE(pmsTest->SuspendDevice(SUSCALLTIMEMS, SuspendDeviceType::SUSPEND_DEVICE_REASON_APPLICATION, false) + == PowerErrors::ERR_OK); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), false) << "NativePowerStateMachine012: Prepare Fail, Screen is On"; + + data->status = 1; + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + + data->status = 0; + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), true); + + EXPECT_TRUE(pmsTest->SuspendDevice(SUSCALLTIMEMS, SuspendDeviceType::SUSPEND_DEVICE_REASON_APPLICATION, false) + == PowerErrors::ERR_OK); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), false); + + pmsTest->HallSensorCallback(event); + sleep(ONE_SECOND); + EXPECT_EQ(stateMachine->IsScreenOn(), false); + delete event->data; + event->data = nullptr; + data = nullptr; + delete event; + event = nullptr; + POWER_HILOGI(LABEL_TEST, "NativePowerStateMachine012 function end!"); + GTEST_LOG_(INFO) << "NativePowerStateMachine012: Suspend Device end."; +} +#endif } // namespace -- Gitee