diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..13566b81b
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/OpenRGB.iml b/.idea/OpenRGB.iml
new file mode 100644
index 000000000..bc2cd8740
--- /dev/null
+++ b/.idea/OpenRGB.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 000000000..16eb6d542
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..35eb1ddfb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Controllers/A4TechController/A4Tech_Detector.cpp b/Controllers/A4TechController/A4TechDetector.cpp
similarity index 55%
rename from Controllers/A4TechController/A4Tech_Detector.cpp
rename to Controllers/A4TechController/A4TechDetector.cpp
index 5e576ff72..a537b2f55 100644
--- a/Controllers/A4TechController/A4Tech_Detector.cpp
+++ b/Controllers/A4TechController/A4TechDetector.cpp
@@ -1,3 +1,13 @@
+/*-------------------------------------------------------------------*\
+| A4TechDetector.cpp |
+| |
+| Driver for A4Tech Devices Detector |
+| |
+| Chris M (Dr_No) 30 Jun 2022 |
+| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
+| |
+\*-------------------------------------------------------------------*/
+
/*-----------------------------------------------------*\
| OpenRGB includes |
\*-----------------------------------------------------*/
@@ -5,10 +15,13 @@
#include "Detector.h"
#include "RGBController.h"
+
/*-----------------------------------------------------*\
| A4 Tech specific includes |
\*-----------------------------------------------------*/
#include "RGBController_BloodyMouse.h"
+#include "BloodyB820RController.h"
+#include "RGBController_BloodyB820R.h"
/*-----------------------------------------------------*\
| A4 Tech USB vendor ID |
@@ -29,6 +42,23 @@ void DetectA4TechMouseControllers(hid_device_info* info, const std::string& name
}
}
+void DetectBloodyB820R(hid_device_info* info, const std::string& name)
+{
+ hid_device* dev = hid_open_path(info->path);
+
+ if(dev)
+ {
+ BloodyB820RController* controller = new BloodyB820RController(dev, info->path);
+ RGBController_BloodyB820R* rgb_controller = new RGBController_BloodyB820R(controller);
+ rgb_controller->name = name;
+
+ ResourceManager::get()->RegisterRGBController(rgb_controller);
+ }
+}
+
+
REGISTER_HID_DETECTOR_IPU("Bloody W60 Pro", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W60_PRO_PID, 2, 0xFF33, 0x0529);
REGISTER_HID_DETECTOR_IPU("Bloody W90 Max", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_W90_MAX_PID, 2, 0xFF33, 0x053D);
REGISTER_HID_DETECTOR_IPU("Bloody MP 50RS", DetectA4TechMouseControllers, A4_TECH_VID, BLOODY_MP_50RS_PID, 2, 0xFFF2, 0x6009);
+
+REGISTER_HID_DETECTOR_IPU("A4Tech Bloody B820R", DetectBloodyB820R, A4_TECH_VID, BLOODY_B820R_PID, 2, 0xFF52, 0x0210);
diff --git a/Controllers/A4TechController/BloodyB820RController.cpp b/Controllers/A4TechController/BloodyB820RController.cpp
new file mode 100644
index 000000000..f8d3b070b
--- /dev/null
+++ b/Controllers/A4TechController/BloodyB820RController.cpp
@@ -0,0 +1,274 @@
+/*-------------------------------------------------------------------*\
+| BloodyB820RController.cpp |
+| |
+| Driver for A4Tech Bloody B820R Keyboard Controller |
+| |
+| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
+| |
+\*-------------------------------------------------------------------*/
+
+#include "LogManager.h"
+#include "BloodyB820RController.h"
+
+static uint8_t map_layout1[58][2] = {
+ {6},
+ {7},
+ {8},
+ {9},
+ {10},
+ {11},
+ {12},
+ {13},
+ {14},
+ {15},
+ {16},
+ {17},
+ {18},
+ {19},
+ {20},
+ {21},
+ {22},
+ {23},
+ {24},
+ {25},
+ {26},
+ {27},
+ {28},
+ {29},
+ {30},
+ {31},
+ {32},
+ {33},
+ {34},
+ {35},
+ {36},
+ {37},
+ {38},
+ {39},
+ {40},
+ {41},
+ {42},
+ {43},
+ {44},
+ {45},
+ {46},
+ {47},
+ {48},
+ {49},
+ {50},
+ {51},
+ {52},
+ {53},
+ {54},
+ {55},
+ {56},
+ {57},
+ {58},
+ {59},
+ {60},
+ {61},
+ {62},
+ {63}
+};
+
+static uint8_t map_layout2[58][2] = {
+ {6},
+ {7},
+ {8},
+ {9},
+ {10},
+ {11},
+ {12},
+ {13},
+ {14},
+ {15},
+ {16},
+ {17},
+ {18},
+ {19},
+ {20},
+ {21},
+ {22, 55},
+ {23},
+ {24},
+ {25},
+ {26},
+ {27},
+ {28},
+ {29},
+ {30},
+ {31},
+ {32},
+ {33},
+ {34},
+ {35},
+ {36},
+ {37},
+ {38},
+ {39},
+ {40},
+ {41},
+ {42},
+ {43},
+ {44},
+ {45},
+ {46},
+ {47},
+ {48},
+ {49},
+ {50},
+ {51},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {},
+ {}
+};
+
+
+BloodyB820RController::BloodyB820RController(hid_device* dev_handle, const char* path)
+{
+ dev = dev_handle;
+ location = path;
+
+ InitDevice();
+}
+
+BloodyB820RController::~BloodyB820RController()
+{
+ hid_close(dev);
+}
+
+std::string BloodyB820RController::GetDeviceName()
+{
+ const int szTemp = HID_MAX_STR;
+ wchar_t tmpName[szTemp];
+
+ hid_get_manufacturer_string(dev, tmpName, szTemp);
+ std::wstring wName = std::wstring(tmpName);
+ std::string name = std::string(wName.begin(), wName.end());
+
+ return name;
+}
+
+std::string BloodyB820RController::GetSerial()
+{
+ const int szTemp = HID_MAX_STR;
+ wchar_t tmpName[szTemp];
+
+ hid_get_serial_number_string(dev, tmpName, szTemp);
+ std::wstring wName = std::wstring(tmpName);
+ std::string serial = std::string(wName.begin(), wName.end());
+
+ return serial;
+}
+
+std::string BloodyB820RController::GetLocation()
+{
+ return("HID: " + location);
+}
+
+void BloodyB820RController::InitDevice()
+{
+ uint8_t buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00 };
+
+ hid_send_feature_report(dev, buffer, BLOODY_B820R_PACKET_SIZE);
+
+ buffer[BLOODY_B820R_MODE_BYTE] = 0;
+ buffer[BLOODY_B820R_DATA_BYTE] = 1;
+
+ hid_send_feature_report(dev, buffer, BLOODY_B820R_PACKET_SIZE);
+}
+
+void BloodyB820RController::ReleaseDevice()
+{
+ uint8_t buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00 };
+
+ hid_send_feature_report(dev, buffer, BLOODY_B820R_PACKET_SIZE);
+
+ buffer[BLOODY_B820R_MODE_BYTE] = 0;
+
+ hid_send_feature_report(dev, buffer, BLOODY_B820R_PACKET_SIZE);
+}
+
+void BloodyB820RController::SetMode(
+ int mode,
+ int speed,
+ unsigned char brightness,
+ unsigned char dir,
+ unsigned char red,
+ unsigned char green,
+ unsigned char blue) {
+
+
+ switch (mode) {
+ case BLOODY_B820R_MODE_DIRECT:
+ case BLOODY_B820R_MODE_INIT:
+ InitDevice();
+ break;
+ case BLOODY_B820R_MODE_RELEASE:
+ ReleaseDevice();
+ break;
+ default:
+ break;
+ }
+
+}
+
+void BloodyB820RController::SetLEDDirect(std::vector colors)
+{
+
+ uint8_t R1Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x07, 0x00, 0x00 };
+ uint8_t R2Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x08, 0x00, 0x00 };
+ uint8_t G1Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x09, 0x00, 0x00 };
+ uint8_t G2Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x0a, 0x00, 0x00 };
+ uint8_t B1Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x0b, 0x00, 0x00 };
+ uint8_t B2Buffer[BLOODY_B820R_PACKET_SIZE] = { 0x07, 0x03, 0x06, 0x0c, 0x00, 0x00 };
+
+ /*-----------------------------------------------------------------*\
+ | Set up Direct packet |
+ | packet_map is the index of the Key from full_matrix_map and |
+ | the value is the position in the direct packet buffer |
+ \*-----------------------------------------------------------------*/
+
+
+ for(size_t i = 0; i < colors.size(); i++)
+ {
+ RGBColor key = colors[i];
+
+
+ size_t layout1_length = sizeof(map_layout1) / sizeof(map_layout1[0]);
+
+ if (i < layout1_length) {
+ for(auto j : map_layout1[i]) {
+ if (j != 0) {
+ R1Buffer[j] = RGBGetRValue(key);
+ G1Buffer[j] = RGBGetGValue(key);
+ B1Buffer[j] = RGBGetBValue(key);
+ }
+ }
+ } else {
+ for(auto j : map_layout2[i - layout1_length]) {
+ if (j != 0) {
+ R2Buffer[j] = RGBGetRValue(key);
+ G2Buffer[j] = RGBGetGValue(key);
+ B2Buffer[j] = RGBGetBValue(key);
+ }
+ }
+ }
+ }
+
+ hid_send_feature_report(dev, R1Buffer, BLOODY_B820R_PACKET_SIZE);
+ hid_send_feature_report(dev, R2Buffer, BLOODY_B820R_PACKET_SIZE);
+ hid_send_feature_report(dev, G1Buffer, BLOODY_B820R_PACKET_SIZE);
+ hid_send_feature_report(dev, G2Buffer, BLOODY_B820R_PACKET_SIZE);
+ hid_send_feature_report(dev, B1Buffer, BLOODY_B820R_PACKET_SIZE);
+ hid_send_feature_report(dev, B2Buffer, BLOODY_B820R_PACKET_SIZE);
+}
\ No newline at end of file
diff --git a/Controllers/A4TechController/BloodyB820RController.h b/Controllers/A4TechController/BloodyB820RController.h
new file mode 100644
index 000000000..b3730c459
--- /dev/null
+++ b/Controllers/A4TechController/BloodyB820RController.h
@@ -0,0 +1,55 @@
+/*-------------------------------------------------------------------*\
+| BloodyB820RController.h |
+| |
+| Driver for A4Tech Bloody B820R Keyboard Controller |
+| |
+| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
+| |
+\*-------------------------------------------------------------------*/
+
+#include
+#include
+#include "RGBController.h"
+
+#pragma once
+
+#define NA 0xFFFFFFFF
+#define HID_MAX_STR 255
+
+#define BLOODY_B820R_PACKET_SIZE 64
+#define BLOODY_B820R_KEYCOUNT 104
+#define BLOODY_B820R_MODE_BYTE 3
+#define BLOODY_B820R_DATA_BYTE 8
+
+/*---------------------------------------------------------*\
+| Bloody B820R product ID |
+\*---------------------------------------------------------*/
+#define BLOODY_B820R_PID 0xFA10
+
+enum
+{
+ BLOODY_B820R_MODE_DIRECT = 0x01, // Direct LED control - Independently set LEDs in zone
+ BLOODY_B820R_MODE_RELEASE = 0x02, // Release the OpenRGB control from the keyboard
+ BLOODY_B820R_MODE_INIT = 0x03, // Regain the OpenRGB control of the keyboard
+ BLOODY_B820R_MODE_BREATHING = 0x04, // Set breathing RGB effect
+};
+
+class BloodyB820RController
+{
+public:
+ BloodyB820RController(hid_device* dev_handle, const char* path);
+ ~BloodyB820RController();
+
+ std::string GetDeviceName();
+ std::string GetSerial();
+ std::string GetLocation();
+
+ void SetLEDDirect(std::vector colors);
+ void SetMode(int mode, int speed, unsigned char brightness, unsigned char dir, unsigned char red, unsigned char green, unsigned char blue);
+private:
+ std::string location;
+ hid_device* dev;
+
+ void InitDevice();
+ void ReleaseDevice();
+};
diff --git a/Controllers/A4TechController/RGBController_BloodyB820R.cpp b/Controllers/A4TechController/RGBController_BloodyB820R.cpp
new file mode 100644
index 000000000..8b3c3646e
--- /dev/null
+++ b/Controllers/A4TechController/RGBController_BloodyB820R.cpp
@@ -0,0 +1,281 @@
+/*-------------------------------------------------------------------*\
+| RGBController_BloodyB820R.cpp |
+| |
+| Driver for A4Tech Bloody B820R Keyboard Controller |
+| |
+| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
+| |
+\*-------------------------------------------------------------------*/
+
+#include "RGBControllerKeyNames.h"
+#include "RGBController_BloodyB820R.h"
+
+static unsigned int matrix_map[6][21] =
+ {
+ {0, NA, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, NA, NA, NA, NA, 13, 14, 15},
+ {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36},
+ {37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57},
+ {58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, NA, NA, NA, NA, 71, 72, 73, NA},
+ {74, NA, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, NA, NA, 86, NA, 87, 88, 89, 90},
+ {91, 92, 93, 94, NA, NA, NA, NA, NA, NA, 95, 96, 97, 98, 99, 100, 101, 102, NA, 103, NA},
+ };
+
+static const char *led_names[] =
+ {
+ KEY_EN_ESCAPE, //00
+ KEY_EN_F1,
+ KEY_EN_F2,
+ KEY_EN_F3,
+ KEY_EN_F4,
+ KEY_EN_F5,
+ KEY_EN_F6,
+ KEY_EN_F7,
+ KEY_EN_F8,
+ KEY_EN_F9,
+ KEY_EN_F10, //10
+ KEY_EN_F11,
+ KEY_EN_F12,
+ KEY_EN_PRINT_SCREEN,
+ KEY_EN_SCROLL_LOCK,
+ KEY_EN_PAUSE_BREAK,
+
+ KEY_EN_BACK_TICK,
+ KEY_EN_1,
+ KEY_EN_2,
+ KEY_EN_3,
+ KEY_EN_4, //20
+ KEY_EN_5,
+ KEY_EN_6,
+ KEY_EN_7,
+ KEY_EN_8,
+ KEY_EN_9,
+ KEY_EN_0,
+ KEY_EN_MINUS,
+ KEY_EN_EQUALS,
+ KEY_EN_BACKSPACE,
+ KEY_EN_INSERT, //30
+ KEY_EN_HOME,
+ KEY_EN_PAGE_UP,
+ KEY_EN_NUMPAD_LOCK,
+ KEY_EN_NUMPAD_DIVIDE,
+ KEY_EN_NUMPAD_TIMES,
+ KEY_EN_NUMPAD_MINUS,
+
+ KEY_EN_TAB,
+ KEY_EN_Q,
+ KEY_EN_W,
+ KEY_EN_E,
+ KEY_EN_R,
+ KEY_EN_T,
+ KEY_EN_Y,
+ KEY_EN_U, //40
+ KEY_EN_I,
+ KEY_EN_O,
+ KEY_EN_P,
+ KEY_EN_LEFT_BRACKET,
+ KEY_EN_RIGHT_BRACKET,
+ KEY_EN_ANSI_BACK_SLASH,
+ KEY_EN_DELETE,
+ KEY_EN_END,
+ KEY_EN_PAGE_DOWN,
+ KEY_EN_NUMPAD_7,
+ KEY_EN_NUMPAD_8,
+ KEY_EN_NUMPAD_9,
+ KEY_EN_NUMPAD_PLUS,
+
+ KEY_EN_CAPS_LOCK, //50
+ KEY_EN_A,
+ KEY_EN_S,
+ KEY_EN_D,
+ KEY_EN_F,
+ KEY_EN_G,
+ KEY_EN_H,
+ KEY_EN_J,
+ KEY_EN_K,
+ KEY_EN_L,
+ KEY_EN_SEMICOLON, //60
+ KEY_EN_QUOTE,
+ KEY_EN_ANSI_ENTER,
+ KEY_EN_NUMPAD_4,
+ KEY_EN_NUMPAD_5,
+ KEY_EN_NUMPAD_6,
+
+ KEY_EN_LEFT_SHIFT,
+ KEY_EN_Z,
+ KEY_EN_X,
+ KEY_EN_C,
+ KEY_EN_V,
+ KEY_EN_B,
+ KEY_EN_N,
+ KEY_EN_M, //70
+ KEY_EN_COMMA,
+ KEY_EN_PERIOD,
+ KEY_EN_FORWARD_SLASH,
+ KEY_EN_RIGHT_SHIFT,
+ KEY_EN_UP_ARROW,
+ KEY_EN_NUMPAD_1,
+ KEY_EN_NUMPAD_2,
+ KEY_EN_NUMPAD_3,
+ KEY_EN_NUMPAD_ENTER,
+
+ KEY_EN_LEFT_CONTROL,
+ KEY_EN_LEFT_WINDOWS,
+ KEY_EN_LEFT_ALT,
+ KEY_EN_SPACE,
+ KEY_EN_RIGHT_ALT, //80
+ KEY_EN_RIGHT_FUNCTION,
+ KEY_EN_MENU,
+ KEY_EN_RIGHT_CONTROL,
+ KEY_EN_LEFT_ARROW,
+ KEY_EN_DOWN_ARROW,
+ KEY_EN_RIGHT_ARROW,
+ KEY_EN_NUMPAD_0,
+ KEY_EN_NUMPAD_PERIOD
+ };
+
+/**------------------------------------------------------------------*\
+ @name A4Tech Bloody B820R
+ @category Keyboard
+ @type USB
+ @save :x:
+ @direct :white_check_mark:
+ @effects :x:
+ @detectors A4TechDetector
+ @comment The A4Tech Bloody B820R keyboard controller currently
+ supports the full size (ANSI layout).
+\*-------------------------------------------------------------------*/
+
+RGBController_BloodyB820R::RGBController_BloodyB820R(BloodyB820RController *controller_ptr)
+{
+ controller = controller_ptr;
+
+ name = "Bloody B820R";
+ vendor = "A4Tech";
+ type = DEVICE_TYPE_KEYBOARD;
+ description = "Contributed by Mohammed Julfikar Ali Mahbub (github.com/o-julfikar)";
+ serial = controller->GetSerial();
+ location = controller->GetLocation();
+
+ mode Direct;
+ Direct.name = "Direct";
+ Direct.value = BLOODY_B820R_MODE_DIRECT;
+ Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
+ Direct.color_mode = MODE_COLORS_PER_LED;
+ modes.push_back(Direct);
+
+ mode Init;
+ Init.name = "Init";
+ Init.value = BLOODY_B820R_MODE_INIT;
+ Init.flags = MODE_FLAG_HAS_PER_LED_COLOR;
+ Init.color_mode = MODE_COLORS_PER_LED;
+ modes.push_back(Init);
+
+ mode Release;
+ Release.name = "Release Control";
+ Release.value = BLOODY_B820R_MODE_RELEASE;
+ Release.flags = 0;
+ Release.color_mode = MODE_COLORS_NONE;
+ modes.push_back(Release);
+
+ SetupZones();
+}
+
+RGBController_BloodyB820R::~RGBController_BloodyB820R()
+{
+ delete controller;
+}
+
+void RGBController_BloodyB820R::SetupZones()
+{
+ /*-------------------------------------------------*\
+ | Create the Keyboard zone and add the matrix map |
+ \*-------------------------------------------------*/
+ zone KB_zone;
+ KB_zone.name = ZONE_EN_KEYBOARD;
+ KB_zone.type = ZONE_TYPE_MATRIX;
+ KB_zone.leds_min = BLOODY_B820R_KEYCOUNT;
+ KB_zone.leds_max = BLOODY_B820R_KEYCOUNT;
+ KB_zone.leds_count = BLOODY_B820R_KEYCOUNT;
+
+ KB_zone.matrix_map = new matrix_map_type;
+ KB_zone.matrix_map->height = 6;
+ KB_zone.matrix_map->width = 21;
+ KB_zone.matrix_map->map = (unsigned int *)&matrix_map;
+ zones.push_back(KB_zone);
+
+ /*-------------------------------------------------*\
+ | Clear any existing color/LED configuration |
+ \*-------------------------------------------------*/
+ leds.clear();
+ colors.clear();
+
+ /*---------------------------------------------------------*\
+ | Set up zones |
+ \*---------------------------------------------------------*/
+ for(std::size_t zone_index = 0; zone_index < zones.size(); zone_index++)
+ {
+ for(unsigned int led_index = 0; led_index < zones[zone_index].leds_count; led_index++)
+ {
+ led new_led;
+ new_led.name = led_names[led_index];
+ new_led.value = led_index;
+ leds.push_back(new_led);
+ }
+ }
+
+ SetupColors();
+}
+
+void RGBController_BloodyB820R::ResizeZone(int /*zone*/, int /*new_size*/)
+{
+ /*---------------------------------------------------------*\
+ | This device does not support resizing zones |
+ \*---------------------------------------------------------*/
+}
+
+
+void RGBController_BloodyB820R::DeviceUpdateLEDs()
+{
+ controller->SetLEDDirect(colors);
+}
+
+void RGBController_BloodyB820R::UpdateZoneLEDs(int zone)
+{
+ std::vector colour;
+ for(size_t i = 0; i < zones[zone].leds_count; i++)
+ {
+ colour.push_back(zones[zone].colors[i]);
+ }
+
+ controller->SetLEDDirect(colour);
+}
+
+void RGBController_BloodyB820R::UpdateSingleLED(int led)
+{
+ std::vector colour;
+ colour.push_back(colors[led]);
+
+ controller->SetLEDDirect(colour);
+}
+
+void RGBController_BloodyB820R::DeviceUpdateMode()
+{
+ unsigned char red = 0;
+ unsigned char grn = 0;
+ unsigned char blu = 0;
+ unsigned char dir = 0;
+
+ if(modes[active_mode].color_mode & MODE_COLORS_MODE_SPECIFIC)
+ {
+ red = RGBGetRValue(modes[active_mode].colors[0]);
+ grn = RGBGetGValue(modes[active_mode].colors[0]);
+ blu = RGBGetBValue(modes[active_mode].colors[0]);
+ }
+
+ if(modes[active_mode].flags & MODE_FLAG_HAS_DIRECTION_LR)
+ {
+ dir = (unsigned char)modes[active_mode].direction;
+ }
+
+ controller->SetMode(modes[active_mode].value, modes[active_mode].speed, modes[active_mode].brightness, dir, red, grn, blu);
+}
diff --git a/Controllers/A4TechController/RGBController_BloodyB820R.h b/Controllers/A4TechController/RGBController_BloodyB820R.h
new file mode 100644
index 000000000..2e50110f4
--- /dev/null
+++ b/Controllers/A4TechController/RGBController_BloodyB820R.h
@@ -0,0 +1,33 @@
+/*-------------------------------------------------------------------*\
+| RGBController_BloodyB820R.h |
+| |
+| Driver for A4Tech Bloody B820R Keyboard Controller |
+| |
+| Mohammed Julfikar Ali Mahbub (o-julfikar) 01 Apr 2024 |
+| |
+\*-------------------------------------------------------------------*/
+
+#pragma once
+#include "LogManager.h"
+#include "RGBController.h"
+#include "BloodyB820RController.h"
+#include
+
+class RGBController_BloodyB820R : public RGBController
+{
+public:
+ RGBController_BloodyB820R(BloodyB820RController* controller_ptr);
+ ~RGBController_BloodyB820R();
+
+ void SetupZones();
+ void ResizeZone(int zone, int new_size);
+
+ void DeviceUpdateLEDs();
+ void UpdateZoneLEDs(int zone);
+ void UpdateSingleLED(int led);
+
+ void DeviceUpdateMode();
+
+private:
+ BloodyB820RController* controller;
+};