diff options
author | Peng Xu <pengxu@google.com> | 2017-04-04 01:31:54 -0700 |
---|---|---|
committer | Peng Xu <pengxu@google.com> | 2017-04-20 23:23:53 +0000 |
commit | 4715d1734d2c60cc91ef70d409678d8eda382fde (patch) | |
tree | 4a7968a6472431119e43f4ad0ad9520fee541c44 /modules/sensors/dynamic_sensor/BaseDynamicSensorDaemon.cpp | |
parent | c87b15a2245b6fac68bd2e259cb0f4b4efbcf045 (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.cpp | 34 |
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"); } } |