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