diff --git a/services/native/src/power_mgr_service.cpp b/services/native/src/power_mgr_service.cpp index 6736045758c5c9d552cecd4a26126bf07edc3394..202188fe9c05ab743c5f8a22567e1ddf5918f9fa 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 719eb01464677e63eda2fea48ae7b44f44d2207f..30676e7b4ec66ef288dabb769a8523c87558b10b 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