You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
7.8 KiB

/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "HardwareBase.h"
#include "Vibrator.h"
namespace aidl {
namespace android {
namespace hardware {
namespace vibrator {
class HwApi : public Vibrator::HwApi, private HwApiBase {
public:
HwApi() {
open("device/f0_stored", &mF0);
open("device/f0_offset", &mF0Offset);
open("device/redc_stored", &mRedc);
open("device/q_stored", &mQ);
open("activate", &mActivate);
open("duration", &mDuration);
open("state", &mState);
open("device/cp_trigger_duration", &mEffectDuration);
open("device/cp_trigger_index", &mEffectIndex);
open("device/cp_trigger_queue", &mEffectQueue);
open("device/cp_dig_scale", &mEffectScale);
open("device/dig_scale", &mGlobalScale);
open("device/asp_enable", &mAspEnable);
open("device/gpio1_fall_index", &mGpioFallIndex);
open("device/gpio1_fall_dig_scale", &mGpioFallScale);
open("device/gpio1_rise_index", &mGpioRiseIndex);
open("device/gpio1_rise_dig_scale", &mGpioRiseScale);
open("device/vibe_state", &mVibeState);
open("device/num_waves", &mEffectCount);
open("device/clab_enable", &mClabEnable);
open("device/available_pwle_segments", &mAvailablePwleSegments);
open("device/pwle", &mPwle);
}
bool setF0(uint32_t value) override { return set(value, &mF0); }
bool setF0Offset(uint32_t value) override { return set(value, &mF0Offset); }
bool setRedc(uint32_t value) override { return set(value, &mRedc); }
bool setQ(uint32_t value) override { return set(value, &mQ); }
bool setActivate(bool value) override { return set(value, &mActivate); }
bool setDuration(uint32_t value) override { return set(value, &mDuration); }
bool getEffectCount(uint32_t *value) override { return get(value, &mEffectCount); }
bool getEffectDuration(uint32_t *value) override { return get(value, &mEffectDuration); }
bool setEffectIndex(uint32_t value) override { return set(value, &mEffectIndex); }
bool setEffectQueue(std::string value) override { return set(value, &mEffectQueue); }
bool hasEffectScale() override { return has(mEffectScale); }
bool setEffectScale(uint32_t value) override { return set(value, &mEffectScale); }
bool setGlobalScale(uint32_t value) override { return set(value, &mGlobalScale); }
bool setState(bool value) override { return set(value, &mState); }
bool hasAspEnable() override { return has(mAspEnable); }
bool getAspEnable(bool *value) override { return get(value, &mAspEnable); }
bool setAspEnable(bool value) override { return set(value, &mAspEnable); }
bool setGpioFallIndex(uint32_t value) override { return set(value, &mGpioFallIndex); }
bool setGpioFallScale(uint32_t value) override { return set(value, &mGpioFallScale); }
bool setGpioRiseIndex(uint32_t value) override { return set(value, &mGpioRiseIndex); }
bool setGpioRiseScale(uint32_t value) override { return set(value, &mGpioRiseScale); }
bool pollVibeState(bool value) override { return poll(value, &mVibeState); }
bool setClabEnable(bool value) override { return set(value, &mClabEnable); }
bool getAvailablePwleSegments(uint32_t *value) override { return get(value, &mAvailablePwleSegments); }
bool hasPwle() override { return has(mPwle); }
bool setPwle(std::string value) override { return set(value, &mPwle); }
void debug(int fd) override { HwApiBase::debug(fd); }
private:
std::ofstream mF0;
std::ofstream mF0Offset;
std::ofstream mRedc;
std::ofstream mQ;
std::ofstream mActivate;
std::ofstream mDuration;
std::ifstream mEffectCount;
std::ifstream mEffectDuration;
std::ofstream mEffectIndex;
std::ofstream mEffectQueue;
std::ofstream mEffectScale;
std::ofstream mGlobalScale;
std::ofstream mState;
std::fstream mAspEnable;
std::ofstream mGpioFallIndex;
std::ofstream mGpioFallScale;
std::ofstream mGpioRiseIndex;
std::ofstream mGpioRiseScale;
std::ifstream mVibeState;
std::ofstream mClabEnable;
std::ifstream mAvailablePwleSegments;
std::ofstream mPwle;
};
class HwCal : public Vibrator::HwCal, private HwCalBase {
private:
static constexpr char VERSION[] = "version";
static constexpr char F0_CONFIG[] = "f0_measured";
static constexpr char REDC_CONFIG[] = "redc_measured";
static constexpr char Q_CONFIG[] = "q_measured";
static constexpr char Q_INDEX[] = "q_index";
static constexpr char VOLTAGES_CONFIG[] = "v_levels";
static constexpr char TICK_VOLTAGES_CONFIG[] = "v_tick";
static constexpr char CLICK_VOLTAGES_CONFIG[] = "v_click";
static constexpr char LONG_VOLTAGES_CONFIG[] = "v_long";
static constexpr uint32_t Q_FLOAT_TO_FIXED = 1 << 16;
static constexpr float Q_INDEX_TO_FLOAT = 1.5f;
static constexpr uint32_t Q_INDEX_TO_FIXED = Q_INDEX_TO_FLOAT * Q_FLOAT_TO_FIXED;
static constexpr uint32_t Q_INDEX_OFFSET = 2.0f * Q_FLOAT_TO_FIXED;
static constexpr uint32_t VERSION_DEFAULT = 1;
static constexpr int32_t DEFAULT_FREQUENCY_SHIFT = 0;
static constexpr uint32_t Q_DEFAULT = 15.5 * Q_FLOAT_TO_FIXED;
static constexpr std::array<uint32_t, 6> V_LEVELS_DEFAULT = {60, 70, 80, 90, 100, 76};
static constexpr std::array<uint32_t, 2> V_TICK_DEFAULT = {10, 70};
static constexpr std::array<uint32_t, 2> V_CTICK_DEFAULT = {10, 70};
static constexpr std::array<uint32_t, 2> V_LONG_DEFAULT = {10, 70};
public:
HwCal() {}
bool getVersion(uint32_t *value) override {
if (getPersist(VERSION, value)) {
return true;
}
*value = VERSION_DEFAULT;
return true;
}
bool getLongFrequencyShift(int32_t *value) override {
return getProperty("long.frequency.shift", value, DEFAULT_FREQUENCY_SHIFT);
}
bool getF0(uint32_t *value) override { return getPersist(F0_CONFIG, value); }
bool getRedc(uint32_t *value) override { return getPersist(REDC_CONFIG, value); }
bool getQ(uint32_t *value) override {
if (getPersist(Q_CONFIG, value)) {
return true;
}
if (getPersist(Q_INDEX, value)) {
*value = *value * Q_INDEX_TO_FIXED + Q_INDEX_OFFSET;
return true;
}
*value = Q_DEFAULT;
return true;
}
bool getVolLevels(std::array<uint32_t, 6> *value) override {
if (getPersist(VOLTAGES_CONFIG, value)) {
return true;
}
*value = V_LEVELS_DEFAULT;
return true;
}
bool getTickVolLevels(std::array<uint32_t, 2> *value) override {
if (getPersist(TICK_VOLTAGES_CONFIG, value)) {
return true;
}
*value = V_TICK_DEFAULT;
return true;
}
bool getClickVolLevels(std::array<uint32_t, 2> *value) override {
if (getPersist(CLICK_VOLTAGES_CONFIG, value)) {
return true;
}
*value = V_CTICK_DEFAULT;
return true;
}
bool getLongVolLevels(std::array<uint32_t, 2> *value) override {
if (getPersist(LONG_VOLTAGES_CONFIG, value)) {
return true;
}
*value = V_LONG_DEFAULT;
return true;
}
void debug(int fd) override { HwCalBase::debug(fd); }
};
} // namespace vibrator
} // namespace hardware
} // namespace android
} // namespace aidl