Updating libcmmk to call hid_write() with prepended 0x00 resolving #1673

This commit is contained in:
Chris M 2021-08-23 00:58:33 +00:00 committed by Adam Honse
parent 02ca3f32a0
commit 4f24250772
5 changed files with 220 additions and 181 deletions

View file

@ -114,16 +114,19 @@ ACTION=="add", SUBSYSTEM=="platform", KERNEL=="faustus", RUN+="/bin/chmod a+w /s
# Masterkeys SK650 #
#---------------------------------------------------------------#
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0101", TAG+="uaccess" #MM711
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0109", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0105", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="1011", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="1000", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="014d", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0047", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="003c", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0067", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0089", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="008d", TAG+="uaccess"
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0109", TAG+="uaccess" #MP750 XL
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0105", TAG+="uaccess" #MP750 M
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="1011", TAG+="uaccess" #ARGB
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="1000", TAG+="uaccess" #Small ARGB
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="004f", TAG+="uaccess" #RGB
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="014d", TAG+="uaccess" #Radeon 6000
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="003b", TAG+="uaccess" #Masterkeys Pro L
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0047", TAG+="uaccess" #Masterkeys Pro L White
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="003c", TAG+="uaccess" #Masterkeys Pro S
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0067", TAG+="uaccess" #Masterkeys MK750
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="0089", TAG+="uaccess" #Masterkeys SK630
SUBSYSTEMS=="usb", ATTR{idVendor}=="2516", ATTR{idProduct}=="008d", TAG+="uaccess" #Masterkeys SK650
#---------------------------------------------------------------#
# Corsair Hydro Series Devices #

View file

@ -25,7 +25,7 @@
#define COOLERMASTER_SMALL_ARGB_PID 0x1000
#define COOLERMASTER_RGB_PID 0x004F
#define COOLERMASTER_RADEON_6000_PID 0x014D
#define COOLERMASTER_MASTERKEYS_PRO_L_PID CMMK_USB_MASTERKEYS_MK750
#define COOLERMASTER_MASTERKEYS_PRO_L_PID CMMK_USB_MASTERKEYS_PRO_L
#define COOLERMASTER_MASTERKEYS_PRO_L_WHITE_PID CMMK_USB_MASTERKEYS_PRO_L_WHITE
#define COOLERMASTER_MASTERKEYS_PRO_S_PID CMMK_USB_MASTERKEYS_PRO_S
#define COOLERMASTER_MASTERKEYS_MK750_PID CMMK_USB_MASTERKEYS_MK750

View file

@ -14,141 +14,157 @@
using namespace std::chrono_literals;
#define CMMK_SPEED_MIN CMMK_SPEED0
#define CMMK_SPEED_MID CMMK_SPEED2
#define CMMK_SPEED_MAX CMMK_SPEED4
#define CMMK_MODE_FIRMWARE 0xFF
#define CMMK_MODE_MANUAL 0x7F
#define CMMK_SPEED_MIN CMMK_SPEED0
#define CMMK_SPEED_MID CMMK_SPEED2
#define CMMK_SPEED_MAX CMMK_SPEED4
#define CMMK_MODE_FIRMWARE 0xFF
#define CMMK_MODE_MANUAL 0x7F
RGBController_CMMKController::RGBController_CMMKController(CMMKController* cmmk_ctrl)
{
cmmk = cmmk_ctrl;
cmmk = cmmk_ctrl;
name = cmmk->GetDeviceName();
type = DEVICE_TYPE_KEYBOARD;
description = "Cooler Master MasterKeys Device";
version = cmmk->GetFirmwareVersion();
serial = "";
location = cmmk->GetLocation();
name = cmmk->GetDeviceName();
type = DEVICE_TYPE_KEYBOARD;
description = "Cooler Master MasterKeys Device";
version = cmmk->GetFirmwareVersion();
serial = "";
location = cmmk->GetLocation();
mode Direct;
Direct.name = "Direct";
Direct.value = CMMK_MODE_MANUAL;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
Direct.name = "Direct";
Direct.value = CMMK_MODE_MANUAL;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
mode Static;
Static.name = "Static";
Static.value = CMMK_EFFECT_FULLY_LIT;
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.colors_min = 1;
Static.colors_max = 1;
Static.name = "Static";
Static.value = CMMK_EFFECT_FULLY_LIT;
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
Static.colors_min = 1;
Static.colors_max = 1;
Static.colors.resize(1);
modes.push_back(Static);
mode Breathing;
Breathing.name = "Breathing";
Breathing.value = CMMK_EFFECT_BREATHE;
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Breathing.speed_min = 0x20;
Breathing.speed_max = 0x20;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.name = "Breathing";
Breathing.value = CMMK_EFFECT_BREATHE;
Breathing.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
Breathing.speed_min = CMMK_SPEED_MIN;
Breathing.speed_max = CMMK_SPEED_MAX;
Breathing.speed = CMMK_SPEED_MID;
Breathing.colors_min = 1;
Breathing.colors_max = 1;
Breathing.colors.resize(1);
modes.push_back(Breathing);
mode Cycle;
Cycle.name = "Spectrum Cycle";
Cycle.value = CMMK_EFFECT_CYCLE;
Cycle.flags = MODE_FLAG_HAS_SPEED;
Cycle.speed_min = CMMK_SPEED_MIN;
Cycle.speed_max = CMMK_SPEED_MAX;
Cycle.color_mode = MODE_COLORS_NONE;
Cycle.name = "Spectrum Cycle";
Cycle.value = CMMK_EFFECT_CYCLE;
Cycle.flags = MODE_FLAG_HAS_SPEED;
Cycle.color_mode = MODE_COLORS_NONE;
Cycle.speed_min = 2 * CMMK_SPEED_MIN; //Spectrum Cycle uses a unique speed range
Cycle.speed_max = 2 * CMMK_SPEED_MAX;
Cycle.speed = 2 * CMMK_SPEED_MID;
modes.push_back(Cycle);
mode Reactive;
Reactive.name = "Reactive";
Reactive.value = CMMK_EFFECT_SINGLE;
Reactive.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Reactive.speed_min = CMMK_SPEED_MIN;
Reactive.speed_max = CMMK_SPEED_MAX;
Reactive.color_mode = MODE_COLORS_MODE_SPECIFIC;
Reactive.colors_min = 2;
Reactive.colors_max = 2;
Reactive.name = "Reactive";
Reactive.value = CMMK_EFFECT_SINGLE;
Reactive.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Reactive.color_mode = MODE_COLORS_MODE_SPECIFIC;
Reactive.speed_min = CMMK_SPEED_MIN;
Reactive.speed_max = CMMK_SPEED_MAX;
Reactive.speed = CMMK_SPEED_MID;
Reactive.colors_min = 2;
Reactive.colors_max = 2;
Reactive.colors.resize(2);
modes.push_back(Reactive);
mode Wave;
Wave.name = "Rainbow Wave";
Wave.value = CMMK_EFFECT_WAVE;
Wave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
Wave.speed_min = CMMK_SPEED_MIN;
Wave.speed_max = CMMK_SPEED_MAX;
Wave.color_mode = MODE_COLORS_MODE_SPECIFIC;
Wave.colors_min = 1;
Wave.colors_max = 1;
Wave.name = "Rainbow Wave";
Wave.value = CMMK_EFFECT_WAVE;
Wave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD;
Wave.color_mode = MODE_COLORS_MODE_SPECIFIC;
Wave.speed_min = CMMK_SPEED_MIN;
Wave.speed_max = CMMK_SPEED_MAX;
Wave.speed = CMMK_SPEED_MID;
Wave.direction = MODE_DIRECTION_LEFT;
Wave.colors_min = 1;
Wave.colors_max = 1;
Wave.colors.resize(1);
modes.push_back(Wave);
mode Ripple;
Ripple.name = "Ripple Effect";
Ripple.value = CMMK_EFFECT_RIPPLE;
Ripple.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_SPEED;
Ripple.speed_min = CMMK_SPEED_MIN;
Ripple.speed_max = CMMK_SPEED_MAX;
Ripple.colors_min = 2;
Ripple.colors_max = 2;
Ripple.name = "Ripple Effect";
Ripple.value = CMMK_EFFECT_RIPPLE;
Ripple.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_SPEED;
Ripple.color_mode = MODE_COLORS_MODE_SPECIFIC;
Ripple.speed_min = CMMK_SPEED_MIN;
Ripple.speed_max = CMMK_SPEED_MAX;
Ripple.speed = CMMK_SPEED_MID;
Ripple.colors_min = 2;
Ripple.colors_max = 2;
Ripple.colors.resize(2);
modes.push_back(Ripple);
mode Cross;
Cross.name = "Cross";
Cross.value = CMMK_EFFECT_CROSS;
Cross.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Cross.speed_min = CMMK_SPEED_MIN;
Cross.speed_max = CMMK_SPEED_MAX;
Cross.colors_min = 2;
Cross.colors_max = 2;
Cross.name = "Cross";
Cross.value = CMMK_EFFECT_CROSS;
Cross.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Cross.color_mode = MODE_COLORS_MODE_SPECIFIC;
Cross.speed_min = CMMK_SPEED_MIN;
Cross.speed_max = CMMK_SPEED_MAX;
Cross.speed = CMMK_SPEED_MID;
Cross.colors_min = 2;
Cross.colors_max = 2;
Cross.colors.resize(2);
modes.push_back(Cross);
mode Raindrops;
Raindrops.name = "Raindrops";
Raindrops.value = CMMK_EFFECT_RAINDROPS;
Raindrops.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Raindrops.speed_min = CMMK_SPEED_MIN;
Raindrops.speed_max = CMMK_SPEED_MAX;
Raindrops.colors_min = 2;
Raindrops.colors_max = 2;
Raindrops.name = "Raindrops";
Raindrops.value = CMMK_EFFECT_RAINDROPS;
Raindrops.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Raindrops.color_mode = MODE_COLORS_MODE_SPECIFIC;
Raindrops.speed_min = CMMK_SPEED_MIN;
Raindrops.speed_max = CMMK_SPEED_MAX;
Raindrops.speed = CMMK_SPEED_MID;
Raindrops.colors_min = 2;
Raindrops.colors_max = 2;
Raindrops.colors.resize(2);
modes.push_back(Raindrops);
mode Stars;
Stars.name = "Starfield";
Stars.value = CMMK_EFFECT_STARS;
Stars.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Stars.speed_min = CMMK_SPEED_MIN;
Stars.speed_max = CMMK_SPEED_MAX;
Stars.colors_min = 2;
Stars.name = "Starfield";
Stars.value = CMMK_EFFECT_STARS;
Stars.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_SPEED;
Stars.color_mode = MODE_COLORS_MODE_SPECIFIC;
Stars.speed_min = CMMK_SPEED_MIN;
Stars.speed_max = CMMK_SPEED_MAX;
Stars.speed = CMMK_SPEED_MID;
Stars.colors_min = 2;
Stars.colors_max = 2;
Stars.colors.resize(2);
modes.push_back(Stars);
mode Snake;
Snake.name = "Snake";
Snake.value = CMMK_EFFECT_SNAKE;
Snake.flags = MODE_FLAG_HAS_SPEED;
Snake.speed_min = CMMK_SPEED_MIN;
Snake.speed_max = CMMK_SPEED_MAX;
Snake.name = "Snake";
Snake.value = CMMK_EFFECT_SNAKE;
Snake.flags = MODE_FLAG_HAS_SPEED;
Snake.color_mode = MODE_COLORS_NONE;
Snake.speed_min = CMMK_SPEED_MIN;
Snake.speed_max = CMMK_SPEED_MAX;
Snake.speed = CMMK_SPEED_MID;
modes.push_back(Snake);
mode FirmwareControl;
FirmwareControl.name = "Firmware Controlled";
FirmwareControl.value = 0xFF;
FirmwareControl.flags = 0;
FirmwareControl.name = "Firmware Controlled";
FirmwareControl.value = 0xFF;
FirmwareControl.flags = 0;
FirmwareControl.color_mode = MODE_COLORS_NONE;
modes.push_back(FirmwareControl);
SetupZones();

View file

@ -25,10 +25,13 @@
extern "C" {
#endif
#define BYTE_SIZE 8
#define CMMK_ROWS_MAX 7
#define CMMK_COLS_MAX 22
#define CMMK_KEYLIST_SIZE 256
#define CMMK_BUFFER_SIZE 65
/*
* If we have C99 support (which we do, because libusb-1.0 requires it...), define some handy
@ -65,7 +68,7 @@ enum cmmk_product {
CMMK_USB_MASTERKEYS_PRO_L = 0x003b,
CMMK_USB_MASTERKEYS_PRO_L_WHITE = 0x0047,
CMMK_USB_MASTERKEYS_PRO_S = 0x003c,
CMMK_USB_MASTERKEYS_MK750 = 0x0067,
CMMK_USB_MASTERKEYS_MK750 = 0x0067,
CMMK_USB_MASTERKEYS_SK630 = 0x0089,
CMMK_USB_MASTERKEYS_SK650 = 0x008d,
};

View file

@ -387,10 +387,10 @@ int cmmk_force_layout(struct cmmk *dev, int layout)
int cmmk_get_firmware_version(struct cmmk *dev, char *fw, size_t fwsiz)
{
unsigned char data[65] = { 0x01, 0x02 };
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x01, 0x02};
int r;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
@ -483,25 +483,25 @@ const char * cmmk_layout_to_str(int layout)
*/
int cmmk_set_control_mode(struct cmmk *dev, int mode)
{
unsigned char data[64] = {0x41, mode};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x41, mode};
return send_command(dev->dev, data, sizeof(data));
return send_command(dev->dev, data, CMMK_BUFFER_SIZE);
}
int cmmk_set_active_profile(struct cmmk *dev, int prof)
{
unsigned char setprof[64] = {0x51, 0x00, 0x00, 0x00, prof};
unsigned char setprof[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0x00, 0x00, 0x00, prof};
return send_command(dev->dev, setprof, sizeof(setprof));
return send_command(dev->dev, setprof, CMMK_BUFFER_SIZE);
}
int cmmk_get_active_profile(struct cmmk *dev, int *prof)
{
int r;
unsigned char getprof[64] = {0x52, 0x00};
unsigned char getprof[CMMK_BUFFER_SIZE] = {0x00, 0x52, 0x00};
if ((r = send_command(dev->dev, getprof, sizeof(getprof))) != 0)
if ((r = send_command(dev->dev, getprof, CMMK_BUFFER_SIZE)) != 0)
return r;
*prof = getprof[4];
@ -511,17 +511,17 @@ int cmmk_get_active_profile(struct cmmk *dev, int *prof)
int cmmk_save_active_profile(struct cmmk *dev)
{
unsigned char saveprof[64] = {0x50, 0x55};
unsigned char saveprof[CMMK_BUFFER_SIZE] = {0x00, 0x50, 0x55};
return send_command(dev->dev, saveprof, sizeof(saveprof));
return send_command(dev->dev, saveprof, CMMK_BUFFER_SIZE);
}
static int set_effect1(struct cmmk *dev, int eff)
{
unsigned char data[64] = {0x51, 0x28, 0x00, 0x00, eff};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0x28, 0x00, 0x00, eff};
return send_command(dev->dev, data, sizeof(data));
return send_command(dev->dev, data, CMMK_BUFFER_SIZE);
}
@ -532,25 +532,25 @@ static int set_effect(
struct rgb const *col1,
struct rgb const *col2)
{
unsigned char data[64] = {
0x51, 0x2c, dev->multilayer_mode, 0x00, eff, p1, p2, p3,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
unsigned char data[CMMK_BUFFER_SIZE] = {
0x00, 0x51, 0x2c, dev->multilayer_mode, 0x00, eff, p1,
p2, p3, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
if (col1 != NULL) {
data[10] = col1->R;
data[11] = col1->G;
data[12] = col1->B;
data[11] = col1->R;
data[12] = col1->G;
data[13] = col1->B;
}
if (col2 != NULL) {
data[13] = col2->R;
data[14] = col2->G;
data[15] = col2->B;
data[14] = col2->R;
data[15] = col2->G;
data[16] = col2->B;
}
memset(data + 16, 0xff, 48);
memset(data + 17, 0xff, 48);
return send_command(dev->dev, data, sizeof(data));
return send_command(dev->dev, data, CMMK_BUFFER_SIZE);
}
static int get_effect(
@ -562,13 +562,13 @@ static int get_effect(
{
int r;
unsigned char data[64] = {
0x52, 0x2c, dev->multilayer_mode, 0x00, eff
unsigned char data[CMMK_BUFFER_SIZE] = {
0x00, 0x52, 0x2c, dev->multilayer_mode, 0x00, eff
};
memset(data + 5, 0xff, 59);
memset(data + 6, 0xff, 59);
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
@ -612,10 +612,10 @@ int cmmk_set_active_effect(struct cmmk *dev, enum cmmk_effect_id eff)
int cmmk_get_active_effect(struct cmmk *dev, enum cmmk_effect_id *eff)
{
unsigned char data[64] = {0x52, 0x28};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x52, 0x28};
int r;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
@ -640,14 +640,14 @@ int cmmk_get_enabled_effects(
size_t siz,
size_t *n)
{
unsigned char data[64] = {0x52, 0x29};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x52, 0x29};
size_t i;
size_t j = 0;
int r;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
@ -664,16 +664,16 @@ int cmmk_set_enabled_effects(
enum cmmk_effect_id const *effs,
size_t n)
{
unsigned char data[64] = {0x51, 0x29};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0x29};
size_t i;
for (i = 0; i < n; ++i) {
data[4 + i] = effs[i];
data[5 + i] = effs[i];
}
while (i < 18) {
data[4 + i] = 0xff;
data[5 + i] = 0xff;
++i;
}
@ -808,7 +808,8 @@ int cmmk_set_effect_snake(struct cmmk *dev, struct cmmk_effect_snake const *eff)
int cmmk_set_customized_leds(struct cmmk *dev, struct cmmk_color_matrix const *colmap)
{
unsigned char data[64] = {0x51, 0xa8};
const unsigned char HEADER_SIZE = 5;
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0xa8};
int i;
int j;
@ -823,10 +824,10 @@ int cmmk_set_customized_leds(struct cmmk *dev, struct cmmk_color_matrix const *c
transpose_reverse(dev, colmap, linear);
for (i = 0; i < 8; ++i) {
data[2] = i*2;
data[3] = i*2;
for (j = 0; j < 16; ++j) {
int const offset = 4 + (j * 3);
int const offset = HEADER_SIZE + (j * 3);
data[offset] = nextcol->R;
data[offset + 1] = nextcol->G;
@ -835,7 +836,7 @@ int cmmk_set_customized_leds(struct cmmk *dev, struct cmmk_color_matrix const *c
++nextcol;
}
send_command(dev->dev, data, sizeof(data));
send_command(dev->dev, data, CMMK_BUFFER_SIZE);
}
return CMMK_OK;
@ -844,12 +845,13 @@ int cmmk_set_customized_leds(struct cmmk *dev, struct cmmk_color_matrix const *c
int cmmk_get_customized_leds(struct cmmk *dev, struct cmmk_color_matrix *colmap)
{
#ifdef _MSC_VER
struct rgb linear[CMMK_KEYLIST_SIZE] = { 0 };
struct rgb linear[CMMK_KEYLIST_SIZE] = { 0 };
#else
struct rgb linear[CMMK_KEYLIST_SIZE] = {};
struct rgb linear[CMMK_KEYLIST_SIZE] = {};
#endif
unsigned char data[64] = {0x52, 0xa8};
const unsigned char HEADER_SIZE = 5;
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x52, 0xa8};
int i;
int j;
@ -857,12 +859,12 @@ int cmmk_get_customized_leds(struct cmmk *dev, struct cmmk_color_matrix *colmap)
struct rgb *ptr = linear;
for (i = 0; i < 8; ++i) {
data[2] = i * 2;
data[3] = i * 2;
send_command(dev->dev, data, sizeof(data));
send_command(dev->dev, data, CMMK_BUFFER_SIZE);
for (j = 0; j < 16; ++j) {
int const offset = 4 + (j * 3);
int const offset = (HEADER_SIZE - 1) + (j * 3);
ptr->R = data[offset];
ptr->G = data[offset + 1];
@ -886,40 +888,47 @@ int cmmk_switch_multilayer(struct cmmk *dev, int active)
int cmmk_get_multilayer_map(struct cmmk *dev, struct cmmk_effect_matrix *effmap)
{
int r;
const unsigned char HEADER_SIZE = 9;
unsigned char data_size = CMMK_BUFFER_SIZE - HEADER_SIZE;
unsigned char data_size_in_bytes = data_size / BYTE_SIZE;
int r;
unsigned char data[64] = {0x52, 0xa0, 0x01, 0x00};
uint8_t linear[CMMK_KEYLIST_SIZE];
unsigned char data[CMMK_BUFFER_SIZE];
unsigned char header[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0xa0, 0x01, 0x00};
uint8_t linear[CMMK_KEYLIST_SIZE];
/* Call 1 */
data[4] = 0x00;
data[5] = 0x07;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x00;
data[6] = 0x07;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
memcpy(linear, data + 8, 56);
memcpy(linear, data + HEADER_SIZE - 1, data_size);
/* Call 2 */
data[4] = 0x07;
data[5] = 0x07;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x07;
data[6] = 0x07;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
memcpy(linear + 56, data + 8, 56);
memcpy(linear + 56, data + HEADER_SIZE - 1, data_size);
/* Call 3 */
data[4] = 0x0e;
data[5] = 0x01;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x0e;
data[6] = 0x01;
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
memcpy(linear + 112, data + 8, 8);
memcpy(linear + 112, data + HEADER_SIZE - 1, data_size);
transpose_effects(dev, linear, effmap);
@ -928,40 +937,47 @@ int cmmk_get_multilayer_map(struct cmmk *dev, struct cmmk_effect_matrix *effmap)
int cmmk_set_multilayer_map(struct cmmk *dev, struct cmmk_effect_matrix const *effmap)
{
const unsigned char HEADER_SIZE = 9;
unsigned char data_size = CMMK_BUFFER_SIZE - HEADER_SIZE;
unsigned char data_size_in_bytes = data_size / BYTE_SIZE;
int r;
unsigned char data[64] = {0x51, 0xa0, 0x01, 0x00};
uint8_t linear[CMMK_KEYLIST_SIZE] = {0};
unsigned char data[CMMK_BUFFER_SIZE];
unsigned char header[CMMK_BUFFER_SIZE] = {0x00, 0x51, 0xa0, 0x01, 0x00};
uint8_t linear[CMMK_KEYLIST_SIZE] = {0};
transpose_effects_reverse(dev, effmap, linear);
/* Call 1 */
data[4] = 0x00;
data[5] = 0x07;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x00;
data[6] = 0x07;
memcpy(data + 8, linear, 56);
memcpy(data + HEADER_SIZE, linear, data_size);
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
/* Call 2 */
data[4] = 0x07;
data[5] = 0x07;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x07;
data[6] = 0x07;
memcpy(data + 8, linear + 56, 56);
memcpy(data + HEADER_SIZE, linear + 56, data_size);
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
/* Call 3 */
data[4] = 0x0e;
data[5] = 0x01;
memcpy(data, header, HEADER_SIZE);
data[5] = 0x0e;
data[6] = 0x01;
memcpy(data + 8, linear + 112, 8);
memcpy(data + HEADER_SIZE, linear + 112, data_size);
if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
return r;
}
@ -980,7 +996,7 @@ int cmmk_lookup_key_id(struct cmmk *dev, int row, int col)
*/
int cmmk_set_single_key_by_id(struct cmmk *dev, int key, struct rgb const *color)
{
unsigned char data[64] = {0xc0, 0x01, 0x01, 0x00, key, color->R, color->G, color->B};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0xc0, 0x01, 0x01, 0x00, key, color->R, color->G, color->B};
return send_command(dev->dev, data, sizeof(data));
}
@ -1001,7 +1017,7 @@ int cmmk_set_single_key(struct cmmk *dev, int row, int col, struct rgb const *co
*/
int cmmk_set_all_single(struct cmmk *dev, struct rgb const *col)
{
unsigned char data[64] = {0xc0, 0x00, 0x00, 0x00, col->R, col->G, col->B};
unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0xc0, 0x00, 0x00, 0x00, col->R, col->G, col->B};
return send_command(dev->dev, data, sizeof(data));
}
@ -1019,7 +1035,7 @@ int cmmk_set_all_single(struct cmmk *dev, struct rgb const *col)
*/
int cmmk_set_leds(struct cmmk *dev, struct cmmk_color_matrix const *colmap)
{
unsigned char data[64];
unsigned char data[CMMK_BUFFER_SIZE];
int i;
int j;
@ -1034,13 +1050,14 @@ int cmmk_set_leds(struct cmmk *dev, struct cmmk_color_matrix const *colmap)
transpose_reverse(dev, colmap, linear);
for (i = 0; i < 8; ++i) {
data[0] = 0xc0;
data[1] = 0x02;
data[2] = i*2;
data[3] = 0x00;
data[0] = 0x00;
data[1] = 0xc0;
data[2] = 0x02;
data[3] = i*2;
data[4] = 0x00;
for (j = 0; j < 16; ++j) {
int const offset = 4 + (j * 3);
int const offset = 5 + (j * 3);
data[offset] = nextcol->R;
data[offset + 1] = nextcol->G;
@ -1049,7 +1066,7 @@ int cmmk_set_leds(struct cmmk *dev, struct cmmk_color_matrix const *colmap)
++nextcol;
}
send_command(dev->dev, data, sizeof(data));
send_command(dev->dev, data, CMMK_BUFFER_SIZE);
}
return CMMK_OK;