Loading vibrator/aidl/default/Vibrator.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,10 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect>& composi } LOG(INFO) << "triggering primitive " << static_cast<int>(e.primitive) << " @ scale " << e.scale; int32_t durationMs; getPrimitiveDuration(e.primitive, &durationMs); usleep(durationMs * 1000); } if (callback != nullptr) { Loading vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp +44 −17 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ using android::hardware::vibrator::CompositePrimitive; using android::hardware::vibrator::Effect; using android::hardware::vibrator::EffectStrength; using android::hardware::vibrator::IVibrator; using std::chrono::high_resolution_clock; const std::vector<Effect> kEffects{android::enum_range<Effect>().begin(), android::enum_range<Effect>().end()}; Loading Loading @@ -381,15 +382,28 @@ TEST_P(VibratorAidl, CompseSizeBoundary) { } TEST_P(VibratorAidl, ComposeCallback) { constexpr std::chrono::milliseconds allowedLatency{10}; if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) { std::vector<CompositePrimitive> supported; ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk()); for (auto primitive : supported) { if (primitive == CompositePrimitive::NOOP) { continue; } std::promise<void> completionPromise; std::future<void> completionFuture{completionPromise.get_future()}; sp<CompletionCallback> callback = new CompletionCallback([&completionPromise] { completionPromise.set_value(); }); CompositePrimitive primitive = CompositePrimitive::CLICK; CompositeEffect effect; std::vector<CompositeEffect> composite; int32_t duration; int32_t durationMs; std::chrono::milliseconds duration; std::chrono::time_point<high_resolution_clock> start, end; std::chrono::milliseconds elapsed; effect.delayMs = 0; effect.primitive = primitive; Loading @@ -397,10 +411,23 @@ TEST_P(VibratorAidl, ComposeCallback) { composite.emplace_back(effect); EXPECT_EQ(Status::EX_NONE, vibrator->getPrimitiveDuration(primitive, &duration).exceptionCode()); EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()); EXPECT_EQ(completionFuture.wait_for(std::chrono::milliseconds(duration * 2)), std::future_status::ready); vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode()) << toString(primitive); duration = std::chrono::milliseconds(durationMs); EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()) << toString(primitive); start = high_resolution_clock::now(); EXPECT_EQ(completionFuture.wait_for(duration + allowedLatency), std::future_status::ready) << toString(primitive); end = high_resolution_clock::now(); elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); EXPECT_LE(elapsed.count(), (duration + allowedLatency).count()) << toString(primitive); EXPECT_GE(elapsed.count(), (duration - allowedLatency).count()) << toString(primitive); } } } Loading Loading
vibrator/aidl/default/Vibrator.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -163,6 +163,10 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect>& composi } LOG(INFO) << "triggering primitive " << static_cast<int>(e.primitive) << " @ scale " << e.scale; int32_t durationMs; getPrimitiveDuration(e.primitive, &durationMs); usleep(durationMs * 1000); } if (callback != nullptr) { Loading
vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp +44 −17 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ using android::hardware::vibrator::CompositePrimitive; using android::hardware::vibrator::Effect; using android::hardware::vibrator::EffectStrength; using android::hardware::vibrator::IVibrator; using std::chrono::high_resolution_clock; const std::vector<Effect> kEffects{android::enum_range<Effect>().begin(), android::enum_range<Effect>().end()}; Loading Loading @@ -381,15 +382,28 @@ TEST_P(VibratorAidl, CompseSizeBoundary) { } TEST_P(VibratorAidl, ComposeCallback) { constexpr std::chrono::milliseconds allowedLatency{10}; if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) { std::vector<CompositePrimitive> supported; ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk()); for (auto primitive : supported) { if (primitive == CompositePrimitive::NOOP) { continue; } std::promise<void> completionPromise; std::future<void> completionFuture{completionPromise.get_future()}; sp<CompletionCallback> callback = new CompletionCallback([&completionPromise] { completionPromise.set_value(); }); CompositePrimitive primitive = CompositePrimitive::CLICK; CompositeEffect effect; std::vector<CompositeEffect> composite; int32_t duration; int32_t durationMs; std::chrono::milliseconds duration; std::chrono::time_point<high_resolution_clock> start, end; std::chrono::milliseconds elapsed; effect.delayMs = 0; effect.primitive = primitive; Loading @@ -397,10 +411,23 @@ TEST_P(VibratorAidl, ComposeCallback) { composite.emplace_back(effect); EXPECT_EQ(Status::EX_NONE, vibrator->getPrimitiveDuration(primitive, &duration).exceptionCode()); EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()); EXPECT_EQ(completionFuture.wait_for(std::chrono::milliseconds(duration * 2)), std::future_status::ready); vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode()) << toString(primitive); duration = std::chrono::milliseconds(durationMs); EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()) << toString(primitive); start = high_resolution_clock::now(); EXPECT_EQ(completionFuture.wait_for(duration + allowedLatency), std::future_status::ready) << toString(primitive); end = high_resolution_clock::now(); elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); EXPECT_LE(elapsed.count(), (duration + allowedLatency).count()) << toString(primitive); EXPECT_GE(elapsed.count(), (duration - allowedLatency).count()) << toString(primitive); } } } Loading