summaryrefslogtreecommitdiff
path: root/modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp
diff options
context:
space:
mode:
authorPeng Xu <pengxu@google.com>2017-04-04 01:31:54 -0700
committerPeng Xu <pengxu@google.com>2017-04-20 23:23:53 +0000
commit4715d1734d2c60cc91ef70d409678d8eda382fde (patch)
tree4a7968a6472431119e43f4ad0ad9520fee541c44 /modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp
parentc87b15a2245b6fac68bd2e259cb0f4b4efbcf045 (diff)
HID dynamic sensor: add support to three types of sensor
Implemented HID dynamic sensor using linux hidraw driver and HidUtils. Support the following cases: 1) HID Sensor spec defined accelerometer, gyroscope, magnetometer and orientation (quaternion). 2) Android defined type sensors (HID sensor custom type): ambient temperature, barometer, light and heart rate sensor. 3) Android custom type sensor (based on HID sensor custom type). Test: run tests/examples in test/ Test: test with a USB HID hardware (launchpad sensor) and marlin Bug: 37482951 Bug: 31026607 Change-Id: I9d679fb34d15324a9df1cf19647ea638fd1a0e68
Diffstat (limited to 'modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp')
-rw-r--r--modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp b/modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp
index f5f642ce..7e9f2173 100644
--- a/modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp
+++ b/modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp
@@ -23,14 +23,23 @@ namespace SensorHalExt {
bool BaseDynamicSensorDaemon::onConnectionChange(const std::string &deviceKey, bool connected) {
bool ret = false;
- auto i = mDevices.find(deviceKey);
+ auto i = mDeviceKeySensorMap.find(deviceKey);
if (connected) {
- if (i == mDevices.end()) {
+ if (i == mDeviceKeySensorMap.end()) {
ALOGV("device %s is connected", deviceKey.c_str());
- BaseSensorObject* s = createSensor(deviceKey);
- if (s) {
- mDevices.emplace(deviceKey, sp<BaseSensorObject>(s));
- mManager.registerSensor(s);
+ // get sensors from implementation
+ BaseSensorVector sensors = createSensor(deviceKey);
+ if (sensors.empty()) {
+ ALOGI("no valid sensor is defined in device %s, ignore", deviceKey.c_str());
+ } else {
+ ALOGV("discovered %zu sensors from device", sensors.size());
+ // build internal table first
+ auto result = mDeviceKeySensorMap.emplace(deviceKey, std::move(sensors));
+ // then register sensor to dynamic sensor manager, result.first is the iterator
+ // of key-value pair; result.first->second is the value, which is s.
+ for (auto &i : result.first->second) {
+ mManager.registerSensor(i);
+ }
ALOGV("device %s is registered", deviceKey.c_str());
ret = true;
}
@@ -39,13 +48,18 @@ bool BaseDynamicSensorDaemon::onConnectionChange(const std::string &deviceKey, b
}
} else {
ALOGV("device %s is disconnected", deviceKey.c_str());
- if (i != mDevices.end()) {
- mManager.unregisterSensor(i->second.get());
- mDevices.erase(i);
+ if (i != mDeviceKeySensorMap.end()) {
+ BaseSensorVector sensors = i->second;
+ for (auto &sensor : sensors) {
+ mManager.unregisterSensor(sensor);
+ }
+ mDeviceKeySensorMap.erase(i);
+ // notify implementation
+ removeSensor(deviceKey);
ALOGV("device %s is unregistered", deviceKey.c_str());
ret = true;
} else {
- ALOGD("device not found in registry");
+ ALOGV("device not found in registry");
}
}