From 47ee8946298d6cb224fa3ef311a55a87fa12db8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Tu=C4=8Dek?= Date: Fri, 29 Nov 2024 13:10:22 +0100 Subject: [PATCH 1/2] Wake up the event loop only if touchpad changes state. --- right/src/slave_drivers/touchpad_driver.c | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/right/src/slave_drivers/touchpad_driver.c b/right/src/slave_drivers/touchpad_driver.c index 70b092bf..60c07a0f 100644 --- a/right/src/slave_drivers/touchpad_driver.c +++ b/right/src/slave_drivers/touchpad_driver.c @@ -164,25 +164,40 @@ slave_result_t TouchpadDriver_Update(uint8_t uhkModuleDriverId) ModuleConnectionStates[UhkModuleDriverId_RightModule].lastTimeConnected = CurrentTime; - TouchpadEvents.singleTap = gestureEvents.events0.singleTap; - TouchpadEvents.twoFingerTap = gestureEvents.events1.twoFingerTap; - TouchpadEvents.tapAndHold = gestureEvents.events0.tapAndHold; - TouchpadEvents.noFingers = noFingers; + bool somethingChanged = false; + + if ( + TouchpadEvents.singleTap != gestureEvents.events0.singleTap + || TouchpadEvents.twoFingerTap != gestureEvents.events1.twoFingerTap + || TouchpadEvents.tapAndHold != gestureEvents.events0.tapAndHold + || TouchpadEvents.noFingers != noFingers + ) { + TouchpadEvents.singleTap = gestureEvents.events0.singleTap; + TouchpadEvents.twoFingerTap = gestureEvents.events1.twoFingerTap; + TouchpadEvents.tapAndHold = gestureEvents.events0.tapAndHold; + TouchpadEvents.noFingers = noFingers; + somethingChanged = true; + } if (gestureEvents.events1.scroll) { TouchpadEvents.wheelX -= deltaX; TouchpadEvents.wheelY += deltaY; + somethingChanged = true; } else if (gestureEvents.events1.zoom) { TouchpadEvents.zoomLevel -= deltaY; + somethingChanged = true; } else { TouchpadEvents.x -= deltaX; TouchpadEvents.y += deltaY; + somethingChanged = true; } res.status = I2cAsyncWrite(address, closeCommunicationWindow, sizeof(closeCommunicationWindow)); res.hold = false; - EventVector_Set(EventVector_MouseController); - EventVector_WakeMain(); + if (somethingChanged) { + EventVector_Set(EventVector_MouseController); + EventVector_WakeMain(); + } phase = 3; break; } From cf2090021dad5e79f0c24da4f88ee28e8599ddce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Tu=C4=8Dek?= Date: Fri, 29 Nov 2024 14:04:10 +0100 Subject: [PATCH 2/2] Fix eventloop spinning on touchpad v2. --- right/src/slave_drivers/touchpad_driver.c | 66 ++++++++++++----------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/right/src/slave_drivers/touchpad_driver.c b/right/src/slave_drivers/touchpad_driver.c index 60c07a0f..c5f7eb99 100644 --- a/right/src/slave_drivers/touchpad_driver.c +++ b/right/src/slave_drivers/touchpad_driver.c @@ -164,40 +164,46 @@ slave_result_t TouchpadDriver_Update(uint8_t uhkModuleDriverId) ModuleConnectionStates[UhkModuleDriverId_RightModule].lastTimeConnected = CurrentTime; - bool somethingChanged = false; - - if ( - TouchpadEvents.singleTap != gestureEvents.events0.singleTap - || TouchpadEvents.twoFingerTap != gestureEvents.events1.twoFingerTap - || TouchpadEvents.tapAndHold != gestureEvents.events0.tapAndHold - || TouchpadEvents.noFingers != noFingers - ) { - TouchpadEvents.singleTap = gestureEvents.events0.singleTap; - TouchpadEvents.twoFingerTap = gestureEvents.events1.twoFingerTap; - TouchpadEvents.tapAndHold = gestureEvents.events0.tapAndHold; - TouchpadEvents.noFingers = noFingers; - somethingChanged = true; - } - - if (gestureEvents.events1.scroll) { - TouchpadEvents.wheelX -= deltaX; - TouchpadEvents.wheelY += deltaY; - somethingChanged = true; - } else if (gestureEvents.events1.zoom) { - TouchpadEvents.zoomLevel -= deltaY; - somethingChanged = true; - } else { - TouchpadEvents.x -= deltaX; - TouchpadEvents.y += deltaY; - somethingChanged = true; + if (deltaX || deltaY || *(uint16_t*)&gestureEvents) { + bool somethingChanged = false; + + if ( + TouchpadEvents.singleTap != gestureEvents.events0.singleTap + || TouchpadEvents.twoFingerTap != gestureEvents.events1.twoFingerTap + || TouchpadEvents.tapAndHold != gestureEvents.events0.tapAndHold + || TouchpadEvents.noFingers != noFingers + ) { + TouchpadEvents.singleTap = gestureEvents.events0.singleTap; + TouchpadEvents.twoFingerTap = gestureEvents.events1.twoFingerTap; + TouchpadEvents.tapAndHold = gestureEvents.events0.tapAndHold; + TouchpadEvents.noFingers = noFingers; + somethingChanged = true; + } + + if (deltaX != 0 || deltaY != 0) { + if (gestureEvents.events1.scroll) { + TouchpadEvents.wheelX -= deltaX; + TouchpadEvents.wheelY += deltaY; + somethingChanged = true; + } else if (gestureEvents.events1.zoom) { + TouchpadEvents.zoomLevel -= deltaY; + somethingChanged = true; + } else { + TouchpadEvents.x -= deltaX; + TouchpadEvents.y += deltaY; + somethingChanged = true; + } + } + + if (somethingChanged) { + EventVector_Set(EventVector_MouseController); + EventVector_WakeMain(); + } } res.status = I2cAsyncWrite(address, closeCommunicationWindow, sizeof(closeCommunicationWindow)); res.hold = false; - if (somethingChanged) { - EventVector_Set(EventVector_MouseController); - EventVector_WakeMain(); - } + phase = 3; break; }