Loading services/inputflinger/reader/EventHub.cpp +40 −24 Original line number Diff line number Diff line Loading @@ -864,6 +864,30 @@ void EventHub::addDeviceInotify() { strerror(errno)); } void EventHub::populateDeviceAbsoluteAxisInfo(Device& device) { for (int axis = 0; axis <= ABS_MAX; axis++) { if (!device.absBitmask.test(axis)) { continue; } struct input_absinfo info {}; if (ioctl(device.fd, EVIOCGABS(axis), &info)) { ALOGE("Error reading absolute controller %d for device %s fd %d, errno=%d", axis, device.identifier.name.c_str(), device.fd, errno); continue; } if (info.minimum == info.maximum) { continue; } RawAbsoluteAxisInfo& outAxisInfo = device.rawAbsoluteAxisInfoCache[axis]; outAxisInfo.valid = true; outAxisInfo.minValue = info.minimum; outAxisInfo.maxValue = info.maximum; outAxisInfo.flat = info.flat; outAxisInfo.fuzz = info.fuzz; outAxisInfo.resolution = info.resolution; } } InputDeviceIdentifier EventHub::getDeviceIdentifier(int32_t deviceId) const { std::scoped_lock _l(mLock); Device* device = getDeviceLocked(deviceId); Loading Loading @@ -894,32 +918,21 @@ std::optional<PropertyMap> EventHub::getConfiguration(int32_t deviceId) const { status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, RawAbsoluteAxisInfo* outAxisInfo) const { outAxisInfo->clear(); if (axis >= 0 && axis <= ABS_MAX) { if (axis < 0 || axis > ABS_MAX) { return -1; } std::scoped_lock _l(mLock); Device* device = getDeviceLocked(deviceId); if (device != nullptr && device->hasValidFd() && device->absBitmask.test(axis)) { struct input_absinfo info; if (ioctl(device->fd, EVIOCGABS(axis), &info)) { ALOGW("Error reading absolute controller %d for device %s fd %d, errno=%d", axis, device->identifier.name.c_str(), device->fd, errno); return -errno; if (device == nullptr) { return -1; } if (info.minimum != info.maximum) { outAxisInfo->valid = true; outAxisInfo->minValue = info.minimum; outAxisInfo->maxValue = info.maximum; outAxisInfo->flat = info.flat; outAxisInfo->fuzz = info.fuzz; outAxisInfo->resolution = info.resolution; auto it = device->rawAbsoluteAxisInfoCache.find(axis); if (it == device->rawAbsoluteAxisInfoCache.end()) { return -1; } *outAxisInfo = it->second; return OK; } } return -1; } bool EventHub::hasRelativeAxis(int32_t deviceId, int axis) const { if (axis >= 0 && axis <= REL_MAX) { Loading Loading @@ -2435,6 +2448,9 @@ void EventHub::openDeviceLocked(const std::string& devicePath) { device->configureFd(); // read absolute axis info for all available axes for the device populateDeviceAbsoluteAxisInfo(*device); ALOGI("New device: id=%d, fd=%d, path='%s', name='%s', classes=%s, " "configuration='%s', keyLayout='%s', keyCharacterMap='%s', builtinKeyboard=%s, ", deviceId, fd, devicePath.c_str(), device->identifier.name.c_str(), Loading services/inputflinger/reader/include/EventHub.h +8 −0 Original line number Diff line number Diff line Loading @@ -615,6 +615,7 @@ private: std::unique_ptr<PropertyMap> configuration; std::unique_ptr<VirtualKeyMap> virtualKeyMap; KeyMap keyMap; std::unordered_map<int /*axis*/, RawAbsoluteAxisInfo> rawAbsoluteAxisInfoCache; bool ffEffectPlaying; int16_t ffEffectId; // initially -1 Loading Loading @@ -717,6 +718,13 @@ private: void addDeviceInputInotify(); void addDeviceInotify(); /** * AbsoluteAxisInfo remains unchanged for the lifetime of the device, hence * we can read and store it with device * @param device target device */ static void populateDeviceAbsoluteAxisInfo(Device& device); // Protect all internal state. mutable std::mutex mLock; Loading Loading
services/inputflinger/reader/EventHub.cpp +40 −24 Original line number Diff line number Diff line Loading @@ -864,6 +864,30 @@ void EventHub::addDeviceInotify() { strerror(errno)); } void EventHub::populateDeviceAbsoluteAxisInfo(Device& device) { for (int axis = 0; axis <= ABS_MAX; axis++) { if (!device.absBitmask.test(axis)) { continue; } struct input_absinfo info {}; if (ioctl(device.fd, EVIOCGABS(axis), &info)) { ALOGE("Error reading absolute controller %d for device %s fd %d, errno=%d", axis, device.identifier.name.c_str(), device.fd, errno); continue; } if (info.minimum == info.maximum) { continue; } RawAbsoluteAxisInfo& outAxisInfo = device.rawAbsoluteAxisInfoCache[axis]; outAxisInfo.valid = true; outAxisInfo.minValue = info.minimum; outAxisInfo.maxValue = info.maximum; outAxisInfo.flat = info.flat; outAxisInfo.fuzz = info.fuzz; outAxisInfo.resolution = info.resolution; } } InputDeviceIdentifier EventHub::getDeviceIdentifier(int32_t deviceId) const { std::scoped_lock _l(mLock); Device* device = getDeviceLocked(deviceId); Loading Loading @@ -894,32 +918,21 @@ std::optional<PropertyMap> EventHub::getConfiguration(int32_t deviceId) const { status_t EventHub::getAbsoluteAxisInfo(int32_t deviceId, int axis, RawAbsoluteAxisInfo* outAxisInfo) const { outAxisInfo->clear(); if (axis >= 0 && axis <= ABS_MAX) { if (axis < 0 || axis > ABS_MAX) { return -1; } std::scoped_lock _l(mLock); Device* device = getDeviceLocked(deviceId); if (device != nullptr && device->hasValidFd() && device->absBitmask.test(axis)) { struct input_absinfo info; if (ioctl(device->fd, EVIOCGABS(axis), &info)) { ALOGW("Error reading absolute controller %d for device %s fd %d, errno=%d", axis, device->identifier.name.c_str(), device->fd, errno); return -errno; if (device == nullptr) { return -1; } if (info.minimum != info.maximum) { outAxisInfo->valid = true; outAxisInfo->minValue = info.minimum; outAxisInfo->maxValue = info.maximum; outAxisInfo->flat = info.flat; outAxisInfo->fuzz = info.fuzz; outAxisInfo->resolution = info.resolution; auto it = device->rawAbsoluteAxisInfoCache.find(axis); if (it == device->rawAbsoluteAxisInfoCache.end()) { return -1; } *outAxisInfo = it->second; return OK; } } return -1; } bool EventHub::hasRelativeAxis(int32_t deviceId, int axis) const { if (axis >= 0 && axis <= REL_MAX) { Loading Loading @@ -2435,6 +2448,9 @@ void EventHub::openDeviceLocked(const std::string& devicePath) { device->configureFd(); // read absolute axis info for all available axes for the device populateDeviceAbsoluteAxisInfo(*device); ALOGI("New device: id=%d, fd=%d, path='%s', name='%s', classes=%s, " "configuration='%s', keyLayout='%s', keyCharacterMap='%s', builtinKeyboard=%s, ", deviceId, fd, devicePath.c_str(), device->identifier.name.c_str(), Loading
services/inputflinger/reader/include/EventHub.h +8 −0 Original line number Diff line number Diff line Loading @@ -615,6 +615,7 @@ private: std::unique_ptr<PropertyMap> configuration; std::unique_ptr<VirtualKeyMap> virtualKeyMap; KeyMap keyMap; std::unordered_map<int /*axis*/, RawAbsoluteAxisInfo> rawAbsoluteAxisInfoCache; bool ffEffectPlaying; int16_t ffEffectId; // initially -1 Loading Loading @@ -717,6 +718,13 @@ private: void addDeviceInputInotify(); void addDeviceInotify(); /** * AbsoluteAxisInfo remains unchanged for the lifetime of the device, hence * we can read and store it with device * @param device target device */ static void populateDeviceAbsoluteAxisInfo(Device& device); // Protect all internal state. mutable std::mutex mLock; Loading