/* * 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 lastSampleTimeNs; InputDeviceSensorInfo sensorInfo; // Sensor X, Y, Z data mapping to abs std::array 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 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 mSensors; void sync(nsecs_t when, bool force); template 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