From 4e33ad7593112ba69f733cd8682403f5c37d95b4 Mon Sep 17 00:00:00 2001 From: pixl Date: Thu, 2 Jul 2020 15:27:30 -0400 Subject: [PATCH] Add SmartShift Device feature --- src/logid/CMakeLists.txt | 1 + src/logid/Device.cpp | 8 +-- src/logid/Device.h | 11 ++++ .../backend/hidpp20/features/SmartShift.h | 2 +- src/logid/features/DPI.h | 4 +- src/logid/features/SmartShift.cpp | 65 +++++++++++++++++++ src/logid/features/SmartShift.h | 48 ++++++++++++++ 7 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 src/logid/features/SmartShift.cpp create mode 100644 src/logid/features/SmartShift.h diff --git a/src/logid/CMakeLists.txt b/src/logid/CMakeLists.txt index 4d0962e..aa9570d 100644 --- a/src/logid/CMakeLists.txt +++ b/src/logid/CMakeLists.txt @@ -16,6 +16,7 @@ add_executable(logid Receiver.cpp Configuration.cpp features/DPI.cpp + features/SmartShift.cpp backend/Error.cpp backend/raw/DeviceMonitor.cpp backend/raw/RawDevice.cpp diff --git a/src/logid/Device.cpp b/src/logid/Device.cpp index ba2949b..d7b02f5 100644 --- a/src/logid/Device.cpp +++ b/src/logid/Device.cpp @@ -19,6 +19,7 @@ #include "util/log.h" #include "features/DPI.h" #include "Device.h" +#include "features/SmartShift.h" using namespace logid; using namespace logid::backend; @@ -40,11 +41,8 @@ Device::Device(const std::shared_ptr& raw_device, void Device::_init() { - ///TODO: Surely there's a better way of doing this - try { - _features.push_back(std::make_shared(this)); - } catch (backend::hidpp20::UnsupportedFeature& e) { - } + _addFeature(); + _addFeature(); for(auto& feature: _features) feature->configure(); diff --git a/src/logid/Device.h b/src/logid/Device.h index d1226cb..1206097 100644 --- a/src/logid/Device.h +++ b/src/logid/Device.h @@ -21,6 +21,7 @@ #include "backend/hidpp/defs.h" #include "backend/hidpp20/Device.h" +#include "backend/hidpp20/Feature.h" #include "features/DeviceFeature.h" #include "Configuration.h" @@ -62,6 +63,16 @@ namespace logid private: void _init(); + /* Adds a feature without calling an error if unsupported */ + template + void _addFeature() + { + try { + _features.push_back(std::make_shared(this)); + } catch (backend::hidpp20::UnsupportedFeature& e) { + } + } + backend::hidpp20::Device _hidpp20; std::string _path; backend::hidpp::DeviceIndex _index; diff --git a/src/logid/backend/hidpp20/features/SmartShift.h b/src/logid/backend/hidpp20/features/SmartShift.h index 95717f5..92f4fb1 100644 --- a/src/logid/backend/hidpp20/features/SmartShift.h +++ b/src/logid/backend/hidpp20/features/SmartShift.h @@ -36,7 +36,7 @@ namespace hidpp20 SetStatus = 1 }; - SmartShift(Device* dev); + explicit SmartShift(Device* dev); struct SmartshiftStatus { diff --git a/src/logid/features/DPI.h b/src/logid/features/DPI.h index 5fa346f..b4c5ca6 100644 --- a/src/logid/features/DPI.h +++ b/src/logid/features/DPI.h @@ -15,8 +15,8 @@ * along with this program. If not, see . * */ -#ifndef LOGID_FEATURES_DPI_H -#define LOGID_FEATURES_DPI_H +#ifndef LOGID_FEATURE_DPI_H +#define LOGID_FEATURE_DPI_H #include "../backend/hidpp20/features/AdjustableDPI.h" #include "DeviceFeature.h" diff --git a/src/logid/features/SmartShift.cpp b/src/logid/features/SmartShift.cpp new file mode 100644 index 0000000..5a0bba8 --- /dev/null +++ b/src/logid/features/SmartShift.cpp @@ -0,0 +1,65 @@ +/* + * 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 "SmartShift.h" +#include "../Device.h" +#include "../util/log.h" + +using namespace logid::features; +using namespace logid::backend; + +SmartShift::SmartShift(Device* device) : DeviceFeature(device), _config + (device), _smartshift(&device->hidpp20()) +{ +} + +void SmartShift::configure() +{ + _smartshift.setStatus(_config.getSettings()); +} + +void SmartShift::listen() +{ +} + +SmartShift::Config::Config(Device *dev) : DeviceFeature::Config(dev), _status() +{ + try { + auto& config_root = dev->config().getSetting("smartshift"); + if(!config_root.isGroup()) { + logPrintf(WARN, "Line %d: smartshift must be an object", + config_root.getSourceLine()); + return; + } + _status.setActive = config_root.lookupValue("on", _status.active); + int tmp; + _status.setAutoDisengage = config_root.lookupValue("threshold", tmp); + if(_status.setAutoDisengage) + _status.autoDisengage = tmp; + _status.setDefaultAutoDisengage = config_root.lookupValue + ("default_threshold", tmp); + if(_status.setDefaultAutoDisengage) + _status.defaultAutoDisengage = tmp; + } catch(libconfig::SettingNotFoundException& e) { + // DPI not configured, use default + } +} + +hidpp20::SmartShift::SmartshiftStatus SmartShift::Config::getSettings() +{ + return _status; +} \ No newline at end of file diff --git a/src/logid/features/SmartShift.h b/src/logid/features/SmartShift.h new file mode 100644 index 0000000..98f1811 --- /dev/null +++ b/src/logid/features/SmartShift.h @@ -0,0 +1,48 @@ +/* + * 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_FEATURE_SMARTSHIFT_H +#define LOGID_FEATURE_SMARTSHIFT_H + +#include "../backend/hidpp20/features/SmartShift.h" +#include "DeviceFeature.h" + +namespace logid { +namespace features +{ + class SmartShift : public DeviceFeature + { + public: + explicit SmartShift(Device* dev); + virtual void configure(); + virtual void listen(); + + class Config : public DeviceFeature::Config + { + public: + explicit Config(Device* dev); + backend::hidpp20::SmartShift::SmartshiftStatus getSettings(); + protected: + backend::hidpp20::SmartShift::SmartshiftStatus _status; + }; + private: + Config _config; + backend::hidpp20::SmartShift _smartshift; + }; +}} + +#endif //LOGID_FEATURE_SMARTSHIFT_H