/*---------------------------------------------------------*\ | WootingV3KeyboardController.cpp | | | | Driver for Wooting keyboards with v3 firmware | | | | Diogo Trindade (diogotr7) 25 Dec 2025 | | | | This file is part of the OpenRGB project | | SPDX-License-Identifier: GPL-2.0-or-later | \*---------------------------------------------------------*/ #include #include "StringUtils.h" #include "WootingV3KeyboardController.h" #define WOOTING_V3_REPORT_SIZE 2046 #undef WOOTING_CONTROLLER_NAME #define WOOTING_CONTROLLER_NAME "[WootingTWO] " //Indicates an unused entry in matrix #define NA 0x7D //WootingTwo uses a 16bit color space typedef uint16_t R5G6B5_color; #define RGB888ToRGBcolor16(r, g, b) ((R5G6B5_color)((red & 0xF8) << 8 | (green & 0xFC) << 3 | (b & 0xF8) >> 3)) #define RGB32ToRGBcolor16(color32) ((R5G6B5_color)((color32 & 0xF8) << 8 | (color32 & 0xFC00) >> 5 | (color32 & 0xF80000) >> 19)) WootingV3KeyboardController::WootingV3KeyboardController(hid_device* dev_handle, const char *path, WOOTING_DEVICE_TYPE wooting_type, std::string dev_name) { dev = dev_handle; location = path; name = dev_name; this->wooting_type = wooting_type; /*---------------------------------------------------------*\ | Get device HID manufacturer and product strings | \*---------------------------------------------------------*/ const int szTemp = 256; wchar_t tmpName[szTemp]; hid_get_manufacturer_string(dev, tmpName, szTemp); vendor = std::string(StringUtils::wstring_to_string(tmpName)); hid_get_product_string(dev, tmpName, szTemp); description = std::string(StringUtils::wstring_to_string(tmpName)); SendInitialize(); } WootingV3KeyboardController::~WootingV3KeyboardController() { } void WootingV3KeyboardController::SendDirect(RGBColor* colors, uint8_t color_count) { uint8_t rgb_buffer[WOOTING_V3_REPORT_SIZE] = {0}; rgb_buffer[0] = 4; rgb_buffer[1] = 0xD1; rgb_buffer[2] = 0xDA; rgb_buffer[3] = WOOTING_RAW_COLORS_REPORT; for(std::size_t index = 0; index < color_count; index++) { size_t buffer_index = 4 + (index * 2); R5G6B5_color color16 = RGB32ToRGBcolor16(colors[index]); rgb_buffer[buffer_index] = color16 & 0xFF; rgb_buffer[buffer_index+1] = color16 >> 8; } uint16_t report_size = hid_write(dev, rgb_buffer, WOOTING_V3_REPORT_SIZE); LOG_DEBUG("%sSend buffer returned - %04i expected %04i", WOOTING_CONTROLLER_NAME, report_size, WOOTING_V3_REPORT_SIZE); }