1a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol/* 2a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * Copyright (C) 2016 The Android Open Source Project 3a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * 4a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * Licensed under the Apache License, Version 2.0 (the "License"); 5a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * you may not use this file except in compliance with the License. 6a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * You may obtain a copy of the License at 7a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * 8a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * http://www.apache.org/licenses/LICENSE-2.0 9a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * 10a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * Unless required by applicable law or agreed to in writing, software 11a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * distributed under the License is distributed on an "AS IS" BASIS, 12a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * See the License for the specific language governing permissions and 14a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol * limitations under the License. 15a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol */ 16a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol 17f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol#include <algorithm> 18a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol 194446be9be8f90e66d3cb4d30393862fc725230daAndrew Rossignol#include "chre/core/sensor_request.h" 20a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol#include "chre/platform/assert.h" 210e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol#include "chre/platform/fatal_error.h" 22a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol 23a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignolnamespace chre { 24a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol 25a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignolconst char *getSensorTypeName(SensorType sensorType) { 26a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol switch (sensorType) { 27a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Unknown: 28a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Unknown"; 29a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Accelerometer: 30a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Accelerometer"; 31a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::InstantMotion: 32a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Instant Motion"; 33a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::StationaryDetect: 34a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Stationary Detect"; 35a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Gyroscope: 36a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Gyroscope"; 37a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::GeomagneticField: 38a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Geomagnetic Field"; 39a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Pressure: 40a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Pressure"; 41a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Light: 42a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Light"; 43a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol case SensorType::Proximity: 44a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return "Proximity"; 45ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::AccelerometerTemperature: 46ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return "Accelerometer Temp"; 47ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::GyroscopeTemperature: 48ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return "Gyroscope Temp"; 49ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedAccelerometer: 50ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return "Uncal Accelerometer"; 51ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedGyroscope: 52ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return "Uncal Gyroscope"; 53ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedGeomagneticField: 54ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return "Uncal Geomagnetic Field"; 55a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol default: 56a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol CHRE_ASSERT(false); 57a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol return ""; 58a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol } 59a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol} 60a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol 610e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignoluint16_t getSampleEventTypeForSensorType(SensorType sensorType) { 620e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol if (sensorType == SensorType::Unknown) { 630e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol FATAL_ERROR("Tried to obtain the sensor sample event index for an unknown " 640e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol "sensor type"); 650e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol } 660e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol 67a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung // The enum values of SensorType may not map to the defined values in the 68a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung // CHRE API. 69a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung uint8_t sensorTypeValue = getUnsignedIntFromSensorType(sensorType); 700e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol return CHRE_EVENT_SENSOR_DATA_EVENT_BASE + sensorTypeValue; 710e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol} 720e29662ca7ad046d0c0c663fae671f980940d8a1Andrew Rossignol 73cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan ChungSensorType getSensorTypeForSampleEventType(uint16_t eventType) { 74cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung return getSensorTypeFromUnsignedInt( 75cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung eventType - CHRE_EVENT_SENSOR_DATA_EVENT_BASE); 76cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung} 77cea64a899fafc0e75dc0e63dbe699ca5679564adMeng-hsuan Chung 781795db1e2282dac8454cf59d23314f70b6930f7bAndrew RossignolSensorType getSensorTypeFromUnsignedInt(uint8_t sensorType) { 791795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol switch (sensorType) { 801795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_ACCELEROMETER: 811795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Accelerometer; 821795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT: 831795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::InstantMotion; 841795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_STATIONARY_DETECT: 851795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::StationaryDetect; 861795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_GYROSCOPE: 871795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Gyroscope; 881795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD: 891795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::GeomagneticField; 901795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_PRESSURE: 911795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Pressure; 921795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_LIGHT: 931795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Light; 941795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol case CHRE_SENSOR_TYPE_PROXIMITY: 951795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Proximity; 96ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case CHRE_SENSOR_TYPE_ACCELEROMETER_TEMPERATURE: 97ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return SensorType::AccelerometerTemperature; 98ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case CHRE_SENSOR_TYPE_GYROSCOPE_TEMPERATURE: 99ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return SensorType::GyroscopeTemperature; 100ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER: 101ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return SensorType::UncalibratedAccelerometer; 102ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE: 103ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return SensorType::UncalibratedGyroscope; 104ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD: 105ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return SensorType::UncalibratedGeomagneticField; 1061795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol default: 1071795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol return SensorType::Unknown; 1081795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol } 1091795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol} 1101795db1e2282dac8454cf59d23314f70b6930f7bAndrew Rossignol 111a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chunguint8_t getUnsignedIntFromSensorType(SensorType sensorType) { 112a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung switch (sensorType) { 113a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::Accelerometer: 114a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_ACCELEROMETER; 115a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::InstantMotion: 116a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_INSTANT_MOTION_DETECT; 117a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::StationaryDetect: 118a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_STATIONARY_DETECT; 119a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::Gyroscope: 120a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_GYROSCOPE; 121a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::GeomagneticField: 122a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_GEOMAGNETIC_FIELD; 123a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::Pressure: 124a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_PRESSURE; 125a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::Light: 126a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_LIGHT; 127a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung case SensorType::Proximity: 128a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return CHRE_SENSOR_TYPE_PROXIMITY; 129ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::AccelerometerTemperature: 130ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return CHRE_SENSOR_TYPE_ACCELEROMETER_TEMPERATURE; 131ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::GyroscopeTemperature: 132ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return CHRE_SENSOR_TYPE_GYROSCOPE_TEMPERATURE; 133ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedAccelerometer: 134ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return CHRE_SENSOR_TYPE_UNCALIBRATED_ACCELEROMETER; 135ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedGyroscope: 136ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return CHRE_SENSOR_TYPE_UNCALIBRATED_GYROSCOPE; 137ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung case SensorType::UncalibratedGeomagneticField: 138ba02dd147fe1ab32de471743e1996b416d345a7aMeng-hsuan Chung return CHRE_SENSOR_TYPE_UNCALIBRATED_GEOMAGNETIC_FIELD; 139a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung default: 140a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung // Update implementation to prevent undefined or SensorType::Unknown from 141a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung // being used. 142a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung CHRE_ASSERT(false); 143a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung return 0; 144a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung } 145a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung} 146a0bc6bcb8f586c873e46ed39ba608c6c9728f40cMeng-hsuan Chung 147bf7f9e866c31f63b321172dec0a8d8037aa2460bMeng-hsuan ChungSensorSampleType getSensorSampleTypeFromSensorType(SensorType sensorType) { 14890db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung switch (sensorType) { 14990db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::Accelerometer: 15090db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::Gyroscope: 15190db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::GeomagneticField: 15290db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::UncalibratedAccelerometer: 15390db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::UncalibratedGyroscope: 15490db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::UncalibratedGeomagneticField: 15590db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung return SensorSampleType::ThreeAxis; 15690db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::Pressure: 15790db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::Light: 15890db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::AccelerometerTemperature: 15990db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::GyroscopeTemperature: 16090db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung return SensorSampleType::Float; 16190db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::InstantMotion: 16290db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::StationaryDetect: 16390db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung return SensorSampleType::Occurrence; 16490db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung case SensorType::Proximity: 16590db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung return SensorSampleType::Byte; 16690db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung default: 16790db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung CHRE_ASSERT(false); 16890db64e2ff34e67d967abf755c9dc2dd9a715079Meng-hsuan Chung return SensorSampleType::Unknown; 169bf7f9e866c31f63b321172dec0a8d8037aa2460bMeng-hsuan Chung } 170bf7f9e866c31f63b321172dec0a8d8037aa2460bMeng-hsuan Chung} 171bf7f9e866c31f63b321172dec0a8d8037aa2460bMeng-hsuan Chung 172d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew RossignolSensorMode getSensorModeFromEnum(enum chreSensorConfigureMode enumSensorMode) { 173d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol switch (enumSensorMode) { 174d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol case CHRE_SENSOR_CONFIGURE_MODE_DONE: 175d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::Off; 176d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol case CHRE_SENSOR_CONFIGURE_MODE_CONTINUOUS: 177d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::ActiveContinuous; 178d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol case CHRE_SENSOR_CONFIGURE_MODE_ONE_SHOT: 179d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::ActiveOneShot; 180d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol case CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_CONTINUOUS: 181d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::PassiveContinuous; 182d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol case CHRE_SENSOR_CONFIGURE_MODE_PASSIVE_ONE_SHOT: 183d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::PassiveOneShot; 184d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol default: 185d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol // Default to off since it is the least harmful and has no power impact. 186d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return SensorMode::Off; 187d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol } 188d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol} 189d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol 19048fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chungbool sensorTypeIsOneShot(SensorType sensorType) { 19148fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung return (sensorType == SensorType::InstantMotion || 19248fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung sensorType == SensorType::StationaryDetect); 19348fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung} 19448fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung 19548fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chungbool sensorTypeIsOnChange(SensorType sensorType) { 19648fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung return (sensorType == SensorType::Light || 19748fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung sensorType == SensorType::Proximity); 19848fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung} 19948fda6e1eedf6ba80ae7596fc7676f8318a1e88eMeng-hsuan Chung 200f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew RossignolSensorRequest::SensorRequest() 201f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol : SensorRequest(SensorMode::Off, 2022d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol Nanoseconds(CHRE_SENSOR_INTERVAL_DEFAULT), 2032d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol Nanoseconds(CHRE_SENSOR_LATENCY_DEFAULT)) {} 204f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 205f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew RossignolSensorRequest::SensorRequest(SensorMode mode, 206f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol Nanoseconds interval, 207f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol Nanoseconds latency) 208f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol : mInterval(interval), mLatency(latency), mMode(mode) {} 209f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 210d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew RossignolSensorRequest::SensorRequest(Nanoapp *nanoapp, SensorMode mode, 211d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol Nanoseconds interval, 212d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol Nanoseconds latency) 213d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol : mNanoapp(nanoapp), mInterval(interval), mLatency(latency), mMode(mode) {} 214d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol 215f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignolbool SensorRequest::isEquivalentTo(const SensorRequest& request) const { 216f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol return (mMode == request.mMode 217f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol && mInterval == request.mInterval 218f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol && mLatency == request.mLatency); 219f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol} 220f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 2212d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignolbool SensorRequest::mergeWith(const SensorRequest& request) { 2222d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol bool attributesChanged = false; 2232d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 2242d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol if (request.mInterval < mInterval) { 2252d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol mInterval = request.mInterval; 2262d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol attributesChanged = true; 2272d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol } 2282d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 2292d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol if (request.mLatency < mLatency) { 2302d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol mLatency = request.mLatency; 2312d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol attributesChanged = true; 2322d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol } 233f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 234f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol // Compute the highest priority mode. Active continuous is the highest 235f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol // priority and passive one-shot is the lowest. 2362d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol SensorMode maximalSensorMode = SensorMode::Off; 237f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol if (mMode == SensorMode::ActiveContinuous 238f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol || request.mMode == SensorMode::ActiveContinuous) { 239f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol maximalSensorMode = SensorMode::ActiveContinuous; 240f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol } else if (mMode == SensorMode::ActiveOneShot 241f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol || request.mMode == SensorMode::ActiveOneShot) { 242f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol maximalSensorMode = SensorMode::ActiveOneShot; 243f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol } else if (mMode == SensorMode::PassiveContinuous 244f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol || request.mMode == SensorMode::PassiveContinuous) { 245f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol maximalSensorMode = SensorMode::PassiveContinuous; 246f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol } else if (mMode == SensorMode::PassiveOneShot 247f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol || request.mMode == SensorMode::PassiveOneShot) { 248f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol maximalSensorMode = SensorMode::PassiveOneShot; 2492d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol } else { 2502d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol CHRE_ASSERT(false); 2512d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol } 2522d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol 2532d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol if (mMode != maximalSensorMode) { 2542d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol mMode = maximalSensorMode; 2552d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol attributesChanged = true; 256f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol } 257f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 2582d93f2a877a9c68a2ef249ba996188188d8469acAndrew Rossignol return attributesChanged; 259f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol} 260f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 261f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew RossignolNanoseconds SensorRequest::getInterval() const { 262f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol return mInterval; 263f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol} 264f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 265f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew RossignolNanoseconds SensorRequest::getLatency() const { 266f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol return mLatency; 267f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol} 268f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 269f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew RossignolSensorMode SensorRequest::getMode() const { 270f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol return mMode; 271f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol} 272f546f4c27e66dc4ea868e660cebac9ba0c31fad9Andrew Rossignol 273d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew RossignolNanoapp *SensorRequest::getNanoapp() const { 274d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol return mNanoapp; 275d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol} 276d4bbafd70fea2da476081166a29acd8b5cbb21a1Andrew Rossignol 277a4e39d18c19e4fb9f3fd41870fb61b95778048e2Andrew Rossignol} // namespace chre 278