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}, +};