From 1215065c64f33f0bb09fc94d54c4c94e8cf7a13f Mon Sep 17 00:00:00 2001 From: Curi0 Date: Wed, 4 Dec 2019 12:59:37 +0530 Subject: [PATCH 1/2] Add ButtonFix filter incompatible with anti-smoothing which requires a prediction algorithm --- .../CommandHandler.Filters.cpp | 24 +++++++ TabletDriverService/Tablet.cpp | 7 +- TabletDriverService/Tablet.h | 2 + .../TabletDriverService.vcxproj | 2 + .../TabletDriverService.vcxproj.filters | 6 ++ TabletDriverService/TabletFilterButtonFix.cpp | 66 +++++++++++++++++++ TabletDriverService/TabletFilterButtonFix.h | 27 ++++++++ 7 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 TabletDriverService/TabletFilterButtonFix.cpp create mode 100644 TabletDriverService/TabletFilterButtonFix.h diff --git a/TabletDriverService/CommandHandler.Filters.cpp b/TabletDriverService/CommandHandler.Filters.cpp index 1cc755a..050878c 100644 --- a/TabletDriverService/CommandHandler.Filters.cpp +++ b/TabletDriverService/CommandHandler.Filters.cpp @@ -330,6 +330,30 @@ void CommandHandler::CreateFilterCommands() { })); + // Command: ButtonFix, ButtonFix + // + // Sets ButtonFix filter parameters + // + AddAlias("ButtonFix", "ButtonFixAdd"); + AddCommand(new Command("ButtonFixAdd", [&](CommandLine* cmd) { + + // Tablet valid? + if (!ExecuteCommand("TabletValid")) return false; + + std::string stringValue = cmd->GetStringLower(0, ""); + + // Off / False + if (stringValue == "off" || stringValue == "false") { + tablet->buttonFix.isEnabled = false; + LOG_INFO("Button Fix = off\n"); + } + else { + tablet->buttonFix.isEnabled = true; + LOG_INFO("Button Fix = on\n"); + } + return true; + })); + // // Command: FilterTimerInterval, TimerInterval, Interval diff --git a/TabletDriverService/Tablet.cpp b/TabletDriverService/Tablet.cpp index 8533b09..4cfadcd 100644 --- a/TabletDriverService/Tablet.cpp +++ b/TabletDriverService/Tablet.cpp @@ -59,9 +59,10 @@ Tablet::Tablet() { filterTimedCount = 3; // Report filters - filterReport[0] = &antiSmoothing; - filterReport[1] = &noiseFilter; - filterReportCount = 2; + filterReport[0] = &buttonFix; + filterReport[1] = &antiSmoothing; + filterReport[2] = &noiseFilter; + filterReportCount = 3; // Tablet connection open isOpen = false; diff --git a/TabletDriverService/Tablet.h b/TabletDriverService/Tablet.h index 6af8e74..5648495 100644 --- a/TabletDriverService/Tablet.h +++ b/TabletDriverService/Tablet.h @@ -17,6 +17,7 @@ #include "TabletFilterNoiseReduction.h" #include "TabletFilterAntiSmoothing.h" #include "TabletFilterPeak.h" +#include "TabletFilterButtonFix.h" #include "TabletMeasurement.h" #include "DataFormatter.h" @@ -164,6 +165,7 @@ class Tablet { TabletFilterNoiseReduction noiseFilter; TabletFilterAntiSmoothing antiSmoothing; TabletFilterGravity gravityFilter; + TabletFilterButtonFix buttonFix; // Timed filters TabletFilter *filterTimed[10]; diff --git a/TabletDriverService/TabletDriverService.vcxproj b/TabletDriverService/TabletDriverService.vcxproj index c4523c7..0dc7035 100644 --- a/TabletDriverService/TabletDriverService.vcxproj +++ b/TabletDriverService/TabletDriverService.vcxproj @@ -190,6 +190,7 @@ + @@ -239,6 +240,7 @@ + diff --git a/TabletDriverService/TabletDriverService.vcxproj.filters b/TabletDriverService/TabletDriverService.vcxproj.filters index f1aa145..55afb2b 100644 --- a/TabletDriverService/TabletDriverService.vcxproj.filters +++ b/TabletDriverService/TabletDriverService.vcxproj.filters @@ -144,6 +144,9 @@ Header Files + + Header Files + @@ -289,6 +292,9 @@ Source Files + + + Source Files diff --git a/TabletDriverService/TabletFilterButtonFix.cpp b/TabletDriverService/TabletFilterButtonFix.cpp new file mode 100644 index 0000000..ad693b9 --- /dev/null +++ b/TabletDriverService/TabletFilterButtonFix.cpp @@ -0,0 +1,66 @@ +#include "precompiled.h" +#include "TabletFilterButtonFix.h" + + +#define LOG_MODULE "ButtonFix" +#include "Logger.h" + + +// +// Constructor +// +TabletFilterButtonFix::TabletFilterButtonFix() { + ignoreInvalidReports = 0; + outputPosition = &outputState.position; +} + +// +// Destructor +// +TabletFilterButtonFix::~TabletFilterButtonFix() { +} + + +// +// Set target +// +void TabletFilterButtonFix::SetTarget(TabletState* tabletState) { + latestTarget.Set(tabletState->position); + memcpy(&this->tabletState, tabletState, sizeof(TabletState)); + memcpy(&outputState, tabletState, sizeof(TabletState)); +} + + +// +// Update filter +// +void TabletFilterButtonFix::Update() { + // + // Invalid position data detection. + // Some tablets do send invalid/broken data when buttons are released + // + if (tabletState.buttons <= 1 && oldTabletState.buttons > 1) { + tabletState.pressure = oldTabletState.pressure; + tabletState.inputPressure = oldTabletState.inputPressure; + if (oldTabletState.buttons == 5 || oldTabletState.buttons == 3) + tabletState.buttons = 1; + ignoreInvalidReports = 2; + oldTarget.Set(latestTarget); + memcpy(&this->oldTabletState, &this->tabletState, sizeof(TabletState)); + return; + } + + if (ignoreInvalidReports == 0) { + // Update old values + oldTarget.Set(latestTarget); + memcpy(&this->oldTabletState, &this->tabletState, sizeof(TabletState)); + } + else { + oldTabletState.time = tabletState.time; + tabletState = oldTabletState; + // TODO: extrapolate a new coordinate + outputPosition->Set(oldTarget); + ignoreInvalidReports--; + } +} + diff --git a/TabletDriverService/TabletFilterButtonFix.h b/TabletDriverService/TabletFilterButtonFix.h new file mode 100644 index 0000000..66bb2be --- /dev/null +++ b/TabletDriverService/TabletFilterButtonFix.h @@ -0,0 +1,27 @@ +#pragma once +#include "TabletFilter.h" +#include "PositionRingBuffer.h" + +#include + + +class TabletFilterButtonFix : public TabletFilter { +private: + int ignoreInvalidReports; + +public: + Vector2D latestTarget; + Vector2D oldTarget; + Vector2D* outputPosition; + + TabletState tabletState; + TabletState oldTabletState; + + void SetTarget(TabletState* tabletState); + void Update(); + + TabletFilterButtonFix(); + ~TabletFilterButtonFix(); + +}; + From 8f151a8a86d279c929f1f2bcb7ccb2f6b5e3695c Mon Sep 17 00:00:00 2001 From: Curi0 Date: Mon, 16 Dec 2019 10:28:29 +0530 Subject: [PATCH 2/2] Add button press filter --- TabletDriverService/TabletFilterButtonFix.cpp | 10 ++++++++-- TabletDriverService/TabletFilterButtonFix.h | 4 ---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/TabletDriverService/TabletFilterButtonFix.cpp b/TabletDriverService/TabletFilterButtonFix.cpp index ad693b9..8c9b56d 100644 --- a/TabletDriverService/TabletFilterButtonFix.cpp +++ b/TabletDriverService/TabletFilterButtonFix.cpp @@ -39,7 +39,9 @@ void TabletFilterButtonFix::Update() { // Invalid position data detection. // Some tablets do send invalid/broken data when buttons are released // - if (tabletState.buttons <= 1 && oldTabletState.buttons > 1) { + + if (tabletState.buttons <= 1 && oldTabletState.buttons > 1 && ignoreInvalidReports == 0) { + //LOG_INFO("RELEASE\n"); tabletState.pressure = oldTabletState.pressure; tabletState.inputPressure = oldTabletState.inputPressure; if (oldTabletState.buttons == 5 || oldTabletState.buttons == 3) @@ -49,7 +51,11 @@ void TabletFilterButtonFix::Update() { memcpy(&this->oldTabletState, &this->tabletState, sizeof(TabletState)); return; } - + else if (oldTabletState.buttons <= 1 && tabletState.buttons > 1 && ignoreInvalidReports == 0) { + //LOG_INFO("PRESS\n"); + oldTabletState.buttons = tabletState.buttons; + ignoreInvalidReports = 2; + } if (ignoreInvalidReports == 0) { // Update old values oldTarget.Set(latestTarget); diff --git a/TabletDriverService/TabletFilterButtonFix.h b/TabletDriverService/TabletFilterButtonFix.h index 66bb2be..8c4e2df 100644 --- a/TabletDriverService/TabletFilterButtonFix.h +++ b/TabletDriverService/TabletFilterButtonFix.h @@ -1,9 +1,5 @@ #pragma once #include "TabletFilter.h" -#include "PositionRingBuffer.h" - -#include - class TabletFilterButtonFix : public TabletFilter { private: