Skip to content

Commit d18f66f

Browse files
Implement dynamic detectors - run-once functions that can register detectors dynamically
1 parent 259ba89 commit d18f66f

File tree

5 files changed

+59
-12
lines changed

5 files changed

+59
-12
lines changed

Controllers/QMKOpenRGBController/QMKOpenRGBControllerDetect.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ void DetectQMKOpenRGBControllers(hid_device_info *info, const std::string&)
6565
}
6666
}
6767

68-
REGISTER_HID_DETECTOR_IPU("Massdrop Alt", DetectQMKOpenRGBControllers, MASSDROP_VID, MASSDROP_ALT_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
69-
REGISTER_HID_DETECTOR_IPU("Massdrop Ctrl", DetectQMKOpenRGBControllers, MASSDROP_VID, MASSDROP_CTRL_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
70-
REGISTER_HID_DETECTOR_IPU("SonixQMK 0C45:5004", DetectQMKOpenRGBControllers, SONIXQMK_VID, SONIXQMK_5004_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
71-
REGISTER_HID_DETECTOR_IPU("SonixQMK 0C45:5104", DetectQMKOpenRGBControllers, SONIXQMK_VID, SONIXQMK_5104_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
72-
REGISTER_HID_DETECTOR_IPU("KBDFans KBD67 MKII RGB", DetectQMKOpenRGBControllers, KBDFANS_VID, KBDFANS_K67_MKII_RGB_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
68+
void RegisterQMKDetectors()
69+
{
70+
REGISTER_HID_DETECTOR_IPU("Massdrop Alt", DetectQMKOpenRGBControllers, MASSDROP_VID, MASSDROP_ALT_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
71+
REGISTER_HID_DETECTOR_IPU("Massdrop Ctrl", DetectQMKOpenRGBControllers, MASSDROP_VID, MASSDROP_CTRL_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
72+
REGISTER_HID_DETECTOR_IPU("SonixQMK 0C45:5004", DetectQMKOpenRGBControllers, SONIXQMK_VID, SONIXQMK_5004_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
73+
REGISTER_HID_DETECTOR_IPU("SonixQMK 0C45:5104", DetectQMKOpenRGBControllers, SONIXQMK_VID, SONIXQMK_5104_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
74+
REGISTER_HID_DETECTOR_IPU("KBDFans KBD67 MKII RGB", DetectQMKOpenRGBControllers, KBDFANS_VID, KBDFANS_K67_MKII_RGB_PID, 1, QMK_USAGE_PAGE, QMK_USAGE);
75+
}
76+
77+
REGISTER_DYNAMIC_DETECTOR("QMK OpenRGB Devices", RegisterQMKDetectors);

Detector.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
#include "DeviceDetector.h"
44

5-
#define REGISTER_DETECTOR(name, func) static DeviceDetector device_detector_obj_##func(name, func)
5+
#define REGISTER_DETECTOR(name, func) static DeviceDetector device_detector_obj_##func(name, func)
66
#define REGISTER_I2C_DETECTOR(name, func) static I2CDeviceDetector device_detector_obj_##func(name, func)
7-
#define REGISTER_I2C_BUS_DETECTOR(func) static I2CBusDetector device_detector_obj_##func(func)
7+
#define REGISTER_I2C_BUS_DETECTOR(func) static I2CBusDetector device_detector_obj_##func(func)
88
#define REGISTER_HID_DETECTOR(name, func, vid, pid) static HIDDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, HID_INTERFACE_ANY, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
99
#define REGISTER_HID_DETECTOR_I(name, func, vid, pid, interface) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface(name, func, vid, pid, interface, HID_USAGE_PAGE_ANY, HID_USAGE_ANY)
1010
#define REGISTER_HID_DETECTOR_IP(name, func, vid, pid, interface, page) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page(name, func, vid, pid, interface, page, HID_USAGE_ANY)
1111
#define REGISTER_HID_DETECTOR_IPU(name, func, vid, pid, interface, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##_##interface##_##page##_##usage(name, func, vid, pid, interface, page, usage)
1212
#define REGISTER_HID_DETECTOR_P(name, func, vid, pid, page) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page(name, func, vid, pid, HID_INTERFACE_ANY, page, HID_USAGE_ANY)
1313
#define REGISTER_HID_DETECTOR_PU(name, func, vid, pid, page, usage) static HIDDeviceDetector device_detector_obj_##vid##pid##__##page##_##usage(name, func, vid, pid, HID_INTERFACE_ANY, page, usage)
14+
#define REGISTER_DYNAMIC_DETECTOR(name, func) static DynamicDetector device_detector_obj_##func(name, func)

DeviceDetector.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,12 @@ class HIDDeviceDetector
4141
ResourceManager::get()->RegisterHIDDeviceDetector(name, detector, vid, pid, interface, usage_page, usage);
4242
}
4343
};
44+
45+
class DynamicDetector
46+
{
47+
public:
48+
DynamicDetector(std::string name, DynamicDetectorFunction detector)
49+
{
50+
ResourceManager::get()->RegisterDynamicDetector(name, detector);
51+
}
52+
};

ResourceManager.cpp

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ ResourceManager::ResourceManager()
3737
/*-------------------------------------------------------------------------*\
3838
| Initialize Detection Variables |
3939
\*-------------------------------------------------------------------------*/
40-
detection_enabled = true;
41-
detection_percent = 100;
42-
detection_string = "";
43-
detection_is_required = false;
44-
DetectDevicesThread = nullptr;
40+
detection_enabled = true;
41+
detection_percent = 100;
42+
detection_string = "";
43+
detection_is_required = false;
44+
DetectDevicesThread = nullptr;
45+
dynamic_detectors_processed = false;
4546

4647
SetupConfigurationDirectory();
4748

@@ -185,6 +186,12 @@ void ResourceManager::RegisterHIDDeviceDetector(std::string name,
185186
hid_device_detector_strings.push_back(name);
186187
}
187188

189+
void ResourceManager::RegisterDynamicDetector(std::string name, DynamicDetectorFunction detector)
190+
{
191+
dynamic_detector_strings.push_back(name);
192+
dynamic_detectors.push_back(detector);
193+
}
194+
188195
void ResourceManager::RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg)
189196
{
190197
DeviceListChangeCallbacks.push_back(new_callback);
@@ -503,8 +510,26 @@ void ResourceManager::Cleanup()
503510
}
504511
}
505512

513+
void ResourceManager::ProcessDynamicDetectors()
514+
{
515+
for(unsigned int detector_idx = 0; detector_idx < dynamic_detectors.size(); detector_idx++)
516+
{
517+
dynamic_detectors[detector_idx]();
518+
}
519+
520+
dynamic_detectors_processed = true;
521+
}
522+
506523
void ResourceManager::DetectDevices()
507524
{
525+
/*-----------------------------------------------------*\
526+
| Process Dynamic Detectors |
527+
\*-----------------------------------------------------*/
528+
if(!dynamic_detectors_processed)
529+
{
530+
ProcessDynamicDetectors();
531+
}
532+
508533
/*-----------------------------------------------------*\
509534
| Call detection start callbacks |
510535
\*-----------------------------------------------------*/

ResourceManager.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ typedef std::function<void()> I2CBusDetect
3636
typedef std::function<void(std::vector<RGBController*>&)> DeviceDetectorFunction;
3737
typedef std::function<void(std::vector<i2c_smbus_interface*>&)> I2CDeviceDetectorFunction;
3838
typedef std::function<void(hid_device_info*, const std::string&)> HIDDeviceDetectorFunction;
39+
typedef std::function<void()> DynamicDetectorFunction;
3940
typedef struct
4041
{
4142
std::string name;
@@ -111,6 +112,7 @@ class ResourceManager: public ResourceManagerInterface
111112
int interface = HID_INTERFACE_ANY,
112113
int usage_page = HID_USAGE_PAGE_ANY,
113114
int usage = HID_USAGE_ANY);
115+
void RegisterDynamicDetector (std::string name, DynamicDetectorFunction detector);
114116

115117
void RegisterDeviceListChangeCallback(DeviceListChangeCallback new_callback, void * new_callback_arg);
116118
void RegisterDetectionProgressCallback(DetectionProgressCallback new_callback, void * new_callback_arg);
@@ -135,6 +137,7 @@ class ResourceManager: public ResourceManagerInterface
135137

136138
void SetConfigurationDirectory(std::string directory);
137139

140+
void ProcessDynamicDetectors();
138141
void UpdateDeviceList();
139142
void DeviceListChanged();
140143
void DetectionProgressChanged();
@@ -207,6 +210,10 @@ class ResourceManager: public ResourceManagerInterface
207210
std::vector<std::string> i2c_device_detector_strings;
208211
std::vector<HIDDeviceDetectorBlock> hid_device_detectors;
209212
std::vector<std::string> hid_device_detector_strings;
213+
std::vector<DynamicDetectorFunction> dynamic_detectors;
214+
std::vector<std::string> dynamic_detector_strings;
215+
216+
bool dynamic_detectors_processed;
210217

211218
/*-------------------------------------------------------------------------------------*\
212219
| Detection Thread and Detection State |

0 commit comments

Comments
 (0)