/*
* Copyright (C) 2017 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 ANDROID_SENSORHAL_EXT_HIDRAW_SENSOR_H
#define ANDROID_SENSORHAL_EXT_HIDRAW_SENSOR_H
#include "BaseSensorObject.h"
#include "HidDevice.h"
#include "Utils.h"
#include <HidParser.h>
#include <hardware/sensors.h>
namespace android {
namespace SensorHalExt {
using HidUtil::HidParser;
using ReportPacket = HidParser::ReportPacket;
using ReportItem = HidParser::ReportItem;
class HidRawSensor : public BaseSensorObject {
friend class HidRawSensorTest;
friend class HidRawDeviceTest;
public:
HidRawSensor(SP(HidDevice) device, uint32_t usage,
const std::vector<HidParser::ReportPacket> &report);
// implements BaseSensorObject
virtual const sensor_t* getSensor() const;
virtual void getUuid(uint8_t* uuid) const;
virtual int enable(bool enable);
virtual int batch(int64_t samplePeriod, int64_t batchPeriod); // unit nano-seconds
// handle input report received
void handleInput(uint8_t id, const std::vector<uint8_t> &message);
// indicate if the HidRawSensor is a valid one
bool isValid() const { return mValid; };
private:
// structure used for holding descriptor parse result for each report field
enum {
TYPE_FLOAT,
TYPE_INT64,
TYPE_ACCURACY
};
struct ReportTranslateRecord {
int type;
int index;
int64_t maxValue;
int64_t minValue;
size_t byteOffset;
size_t byteSize;
double a;
int64_t b;
};
// sensor related information parsed from HID descriptor
struct FeatureValue {
// information needed to furnish sensor_t structure (see hardware/sensors.h)
std::string name;
std::string vendor;
std::string permission;
std::string typeString;
int32_t type;
int version;
float maxRange;
float resolution;
float power;
int32_t minDelay;
int64_t maxDelay;
size_t fifoSize;
size_t fifoMaxSize;
uint32_t reportModeFlag;
bool isWakeUp;
// dynamic sensor specific
std::string uniqueId;
uint8_t uuid[16];
// if the device is custom sensor HID device that furnished android specific descriptors
bool isAndroidCustom;
};
// helper function to find the first report item with specified usage, type and id.
// if parameter id is omitted, this function looks for usage with all ids.
// return nullptr if nothing is found.
static const HidParser::ReportItem* find
(const std::vector<HidParser::ReportPacket> &packets,
unsigned int usage, int type, int id = -1);
// helper function to decode std::string from HID feature report buffer.
static bool decodeString(
const HidParser::ReportItem &report,
const std::vector<uint8_t> &buffer, std::string *d);
// initialize default feature values default based on hid device info
static void initFeatureValueFromHidDeviceInfo(
FeatureValue *featureValue, const HidDevice::HidDeviceInfo &info);
// populates feature values from descripitors and hid feature reports
bool populateFeatureValueFromFeatureReport(
FeatureValue *featureValue, const std::vector<HidParser::ReportPacket> &packets);
// validate feature values and construct sensor_t structure if values are ok.
bool validateFeatureValueAndBuildSensor();
// helper function to find sensor control feature usage from packets
bool findSensorControlUsage(const std::vector<HidParser::ReportPacket> &packets);
// try to parse sensor description feature value to see if it matches
// android specified custom sensor definition.
bool detectAndroidCustomSensor(const std::string &description);
// process HID sensor spec defined three axis sensors usages: accel, gyro, mag.
bool processTriAxisUsage(const std::vector<HidParser::ReportPacket> &packets,
uint32_t usageX, uint32_t usageY, uint32_t usageZ, double defaultScaling = 1);
// process HID snesor spec defined orientation(quaternion) sensor usages.
bool processQuaternionUsage(const std::vector<HidParser::ReportPacket> &packets);
// dump data for test/debug purpose
std::string dump() const;
// Features for control sensor
int mReportingStateId;
unsigned int mReportingStateOffset;
int mPowerStateId;
unsigned int mPowerStateOffset;
int mReportIntervalId;
unsigned int mReportIntervalOffset;
unsigned int mReportIntervalSize;
// Input report translate table
std::vector<ReportTranslateRecord> mTranslateTable;
unsigned mInputReportId;
FeatureValue mFeatureInfo;
sensor_t mSensor;
// runtime states variable
bool mEnabled;
int64_t mSamplingPeriod; // ns
int64_t mBatchingPeriod; // ns
WP(HidDevice) mDevice;
bool mValid;
};
} // namespace SensorHalExt
} // namespace android
#endif // ANDROID_SENSORHAL_EXT_HIDRAW_SENSOR_H