diff options
Diffstat (limited to 'services/inputflinger/reader/mapper/SensorInputMapper.h')
-rw-r--r-- | services/inputflinger/reader/mapper/SensorInputMapper.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/services/inputflinger/reader/mapper/SensorInputMapper.h b/services/inputflinger/reader/mapper/SensorInputMapper.h new file mode 100644 index 0000000000..1797fe3c71 --- /dev/null +++ b/services/inputflinger/reader/mapper/SensorInputMapper.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2020 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. + */ + +#ifndef _UI_INPUTREADER_SENSOR_INPUT_MAPPER_H +#define _UI_INPUTREADER_SENSOR_INPUT_MAPPER_H + +#include "InputMapper.h" + +namespace android { +// sensor data vector length +static constexpr ssize_t SENSOR_VEC_LEN = 3; + +class SensorInputMapper : public InputMapper { +public: + explicit SensorInputMapper(InputDeviceContext& deviceContext); + ~SensorInputMapper() override; + + uint32_t getSources() override; + void populateDeviceInfo(InputDeviceInfo* deviceInfo) override; + void dump(std::string& dump) override; + void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes) override; + void reset(nsecs_t when) override; + void process(const RawEvent* rawEvent) override; + bool enableSensor(InputDeviceSensorType sensorType, std::chrono::microseconds samplingPeriod, + std::chrono::microseconds maxBatchReportLatency) override; + void disableSensor(InputDeviceSensorType sensorType) override; + void flushSensor(InputDeviceSensorType sensorType) override; + +private: + struct Axis { + explicit Axis(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo, float scale, + float offset, float min, float max, float flat, float fuzz, float resolution, + float filter) + : rawAxisInfo(rawAxisInfo), + axisInfo(axisInfo), + scale(scale), + offset(offset), + min(min), + max(max), + flat(flat), + fuzz(fuzz), + resolution(resolution), + filter(filter) { + resetValue(); + } + + RawAbsoluteAxisInfo rawAxisInfo; + AxisInfo axisInfo; + + float scale; // scale factor from raw to normalized values + float offset; // offset to add after scaling for normalization + + float min; // normalized inclusive minimum + float max; // normalized inclusive maximum + float flat; // normalized flat region size + float fuzz; // normalized error tolerance + float resolution; // normalized resolution in units + + float filter; // filter out small variations of this size + float currentValue; // current value + float newValue; // most recent value + + void resetValue() { + this->currentValue = 0; + this->newValue = 0; + } + }; + + struct Sensor { + explicit Sensor(const InputDeviceSensorInfo& sensorInfo) : sensorInfo(sensorInfo) { + resetValue(); + } + bool enabled; + InputDeviceSensorAccuracy accuracy; + std::chrono::nanoseconds samplingPeriod; + std::chrono::nanoseconds maxBatchReportLatency; + // last sample time in nano seconds + std::optional<nsecs_t> lastSampleTimeNs; + InputDeviceSensorInfo sensorInfo; + // Sensor X, Y, Z data mapping to abs + std::array<int32_t, SENSOR_VEC_LEN> dataVec; + void resetValue() { + this->enabled = false; + this->accuracy = InputDeviceSensorAccuracy::ACCURACY_NONE; + this->samplingPeriod = std::chrono::nanoseconds(0); + this->maxBatchReportLatency = std::chrono::nanoseconds(0); + this->lastSampleTimeNs = std::nullopt; + } + }; + + static Axis createAxis(const AxisInfo& AxisInfo, const RawAbsoluteAxisInfo& rawAxisInfo); + + // Axes indexed by raw ABS_* axis index. + std::unordered_map<int32_t, Axis> mAxes; + + // hardware timestamp from MSC_TIMESTAMP + nsecs_t mHardwareTimestamp; + uint32_t mPrevMscTime; + + bool mDeviceEnabled; + // Does device support MSC_TIMESTAMP + bool mHasHardwareTimestamp; + + // Sensor list + std::unordered_map<InputDeviceSensorType, Sensor> mSensors; + + void sync(nsecs_t when, bool force); + + template <typename T> + bool tryGetProperty(std::string keyName, T& outValue); + + void parseSensorConfiguration(InputDeviceSensorType sensorType, int32_t absCode, + int32_t sensorDataIndex, const Axis& axis); + + void processHardWareTimestamp(nsecs_t evTime, int32_t evValue); + + Sensor createSensor(InputDeviceSensorType sensorType, const Axis& axis); + + bool setSensorEnabled(InputDeviceSensorType sensorType, bool enabled); +}; + +} // namespace android + +#endif // _UI_INPUTREADER_SENSOR_INPUT_MAPPER_H
\ No newline at end of file |