From f948d6e1d398b5bff6f1b409e09f5388c424e5e5 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 11 Jan 2026 03:08:04 -0600 Subject: [PATCH] Clean up some stuff in the Mountain keyboard controllers that violated conventions * Mountain60KeyboardController's detector was setting the name member directly, this is an outdated convention that breaks the RGBController rework, moved to a Controller member * Mountain60KeyboardController had some sort of HID redetect logic, this should not be part of the Controller, this will be handled in the future by HID hotplugging * Both MountainKeyboardControllers defined static variables to keep track of current mode, moved these to class members so that they won't conflict if two instances exist * Don't send any device updates as part of SetupZones --- .../Mountain60KeyboardController.cpp | 27 +++--- .../Mountain60KeyboardController.h | 14 +-- .../MountainKeyboardControllerDetect.cpp | 4 +- .../RGBController_Mountain60Keyboard.cpp | 85 +++++++------------ .../RGBController_Mountain60Keyboard.h | 5 +- .../RGBController_MountainKeyboard.cpp | 12 ++- .../RGBController_MountainKeyboard.h | 5 +- 7 files changed, 59 insertions(+), 93 deletions(-) diff --git a/Controllers/MountainKeyboardController/Mountain60KeyboardController.cpp b/Controllers/MountainKeyboardController/Mountain60KeyboardController.cpp index ebeab9288..46839495b 100644 --- a/Controllers/MountainKeyboardController/Mountain60KeyboardController.cpp +++ b/Controllers/MountainKeyboardController/Mountain60KeyboardController.cpp @@ -17,10 +17,11 @@ using namespace std::chrono_literals; -Mountain60KeyboardController::Mountain60KeyboardController(hid_device* dev_handle, const char* path) +Mountain60KeyboardController::Mountain60KeyboardController(hid_device* dev_handle, const char* path, std::string dev_name) { dev = dev_handle; location = path; + name = dev_name; } Mountain60KeyboardController::~Mountain60KeyboardController() @@ -33,9 +34,9 @@ std::string Mountain60KeyboardController::GetDeviceLocation() return("HID: " + location); } -const char* Mountain60KeyboardController::GetPath() +std::string Mountain60KeyboardController::GetNameString() { - return location.c_str(); + return(name); } std::string Mountain60KeyboardController::GetSerialString() @@ -51,12 +52,6 @@ std::string Mountain60KeyboardController::GetSerialString() return(StringUtils::wstring_to_string(serial_string)); } -void Mountain60KeyboardController::SetDevice(hid_device* new_device) -{ - hid_close(dev); - dev = new_device; -} - void Mountain60KeyboardController::UpdateData() { unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE]; @@ -85,17 +80,17 @@ void Mountain60KeyboardController::SendModeDetails(const mode* current_mode) usb_buf[0x04] = 0xEA; //constant data usb_buf[0x05] = current_mode->value; - usb_buf[0x07] = current_mode->value == MOUNTAIN60_KEYBOARD_MODE_STATIC ? 0x32 : current_mode->speed * 25; + usb_buf[0x07] = (current_mode->value == MOUNTAIN60_KEYBOARD_MODE_STATIC) ? 0x32 : current_mode->speed * 25; usb_buf[0x08] = current_mode->brightness * 25; - usb_buf[0x09] = current_mode->color_mode == MODE_COLORS_RANDOM ? MOUNTAIN60_KEYBOARD_COLOR_MODE_RAINBOW : color_mode[current_mode->colors.size() - 1]; + usb_buf[0x09] = (current_mode->color_mode == MODE_COLORS_RANDOM) ? (unsigned char)MOUNTAIN60_KEYBOARD_COLOR_MODE_RAINBOW : color_mode[current_mode->colors.size() - 1]; usb_buf[0x0A] = ConvertDirection(current_mode->direction,current_mode->value == MOUNTAIN60_KEYBOARD_MODE_TORNADO); - for (int idx = 0; idx < current_mode->colors.size(); ++idx) + for(std::size_t idx = 0; idx < current_mode->colors.size(); idx++) { - unsigned int offset = 12 + (idx * 3); - usb_buf[offset] = RGBGetRValue(current_mode->colors[idx]); - usb_buf[offset+1] = RGBGetGValue(current_mode->colors[idx]); - usb_buf[offset+2] = RGBGetBValue(current_mode->colors[idx]); + std::size_t offset = (12 + (idx * 3)); + usb_buf[offset] = RGBGetRValue(current_mode->colors[idx]); + usb_buf[offset+1] = RGBGetGValue(current_mode->colors[idx]); + usb_buf[offset+2] = RGBGetBValue(current_mode->colors[idx]); } hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE); diff --git a/Controllers/MountainKeyboardController/Mountain60KeyboardController.h b/Controllers/MountainKeyboardController/Mountain60KeyboardController.h index e50ace9d5..61fe1f924 100644 --- a/Controllers/MountainKeyboardController/Mountain60KeyboardController.h +++ b/Controllers/MountainKeyboardController/Mountain60KeyboardController.h @@ -69,27 +69,27 @@ enum class Mountain60KeyboardController { public: - Mountain60KeyboardController(hid_device* dev_handle, const char* path); + Mountain60KeyboardController(hid_device* dev_handle, const char* path, std::string dev_name); ~Mountain60KeyboardController(); - const char* GetPath(); - std::string GetSerialString(); std::string GetDeviceLocation(); + std::string GetNameString(); + std::string GetSerialString(); void UpdateData(); void SaveData(unsigned char mode_idx); void SelectMode(unsigned char mode_idx); - void SetDevice(hid_device * new_device); void SendModeDetails(const mode* current_mode); void SendDirect(unsigned int brightness,unsigned char* color_data, unsigned int color_count); private: + hid_device* dev; + std::string location; + std::string name; + unsigned char ConvertDirection(unsigned int direction, bool rotation); void SendDirectStartPacketCmd(unsigned int brightness); void SendDirectPacketCmd(unsigned char stream_control, unsigned char *data, unsigned int data_size); void SendDirectPacketFinishCmd(); - - hid_device* dev; - std::string location; }; diff --git a/Controllers/MountainKeyboardController/MountainKeyboardControllerDetect.cpp b/Controllers/MountainKeyboardController/MountainKeyboardControllerDetect.cpp index 26b322ce4..28e860c80 100644 --- a/Controllers/MountainKeyboardController/MountainKeyboardControllerDetect.cpp +++ b/Controllers/MountainKeyboardController/MountainKeyboardControllerDetect.cpp @@ -44,9 +44,9 @@ void DetectMountain60KeyboardControllers(hid_device_info* info, const std::strin if(dev) { - Mountain60KeyboardController* controller = new Mountain60KeyboardController(dev, info->path); + Mountain60KeyboardController* controller = new Mountain60KeyboardController(dev, info->path, name); RGBController_Mountain60Keyboard* rgb_controller = new RGBController_Mountain60Keyboard(controller); - rgb_controller->name = name; + ResourceManager::get()->RegisterRGBController(rgb_controller); } } diff --git a/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.cpp b/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.cpp index a25d5475c..aaf6cdb61 100644 --- a/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.cpp +++ b/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.cpp @@ -38,8 +38,8 @@ layout_values mountain60_layout = mountain60_keyboard_key_id_values, { /*------------------------------------------*\ - | No regional layout fix for the moment | - \*------------------------------------------*/ + | No regional layout fix for the moment | + \*------------------------------------------*/ }, }; @@ -182,10 +182,10 @@ keyboard_keymap_overlay_values mountain60_keyboard_overlay_no_numpad = RGBController_Mountain60Keyboard::RGBController_Mountain60Keyboard(Mountain60KeyboardController* controller_ptr) { controller = controller_ptr; - name = "Mountain Everest 60 Keyboard"; + name = controller->GetNameString(); vendor = "Mountain"; type = DEVICE_TYPE_KEYBOARD; - description = "Mountain Everest Keyboard 60%"; + description = "Mountain Everest Keyboard 60% Device"; location = controller->GetDeviceLocation(); serial = controller->GetSerialString(); @@ -329,6 +329,9 @@ RGBController_Mountain60Keyboard::RGBController_Mountain60Keyboard(Mountain60Key Yeti.colors.resize(2); modes.push_back(Yeti); + active_mode = 0; + current_mode_value = -1; + SetupZones(); /*-----------------------------------------------------*\ @@ -336,15 +339,12 @@ RGBController_Mountain60Keyboard::RGBController_Mountain60Keyboard(Mountain60Key | specific packet frequently so that leds get updated | \*-----------------------------------------------------*/ mountain_thread = new std::thread(&RGBController_Mountain60Keyboard::UpdateMountain, this); - mountaint_thread_running = true; - update_device = true; - found_device = true; + mountain_thread_running = true; } RGBController_Mountain60Keyboard::~RGBController_Mountain60Keyboard() { - update_device = false; - mountaint_thread_running = false; + mountain_thread_running = false; mountain_thread->join(); delete mountain_thread; @@ -391,9 +391,8 @@ void RGBController_Mountain60Keyboard::SetupZones() } zones.push_back(new_zone); + SetupColors(); - DeviceUpdateMode(); - update_device = true; } void RGBController_Mountain60Keyboard::ResizeZone(int /*zone*/, int /*new_size*/) @@ -405,26 +404,23 @@ void RGBController_Mountain60Keyboard::ResizeZone(int /*zone*/, int /*new_size*/ void RGBController_Mountain60Keyboard::DeviceUpdateLEDs() { - if (update_device.load()) + unsigned char* color_data = new unsigned char[(leds.size()*4)]; + + /*---------------------------------------------------------*\ + | Filling the color_data vector with progressive index | + | leaving space for RGB data | + \*---------------------------------------------------------*/ + for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++) { - unsigned char* color_data = new unsigned char[(leds.size()*4)]; - - /*---------------------------------------------------------*\ - | Filling the color_data vector with progressive index | - | leaving space for RGB data | - \*---------------------------------------------------------*/ - for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++) - { - const unsigned int idx = led_idx * 4; - color_data[idx] = leds[led_idx].value; - color_data[idx + 1] = RGBGetRValue(colors[led_idx]); - color_data[idx + 2] = RGBGetGValue(colors[led_idx]); - color_data[idx + 3] = RGBGetBValue(colors[led_idx]); - } - - controller->SendDirect(modes[active_mode].brightness, color_data, (leds.size()*4)); - delete[] color_data; + const unsigned int idx = led_idx * 4; + color_data[idx] = leds[led_idx].value; + color_data[idx + 1] = RGBGetRValue(colors[led_idx]); + color_data[idx + 2] = RGBGetGValue(colors[led_idx]); + color_data[idx + 3] = RGBGetBValue(colors[led_idx]); } + + controller->SendDirect(modes[active_mode].brightness, color_data, (leds.size()*4)); + delete[] color_data; } void RGBController_Mountain60Keyboard::UpdateZoneLEDs(int /*zone*/) @@ -439,15 +435,13 @@ void RGBController_Mountain60Keyboard::UpdateSingleLED(int /*led*/) void RGBController_Mountain60Keyboard::DeviceUpdateMode() { - static mode current_mode; - - if(modes[active_mode].value != current_mode.value && found_device.load()) + if(modes[active_mode].value != current_mode_value) { - current_mode = modes[active_mode]; + current_mode_value = modes[active_mode].value; controller->SelectMode(modes[active_mode].value); } - if(current_mode.color_mode != MODE_FLAG_HAS_PER_LED_COLOR && update_device.load()) + if(modes[active_mode].color_mode != MODE_FLAG_HAS_PER_LED_COLOR) { controller->SendModeDetails(&modes[active_mode]); } @@ -460,31 +454,10 @@ void RGBController_Mountain60Keyboard::DeviceSaveMode() void RGBController_Mountain60Keyboard::UpdateMountain() { - while (mountaint_thread_running.load()) + while(mountain_thread_running.load()) { std::this_thread::sleep_for(MOUNTAIN60_KEEP_LIVE_PERIOD); controller->UpdateData(); - - const char* Path = controller->GetPath(); - hid_device * rescan_device = hid_open_path(Path); - - if (rescan_device) - { - if (!found_device.load()) - { - controller->SetDevice(rescan_device); - found_device = true; - update_device = true; - } - } - else - { - if (found_device.load()) - { - update_device = false; - found_device = false; - } - } } } diff --git a/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.h b/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.h index 89a670836..00afae146 100644 --- a/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.h +++ b/Controllers/MountainKeyboardController/RGBController_Mountain60Keyboard.h @@ -44,8 +44,7 @@ public: private: Mountain60KeyboardController* controller; + int current_mode_value; std::thread* mountain_thread; - std::atomic mountaint_thread_running; - std::atomic update_device; - std::atomic found_device; + std::atomic mountain_thread_running; }; diff --git a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp index 36a13f4af..09e529bd7 100644 --- a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp +++ b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.cpp @@ -680,6 +680,9 @@ RGBController_MountainKeyboard::RGBController_MountainKeyboard(MountainKeyboardC Matrix.colors.resize(2); modes.push_back(Matrix); + prv_mode = -1; + active_mode = 0; + SetupZones(); } @@ -760,9 +763,8 @@ void RGBController_MountainKeyboard::SetupZones() } } } - SetupColors(); - DeviceUpdateMode(); + SetupColors(); } void RGBController_MountainKeyboard::ResizeZone(int /*zone*/, int /*new_size*/) @@ -1008,15 +1010,12 @@ void RGBController_MountainKeyboard::DeviceUpdate(const mode& current_mode) } } - void RGBController_MountainKeyboard::DeviceUpdateLEDs() { mode current_mode = modes[active_mode]; DeviceUpdate(current_mode); } - - void RGBController_MountainKeyboard::UpdateZoneLEDs(int /*zone*/) { DeviceUpdateLEDs(); @@ -1029,9 +1028,8 @@ void RGBController_MountainKeyboard::UpdateSingleLED(int /*led*/) void RGBController_MountainKeyboard::DeviceUpdateMode() { - static int prv_mode =-1; - mode current_mode = modes[active_mode]; + if(prv_mode != current_mode.value) { controller->SelectMode(current_mode.value); diff --git a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h index ef0fa12b2..fd6e3643c 100644 --- a/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h +++ b/Controllers/MountainKeyboardController/RGBController_MountainKeyboard.h @@ -53,8 +53,9 @@ public: private: MountainKeyboardController* controller; + int prv_mode; + unsigned char wheel_color[3]; + unsigned char ConvertDirection(unsigned int direction, bool rotation); void DeviceUpdate(const mode& current_mode); - - unsigned char wheel_color [3]; };