diff --git a/src/logid/CMakeLists.txt b/src/logid/CMakeLists.txt index e8df76d..2118e6e 100644 --- a/src/logid/CMakeLists.txt +++ b/src/logid/CMakeLists.txt @@ -32,6 +32,7 @@ add_executable(logid actions/ChangeHostAction.cpp actions/gesture/Gesture.cpp actions/gesture/ReleaseGesture.cpp + actions/gesture/ThresholdGesture.cpp actions/gesture/IntervalGesture.cpp actions/gesture/AxisGesture.cpp actions/gesture/NullGesture.cpp diff --git a/src/logid/actions/gesture/Gesture.cpp b/src/logid/actions/gesture/Gesture.cpp index 92a21c8..eb3bcfe 100644 --- a/src/logid/actions/gesture/Gesture.cpp +++ b/src/logid/actions/gesture/Gesture.cpp @@ -20,6 +20,7 @@ #include "Gesture.h" #include "../../util/log.h" #include "ReleaseGesture.h" +#include "ThresholdGesture.h" #include "../../backend/hidpp20/features/ReprogControls.h" #include "IntervalGesture.h" #include "AxisGesture.h" @@ -89,6 +90,8 @@ std::shared_ptr Gesture::makeGesture(Device *device, if(type == "onrelease") return std::make_shared(device, setting); + else if(type == "onthreshold") + return std::make_shared(device, setting); else if(type == "oninterval" || type == "onfewpixels") return std::make_shared(device, setting); else if(type == "axis") diff --git a/src/logid/actions/gesture/ThresholdGesture.cpp b/src/logid/actions/gesture/ThresholdGesture.cpp new file mode 100644 index 0000000..f5843e1 --- /dev/null +++ b/src/logid/actions/gesture/ThresholdGesture.cpp @@ -0,0 +1,54 @@ +/* + * Copyright 2019-2020 PixlOne + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#include "ThresholdGesture.h" + +using namespace logid::actions; + +ThresholdGesture::ThresholdGesture(Device *device, libconfig::Setting &root) : + Gesture (device), _config (device, root) +{ +} + +void ThresholdGesture::press() +{ + _axis = 0; + this->executed = false; +} + +void ThresholdGesture::release(bool primary) +{ + (void)primary; // Suppress unused warning + + this->executed = false; +} + +void ThresholdGesture::move(int16_t axis) +{ + _axis += axis; + + if(!this->executed && metThreshold()) { + _config.action()->press(); + _config.action()->release(); + this->executed = true; + } +} + +bool ThresholdGesture::metThreshold() const +{ + return _axis >= _config.threshold(); +} \ No newline at end of file diff --git a/src/logid/actions/gesture/ThresholdGesture.h b/src/logid/actions/gesture/ThresholdGesture.h new file mode 100644 index 0000000..6d0cf69 --- /dev/null +++ b/src/logid/actions/gesture/ThresholdGesture.h @@ -0,0 +1,46 @@ +/* + * Copyright 2019-2020 PixlOne + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#ifndef LOGID_ACTION_THRESHOLDGESTURE_H +#define LOGID_ACTION_THRESHOLDGESTURE_H + +#include "Gesture.h" + +namespace logid { +namespace actions +{ + class ThresholdGesture : public Gesture + { + public: + ThresholdGesture(Device* device, libconfig::Setting& root); + + virtual void press(); + virtual void release(bool primary=false); + virtual void move(int16_t axis); + + virtual bool metThreshold() const; + + protected: + int16_t _axis; + Gesture::Config _config; + + private: + bool executed = false; + }; +}} + +#endif //LOGID_ACTION_THRESHOLDGESTURE_H