diff --git a/include/libcmmk/libcmmk.h b/include/libcmmk/libcmmk.h
index 2a98cd4..e6fa787 100644
--- a/include/libcmmk/libcmmk.h
+++ b/include/libcmmk/libcmmk.h
@@ -25,10 +25,14 @@
extern "C" {
#endif
+#define BYTE_SIZE 8
+
#define CMMK_ROWS_MAX 7
#define CMMK_COLS_MAX 22
-#define CMMK_KEYLIST_SIZE 256
+#define CMMK_FW_SIZE 16
+#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
@@ -62,30 +66,31 @@ enum cmmk_result {
* Physical USB product IDs for general device type detection only.
*/
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_SK630 = 0x0089,
- CMMK_USB_MASTERKEYS_SK650 = 0x008d,
+ 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_SK630 = 0x0089,
+ CMMK_USB_MASTERKEYS_SK650 = 0x008d,
};
/*
* The specific layout of a given device.
*/
enum cmmk_layout {
- CMMK_LAYOUT_US_S,
- CMMK_LAYOUT_US_L, /* TODO */
- CMMK_LAYOUT_US_MK750, /* TODO */
- CMMK_LAYOUT_US_SK630, /* TODO */
- CMMK_LAYOUT_US_SK650, /* TODO */
- CMMK_LAYOUT_EU_S, /* TODO */
- CMMK_LAYOUT_EU_L,
- CMMK_LAYOUT_EU_MK750,
- CMMK_LAYOUT_EU_SK630,
- CMMK_LAYOUT_EU_SK650,
-
- CMMK_LAYOUT_INVAL /* end marker */
+ CMMK_LAYOUT_US_L,
+ CMMK_LAYOUT_US_L_WHITE,
+ CMMK_LAYOUT_US_S,
+ CMMK_LAYOUT_US_MK750, /* TODO empty keymap */
+ CMMK_LAYOUT_US_SK630,
+ CMMK_LAYOUT_US_SK650, /* TODO empty keymap */
+ CMMK_LAYOUT_EU_L,
+ CMMK_LAYOUT_EU_L_WHITE,
+ CMMK_LAYOUT_EU_S,
+ CMMK_LAYOUT_EU_MK750,
+ CMMK_LAYOUT_EU_SK630,
+ CMMK_LAYOUT_EU_SK650,
+ CMMK_LAYOUT_INVAL /* end marker */
};
/* Apparently can be anything in range [0x00, 0x50].
@@ -147,16 +152,17 @@ enum cmmk_effect_id {
* most of the time, library users really want the model and layout information separated,
* these two helpers abstract it away a bit. */
enum cmmk_layout_type {
- CMMK_LAYOUT_TYPE_ANSI,
- CMMK_LAYOUT_TYPE_ISO
+ CMMK_LAYOUT_TYPE_ANSI,
+ CMMK_LAYOUT_TYPE_ISO
};
enum cmmk_product_type {
- CMMK_PRODUCT_MASTERKEYS_PRO_L,
- CMMK_PRODUCT_MASTERKEYS_PRO_S,
- CMMK_PRODUCT_MASTERKEYS_MK750,
- CMMK_PRODUCT_MASTERKEYS_SK630,
- CMMK_PRODUCT_MASTERKEYS_SK650,
+ CMMK_PRODUCT_MASTERKEYS_PRO_L,
+ CMMK_PRODUCT_MASTERKEYS_PRO_L_WHITE,
+ CMMK_PRODUCT_MASTERKEYS_PRO_S,
+ CMMK_PRODUCT_MASTERKEYS_MK750,
+ CMMK_PRODUCT_MASTERKEYS_SK630,
+ CMMK_PRODUCT_MASTERKEYS_SK650,
};
/*
diff --git a/src/libcmmk.c b/src/libcmmk.c
index 086f2af..7a7d441 100644
--- a/src/libcmmk.c
+++ b/src/libcmmk.c
@@ -45,239 +45,239 @@ typedef int16_t keyboard_layout[CMMK_ROWS_MAX][CMMK_COLS_MAX];
#include "mappings/ansi/sk650.h"
static keyboard_layout const *keyboard_layouts[] = {
- [CMMK_LAYOUT_US_S] = &layout_ansi_pro_s,
- [CMMK_LAYOUT_US_L] = &layout_ansi_pro_l,
- [CMMK_LAYOUT_US_MK750] = &layout_ansi_mk750,
- [CMMK_LAYOUT_US_SK630] = &layout_ansi_sk630,
- [CMMK_LAYOUT_US_SK650] = &layout_ansi_sk650,
- [CMMK_LAYOUT_EU_S] = &layout_iso_pro_s,
- [CMMK_LAYOUT_EU_L] = &layout_iso_pro_l,
- [CMMK_LAYOUT_EU_MK750] = &layout_iso_mk750,
- [CMMK_LAYOUT_EU_SK630] = &layout_iso_sk630,
- [CMMK_LAYOUT_EU_SK650] = &layout_iso_sk650,
+ [CMMK_LAYOUT_US_S] = &layout_ansi_pro_s,
+ [CMMK_LAYOUT_US_L] = &layout_ansi_pro_l,
+ [CMMK_LAYOUT_US_MK750] = &layout_ansi_mk750,
+ [CMMK_LAYOUT_US_SK630] = &layout_ansi_sk630,
+ [CMMK_LAYOUT_US_SK650] = &layout_ansi_sk650,
+ [CMMK_LAYOUT_EU_S] = &layout_iso_pro_s,
+ [CMMK_LAYOUT_EU_L] = &layout_iso_pro_l,
+ [CMMK_LAYOUT_EU_MK750] = &layout_iso_mk750,
+ [CMMK_LAYOUT_EU_SK630] = &layout_iso_sk630,
+ [CMMK_LAYOUT_EU_SK650] = &layout_iso_sk650,
};
/* Some global definitions */
enum {
- CMMK_USB_VENDOR = 0x2516,
+ CMMK_USB_VENDOR = 0x2516,
- CMMK_USB_INTERFACE = 1,
+ CMMK_USB_INTERFACE = 1,
- CMMK_USB_EP_IN = 0x04,
- CMMK_USB_EP_OUT = 0x83
+ CMMK_USB_EP_IN = 0x04,
+ CMMK_USB_EP_OUT = 0x83
};
/* linear -> matrix */
static int transpose(struct cmmk *dev, struct rgb const *linear, struct cmmk_color_matrix *matrix)
{
- int i;
+ int i;
- for (i = 0; i < CMMK_KEYLIST_SIZE; ++i) {
- if (dev->rowmap[i] < 0 || dev->colmap[i] < 0) {
- continue;
- }
+ for (i = 0; i < CMMK_KEYLIST_SIZE; ++i) {
+ if (dev->rowmap[i] < 0 || dev->colmap[i] < 0) {
+ continue;
+ }
- matrix->data[dev->rowmap[i]][dev->colmap[i]] = linear[i];
- }
+ matrix->data[dev->rowmap[i]][dev->colmap[i]] = linear[i];
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
/* Too bad C doesn't have templates */
static int transpose_effects(struct cmmk *dev, uint8_t const *linear, struct cmmk_effect_matrix *matrix)
{
- int i;
+ int i;
- for (i = 0; i < CMMK_KEYLIST_SIZE; ++i) {
- if (dev->rowmap[i] < 0 || dev->colmap[i] < 0) {
- continue;
- }
+ for (i = 0; i < CMMK_KEYLIST_SIZE; ++i) {
+ if (dev->rowmap[i] < 0 || dev->colmap[i] < 0) {
+ continue;
+ }
- matrix->data[dev->rowmap[i]][dev->colmap[i]] = linear[i];
- }
+ matrix->data[dev->rowmap[i]][dev->colmap[i]] = linear[i];
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
/* matrix -> linear */
int transpose_reverse(struct cmmk *dev, struct cmmk_color_matrix const *matrix, struct rgb *linear)
{
- keyboard_layout const *layout = keyboard_layouts[dev->layout];
+ keyboard_layout const *layout = keyboard_layouts[dev->layout];
- int i;
- int j;
+ int i;
+ int j;
- for (i = 0; i < CMMK_ROWS_MAX; ++i) {
- for (j = 0; j < CMMK_COLS_MAX; ++j) {
- int pos = 0;
+ for (i = 0; i < CMMK_ROWS_MAX; ++i) {
+ for (j = 0; j < CMMK_COLS_MAX; ++j) {
+ int pos = 0;
- if ((pos = (*layout)[i][j]) < 0 || pos > CMMK_KEYLIST_SIZE) {
- continue;
- }
+ if ((pos = (*layout)[i][j]) < 0 || pos > CMMK_KEYLIST_SIZE) {
+ continue;
+ }
- linear[pos] = matrix->data[i][j];
- }
- }
+ linear[pos] = matrix->data[i][j];
+ }
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
int transpose_effects_reverse(struct cmmk *dev, struct cmmk_effect_matrix const *matrix, uint8_t *linear)
{
- keyboard_layout const *layout = keyboard_layouts[dev->layout];
+ keyboard_layout const *layout = keyboard_layouts[dev->layout];
- int i;
- int j;
+ int i;
+ int j;
- for (i = 0; i < CMMK_ROWS_MAX; ++i) {
- for (j = 0; j < CMMK_COLS_MAX; ++j) {
- int pos = 0;
+ for (i = 0; i < CMMK_ROWS_MAX; ++i) {
+ for (j = 0; j < CMMK_COLS_MAX; ++j) {
+ int pos = 0;
- if ((pos = (*layout)[i][j]) < 0 || pos > CMMK_KEYLIST_SIZE) {
- continue;
- }
+ if ((pos = (*layout)[i][j]) < 0 || pos > CMMK_KEYLIST_SIZE) {
+ continue;
+ }
- linear[pos] = matrix->data[i][j];
- }
- }
+ linear[pos] = matrix->data[i][j];
+ }
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
#ifdef CMMK_TRACE
static void hexdump(void const *ptr, size_t buflen)
{
- unsigned char *buf = (unsigned char*)ptr;
- size_t i;
- size_t j;
-
- printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
- for (i = 0; i < buflen; i += 16) {
- printf("%06lx: ", i);
-
- for (j = 0; j < 16; j++) {
- if (i+j < buflen) {
- printf("%02x ", buf[i+j]);
- } else {
- printf(" ");
- }
- }
-
- printf(" ");
-
- for (j = 0; j < 16; j++) {
- if (i+j < buflen) {
- printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
- }
- }
-
- printf("\n");
- }
+ unsigned char *buf = (unsigned char*)ptr;
+ size_t i;
+ size_t j;
+
+ printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
+ for (i = 0; i < buflen; i += 16) {
+ printf("%06lx: ", i);
+
+ for (j = 0; j < 16; j++) {
+ if (i+j < buflen) {
+ printf("%02x ", buf[i+j]);
+ } else {
+ printf(" ");
+ }
+ }
+
+ printf(" ");
+
+ for (j = 0; j < 16; j++) {
+ if (i+j < buflen) {
+ printf("%c", isprint(buf[i+j]) ? buf[i+j] : '.');
+ }
+ }
+
+ printf("\n");
+ }
}
#endif
static int send_command(hid_device *dev, unsigned char *data, size_t datasiz)
{
#ifdef CMMK_TRACE
- printf(">>\n");
- hexdump(data, datasiz);
+ printf(">>\n");
+ hexdump(data, datasiz);
#endif
- if (hid_write(dev, data, datasiz) < 0) {
- return CMMK_USB_COMM;
- }
+ if (hid_write(dev, data, datasiz) < 0) {
+ return CMMK_USB_COMM;
+ }
- if (hid_read(dev, data, datasiz) < 0) {
- return CMMK_USB_COMM;
- }
+ if (hid_read(dev, data, datasiz) < 0) {
+ return CMMK_USB_COMM;
+ }
#ifdef CMMK_TRACE
- printf("<<\n");
- hexdump(data, datasiz);
+ printf("<<\n");
+ hexdump(data, datasiz);
#endif
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_find_device(int *product)
{
- static int supported_devices[] = {
- CMMK_USB_MASTERKEYS_PRO_L,
- CMMK_USB_MASTERKEYS_PRO_S,
- CMMK_USB_MASTERKEYS_MK750,
- CMMK_USB_MASTERKEYS_PRO_L_WHITE,
- CMMK_USB_MASTERKEYS_SK630,
- CMMK_USB_MASTERKEYS_SK650,
- };
+ static int supported_devices[] = {
+ CMMK_USB_MASTERKEYS_PRO_L,
+ CMMK_USB_MASTERKEYS_PRO_S,
+ CMMK_USB_MASTERKEYS_MK750,
+ CMMK_USB_MASTERKEYS_PRO_L_WHITE,
+ CMMK_USB_MASTERKEYS_SK630,
+ CMMK_USB_MASTERKEYS_SK650,
+ };
- struct hid_device_info *list = NULL;
+ struct hid_device_info *list = NULL;
- int res = 1;
+ int res = 1;
- list = hid_enumerate(CMMK_USB_VENDOR, 0);
+ list = hid_enumerate(CMMK_USB_VENDOR, 0);
- for (struct hid_device_info *dev = list; dev != NULL; dev = dev->next) {
- for (size_t j = 0; j < (sizeof(supported_devices) / sizeof(supported_devices[0])); ++j) {
- if (dev->product_id == supported_devices[j] && dev->interface_number == CMMK_USB_INTERFACE) {
- *product = dev->product_id;
+ for (struct hid_device_info *dev = list; dev != NULL; dev = dev->next) {
+ for (size_t j = 0; j < (sizeof(supported_devices) / sizeof(supported_devices[0])); ++j) {
+ if (dev->product_id == supported_devices[j] && dev->interface_number == CMMK_USB_INTERFACE) {
+ *product = dev->product_id;
- res = 0;
+ res = 0;
- break;
- }
- }
- }
+ break;
+ }
+ }
+ }
- hid_free_enumeration(list);
+ hid_free_enumeration(list);
- return res;
+ return res;
}
static int cmmk_try_determine_layout(struct cmmk *dev, int product)
{
- char fw[16];
-
- enum cmmk_layout_type general_layout = CMMK_LAYOUT_TYPE_ANSI;
- enum cmmk_product_type device_model;
-
- if (cmmk_get_firmware_version(dev, fw, sizeof(fw)) == 0) {
- if (fw[0] == '1') {
- /* ANSI firmware */
- general_layout = CMMK_LAYOUT_TYPE_ANSI;
- } else {
- general_layout = CMMK_LAYOUT_TYPE_ISO;
- }
- }
-
- switch ((enum cmmk_product) product) {
- case CMMK_USB_MASTERKEYS_PRO_L:
- case CMMK_USB_MASTERKEYS_PRO_L_WHITE: device_model = CMMK_PRODUCT_MASTERKEYS_PRO_L; break;
- case CMMK_USB_MASTERKEYS_PRO_S: device_model = CMMK_PRODUCT_MASTERKEYS_PRO_S; break;
- case CMMK_USB_MASTERKEYS_MK750: device_model = CMMK_PRODUCT_MASTERKEYS_MK750; break;
- case CMMK_USB_MASTERKEYS_SK630: device_model = CMMK_PRODUCT_MASTERKEYS_SK630; break;
- case CMMK_USB_MASTERKEYS_SK650: device_model = CMMK_PRODUCT_MASTERKEYS_SK650; break;
- }
-
- if (general_layout == CMMK_LAYOUT_TYPE_ANSI) {
- switch (device_model) {
- case CMMK_PRODUCT_MASTERKEYS_PRO_L: return CMMK_LAYOUT_US_L;
- case CMMK_PRODUCT_MASTERKEYS_PRO_S: return CMMK_LAYOUT_US_S;
- case CMMK_PRODUCT_MASTERKEYS_MK750: return CMMK_LAYOUT_US_MK750;
- case CMMK_PRODUCT_MASTERKEYS_SK630: return CMMK_LAYOUT_US_SK630;
- case CMMK_PRODUCT_MASTERKEYS_SK650: return CMMK_LAYOUT_US_SK630;
- }
- } else {
- switch (device_model) {
- case CMMK_PRODUCT_MASTERKEYS_PRO_L: return CMMK_LAYOUT_EU_L;
- case CMMK_PRODUCT_MASTERKEYS_PRO_S: return CMMK_LAYOUT_EU_S;
- case CMMK_PRODUCT_MASTERKEYS_MK750: return CMMK_LAYOUT_EU_MK750;
- case CMMK_PRODUCT_MASTERKEYS_SK630: return CMMK_LAYOUT_EU_SK630;
- case CMMK_PRODUCT_MASTERKEYS_SK650: return CMMK_LAYOUT_EU_SK650;
- }
- }
-
- return -1;
+ char fw[CMMK_FW_SIZE];
+
+ enum cmmk_layout_type general_layout = CMMK_LAYOUT_TYPE_ANSI;
+ enum cmmk_product_type device_model = 0;
+
+ if (cmmk_get_firmware_version(dev, fw, CMMK_FW_SIZE) == 0) {
+ if (fw[0] == '1') {
+ /* ANSI firmware */
+ general_layout = CMMK_LAYOUT_TYPE_ANSI;
+ } else {
+ general_layout = CMMK_LAYOUT_TYPE_ISO;
+ }
+ }
+
+ switch ((enum cmmk_product) product) {
+ case CMMK_USB_MASTERKEYS_PRO_L:
+ case CMMK_USB_MASTERKEYS_PRO_L_WHITE: device_model = CMMK_PRODUCT_MASTERKEYS_PRO_L; break;
+ case CMMK_USB_MASTERKEYS_PRO_S: device_model = CMMK_PRODUCT_MASTERKEYS_PRO_S; break;
+ case CMMK_USB_MASTERKEYS_MK750: device_model = CMMK_PRODUCT_MASTERKEYS_MK750; break;
+ case CMMK_USB_MASTERKEYS_SK630: device_model = CMMK_PRODUCT_MASTERKEYS_SK630; break;
+ case CMMK_USB_MASTERKEYS_SK650: device_model = CMMK_PRODUCT_MASTERKEYS_SK650; break;
+ }
+
+ if (general_layout == CMMK_LAYOUT_TYPE_ANSI) {
+ switch (device_model) {
+ case CMMK_PRODUCT_MASTERKEYS_PRO_L: return CMMK_LAYOUT_US_L;
+ case CMMK_PRODUCT_MASTERKEYS_PRO_S: return CMMK_LAYOUT_US_S;
+ case CMMK_PRODUCT_MASTERKEYS_MK750: return CMMK_LAYOUT_US_MK750;
+ case CMMK_PRODUCT_MASTERKEYS_SK630: return CMMK_LAYOUT_US_SK630;
+ case CMMK_PRODUCT_MASTERKEYS_SK650: return CMMK_LAYOUT_US_SK630;
+ }
+ } else {
+ switch (device_model) {
+ case CMMK_PRODUCT_MASTERKEYS_PRO_L: return CMMK_LAYOUT_EU_L;
+ case CMMK_PRODUCT_MASTERKEYS_PRO_S: return CMMK_LAYOUT_EU_S;
+ case CMMK_PRODUCT_MASTERKEYS_MK750: return CMMK_LAYOUT_EU_MK750;
+ case CMMK_PRODUCT_MASTERKEYS_SK630: return CMMK_LAYOUT_EU_SK630;
+ case CMMK_PRODUCT_MASTERKEYS_SK650: return CMMK_LAYOUT_EU_SK650;
+ }
+ }
+
+ return -1;
}
/*
@@ -285,196 +285,218 @@ static int cmmk_try_determine_layout(struct cmmk *dev, int product)
*/
int cmmk_attach(struct cmmk *dev, int product, int layout)
{
- struct hid_device_info *list;
+ struct hid_device_info *list;
- list = hid_enumerate(CMMK_USB_VENDOR, product);
+ list = hid_enumerate(CMMK_USB_VENDOR, product);
- dev->product = product;
+ dev->product = product;
- for (struct hid_device_info *dev_info = list; dev_info != NULL; dev_info = dev_info->next) {
- if (dev_info->interface_number != CMMK_USB_INTERFACE) {
- continue;
- }
+ for (struct hid_device_info *dev_info = list; dev_info != NULL; dev_info = dev_info->next) {
+ if (dev_info->interface_number != CMMK_USB_INTERFACE) {
+ continue;
+ }
- dev->dev = hid_open_path(dev_info->path);
+ dev->dev = hid_open_path(dev_info->path);
- if (layout < 0) {
- if ((layout = cmmk_try_determine_layout(dev, product)) < 0) {
- hid_free_enumeration(list);
- cmmk_detach(dev);
+ if (layout < 0) {
+ if ((layout = cmmk_try_determine_layout(dev, product)) < 0) {
+ hid_free_enumeration(list);
+ cmmk_detach(dev);
- return CMMK_LAYOUT_DETECTION_FAILED;
- }
- }
+ return CMMK_LAYOUT_DETECTION_FAILED;
+ }
+ }
- break;
- }
-
- hid_free_enumeration(list);
+ break;
+ }
- if (dev->dev != NULL) {
- /*
- * Generate lookup map
- */
- cmmk_force_layout(dev, layout);
+ hid_free_enumeration(list);
- dev->multilayer_mode = 0;
+ if (dev->dev != NULL) {
+ /*
+ * Generate lookup map
+ */
+ cmmk_force_layout(dev, layout);
- return CMMK_OK;
- } else {
- return 1;
- }
+ dev->multilayer_mode = 0;
+
+ return CMMK_OK;
+ } else {
+ return 1;
+ }
}
int cmmk_attach_path(struct cmmk *dev, char const *path, int product, int layout)
{
- dev->dev = hid_open_path(path);
+ dev->dev = hid_open_path(path);
- if (dev->dev != NULL) {
- if (layout < 0) {
- layout = cmmk_try_determine_layout(dev, product);
- }
+ if (dev->dev != NULL) {
+ if (layout < 0) {
+ layout = cmmk_try_determine_layout(dev, product);
+ }
- /*
- * Generate lookup map
- */
- cmmk_force_layout(dev, layout);
+ /*
+ * Generate lookup map
+ */
+ cmmk_force_layout(dev, layout);
- dev->multilayer_mode = 0;
+ dev->multilayer_mode = 0;
- return CMMK_OK;
- } else {
- return 1;
- }
+ return CMMK_OK;
+ } else {
+ return 1;
+ }
}
int cmmk_detach(struct cmmk *dev)
{
- hid_close(dev->dev);
+ hid_close(dev->dev);
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_force_layout(struct cmmk *dev, int layout)
{
- int i;
- int j;
+ int i;
+ int j;
- keyboard_layout const *keyboard_layout;
+ keyboard_layout const *keyboard_layout;
- dev->layout = layout;
+ dev->layout = layout;
- memset(dev->rowmap, -1, sizeof(dev->rowmap));
- memset(dev->colmap, -1, sizeof(dev->colmap));
+ memset(dev->rowmap, -1, sizeof(dev->rowmap));
+ memset(dev->colmap, -1, sizeof(dev->colmap));
- keyboard_layout = keyboard_layouts[dev->layout];
+ keyboard_layout = keyboard_layouts[dev->layout];
- for (i = 0; i < CMMK_ROWS_MAX; ++i) {
- for (j = 0; j < CMMK_COLS_MAX; ++j) {
- int p = (*keyboard_layout)[i][j];
+ for (i = 0; i < CMMK_ROWS_MAX; ++i) {
+ for (j = 0; j < CMMK_COLS_MAX; ++j) {
+ int p = (*keyboard_layout)[i][j];
- if (p < 0) {
- continue;
- }
+ if (p < 0) {
+ continue;
+ }
- dev->rowmap[p] = i;
- dev->colmap[p] = j;
- }
- }
+ dev->rowmap[p] = i;
+ dev->colmap[p] = j;
+ }
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_get_firmware_version(struct cmmk *dev, char *fw, size_t fwsiz)
{
- unsigned char data[65] = { 0x01, 0x02 };
- int r;
+ unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x01, 0x02};
+ int r;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- /* Don't want to read past the response buffer */
- if (fwsiz > 60) {
- fwsiz = 60;
- }
+ /* Don't want to read past the response buffer */
+ if (fwsiz > 60) {
+ fwsiz = 60;
+ }
- strncpy(fw, (char *)data + 4, fwsiz);
+ memcpy(fw, (char *)data + 4, fwsiz);
- return CMMK_OK;
+ return CMMK_OK;
}
enum cmmk_product_type cmmk_get_device_model(struct cmmk *dev)
{
- switch (dev->layout) {
- case CMMK_LAYOUT_US_S:
- case CMMK_LAYOUT_EU_S:
- return CMMK_PRODUCT_MASTERKEYS_PRO_S;
+ switch (dev->layout) {
+
+ case CMMK_LAYOUT_US_L:
+ case CMMK_LAYOUT_EU_L:
+ return CMMK_PRODUCT_MASTERKEYS_PRO_L;
+
+ case CMMK_LAYOUT_US_L_WHITE:
+ case CMMK_LAYOUT_EU_L_WHITE:
+ return CMMK_PRODUCT_MASTERKEYS_PRO_L_WHITE;
+
+ case CMMK_LAYOUT_US_MK750:
+ case CMMK_LAYOUT_EU_MK750:
+ return CMMK_PRODUCT_MASTERKEYS_MK750;
+
+ case CMMK_LAYOUT_US_SK630:
+ case CMMK_LAYOUT_EU_SK630:
+ return CMMK_PRODUCT_MASTERKEYS_SK630;
+
+ case CMMK_LAYOUT_US_SK650:
+ case CMMK_LAYOUT_EU_SK650:
+ return CMMK_PRODUCT_MASTERKEYS_SK650;
- case CMMK_LAYOUT_US_L:
- case CMMK_LAYOUT_EU_L:
- return CMMK_PRODUCT_MASTERKEYS_PRO_L;
+ case CMMK_LAYOUT_US_S:
+ case CMMK_LAYOUT_EU_S:
+ return CMMK_PRODUCT_MASTERKEYS_PRO_S;
- case CMMK_LAYOUT_US_MK750:
- case CMMK_LAYOUT_EU_MK750:
- return CMMK_PRODUCT_MASTERKEYS_MK750;
- }
+ }
- assert(0 && "unreachable");
+ assert(0 && "unreachable");
}
enum cmmk_layout_type cmmk_get_device_layout(struct cmmk *dev)
{
- switch (dev->layout) {
- case CMMK_LAYOUT_US_S:
- case CMMK_LAYOUT_US_L:
- case CMMK_LAYOUT_US_MK750:
- return CMMK_LAYOUT_TYPE_ANSI;
-
- case CMMK_LAYOUT_EU_S:
- case CMMK_LAYOUT_EU_L:
- case CMMK_LAYOUT_EU_MK750:
- return CMMK_LAYOUT_TYPE_ISO;
- }
-
- assert(0 && "unreachable");
+ switch (dev->layout) {
+ case CMMK_LAYOUT_US_L:
+ case CMMK_LAYOUT_US_L_WHITE:
+ case CMMK_LAYOUT_US_S:
+ case CMMK_LAYOUT_US_MK750:
+ case CMMK_LAYOUT_US_SK630:
+ case CMMK_LAYOUT_US_SK650:
+ return CMMK_LAYOUT_TYPE_ANSI;
+
+ case CMMK_LAYOUT_EU_L:
+ case CMMK_LAYOUT_EU_L_WHITE:
+ case CMMK_LAYOUT_EU_S:
+ case CMMK_LAYOUT_EU_MK750:
+ case CMMK_LAYOUT_EU_SK630:
+ case CMMK_LAYOUT_EU_SK650:
+ return CMMK_LAYOUT_TYPE_ISO;
+ }
+
+ assert(0 && "unreachable");
}
const char * cmmk_product_to_str(int product)
{
- switch ((enum cmmk_product) product) {
- case CMMK_USB_MASTERKEYS_PRO_S: return "Cooler Master Masterkeys Pro S";
- case CMMK_USB_MASTERKEYS_PRO_L: return "Cooler Master Masterkeys Pro L";
- case CMMK_USB_MASTERKEYS_PRO_L_WHITE: return "Cooler Master Masterkeys Pro L White";
- case CMMK_USB_MASTERKEYS_MK750: return "Cooler Master Masterkeys MK750";
- case CMMK_USB_MASTERKEYS_SK630: return "Cooler Master Masterkeys SK630";
- case CMMK_USB_MASTERKEYS_SK650: return "Cooler Master Masterkeys SK650";
- }
-
- return "unknown";
+ switch ((enum cmmk_product) product) {
+ case CMMK_USB_MASTERKEYS_PRO_L: return "Cooler Master Masterkeys Pro L";
+ case CMMK_USB_MASTERKEYS_PRO_L_WHITE: return "Cooler Master Masterkeys Pro L White";
+ case CMMK_USB_MASTERKEYS_PRO_S: return "Cooler Master Masterkeys Pro S";
+ case CMMK_USB_MASTERKEYS_MK750: return "Cooler Master Masterkeys MK750";
+ case CMMK_USB_MASTERKEYS_SK630: return "Cooler Master Masterkeys SK630";
+ case CMMK_USB_MASTERKEYS_SK650: return "Cooler Master Masterkeys SK650";
+ }
+
+ return "unknown";
}
const char * cmmk_layout_to_str(int layout)
{
- switch ((enum cmmk_layout) layout) {
- case CMMK_LAYOUT_US_S:
- case CMMK_LAYOUT_US_L:
- case CMMK_LAYOUT_US_MK750:
- case CMMK_LAYOUT_US_SK630:
- case CMMK_LAYOUT_US_SK650:
- return "US";
- case CMMK_LAYOUT_EU_S:
- case CMMK_LAYOUT_EU_L:
- case CMMK_LAYOUT_EU_MK750:
- case CMMK_LAYOUT_EU_SK630:
- case CMMK_LAYOUT_EU_SK650:
- return "EU";
-
- case CMMK_LAYOUT_INVAL:
- return "invalid";
- }
-
- return "unknown";
+ switch ((enum cmmk_layout) layout) {
+ case CMMK_LAYOUT_US_L:
+ case CMMK_LAYOUT_US_L_WHITE:
+ case CMMK_LAYOUT_US_S:
+ case CMMK_LAYOUT_US_MK750:
+ case CMMK_LAYOUT_US_SK630:
+ case CMMK_LAYOUT_US_SK650:
+ return "US";
+ case CMMK_LAYOUT_EU_L:
+ case CMMK_LAYOUT_EU_L_WHITE:
+ case CMMK_LAYOUT_EU_S:
+ case CMMK_LAYOUT_EU_MK750:
+ case CMMK_LAYOUT_EU_SK630:
+ case CMMK_LAYOUT_EU_SK650:
+ return "EU";
+
+ case CMMK_LAYOUT_INVAL:
+ return "invalid";
+ }
+
+ return "unknown";
}
/*
@@ -483,496 +505,510 @@ 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;
+ 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)
- return r;
+ if ((r = send_command(dev->dev, getprof, CMMK_BUFFER_SIZE)) != 0)
+ return r;
- *prof = getprof[4];
+ *prof = getprof[4];
- return CMMK_OK;
+ return CMMK_OK;
}
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);
}
static int set_effect(
- struct cmmk *dev,
- int eff,
- int p1, int p2, int p3,
- struct rgb const *col1,
- struct rgb const *col2)
+ struct cmmk *dev,
+ int eff,
+ int p1, int p2, int p3,
+ 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;
- }
+ if (col1 != NULL) {
+ 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;
- }
+ if (col2 != NULL) {
+ 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(
- struct cmmk *dev,
- int eff,
- int *p1, int *p2, int *p3,
- struct rgb *col1,
- struct rgb *col2)
+ struct cmmk *dev,
+ int eff,
+ int *p1, int *p2, int *p3,
+ struct rgb *col1,
+ struct rgb *col2)
{
- int r;
+ 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) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- if (p1) {
- *p1 = data[5];
- }
+ if (p1) {
+ *p1 = data[5];
+ }
- if (p2) {
- *p2 = data[6];
- }
+ if (p2) {
+ *p2 = data[6];
+ }
- if (p3) {
- *p3 = data[7];
- }
+ if (p3) {
+ *p3 = data[7];
+ }
- if (col1) {
- col1->R = data[10];
- col1->G = data[11];
- col1->B = data[12];
- }
+ if (col1) {
+ col1->R = data[10];
+ col1->G = data[11];
+ col1->B = data[12];
+ }
- if (col2) {
- col2->R = data[13];
- col2->G = data[14];
- col2->B = data[15];
- }
+ if (col2) {
+ col2->R = data[13];
+ col2->G = data[14];
+ col2->B = data[15];
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_set_active_effect(struct cmmk *dev, enum cmmk_effect_id eff)
{
- if (eff < 0 || (eff > CMMK_EFFECT_CUSTOMIZED
- && eff != CMMK_EFFECT_OFF
- && eff != CMMK_EFFECT_MULTILAYER)) {
- return CMMK_INVAL;
- }
+ if (eff < 0 || (eff > CMMK_EFFECT_CUSTOMIZED
+ && eff != CMMK_EFFECT_OFF
+ && eff != CMMK_EFFECT_MULTILAYER)) {
+ return CMMK_INVAL;
+ }
- return set_effect1(dev, eff);
+ return set_effect1(dev, eff);
}
int cmmk_get_active_effect(struct cmmk *dev, enum cmmk_effect_id *eff)
{
- unsigned char data[64] = {0x52, 0x28};
- int r;
+ unsigned char data[CMMK_BUFFER_SIZE] = {0x00, 0x52, 0x28};
+ int r;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- *eff = data[4];
+ *eff = data[4];
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_get_effect(struct cmmk *dev, enum cmmk_effect_id id, struct cmmk_generic_effect *eff)
{
- return get_effect(dev, id, &eff->p1, &eff->p2, &eff->p3, &eff->color1, &eff->color2);
+ return get_effect(dev, id, &eff->p1, &eff->p2, &eff->p3, &eff->color1, &eff->color2);
}
int cmmk_set_effect(struct cmmk *dev, enum cmmk_effect_id id, struct cmmk_generic_effect const *eff)
{
- return set_effect(dev, id, eff->p1, eff->p2, eff->p3, &eff->color1, &eff->color2);
+ return set_effect(dev, id, eff->p1, eff->p2, eff->p3, &eff->color1, &eff->color2);
}
int cmmk_get_enabled_effects(
- struct cmmk *dev,
- enum cmmk_effect_id *effs,
- size_t siz,
- size_t *n)
+ struct cmmk *dev,
+ enum cmmk_effect_id *effs,
+ 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;
+ size_t i;
+ size_t j = 0;
- int r;
+ int r;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- for (i = 4; data[i] != 0xff && j < siz; ++i) {
- effs[j++] = data[i];
- }
+ for (i = 4; data[i] != 0xff && j < siz; ++i) {
+ effs[j++] = data[i];
+ }
- *n = j;
- return CMMK_OK;
+ *n = j;
+ return CMMK_OK;
}
int cmmk_set_enabled_effects(
- struct cmmk *dev,
- enum cmmk_effect_id const *effs,
- size_t n)
+ struct cmmk *dev,
+ 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;
+ size_t i;
- for (i = 0; i < n; ++i) {
- data[4 + i] = effs[i];
- }
+ for (i = 0; i < n; ++i) {
+ data[5 + i] = effs[i];
+ }
- while (i < 18) {
- data[4 + i] = 0xff;
+ while (i < 18) {
+ data[5 + i] = 0xff;
- ++i;
- }
+ ++i;
+ }
- return send_command(dev->dev, data, sizeof(data));;
+ return send_command(dev->dev, data, sizeof(data));;
}
int cmmk_get_effect_fully_lit(struct cmmk *dev, struct cmmk_effect_fully_lit *eff)
{
- return get_effect(dev, CMMK_EFFECT_FULLY_LIT, NULL, NULL, NULL, &eff->color, NULL);
+ return get_effect(dev, CMMK_EFFECT_FULLY_LIT, NULL, NULL, NULL, &eff->color, NULL);
}
int cmmk_set_effect_fully_lit(struct cmmk *dev, struct cmmk_effect_fully_lit const *eff)
{
- return set_effect(dev, CMMK_EFFECT_FULLY_LIT, 0x00, 0x00, 0xff, &eff->color, NULL);
+ return set_effect(dev, CMMK_EFFECT_FULLY_LIT, 0x00, 0x00, 0xff, &eff->color, NULL);
}
int cmmk_get_effect_breathe(struct cmmk *dev, struct cmmk_effect_breathe *eff)
{
- return get_effect(dev, CMMK_EFFECT_BREATHE, &eff->speed, NULL, NULL, &eff->color, NULL);
+ return get_effect(dev, CMMK_EFFECT_BREATHE, &eff->speed, NULL, NULL, &eff->color, NULL);
}
int cmmk_set_effect_breathe(struct cmmk *dev, struct cmmk_effect_breathe const *eff)
{
- return set_effect(dev, CMMK_EFFECT_BREATHE, eff->speed, 0x00, 0xff, &eff->color, NULL);
+ return set_effect(dev, CMMK_EFFECT_BREATHE, eff->speed, 0x00, 0xff, &eff->color, NULL);
}
int cmmk_get_effect_cycle(struct cmmk *dev, struct cmmk_effect_cycle *eff)
{
- return get_effect(dev, CMMK_EFFECT_CYCLE, &eff->speed, NULL, NULL, NULL, NULL);
+ return get_effect(dev, CMMK_EFFECT_CYCLE, &eff->speed, NULL, NULL, NULL, NULL);
}
int cmmk_set_effect_cycle(struct cmmk *dev, struct cmmk_effect_cycle const *eff)
{
- return set_effect(dev, CMMK_EFFECT_CYCLE, eff->speed, 0x00, 0xff, NULL, NULL);
+ return set_effect(dev, CMMK_EFFECT_CYCLE, eff->speed, 0x00, 0xff, NULL, NULL);
}
int cmmk_get_effect_single(struct cmmk *dev, struct cmmk_effect_single *eff)
{
- return get_effect(dev, CMMK_EFFECT_SINGLE, &eff->speed, NULL, NULL, &eff->active, &eff->rest);
+ return get_effect(dev, CMMK_EFFECT_SINGLE, &eff->speed, NULL, NULL, &eff->active, &eff->rest);
}
int cmmk_set_effect_single(struct cmmk *dev, struct cmmk_effect_single const *eff)
{
- return set_effect(dev, CMMK_EFFECT_SINGLE, eff->speed, 0x00, 0xff, &eff->active, &eff->rest);
+ return set_effect(dev, CMMK_EFFECT_SINGLE, eff->speed, 0x00, 0xff, &eff->active, &eff->rest);
}
int cmmk_get_effect_wave(struct cmmk *dev, struct cmmk_effect_wave *eff)
{
- int r;
- int p2;
+ int r;
+ int p2;
- if ((r = get_effect(dev, CMMK_EFFECT_WAVE, &eff->speed, &p2, NULL, &eff->start, NULL)) != 0) {
- return r;
- }
+ if ((r = get_effect(dev, CMMK_EFFECT_WAVE, &eff->speed, &p2, NULL, &eff->start, NULL)) != 0) {
+ return r;
+ }
- eff->direction = p2;
- return CMMK_OK;
+ eff->direction = p2;
+ return CMMK_OK;
}
int cmmk_set_effect_wave(struct cmmk *dev, struct cmmk_effect_wave const *eff)
{
- return set_effect(dev, CMMK_EFFECT_WAVE, eff->speed, eff->direction, 0xff, &eff->start, NULL);
+ return set_effect(dev, CMMK_EFFECT_WAVE, eff->speed, eff->direction, 0xff, &eff->start, NULL);
}
int cmmk_get_effect_ripple(struct cmmk *dev, struct cmmk_effect_ripple *eff)
{
- int r;
- int p2;
+ int r;
+ int p2;
- if ((r = get_effect(dev, CMMK_EFFECT_RIPPLE, &eff->speed, &p2, NULL, &eff->active, &eff->rest)) != 0) {
- return r;
- }
+ if ((r = get_effect(dev, CMMK_EFFECT_RIPPLE, &eff->speed, &p2, NULL, &eff->active, &eff->rest)) != 0) {
+ return r;
+ }
- eff->ripple_type = (p2 == 0x80) ? CMMK_RIPPLE_RANDOM_COLOR : CMMK_RIPPLE_GIVEN_COLOR;
+ eff->ripple_type = (p2 == 0x80) ? CMMK_RIPPLE_RANDOM_COLOR : CMMK_RIPPLE_GIVEN_COLOR;
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_set_effect_ripple(struct cmmk *dev, struct cmmk_effect_ripple const *eff)
{
- return set_effect(dev, CMMK_EFFECT_RIPPLE, eff->speed, eff->ripple_type ? 0x80 : 0x00, 0xff, &eff->active, &eff->rest);
+ return set_effect(dev, CMMK_EFFECT_RIPPLE, eff->speed, eff->ripple_type ? 0x80 : 0x00, 0xff, &eff->active, &eff->rest);
}
int cmmk_get_effect_cross(struct cmmk *dev, struct cmmk_effect_cross *eff)
{
- return get_effect(dev, CMMK_EFFECT_CROSS, &eff->speed, NULL, NULL, &eff->active, &eff->rest);
+ return get_effect(dev, CMMK_EFFECT_CROSS, &eff->speed, NULL, NULL, &eff->active, &eff->rest);
}
int cmmk_set_effect_cross(struct cmmk *dev, struct cmmk_effect_cross const *eff)
{
- return set_effect(dev, CMMK_EFFECT_CROSS, eff->speed, 0x00, 0xff, &eff->active, &eff->rest);
+ return set_effect(dev, CMMK_EFFECT_CROSS, eff->speed, 0x00, 0xff, &eff->active, &eff->rest);
}
int cmmk_get_effect_raindrops(struct cmmk *dev, struct cmmk_effect_raindrops *eff)
{
- return get_effect(dev, CMMK_EFFECT_RAINDROPS, &eff->speed, NULL, &eff->interval, &eff->active, &eff->rest);
+ return get_effect(dev, CMMK_EFFECT_RAINDROPS, &eff->speed, NULL, &eff->interval, &eff->active, &eff->rest);
}
int cmmk_set_effect_raindrops(struct cmmk *dev, struct cmmk_effect_raindrops const *eff)
{
- return set_effect(dev, CMMK_EFFECT_RAINDROPS, eff->speed, 0x00, eff->interval, &eff->active, &eff->rest);
+ return set_effect(dev, CMMK_EFFECT_RAINDROPS, eff->speed, 0x00, eff->interval, &eff->active, &eff->rest);
}
int cmmk_get_effect_stars(struct cmmk *dev, struct cmmk_effect_stars *eff)
{
- return get_effect(dev, CMMK_EFFECT_STARS, &eff->speed, NULL, &eff->interval, &eff->active, &eff->rest);
+ return get_effect(dev, CMMK_EFFECT_STARS, &eff->speed, NULL, &eff->interval, &eff->active, &eff->rest);
}
int cmmk_set_effect_stars(struct cmmk *dev, struct cmmk_effect_stars const *eff)
{
- return set_effect(dev, CMMK_EFFECT_STARS, eff->speed, 0x00, eff->interval, &eff->active, &eff->rest);
+ return set_effect(dev, CMMK_EFFECT_STARS, eff->speed, 0x00, eff->interval, &eff->active, &eff->rest);
}
int cmmk_get_effect_snake(struct cmmk *dev, struct cmmk_effect_snake *eff)
{
- return get_effect(dev, CMMK_EFFECT_SNAKE, &eff->speed, NULL, NULL, NULL, NULL);
+ return get_effect(dev, CMMK_EFFECT_SNAKE, &eff->speed, NULL, NULL, NULL, NULL);
}
int cmmk_set_effect_snake(struct cmmk *dev, struct cmmk_effect_snake const *eff)
{
- return set_effect(dev, CMMK_EFFECT_SNAKE, eff->speed, 0x00, 0xff, NULL, NULL);
+ return set_effect(dev, CMMK_EFFECT_SNAKE, eff->speed, 0x00, 0xff, NULL, NULL);
}
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;
+ int i;
+ int j;
#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
- struct rgb *nextcol = linear;
+ struct rgb *nextcol = linear;
- transpose_reverse(dev, colmap, linear);
+ transpose_reverse(dev, colmap, linear);
- for (i = 0; i < 8; ++i) {
- data[2] = i*2;
+ for (i = 0; i < 8; ++i) {
+ data[3] = i*2;
- for (j = 0; j < 16; ++j) {
- int const offset = 4 + (j * 3);
+ for (j = 0; j < 16; ++j) {
+ int const offset = HEADER_SIZE + (j * 3);
- data[offset] = nextcol->R;
- data[offset + 1] = nextcol->G;
- data[offset + 2] = nextcol->B;
+ data[offset] = nextcol->R;
+ data[offset + 1] = nextcol->G;
+ data[offset + 2] = nextcol->B;
- ++nextcol;
- }
+ ++nextcol;
+ }
- send_command(dev->dev, data, sizeof(data));
- }
+ send_command(dev->dev, data, CMMK_BUFFER_SIZE);
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
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;
+ int i;
+ int j;
- struct rgb *ptr = linear;
+ struct rgb *ptr = linear;
- for (i = 0; i < 8; ++i) {
- data[2] = i * 2;
+ for (i = 0; i < 8; ++i) {
+ 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);
+ for (j = 0; j < 16; ++j) {
+ int const offset = (HEADER_SIZE - 1) + (j * 3);
- ptr->R = data[offset];
- ptr->G = data[offset + 1];
- ptr->B = data[offset + 2];
+ ptr->R = data[offset];
+ ptr->G = data[offset + 1];
+ ptr->B = data[offset + 2];
- ++ptr;
- }
- }
+ ++ptr;
+ }
+ }
- transpose(dev, linear, colmap);
+ transpose(dev, linear, colmap);
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_switch_multilayer(struct cmmk *dev, int active)
{
- dev->multilayer_mode = active > 0;
+ dev->multilayer_mode = active > 0;
- return CMMK_OK;
+ return CMMK_OK;
}
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;
+ 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;
+ /* Call 1 */
+ memcpy(data, header, HEADER_SIZE);
+ data[5] = 0x00;
+ data[6] = 0x07;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ 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;
+ /* Call 2 */
+ memcpy(data, header, HEADER_SIZE);
+ data[5] = 0x07;
+ data[6] = 0x07;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ 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;
+ /* Call 3 */
+ memcpy(data, header, HEADER_SIZE);
+ data[5] = 0x0e;
+ data[6] = 0x01;
- if ((r = send_command(dev->dev, data, sizeof(data))) != 0) {
- return r;
- }
+ 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);
+ transpose_effects(dev, linear, effmap);
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_set_multilayer_map(struct cmmk *dev, struct cmmk_effect_matrix const *effmap)
{
- int r;
+ const unsigned char HEADER_SIZE = 9;
+ unsigned char data_size = CMMK_BUFFER_SIZE - HEADER_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);
+ transpose_effects_reverse(dev, effmap, linear);
- /* Call 1 */
- data[4] = 0x00;
- data[5] = 0x07;
+ /* Call 1 */
+ 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) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- /* Call 2 */
- data[4] = 0x07;
- data[5] = 0x07;
+ /* Call 2 */
+ 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) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- /* Call 3 */
- data[4] = 0x0e;
- data[5] = 0x01;
+ /* Call 3 */
+ 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) {
- return r;
- }
+ if ((r = send_command(dev->dev, data, CMMK_BUFFER_SIZE)) != 0) {
+ return r;
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
int cmmk_lookup_key_id(struct cmmk *dev, int row, int col)
{
- keyboard_layout const *layout = keyboard_layouts[dev->layout];
+ keyboard_layout const *layout = keyboard_layouts[dev->layout];
- return (*layout)[row][col];
+ return (*layout)[row][col];
}
/*
@@ -980,9 +1016,9 @@ 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));
+ return send_command(dev->dev, data, sizeof(data));
}
/*
@@ -990,9 +1026,9 @@ int cmmk_set_single_key_by_id(struct cmmk *dev, int key, struct rgb const *color
*/
int cmmk_set_single_key(struct cmmk *dev, int row, int col, struct rgb const *color)
{
- int key = cmmk_lookup_key_id(dev, row, col);
+ int key = cmmk_lookup_key_id(dev, row, col);
- return cmmk_set_single_key_by_id(dev, key, color);
+ return cmmk_set_single_key_by_id(dev, key, color);
}
@@ -1001,9 +1037,9 @@ 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));
+ return send_command(dev->dev, data, sizeof(data));
}
@@ -1019,40 +1055,41 @@ 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;
+ int i;
+ int j;
#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
- struct rgb *nextcol = linear;
+ struct rgb *nextcol = linear;
- transpose_reverse(dev, colmap, linear);
+ transpose_reverse(dev, colmap, linear);
- for (i = 0; i < 8; ++i) {
- data[0] = 0xc0;
- data[1] = 0x02;
- data[2] = i*2;
- data[3] = 0x00;
+ for (i = 0; i < 8; ++i) {
+ 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);
+ for (j = 0; j < 16; ++j) {
+ int const offset = 5 + (j * 3);
- data[offset] = nextcol->R;
- data[offset + 1] = nextcol->G;
- data[offset + 2] = nextcol->B;
+ data[offset] = nextcol->R;
+ data[offset + 1] = nextcol->G;
+ data[offset + 2] = nextcol->B;
- ++nextcol;
- }
+ ++nextcol;
+ }
- send_command(dev->dev, data, sizeof(data));
- }
+ send_command(dev->dev, data, CMMK_BUFFER_SIZE);
+ }
- return CMMK_OK;
+ return CMMK_OK;
}
@@ -1061,5 +1098,5 @@ int cmmk_set_leds(struct cmmk *dev, struct cmmk_color_matrix const *colmap)
*/
int cmmk_send_anything(struct cmmk *dev, unsigned char *data, size_t data_siz)
{
- return send_command(dev->dev, data, data_siz);
+ return send_command(dev->dev, data, data_siz);
}
diff --git a/src/mappings/ansi/sk630.h b/src/mappings/ansi/sk630.h
index 02454df..54de4c9 100644
--- a/src/mappings/ansi/sk630.h
+++ b/src/mappings/ansi/sk630.h
@@ -15,11 +15,30 @@
* License along with libcmmk. If not, see .
*/
static keyboard_layout layout_ansi_sk630 = {
+ /*
+ ESC F1 F2 F3 F4 XXX F5 F6 F7 F8 XXX F9 F10 F11 F12 PRN SCL PAU XXX XXX XXX XXX */
+ { 9, 33, 41, 49, 57, -1, 73, 81, 89, 97, -1, 105, 113, 121, 129, 137, 145, 153, -1, -1, -1, -1},
+
+ /*
+ ^ 1 2 3 4 5 6 7 8 9 0 ß ´ XXX BCK INS HOM PUP XXX XXX XXX` XXX */
+ {10, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, -1, 130, 138, 146, 154, -1, -1, -1, -1},
+
+ /*
+ TAB Q W E R T Z/Y U I O P { } XXX | DEL END PGDN XXX XXX XXX XXX */
+ {11, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99, 107, 115, -1, 131, 139, 147, 155, -1, -1, -1, -1},
+
+ /*
+ CAP A S D F G H J K L ; " XXX XXX ENT XXX XXX XXX XXX XXX XXX XXX */
+ {12, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, -1, -1, 132, -1, -1, -1, -1, -1, -1, -1},
+
+ /*
+ LSHFT Z X C V B N M < > ? XXX XXX XXX RSHFT XXX UP XXX XXX XXX XXX XXX */
+ {13, 29, 37, 45, 53, 61, 69, 77, 85, 93, 101, -1, -1, -1, 133, -1, 149, -1, -1, -1, -1, -1},
+
+ /*
+ LCTRL LWIN LALT XXX XXX XXX SPACE XXX XXX XXX RALT RWIN FN XXX RCTRL LEFT DOWN RIGHT XXX XXX XXX XXX */
+ {14, 22, 30, -1, -1, -1, 62, -1, -1, -1, 94, 102, 110, -1, 134, 142, 150, 158, -1, -1, -1, -1},
+
+ /* Bottom row does not exist */
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-};
\ No newline at end of file
+};
diff --git a/src/mappings/iso/pro_s.h b/src/mappings/iso/pro_s.h
index 8be3a74..6482f65 100644
--- a/src/mappings/iso/pro_s.h
+++ b/src/mappings/iso/pro_s.h
@@ -15,12 +15,23 @@
* License along with libcmmk. If not, see .
*/
static keyboard_layout layout_iso_pro_s = {
- /* TODO! */
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
- {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
-};
\ No newline at end of file
+/* ESC F1 F2 F3 F4 XXX F5 F6 F7 F8 XXX F9 F10 F11 F12 PRN SCRLK PAUSE XXX XXX XXX XXX */
+{ 96, 97, 98, 99, 104, -1, 105, 106, 112, 113, -1, 114, 67, 68, 69, 102, 103, 107, -1, -1, -1, -1},
+
+/* ` 1 2 3 4 5 6 7 8 9 0 - +/ˆ XXX BKSPC INSRT HOME PGUP NUMLK #/ #* #- */
+{ 0, 1, 8, 9, 16, 17, 24, 25, 32, 33, 40, 41, 48, -1, 49, 56, 57, 64, -1, -1, -1, -1},
+
+/* TAB Q W E R T Y U I O P [ ]/¨ XXX ENTER DELTE END PGDN #7 #8 #9 #+ */
+{ 2, 3, 10, 11, 18, 19, 26, 27, 34, 35, 42, 43, 50, -1, 52, 58, 59, 66, -1, -1, -1, -1},
+
+/* CAPLK A S D F G H J K L ; ' \ XXX XXX XXX XXX XXX #4 #5 #6 XXX */
+{ 4, 5, 12, 13, 20, 21, 28, 29, 36, 37, 44, 45, 89, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+
+/* LSHFT < Z X C V B N M , . / XXX XXX RSHFT XXX UP XXX #1 #2 #3 #ENTR */
+{ 6, 100, 7, 14, 15, 22, 23, 30, 31, 38, 39, 46, -1, -1, 47, -1, 61, -1, -1, -1, -1, -1},
+
+/* LCTRL LWIN LALT XXX XXX XXX SPACE XXX XXX XXX RALT RWIN FNC XXX RCTRL LEFT DOWN RIGHT #0 XXX #. XXX */
+{ 91, 90, 92, -1, -1, -1, 93, -1, -1, -1, 94, 95, 60, -1, 54, 63, 62, 70, -1, -1, -1, -1},
+
+{ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+};
diff --git a/src/mappings/pro_l.h b/src/mappings/pro_l.h
new file mode 100644
index 0000000..59aae42
--- /dev/null
+++ b/src/mappings/pro_l.h
@@ -0,0 +1,44 @@
+/*
+ * This file is part of libcmmk.
+ *
+ * libcmmk is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * libcmmk is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with libcmmk. If not, see .
+ */
+static keyboard_layout layout_ansi_pro_l = {
+ /*
+ ESC F1 F2 F3 F4 XXX F5 F6 F7 F8 XXX F9 F10 F11 F12 PRN SCL PAU P1 P2 P3 P4 */
+ {11, 22, 30, 25, 27, -1, 7, 51, 57, 62, -1, 86, 87, 83, 85, 79, 72, 101, 109, 117, 119, 0},
+
+ /*
+ ` 1 2 3 4 5 6 7 8 9 0 - = XXX BCK INS HOM PUP #LCK #/ #* #- */
+ {14, 15, 23, 31, 39, 38, 46, 47, 55, 63, 71, 70, 54, -1, 81, 3, 1, 2, 100, 108, 116, 118},
+
+ /*
+ TAB Q W E R T Y U I O P [ ] XXX \ DEL END PDN #7 #8 #9 #+ */
+ {9, 8, 16, 24, 32, 33, 41, 40, 48, 56, 64, 65, 49, -1, 82, 94, 92, 88, 96, 104, 112, 110},
+
+ /*
+ CAP A S D F G H J K L ; ' XXX XXX ENT XXX XXX XXX #4 #5 #6 XXX */
+ {17, 10, 18, 26, 34, 35, 43, 42, 50, 58, 66, 67, -1, -1, 84, -1, -1, -1, 97, 105, 113, -1},
+
+ /*
+ LSHFT XXX Z X C V B N M , . / XXX XXX RSHFT XXX UP XXX #1 #2 #3 #ENTER */
+ {73, -1, 12, 20, 28, 36, 37, 45, 44, 52, 60, 69, -1, -1, 74, -1, 80, -1, 98, 106, 114, 111},
+
+ /*
+ LCTRL LWIN LALT XXX XXX XXX SPACE XXX XXX XXX RALT RWIN FN XXX RCTRL LEFT DOWN RIGHT #0 XXX #. XXX */
+ {6, 90, 75, -1, -1, -1, 91, -1, -1, -1, 77, 78, 61, -1, 4, 95, 93, 5, 107, -1, 115, -1},
+
+ /* Bottom row does not exist */
+ {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
+};