diff --git a/DetectionManager.cpp b/DetectionManager.cpp index 607a32f5..334bc962 100644 --- a/DetectionManager.cpp +++ b/DetectionManager.cpp @@ -359,6 +359,19 @@ void DetectionManager::RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDevi i2c_pci_device_detectors.push_back(block); } +void DetectionManager::RegisterUSBSerialDeviceDetector(std::string name, USBSerialDeviceDetectorFunction detector, int vid, int pid, bool enabled_by_default) +{ + USBSerialDeviceDetectorBlock block; + + block.name = name; + block.function = detector; + block.vid = vid; + block.pid = pid; + block.enabled_by_default = enabled_by_default; + + usb_serial_detectors.push_back(block); +} + /*---------------------------------------------------------*\ | Pre-Detection Hook Function Registration Function | \*---------------------------------------------------------*/ @@ -796,13 +809,15 @@ void DetectionManager::BackgroundDetectDevices() } } + detection_percent_usb_serial_count = (unsigned int)usb_serial_detectors.size(); detection_percent_other_count = (unsigned int)device_detectors.size(); detection_percent_denominator = detection_percent_i2c_count + detection_percent_i2c_dram_count + detection_percent_i2c_pci_count + detection_percent_other_count - + detection_percent_hid_count; + + detection_percent_hid_count + + detection_percent_usb_serial_count; /*-----------------------------------------------------*\ | Detect I2C interfaces | @@ -850,6 +865,11 @@ void DetectionManager::BackgroundDetectDevices() #endif #endif + /*-----------------------------------------------------*\ + | Detect USB Serial devices | + \*-----------------------------------------------------*/ + BackgroundDetectUSBSerialDevices(detector_settings); + /*-----------------------------------------------------*\ | Detect other devices | \*-----------------------------------------------------*/ @@ -1323,6 +1343,51 @@ void DetectionManager::BackgroundDetectHIDDevicesWrapped(hid_device_info* hid_de #endif #endif +void DetectionManager::BackgroundDetectUSBSerialDevices(json& detector_settings) +{ + LOG_INFO("------------------------------------------------------"); + LOG_INFO("| Detecting USB Serial devices |"); + LOG_INFO("------------------------------------------------------"); + + std::vector serial_devices = find_usb_serial_ports(); + + for(std::size_t detector_idx = 0; detector_idx < usb_serial_detectors.size(); detector_idx++) + { + detection_string = usb_serial_detectors[detector_idx].name.c_str(); + + /*-------------------------------------------------*\ + | Check if this detector is enabled | + \*-------------------------------------------------*/ + bool this_device_enabled = true; + + if(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string)) + { + this_device_enabled = detector_settings["detectors"][detection_string]; + } + + LOG_DEBUG("[%s] %s is %s", DETECTIONMANAGER, detection_string.c_str(), ((this_device_enabled == true) ? "enabled" : "disabled")); + + if(this_device_enabled) + { + SignalUpdate(DETECTIONMANAGER_UPDATE_REASON_DETECTION_PROGRESS_CHANGED); + + for(std::size_t serial_device_idx = 0; serial_device_idx < serial_devices.size(); serial_device_idx++) + { + if((usb_serial_detectors[detector_idx].vid == serial_devices[serial_device_idx].vendor_id) + && (usb_serial_detectors[detector_idx].pid == serial_devices[serial_device_idx].product_id)) + { + DetectedControllers detected_controllers = usb_serial_detectors[detector_idx].function(&serial_devices[serial_device_idx], detection_string); + + for(std::size_t detected_controller_idx = 0; detected_controller_idx < detected_controllers.size(); detected_controller_idx++) + { + RegisterRGBController(detected_controllers[detected_controller_idx]); + } + } + } + } + } +} + void DetectionManager::BackgroundDetectOtherDevices(json& detector_settings) { LOG_INFO("------------------------------------------------------"); @@ -1366,6 +1431,7 @@ void DetectionManager::BackgroundDetectOtherDevices(json& detector_settings) + detection_percent_i2c_dram_count + detection_percent_i2c_pci_count + detection_percent_hid_count + + detection_percent_usb_serial_count + (unsigned int)detector_idx; detection_percent = (unsigned int)(100.0f * (detection_percent_numerator / detection_percent_denominator)); @@ -1912,6 +1978,21 @@ void DetectionManager::UpdateDetectorSettings() } } + /*-----------------------------------------------------*\ + | Loop through all the USB Serial detectors and see if | + | any need to be saved to the settings | + \*-----------------------------------------------------*/ + for(std::size_t usb_serial_detector_idx = 0; usb_serial_detector_idx < usb_serial_detectors.size(); usb_serial_detector_idx++) + { + detection_string = usb_serial_detectors[usb_serial_detector_idx].name.c_str(); + + if(!(detector_settings.contains("detectors") && detector_settings["detectors"].contains(detection_string))) + { + detector_settings["detectors"][detection_string] = usb_serial_detectors[usb_serial_detector_idx].enabled_by_default; + save_settings = true; + } + } + /*-----------------------------------------------------*\ | Loop through remaining detectors and see if any need | | to be saved to the settings | @@ -1974,6 +2055,11 @@ void DetectionManager::UpdateDetectorSettings() active_detector_names.insert(hid_wrapped_specific_detectors[hid_wrapped_detector_idx].name); } + for(std::size_t usb_serial_detector_idx = 0; usb_serial_detector_idx < usb_serial_detectors.size(); usb_serial_detector_idx++) + { + active_detector_names.insert(usb_serial_detectors[usb_serial_detector_idx].name); + } + for(std::size_t detector_idx = 0; detector_idx < device_detector_strings.size(); detector_idx++) { active_detector_names.insert(device_detector_strings[detector_idx]); diff --git a/DetectionManager.h b/DetectionManager.h index 90a6b0e9..9604e681 100644 --- a/DetectionManager.h +++ b/DetectionManager.h @@ -22,6 +22,7 @@ #include #include #include +#include "find_usb_serial_port.h" #include "hidapi_wrapper.h" #include "i2c_smbus.h" #include "RGBController.h" @@ -56,6 +57,7 @@ typedef std::function I2CPCIDeviceDetectorFunction; typedef std::function HIDDeviceDetectorFunction; typedef std::function HIDWrappedDeviceDetectorFunction; +typedef std::function USBSerialDeviceDetectorFunction; typedef std::function DynamicDetectorFunction; typedef std::function PreDetectionHookFunction; @@ -111,6 +113,15 @@ typedef struct bool enabled_by_default; } I2CDRAMDeviceDetectorBlock; +typedef struct +{ + std::string name; + USBSerialDeviceDetectorFunction function; + uint16_t vid; + uint16_t pid; + bool enabled_by_default; +} USBSerialDeviceDetectorBlock; + typedef struct { std::string name; @@ -183,6 +194,7 @@ public: void RegisterI2CDeviceDetector(std::string name, I2CDeviceDetectorFunction detector, bool enabled_by_default = true); void RegisterI2CDRAMDeviceDetector(std::string name, I2CDRAMDeviceDetectorFunction detector, uint16_t jedec_id, uint8_t dram_type, bool enabled_by_default = true); void RegisterI2CPCIDeviceDetector(std::string name, I2CPCIDeviceDetectorFunction detector, uint16_t ven_id, uint16_t dev_id, uint16_t subven_id, uint16_t subdev_id, uint8_t i2c_addr, bool enabled_by_default = true); + void RegisterUSBSerialDeviceDetector(std::string name, USBSerialDeviceDetectorFunction detector, int vid, int pid, bool enabled_by_default = true); /*-----------------------------------------------------*\ | Pre-Detection Hook Function Registration Function | @@ -266,6 +278,7 @@ private: std::vector hid_specific_detectors; std::vector hid_wrapped_generic_detectors; std::vector hid_wrapped_specific_detectors; + std::vector usb_serial_detectors; std::vector dynamic_detectors; std::vector dynamic_detector_strings; std::vector pre_detection_hooks; @@ -316,6 +329,7 @@ private: unsigned int detection_percent_i2c_count; unsigned int detection_percent_i2c_dram_count; unsigned int detection_percent_i2c_pci_count; + unsigned int detection_percent_usb_serial_count; unsigned int detection_percent_other_count; unsigned int detection_percent_denominator; std::string detection_string; @@ -355,6 +369,7 @@ private: void BackgroundDetectI2CDevices(json& detector_settings); void BackgroundDetectI2CDRAMDevices(json& detector_settings); void BackgroundDetectI2CPCIDevices(json& detector_settings); + void BackgroundDetectUSBSerialDevices(json& detector_settings); void BackgroundDetectOtherDevices(json& detector_settings); void BackgroundHIDExit(); void BackgroundHIDInit(); @@ -469,6 +484,15 @@ public: } }; +class USBSerialDeviceDetector +{ +public: + USBSerialDeviceDetector(std::string name, USBSerialDeviceDetectorFunction detector, int vid, int pid, bool enabled_by_default = true) + { + DetectionManager::get()->RegisterUSBSerialDeviceDetector(name, detector, vid, pid, enabled_by_default); + } +}; + class DynamicDetector { public: @@ -565,6 +589,8 @@ public: #define REGISTER_HID_WRAPPED_DETECTOR_P_ONLY_DISABLED(name, func, page) static HIDWrappedDeviceDetector device_detector_obj__##page(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, HID_USAGE_ANY, false) #define REGISTER_HID_WRAPPED_DETECTOR_PU_ONLY(name, func, page, usage) static HIDWrappedDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage) #define REGISTER_HID_WRAPPED_DETECTOR_PU_ONLY_DISABLED(name, func, page, usage) static HIDWrappedDeviceDetector device_detector_obj__##page##_##usage(name, func, HID_VID_ANY, HID_PID_ANY, HID_INTERFACE_ANY, page, usage, false) +#define REGISTER_USB_SERIAL_DETECTOR(name, func, vid, pid) static USBSerialDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid) +#define REGISTER_USB_SERIAL_DETECTOR_DISABLED(name, func, vid, pid) static USBSerialDeviceDetector device_detector_obj_##vid##pid(name, func, vid, pid, false) #define REGISTER_DYNAMIC_DETECTOR(name, func) static DynamicDetector device_detector_obj_##func(name, func) #define REGISTER_PRE_DETECTION_HOOK(func) static PreDetectionHook device_detector_obj_##func(func) diff --git a/serial_port/find_usb_serial_port.h b/serial_port/find_usb_serial_port.h index d15a0584..656eeef4 100644 --- a/serial_port/find_usb_serial_port.h +++ b/serial_port/find_usb_serial_port.h @@ -8,6 +8,8 @@ | SPDX-License-Identifier: GPL-2.0-or-later | \*---------------------------------------------------------*/ +#pragma once + #include #include