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