Felix HAL: Added IVibrator event logs in dumpsys.

Ported the changes made in legacyHAL to Felix HAL
which involves adding the IVibrator event to the
HwApi to produce a friendly debugging logs.

Bug: 376330571
Flag: EXEMPT log only update
Test: Flash to device and verified dumpsys
Change-Id: I54262b7451b1ab07669eb9b7e5ad3c4cd3477016
Signed-off-by: Zouberou Sayibou <zouberou@google.com>
This commit is contained in:
Zouberou Sayibou 2024-11-05 03:14:22 +00:00
parent eed7c72e34
commit e9101cc010
7 changed files with 63 additions and 8 deletions

View file

@ -287,6 +287,10 @@ class HwApi : public Vibrator::HwApi, private HwApiBase {
return true;
}
void recordEvent(const char *func, const std::string &value) override {
HwApiBase::recordEvent(func, value);
}
void debug(int fd) override { HwApiBase::debug(fd); }
private:

View file

@ -45,6 +45,14 @@ namespace aidl {
namespace android {
namespace hardware {
namespace vibrator {
#define RECORD(fmt, ...) { \
this->mHwApiDef->recordEvent(__func__, StringPrintf(fmt, ##__VA_ARGS__)); \
if (this->mIsDual) { \
this->mHwApiDual->recordEvent(__func__, StringPrintf(fmt, ##__VA_ARGS__)); \
} \
}
static constexpr uint16_t FF_CUSTOM_DATA_LEN_MAX_COMP = 2044; // (COMPOSE_SIZE_MAX + 1) * 8 + 4
static constexpr uint16_t FF_CUSTOM_DATA_LEN_MAX_PWLE = 2302;
@ -461,6 +469,7 @@ Vibrator::Vibrator(std::unique_ptr<HwApi> hwApiDefault, std::unique_ptr<HwCal> h
if ((mHwApiDual != nullptr) && (mHwCalDual != nullptr))
mIsDual = true;
RECORD("mIsDual = %d", mIsDual);
// ==================INPUT Devices== Base =================
const char *inputEventName = std::getenv("INPUT_EVENT_NAME");
const char *inputEventPathName = std::getenv("INPUT_EVENT_PATH");
@ -816,6 +825,8 @@ ndk::ScopedAStatus Vibrator::off() {
bool ret{true};
const std::scoped_lock<std::mutex> lock(mActiveId_mutex);
RECORD("mActiveId = %d", mActiveId);
if (mActiveId >= 0) {
ALOGD("Off: Stop the active effect: %d", mActiveId);
/* Stop the active effect. */
@ -858,6 +869,7 @@ ndk::ScopedAStatus Vibrator::on(int32_t timeoutMs,
const std::shared_ptr<IVibratorCallback> &callback) {
ATRACE_NAME("Vibrator::on");
ALOGD("Vibrator::on");
RECORD("timeoutMs = %d", timeoutMs);
if (timeoutMs > MAX_TIME_MS) {
return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
@ -883,6 +895,8 @@ ndk::ScopedAStatus Vibrator::perform(Effect effect, EffectStrength strength,
int32_t *_aidl_return) {
ATRACE_NAME("Vibrator::perform");
ALOGD("Vibrator::perform");
RECORD("effect = %s, strength = %s",
toString(effect).c_str(), toString(strength).c_str());
return performEffect(effect, strength, callback, _aidl_return);
}
@ -964,6 +978,8 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect> &composi
const std::shared_ptr<IVibratorCallback> &callback) {
ATRACE_NAME("Vibrator::compose");
ALOGD("Vibrator::compose");
RECORD("composite.size = %zu", composite.size());
uint16_t size;
uint16_t nextEffectDelay;

View file

@ -16,6 +16,7 @@
#pragma once
#include <aidl/android/hardware/vibrator/BnVibrator.h>
#include <android-base/stringprintf.h>
#include <android-base/unique_fd.h>
#include <linux/input.h>
#include <tinyalsa/asoundlib.h>
@ -29,6 +30,8 @@ namespace android {
namespace hardware {
namespace vibrator {
using ::android::base::StringPrintf;
class Vibrator : public BnVibrator {
public:
// APIs for interfacing with the GPIO pin.
@ -103,6 +106,8 @@ class Vibrator : public BnVibrator {
int *status) = 0;
// Erase OWT waveform
virtual bool eraseOwtEffect(int fd, int8_t effectIndex, std::vector<ff_effect> *effect) = 0;
// Records IVibrator Event.
virtual void recordEvent(const char *func, const std::string &value) = 0;
// Emit diagnostic information to the given file.
virtual void debug(int fd) = 0;
};

View file

@ -58,6 +58,7 @@ class MockApi : public ::aidl::android::hardware::vibrator::Vibrator::HwApi {
bool(int fd, const uint8_t *owtData, const uint32_t numBytes, struct ff_effect *effect,
uint32_t *outEffectIndex, int *status));
MOCK_METHOD3(eraseOwtEffect, bool(int fd, int8_t effectIndex, std::vector<ff_effect> *effect));
MOCK_METHOD2(recordEvent, void(const char *func, const std::string &value));
MOCK_METHOD1(debug, void(int fd));
~MockApi() override { destructor(); };

View file

@ -295,7 +295,7 @@ class VibratorTest : public Test {
EXPECT_CALL(*mMockApi, setMinOnOffInterval(_)).Times(times);
EXPECT_CALL(*mMockApi, getHapticAlsaDevice(_, _)).Times(times);
EXPECT_CALL(*mMockApi, setHapticPcmAmp(_, _, _, _)).Times(times);
EXPECT_CALL(*mMockApi, recordEvent(_, _)).Times(times);
EXPECT_CALL(*mMockApi, debug(_)).Times(times);
EXPECT_CALL(*mMockCal, destructor()).Times(times);
@ -340,6 +340,7 @@ TEST_F(VibratorTest, Constructor) {
createMock(&mockapi, &mockcal, &mockgpio);
EXPECT_CALL(*mMockApi, recordEvent(_, _)).WillRepeatedly(DoDefault());
EXPECT_CALL(*mMockCal, getF0(_))
.InSequence(f0Seq)
.WillOnce(DoAll(SetArgReferee<0>(f0Val), Return(true)));
@ -387,6 +388,9 @@ TEST_F(VibratorTest, on) {
Sequence s1, s2;
uint16_t duration = std::rand() + 1;
EXPECT_CALL(*mMockApi, recordEvent(_, _))
.InSequence(s1)
.WillRepeatedly(DoDefault());
EXPECT_CALL(*mMockApi, setFFGain(_, ON_GLOBAL_SCALE)).InSequence(s1).WillOnce(DoDefault());
EXPECT_CALL(*mMockApi, setFFEffect(_, _, duration + MAX_COLD_START_LATENCY_MS))
.InSequence(s2)
@ -399,6 +403,7 @@ TEST_F(VibratorTest, on) {
TEST_F(VibratorTest, off) {
Sequence s1;
EXPECT_CALL(*mMockApi, recordEvent(_, _)).InSequence(s1).WillRepeatedly(DoDefault());
EXPECT_CALL(*mMockApi, setFFGain(_, ON_GLOBAL_SCALE)).InSequence(s1).WillOnce(DoDefault());
EXPECT_TRUE(mVibrator->off().isOk());
}
@ -528,6 +533,8 @@ TEST_P(EffectsTest, perform) {
ExpectationSet eSetup;
Expectation eActivate, ePollHaptics, ePollStop, eEraseDone;
eSetup += EXPECT_CALL(*mMockApi, recordEvent(_, _)).WillRepeatedly(DoDefault());
if (scale != EFFECT_SCALE.end()) {
EffectIndex index = EFFECT_INDEX.at(effect);
duration = EFFECT_DURATIONS[index];
@ -664,6 +671,7 @@ TEST_P(ComposeTest, compose) {
return ndk::ScopedAStatus::ok();
};
eSetup += EXPECT_CALL(*mMockApi, recordEvent(_, _)).WillRepeatedly(DoDefault());
eSetup += EXPECT_CALL(*mMockApi, setFFGain(_, ON_GLOBAL_SCALE))
.After(eSetup)
.WillOnce(DoDefault());