diff --git a/src/logid/CMakeLists.txt b/src/logid/CMakeLists.txt index 7ece018..e8df76d 100644 --- a/src/logid/CMakeLists.txt +++ b/src/logid/CMakeLists.txt @@ -20,6 +20,7 @@ add_executable(logid features/SmartShift.cpp features/HiresScroll.cpp features/RemapButton.cpp + features/DeviceStatus.cpp actions/Action.cpp actions/NullAction.cpp actions/KeypressAction.cpp diff --git a/src/logid/Device.cpp b/src/logid/Device.cpp index 9d32588..0338714 100644 --- a/src/logid/Device.cpp +++ b/src/logid/Device.cpp @@ -23,6 +23,7 @@ #include "features/RemapButton.h" #include "backend/hidpp20/features/Reset.h" #include "features/HiresScroll.h" +#include "features/DeviceStatus.h" using namespace logid; using namespace logid::backend; @@ -51,6 +52,7 @@ void Device::_init() _addFeature("smartshift"); _addFeature("hiresscroll"); _addFeature("remapbutton"); + _addFeature("devicestatus"); _makeResetMechanism(); reset(); diff --git a/src/logid/features/DeviceStatus.cpp b/src/logid/features/DeviceStatus.cpp new file mode 100644 index 0000000..cf03e2a --- /dev/null +++ b/src/logid/features/DeviceStatus.cpp @@ -0,0 +1,62 @@ +/* + * 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 "DeviceStatus.h" +#include "../util/task.h" + +#define EVENTHANDLER_NAME "devicestatus" + +using namespace logid::features; +using namespace logid::backend; + +DeviceStatus::DeviceStatus(logid::Device *dev) : DeviceFeature(dev) +{ + try { + _wireless_device_status =std::make_shared< + hidpp20::WirelessDeviceStatus>(&dev->hidpp20()); + } catch(hidpp20::UnsupportedFeature& e) { + throw UnsupportedFeature(); + } +} + +void DeviceStatus::configure() +{ + // Do nothing +} + +void DeviceStatus::listen() +{ + if(_device->hidpp20().eventHandlers().find(EVENTHANDLER_NAME) == + _device->hidpp20().eventHandlers().end()) { + auto handler = std::make_shared(); + handler->condition = [index=_wireless_device_status->featureIndex()]( + const hidpp::Report& report)->bool { + return report.feature() == index && report.function() == + hidpp20::WirelessDeviceStatus::StatusBroadcast; + }; + + handler->callback = [dev=this->_device]( + const hidpp::Report& report)->void { + auto event = hidpp20::WirelessDeviceStatus::statusBroadcastEvent( + report); + if(event.reconfNeeded) + task::spawn([dev](){ dev->wakeup(); }); + }; + + _device->hidpp20().addEventHandler(EVENTHANDLER_NAME, handler); + } +} \ No newline at end of file diff --git a/src/logid/features/DeviceStatus.h b/src/logid/features/DeviceStatus.h new file mode 100644 index 0000000..985f8fd --- /dev/null +++ b/src/logid/features/DeviceStatus.h @@ -0,0 +1,41 @@ +/* + * 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_DEVICESTATUS_H +#define LOGID_FEATURE_DEVICESTATUS_H + + +#include "DeviceFeature.h" +#include "../Device.h" +#include "../backend/hidpp20/features/WirelessDeviceStatus.h" + +namespace logid { +namespace features +{ + class DeviceStatus : public DeviceFeature + { + public: + explicit DeviceStatus(Device* dev); + virtual void configure(); + virtual void listen(); + private: + std::shared_ptr + _wireless_device_status; + }; +}} + +#endif //LOGID_FEATURE_DEVICESTATUS_H