/* * 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. */ #include "guest/hals/sensors/vsoc_sensors.h" #include <limits> #include "guest/hals/sensors/sensors.h" namespace cvd { namespace { const cvd::time::Milliseconds kDefaultSamplingRate(200); #if !VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_3) namespace { const int SENSOR_FLAG_WAKE_UP = 0; } #endif timespec infinity() { timespec ts; ts.tv_sec = std::numeric_limits<time_t>::max(); ts.tv_nsec = 0; return ts; } } // namespace const cvd::time::MonotonicTimePoint SensorState::kInfinity = cvd::time::MonotonicTimePoint(infinity()); SensorState::SensorState(SensorInfo info) : enabled_(false), event_(), deadline_(kInfinity), sampling_period_(kDefaultSamplingRate) { event_.sensor = info.handle; event_.type = info.type; } SensorInfo::SensorInfo(const char* name, const char* vendor, int version, int handle, int type, float max_range, float resolution, float power, int32_t min_delay, uint32_t fifo_reserved_event_count, uint32_t fifo_max_event_count, const char* string_type, const char* required_permission, int32_t max_delay, uint32_t reporting_mode) { this->name = name; this->vendor = vendor; this->version = version; this->handle = handle; this->type = type; this->maxRange = max_range; this->resolution = resolution; this->power = power; this->minDelay = min_delay; #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_1) this->fifoReservedEventCount = fifo_reserved_event_count; this->fifoMaxEventCount = fifo_max_event_count; #endif #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_2) this->stringType = string_type; this->requiredPermission = required_permission; #endif #if VSOC_SENSORS_DEVICE_API_VERSION_ATLEAST(1_3) this->maxDelay = max_delay; this->flags = reporting_mode; #endif } namespace sc = sensors_constants; SensorInfo AccelerometerSensor() { uint32_t flags = sc::kAccelerometerReportingMode | (sc::kAccelerometerIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kAccelerometerName, sc::kVendor, sc::kVersion, sc::kAccelerometerHandle, SENSOR_TYPE_ACCELEROMETER, sc::kAccelerometerMaxRange, sc::kAccelerometerResolution, sc::kAccelerometerPower, sc::kAccelerometerMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kAccelerometerStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo GyroscopeSensor() { uint32_t flags = sc::kGyroscopeReportingMode | (sc::kGyroscopeIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo( sc::kGyroscopeName, sc::kVendor, sc::kVersion, sc::kGyroscopeHandle, SENSOR_TYPE_GYROSCOPE, sc::kGyroscopeMaxRange, sc::kGyroscopeResolution, sc::kGyroscopePower, sc::kGyroscopeMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kGyroscopeStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo LightSensor() { uint32_t flags = sc::kLightReportingMode | (sc::kLightIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kLightName, sc::kVendor, sc::kVersion, sc::kLightHandle, SENSOR_TYPE_LIGHT, sc::kLightMaxRange, sc::kLightResolution, sc::kLightPower, sc::kLightMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kLightStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo MagneticFieldSensor() { uint32_t flags = sc::kMagneticFieldReportingMode | (sc::kMagneticFieldIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kMagneticFieldName, sc::kVendor, sc::kVersion, sc::kMagneticFieldHandle, SENSOR_TYPE_MAGNETIC_FIELD, sc::kMagneticFieldMaxRange, sc::kMagneticFieldResolution, sc::kMagneticFieldPower, sc::kMagneticFieldMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kMagneticFieldStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo PressureSensor() { uint32_t flags = sc::kPressureReportingMode | (sc::kPressureIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo( sc::kPressureName, sc::kVendor, sc::kVersion, sc::kPressureHandle, SENSOR_TYPE_PRESSURE, sc::kPressureMaxRange, sc::kPressureResolution, sc::kPressurePower, sc::kPressureMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kPressureStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo ProximitySensor() { uint32_t flags = sc::kProximityReportingMode | (sc::kProximityIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo( sc::kProximityName, sc::kVendor, sc::kVersion, sc::kProximityHandle, SENSOR_TYPE_PROXIMITY, sc::kProximityMaxRange, sc::kProximityResolution, sc::kProximityPower, sc::kProximityMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kProximityStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo AmbientTempSensor() { uint32_t flags = sc::kAmbientTempReportingMode | (sc::kAmbientTempIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kAmbientTempName, sc::kVendor, sc::kVersion, sc::kAmbientTempHandle, SENSOR_TYPE_AMBIENT_TEMPERATURE, sc::kAmbientTempMaxRange, sc::kAmbientTempResolution, sc::kAmbientTempPower, sc::kAmbientTempMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kAmbientTempStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo DeviceTempSensor() { uint32_t flags = sc::kDeviceTempReportingMode | (sc::kDeviceTempIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kDeviceTempName, sc::kVendor, sc::kVersion, sc::kDeviceTempHandle, SENSOR_TYPE_TEMPERATURE, sc::kDeviceTempMaxRange, sc::kDeviceTempResolution, sc::kDeviceTempPower, sc::kDeviceTempMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kDeviceTempStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } SensorInfo RelativeHumiditySensor() { uint32_t flags = sc::kRelativeHumidityReportingMode | (sc::kRelativeHumidityIsWakeup ? SENSOR_FLAG_WAKE_UP : 0); return SensorInfo(sc::kRelativeHumidityName, sc::kVendor, sc::kVersion, sc::kRelativeHumidityHandle, SENSOR_TYPE_RELATIVE_HUMIDITY, sc::kRelativeHumidityMaxRange, sc::kRelativeHumidityResolution, sc::kRelativeHumidityPower, sc::kRelativeHumidityMinDelay, sc::kFifoReservedEventCount, sc::kFifoMaxEventCount, sc::kRelativeHumidityStringType, sc::kRequiredPermission, sc::kMaxDelay, flags); } } // namespace cvd