Coolermaster keyboard device view

This commit is contained in:
Tam D 2023-08-30 03:57:45 +00:00 committed by Adam Honse
parent 962d2e8449
commit 879153d478
6 changed files with 345 additions and 155 deletions

View file

@ -1,10 +1,8 @@
/*-------------------------------------------------------------------*\
| CMMKController.cpp |
| |
| Driver for Coolermaster MasterKeys Keyboards |
| |
| Lukas N (chmod222) 28th Jun 2020 |
| Tam D (too.manyhobbies) 25th Apr 2021 |
| Lukas N (chmod222) 28th Jun 2020 |
| Tam D (too.manyhobbies) 25th Apr 2021 |
| |
\*-------------------------------------------------------------------*/
@ -29,28 +27,128 @@ CMMKController::CMMKController(hid_device* dev, hid_device_info* dev_info)
char buf[32] = {0};
cmmk_get_firmware_version(&cmmk_handle, buf, 32);
firmware_version = std::string(buf);
/*--------------------------------------------------------------*\
| Adjust the row count for keyboards without the front light bar |
| Adjust the column count for TKL keyboards (i.e. x30 vs x50) |
\*--------------------------------------------------------------*/
enum cmmk_product_type kb_type = cmmk_get_device_model(&cmmk_handle);
row_count = (kb_type == CMMK_PRODUCT_MASTERKEYS_MK750) ? CMMK_ROWS_MAX : CMMK_ROWS_MAX - 1;
switch(kb_type)
{
case CMMK_PRODUCT_MASTERKEYS_PRO_S:
case CMMK_PRODUCT_MASTERKEYS_SK630:
kb_size = KEYBOARD_SIZE_TKL;
row_count = CMMK_ROWS_MAX - 1;
column_count = CMMK_COLS_MAX - 4;
break;
case CMMK_PRODUCT_MASTERKEYS_PRO_L:
case CMMK_PRODUCT_MASTERKEYS_MK750:
case CMMK_PRODUCT_MASTERKEYS_SK650:
kb_size = KEYBOARD_SIZE_FULL;
row_count = CMMK_ROWS_MAX - 1;
column_count = CMMK_COLS_MAX;
break;
case CMMK_PRODUCT_MASTERKEYS_MK750:
default:
kb_size = KEYBOARD_SIZE_FULL;
row_count = CMMK_ROWS_MAX;
column_count = CMMK_COLS_MAX;
}
firmware_version = buf;
/*--------------------------------------------------------------*\
| Detect the keyboard version and set the appropriate layout. |
\*--------------------------------------------------------------*/
switch(firmware_version[0])
{
case '1':
kb_layout_type = KEYBOARD_LAYOUT_ANSI_QWERTY;
break;
/*--------------------------------------------------------------*\
| In case we need to handle different versions in the future. |
\*--------------------------------------------------------------*/
default:
kb_layout_type = KEYBOARD_LAYOUT_ISO_QWERTY;
break;
}
/*--------------------------------------------------------------*\
| Populate key offsets. |
\*--------------------------------------------------------------*/
keyboard_layout* kb_layout;
if(KEYBOARD_LAYOUT_ANSI_QWERTY == kb_layout_type)
{
switch (kb_type)
{
case CMMK_PRODUCT_MASTERKEYS_PRO_L:
kb_layout = &layout_ansi_pro_l;
break;
case CMMK_PRODUCT_MASTERKEYS_PRO_S:
kb_layout = &layout_ansi_pro_s;
break;
case CMMK_PRODUCT_MASTERKEYS_MK750:
kb_layout = &layout_ansi_mk750;
break;
case CMMK_PRODUCT_MASTERKEYS_SK630:
kb_layout = &layout_ansi_sk630;
break;
case CMMK_PRODUCT_MASTERKEYS_SK650:
kb_layout = &layout_ansi_sk650;
break;
default:
kb_layout = 0;
break;
}
}
else
{
switch (kb_type)
{
case CMMK_PRODUCT_MASTERKEYS_PRO_L:
kb_layout = &layout_iso_pro_l;
break;
case CMMK_PRODUCT_MASTERKEYS_PRO_S:
kb_layout = &layout_iso_pro_s;
break;
case CMMK_PRODUCT_MASTERKEYS_MK750:
kb_layout = &layout_iso_mk750;
break;
case CMMK_PRODUCT_MASTERKEYS_SK630:
kb_layout = &layout_iso_sk630;
break;
case CMMK_PRODUCT_MASTERKEYS_SK650:
kb_layout = &layout_iso_sk650;
break;
default:
kb_layout = 0;
break;
}
}
std::vector<int> keys_fn, keys_main, keys_num, keys_extra;
memset(&kb_transform, -1, row_count*column_count);
int key_idx = 0;
if(kb_layout)
{
for(int row = 0; row < row_count; row++)
{
for(int col = 0; col < column_count; col++)
{
int val = (*kb_layout)[row][col];
if (-1 != val)
{
kb_offsets.ansi.push_back(val);
kb_transform[row][col] = key_idx;
key_idx++;
}
}
}
}
}
CMMKController::~CMMKController()
@ -88,6 +186,26 @@ uint8_t CMMKController::GetColumnCount()
return column_count;
}
KEYBOARD_LAYOUT CMMKController::GetLayout()
{
return kb_layout_type;
}
keyboard_layout * CMMKController::GetTransform()
{
return &kb_transform;
}
KEYBOARD_SIZE CMMKController::GetSize()
{
return kb_size;
}
layout_values CMMKController::GetLayoutValues()
{
return kb_offsets;
}
void CMMKController::SetFirmwareControl()
{
ActivateMode(CMMK_FIRMWARE);
@ -146,31 +264,31 @@ void CMMKController::SetMode(cmmk_effect_wave eff)
void CMMKController::SetMode(cmmk_effect_ripple eff)
{
ActivateEffect(CMMK_EFFECT_RIPPLE);
cmmk_set_effect_ripple(&cmmk_handle, &eff);
cmmk_set_effect_ripple(&cmmk_handle, &eff);
}
void CMMKController::SetMode(cmmk_effect_cross eff)
{
ActivateEffect(CMMK_EFFECT_CROSS);
cmmk_set_effect_cross(&cmmk_handle, &eff);
cmmk_set_effect_cross(&cmmk_handle, &eff);
}
void CMMKController::SetMode(cmmk_effect_raindrops eff)
{
ActivateEffect(CMMK_EFFECT_RAINDROPS);
cmmk_set_effect_raindrops(&cmmk_handle, &eff);
cmmk_set_effect_raindrops(&cmmk_handle, &eff);
}
void CMMKController::SetMode(cmmk_effect_stars eff)
{
ActivateEffect(CMMK_EFFECT_STARS);
cmmk_set_effect_stars(&cmmk_handle, &eff);
cmmk_set_effect_stars(&cmmk_handle, &eff);
}
void CMMKController::SetMode(cmmk_effect_snake eff)
{
ActivateEffect(CMMK_EFFECT_SNAKE);
cmmk_set_effect_snake(&cmmk_handle, &eff);
cmmk_set_effect_snake(&cmmk_handle, &eff);
}
bool CMMKController::PositionValid(int y, int x)