| /* | |
| * 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 |