Publish LumaOps source
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| Mountain60KeyboardController.cpp |
|
||||
| |
|
||||
| Driver for Mountain keyboard |
|
||||
| |
|
||||
| O'D.Sæzl Jan 2025 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <chrono>
|
||||
#include <cstring>
|
||||
#include <thread>
|
||||
#include "Mountain60KeyboardController.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
Mountain60KeyboardController::Mountain60KeyboardController(hid_device* dev_handle, const char* path, std::string dev_name)
|
||||
{
|
||||
dev = dev_handle;
|
||||
location = path;
|
||||
name = dev_name;
|
||||
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_RESET_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
Mountain60KeyboardController::~Mountain60KeyboardController()
|
||||
{
|
||||
hid_close(dev);
|
||||
}
|
||||
|
||||
std::string Mountain60KeyboardController::GetDeviceLocation()
|
||||
{
|
||||
return("HID: " + location);
|
||||
}
|
||||
|
||||
std::string Mountain60KeyboardController::GetNameString()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string Mountain60KeyboardController::GetSerialString()
|
||||
{
|
||||
wchar_t serial_string[128];
|
||||
int ret = hid_get_serial_number_string(dev, serial_string, 128);
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::UpdateData()
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_CHECK_NUMPAD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SendModeDetails(const mode* current_mode)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char color_mode [] = {MOUNTAIN60_KEYBOARD_COLOR_MODE_SINGLE,MOUNTAIN60_KEYBOARD_COLOR_MODE_DUAL};
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
usb_buf[0x05] = current_mode->value;
|
||||
usb_buf[0x07] = (current_mode->value == MOUNTAIN60_KEYBOARD_MODE_STATIC) ? 0x32 : current_mode->speed * 25;
|
||||
usb_buf[0x08] = current_mode->brightness * 25;
|
||||
usb_buf[0x09] = (current_mode->color_mode == MODE_COLORS_RANDOM) ? (unsigned char)MOUNTAIN60_KEYBOARD_COLOR_MODE_RAINBOW : color_mode[current_mode->colors.size() - 1];
|
||||
usb_buf[0x0A] = ConvertDirection(current_mode->direction,current_mode->value == MOUNTAIN60_KEYBOARD_MODE_TORNADO);
|
||||
|
||||
for(std::size_t idx = 0; idx < current_mode->colors.size(); idx++)
|
||||
{
|
||||
std::size_t offset = (12 + (idx * 3));
|
||||
usb_buf[offset] = RGBGetRValue(current_mode->colors[idx]);
|
||||
usb_buf[offset+1] = RGBGetGValue(current_mode->colors[idx]);
|
||||
usb_buf[offset+2] = RGBGetBValue(current_mode->colors[idx]);
|
||||
}
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
SaveData(current_mode->value);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SelectMode(unsigned char mode_idx)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_SELECT_MODE_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
usb_buf[0x05] = 0x01; //constant data
|
||||
|
||||
usb_buf[0x09] = mode_idx;
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SaveData(unsigned char mode_idx)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_SAVE_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
usb_buf[0x05] = mode_idx;
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SendDirectStartPacketCmd(unsigned int brightness)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_START_DIRECT_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
usb_buf[0x06] = 0xC0; //constant data
|
||||
|
||||
usb_buf[0x05] = brightness * 25;
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SendDirectPacketCmd(unsigned char stream_control, unsigned char *data, unsigned int data_size)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_HEADER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_MAP_DIRECT_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
usb_buf[0x05] = stream_control;
|
||||
|
||||
if(data_size <= MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memcpy(&usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_HEADER_SIZE],data,data_size);
|
||||
|
||||
if(data_size < MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
memset(&usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_HEADER_SIZE + data_size],0xFF,MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE-data_size);
|
||||
}
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SendDirectPacketFinishCmd()
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
unsigned char read[MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE];
|
||||
memset(usb_buf, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
|
||||
usb_buf[0x01] = MOUNTAIN60_KEYBOARD_END_DIRECT_CMD;
|
||||
usb_buf[0x02] = 0x46; //constant data
|
||||
usb_buf[0x03] = 0x23; //constant data
|
||||
usb_buf[0x04] = 0xEA; //constant data
|
||||
|
||||
hid_send_feature_report(dev, usb_buf, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
memset(read, 0x00, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
hid_get_feature_report(dev, read, MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
void Mountain60KeyboardController::SendDirect(unsigned int brightness, unsigned char* color_data, unsigned int data_size)
|
||||
{
|
||||
static unsigned char prv_buffer[MOUNTAIN60_KEYBOARD_TRANSFER_BUFFER_SIZE] = {0xFF};
|
||||
unsigned char *data_ptr = color_data;
|
||||
unsigned char *prv_data_ptr = prv_buffer;
|
||||
unsigned int data_len = data_size;
|
||||
unsigned char stream_control_flag = 0x0E;
|
||||
|
||||
SendDirectStartPacketCmd(brightness);
|
||||
|
||||
while(data_len>0)
|
||||
{
|
||||
if(data_len >= MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
Mountain60KeyboardController::SendDirectPacketCmd(stream_control_flag,data_ptr,MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
memcpy(prv_data_ptr,data_ptr,MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
|
||||
data_ptr += MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
prv_data_ptr += MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
data_len -= MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
stream_control_flag = 0x0A;
|
||||
Mountain60KeyboardController::SendDirectPacketCmd(stream_control_flag,data_ptr,data_len);
|
||||
memcpy(prv_data_ptr,data_ptr,data_len);
|
||||
data_len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
SendDirectPacketFinishCmd();
|
||||
}
|
||||
|
||||
unsigned char Mountain60KeyboardController::ConvertDirection(unsigned int direction, bool rotation)
|
||||
{
|
||||
unsigned char ret;
|
||||
switch(direction)
|
||||
{
|
||||
case MODE_DIRECTION_LEFT:
|
||||
{
|
||||
ret = rotation?MOUNTAIN60_KEYBOARD_DIRECTION_ANTICLK:MOUNTAIN60_KEYBOARD_DIRECTION_LEFT;
|
||||
}
|
||||
break;
|
||||
|
||||
case MODE_DIRECTION_RIGHT:
|
||||
{
|
||||
ret = rotation?MOUNTAIN60_KEYBOARD_DIRECTION_CLK:MOUNTAIN60_KEYBOARD_DIRECTION_RIGHT;
|
||||
}
|
||||
break;
|
||||
|
||||
case MODE_DIRECTION_UP:
|
||||
{
|
||||
ret = MOUNTAIN60_KEYBOARD_DIRECTION_UP;
|
||||
}
|
||||
break;
|
||||
|
||||
case MODE_DIRECTION_DOWN:
|
||||
{
|
||||
ret = MOUNTAIN60_KEYBOARD_DIRECTION_DOWN;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
ret = MOUNTAIN60_KEYBOARD_DIRECTION_LEFT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| MountainKeyboardController.h |
|
||||
| |
|
||||
| Driver for Mountain keyboard |
|
||||
| |
|
||||
| O'D.Sæzl Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <hidapi.h>
|
||||
#include "RGBController.h"
|
||||
|
||||
#define MOUNTAIN60_KEYBOARD_MAX_TRANSFER_COLORS 191
|
||||
#define MOUNTAIN60_KEYBOARD_TRANSFER_BUFFER_SIZE (4*MOUNTAIN60_KEYBOARD_MAX_TRANSFER_COLORS)
|
||||
|
||||
#define MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE 65
|
||||
#define MOUNTAIN60_KEYBOARD_USB_BUFFER_HEADER_SIZE 9
|
||||
|
||||
#define MOUNTAIN60_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE \
|
||||
(MOUNTAIN60_KEYBOARD_USB_BUFFER_SIZE-MOUNTAIN60_KEYBOARD_USB_BUFFER_HEADER_SIZE)
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN60_KEYBOARD_RESET_CMD = 0x03,
|
||||
MOUNTAIN60_KEYBOARD_CHECK_NUMPAD = 0x08,
|
||||
MOUNTAIN60_KEYBOARD_SELECT_MODE_CMD = 0x16,
|
||||
MOUNTAIN60_KEYBOARD_SEND_CMD = 0x17,
|
||||
MOUNTAIN60_KEYBOARD_START_DIRECT_CMD = 0x34,
|
||||
MOUNTAIN60_KEYBOARD_MAP_DIRECT_CMD = 0x35,
|
||||
MOUNTAIN60_KEYBOARD_END_DIRECT_CMD = 0x36,
|
||||
MOUNTAIN60_KEYBOARD_SAVE_CMD = 0x1A,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN60_KEYBOARD_MODE_STATIC = 0x01,
|
||||
MOUNTAIN60_KEYBOARD_MODE_COLOR_WAVE = 0x02,
|
||||
MOUNTAIN60_KEYBOARD_MODE_TORNADO = 0x03,
|
||||
MOUNTAIN60_KEYBOARD_MODE_BREATHING = 0x04,
|
||||
MOUNTAIN60_KEYBOARD_MODE_REACTIVE = 0x05,
|
||||
MOUNTAIN60_KEYBOARD_MODE_MATRIX = 0x06,
|
||||
MOUNTAIN60_KEYBOARD_MODE_CUSTOM = 0x07,
|
||||
MOUNTAIN60_KEYBOARD_MODE_YETI = 0x08,
|
||||
MOUNTAIN60_KEYBOARD_MODE_OFF = 0x09,
|
||||
MOUNTAIN60_KEYBOARD_MODE_INVALID = 0xFF,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN60_KEYBOARD_COLOR_MODE_RAINBOW = 0x02,
|
||||
MOUNTAIN60_KEYBOARD_COLOR_MODE_SINGLE = 0x00,
|
||||
MOUNTAIN60_KEYBOARD_COLOR_MODE_DUAL = 0x10
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_UP = 0x06,
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_DOWN = 0x02,
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_LEFT = 0x04,
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_RIGHT = 0x00,
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_ANTICLK = 0x0A,
|
||||
MOUNTAIN60_KEYBOARD_DIRECTION_CLK = 0x09,
|
||||
};
|
||||
|
||||
class Mountain60KeyboardController
|
||||
{
|
||||
public:
|
||||
Mountain60KeyboardController(hid_device* dev_handle, const char* path, std::string dev_name);
|
||||
~Mountain60KeyboardController();
|
||||
|
||||
std::string GetDeviceLocation();
|
||||
std::string GetNameString();
|
||||
std::string GetSerialString();
|
||||
|
||||
void UpdateData();
|
||||
void SaveData(unsigned char mode_idx);
|
||||
void SelectMode(unsigned char mode_idx);
|
||||
void SendModeDetails(const mode* current_mode);
|
||||
void SendDirect(unsigned int brightness,unsigned char* color_data, unsigned int color_count);
|
||||
|
||||
private:
|
||||
hid_device* dev;
|
||||
std::string location;
|
||||
std::string name;
|
||||
|
||||
unsigned char ConvertDirection(unsigned int direction, bool rotation);
|
||||
|
||||
void SendDirectStartPacketCmd(unsigned int brightness);
|
||||
void SendDirectPacketCmd(unsigned char stream_control, unsigned char *data, unsigned int data_size);
|
||||
void SendDirectPacketFinishCmd();
|
||||
};
|
||||
@@ -0,0 +1,580 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| MountainKeyboardController.cpp |
|
||||
| |
|
||||
| Driver for Mountain keyboard |
|
||||
| |
|
||||
| Wojciech Lazarski Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <chrono>
|
||||
#include <cstring>
|
||||
#include <thread>
|
||||
#include "MountainKeyboardController.h"
|
||||
#include "StringUtils.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
MountainKeyboardController::MountainKeyboardController(hid_device* dev_handle, const char* path, std::string dev_name)
|
||||
{
|
||||
dev = dev_handle;
|
||||
location = path;
|
||||
name = dev_name;
|
||||
}
|
||||
|
||||
MountainKeyboardController::~MountainKeyboardController()
|
||||
{
|
||||
hid_close(dev);
|
||||
}
|
||||
|
||||
std::string MountainKeyboardController::GetDeviceLocation()
|
||||
{
|
||||
return("HID: " + location);
|
||||
}
|
||||
|
||||
std::string MountainKeyboardController::GetNameString()
|
||||
{
|
||||
return(name);
|
||||
}
|
||||
|
||||
std::string MountainKeyboardController::GetSerialString()
|
||||
{
|
||||
wchar_t serial_string[128];
|
||||
int ret = hid_get_serial_number_string(dev, serial_string, 128);
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
return("");
|
||||
}
|
||||
|
||||
return(StringUtils::wstring_to_string(serial_string));
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SelectMode(unsigned char mode_idx)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SELECT_MODE_CMD;
|
||||
usb_buf[0x05] = 0x01; //constant data
|
||||
usb_buf[0x06] = mode_idx;
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(200ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SaveData(unsigned char mode_idx)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SAVE_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SAVE_MAGIC1;
|
||||
usb_buf[0x05] = mode_idx;
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(200ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendOffCmd()
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_OFF_MSG;
|
||||
|
||||
usb_buf[0x05] = 0xFF; //constant data
|
||||
usb_buf[0x06] = 0x64; // constant data
|
||||
|
||||
usb_buf[0x07] = 0xFF; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
|
||||
void MountainKeyboardController::SendColorStaticCmd(color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_STATIC_MSG;
|
||||
usb_buf[0x05] = 0xFF; // constant data
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
|
||||
usb_buf[0x0A] = setup.mode.one_color.r;
|
||||
usb_buf[0x0B] = setup.mode.one_color.g;
|
||||
usb_buf[0x0C] = setup.mode.one_color.b;
|
||||
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorWaveCmd(color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_COLOR_WAVE_MSG;
|
||||
|
||||
usb_buf[0x05] = setup.speed;
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
usb_buf[0x08] = setup.direction;
|
||||
|
||||
switch(setup.color_mode)
|
||||
{
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_DUAL:
|
||||
{
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x09] = 0x02; // constant data
|
||||
|
||||
usb_buf[0x0A] = 0x04; // constant data
|
||||
usb_buf[0x0B] = 0x19; // constant data
|
||||
|
||||
usb_buf[0x0C] = setup.mode.two_colors.r1;
|
||||
usb_buf[0x0D] = setup.mode.two_colors.g1;
|
||||
usb_buf[0x0E] = setup.mode.two_colors.b1;
|
||||
usb_buf[0x0F] = 0x32; // constant data
|
||||
usb_buf[0x10] = setup.mode.two_colors.r2;
|
||||
usb_buf[0x11] = setup.mode.two_colors.g2;
|
||||
usb_buf[0x12] = setup.mode.two_colors.b2;
|
||||
usb_buf[0x13] = 0x4B; // constant data
|
||||
usb_buf[0x14] = setup.mode.two_colors.r1;
|
||||
usb_buf[0x15] = setup.mode.two_colors.g1;
|
||||
usb_buf[0x16] = setup.mode.two_colors.b1;
|
||||
usb_buf[0x17] = 0x64; // constant data
|
||||
usb_buf[0x18] = setup.mode.two_colors.r2;
|
||||
usb_buf[0x19] = setup.mode.two_colors.g2;
|
||||
usb_buf[0x1A] = setup.mode.two_colors.b2;
|
||||
}
|
||||
break;
|
||||
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_SINGLE:
|
||||
{
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x09] = 0x00; // constant data
|
||||
|
||||
usb_buf[0x0A] = 0x01; // constant data
|
||||
usb_buf[0x0B] = 0x64; // constant data
|
||||
|
||||
usb_buf[0x0C] = setup.mode.one_color.r;
|
||||
usb_buf[0x0D] = setup.mode.one_color.g;
|
||||
usb_buf[0x0E] = setup.mode.one_color.b;
|
||||
usb_buf[0x0F] = 0xFF; // constant data
|
||||
}
|
||||
break;
|
||||
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_RAINBOW:
|
||||
{
|
||||
usb_buf[0x07] = 0x02; // constant data
|
||||
usb_buf[0x09] = 0x02; // constant data
|
||||
|
||||
usb_buf[0x0B] = 0xFF; // constant data
|
||||
usb_buf[0x0F] = 0xFF; // constant data
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorTornadoCmd(color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_TORNADO_MSG;
|
||||
|
||||
usb_buf[0x05] = setup.speed;
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
usb_buf[0x08] = setup.direction;
|
||||
|
||||
switch(setup.color_mode)
|
||||
{
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_SINGLE:
|
||||
{
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x09] = 0x00; // constant data
|
||||
|
||||
usb_buf[0x0A] = 0x01; // constant data
|
||||
usb_buf[0x0B] = 0x64; // constant data
|
||||
|
||||
usb_buf[0x0C] = setup.mode.one_color.r;
|
||||
usb_buf[0x0D] = setup.mode.one_color.g;
|
||||
usb_buf[0x0E] = setup.mode.one_color.b;
|
||||
usb_buf[0x0F] = 0xFF; // constant data
|
||||
}
|
||||
break;
|
||||
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_RAINBOW:
|
||||
{
|
||||
usb_buf[0x07] = 0x02; // constant data
|
||||
usb_buf[0x09] = 0x02; // constant data
|
||||
|
||||
usb_buf[0x0B] = 0xFF; // constant data
|
||||
usb_buf[0x0F] = 0xFF; // constant data
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorBreathingCmd( color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_BREATHING_MSG;
|
||||
usb_buf[0x05] = setup.speed;
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
|
||||
switch(setup.color_mode)
|
||||
{
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_DUAL:
|
||||
{
|
||||
usb_buf[0x07] = 0x10; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
|
||||
usb_buf[0x0A] = setup.mode.two_colors.r1;
|
||||
usb_buf[0x0B] = setup.mode.two_colors.g1;
|
||||
usb_buf[0x0C] = setup.mode.two_colors.b1;
|
||||
usb_buf[0x0D] = setup.mode.two_colors.r2;
|
||||
usb_buf[0x0E] = setup.mode.two_colors.g2;
|
||||
usb_buf[0x0F] = setup.mode.two_colors.b2;
|
||||
}
|
||||
break;
|
||||
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_SINGLE:
|
||||
{
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
usb_buf[0x0A] = setup.mode.one_color.r;
|
||||
usb_buf[0x0B] = setup.mode.one_color.g;
|
||||
usb_buf[0x0C] = setup.mode.one_color.b;
|
||||
}
|
||||
break;
|
||||
|
||||
case MOUNTAIN_KEYBOARD_COLOR_MODE_RAINBOW:
|
||||
{
|
||||
usb_buf[0x07] = 0x02; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorMatrixCmd(color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_MATRIX_MSG;
|
||||
usb_buf[0x05] = setup.speed;
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
|
||||
usb_buf[0x0A] = setup.mode.two_colors.r1;
|
||||
usb_buf[0x0B] = setup.mode.two_colors.g1;
|
||||
usb_buf[0x0C] = setup.mode.two_colors.b1;
|
||||
|
||||
usb_buf[0x13] = setup.mode.two_colors.r2;
|
||||
usb_buf[0x14] = setup.mode.two_colors.g2;
|
||||
usb_buf[0x15] = setup.mode.two_colors.b2;
|
||||
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorReactiveCmd(color_setup setup)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_REACTIVE_MSG;
|
||||
usb_buf[0x05] = setup.speed;
|
||||
usb_buf[0x06] = setup.brightness;
|
||||
|
||||
usb_buf[0x07] = 0x00; // constant data
|
||||
usb_buf[0x08] = 0xFF; // constant data
|
||||
usb_buf[0x09] = 0xFF; // constant data
|
||||
|
||||
usb_buf[0x0A] = setup.mode.two_colors.r1;
|
||||
usb_buf[0x0B] = setup.mode.two_colors.g1;
|
||||
usb_buf[0x0C] = setup.mode.two_colors.b1;
|
||||
|
||||
usb_buf[0x13] = setup.mode.two_colors.r2;
|
||||
usb_buf[0x14] = setup.mode.two_colors.g2;
|
||||
usb_buf[0x15] = setup.mode.two_colors.b2;
|
||||
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorStartPacketCmd(unsigned char brightness)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0xFF, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x00] = 0x00;
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x03] = MOUNTAIN_KEYBOARD_CUSTOM_MSG; // constant data
|
||||
usb_buf[0x04] = 0x00; // constant data
|
||||
usb_buf[0x06] = brightness;
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorPacketCmd(unsigned char pkt_no,unsigned char brightness, unsigned char *data, unsigned int data_size)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD;
|
||||
usb_buf[0x04] = 0x01; // constant data
|
||||
usb_buf[0x05] = pkt_no;
|
||||
usb_buf[0x06] = brightness;
|
||||
|
||||
if(data_size <= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
memcpy(&usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE],data,data_size);
|
||||
if(data_size < MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
memset(&usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE + data_size],0x00,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE-data_size);
|
||||
}
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(5ms);
|
||||
}
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorEdgePacketCmd(unsigned char pkt_no, unsigned char *data, unsigned int data_size)
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_SEND_COLOR_EDGE_CMD;
|
||||
usb_buf[0x03] = 0x0A; // constant data
|
||||
usb_buf[0x05] = pkt_no;
|
||||
usb_buf[0x06] = 0xFF;
|
||||
|
||||
if(data_size <= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
memcpy(&usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE],data,data_size);
|
||||
if(data_size < MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
memset(&usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE + data_size],0x00,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE-data_size);
|
||||
}
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(5ms);
|
||||
}
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendColorPacketFinishCmd()
|
||||
{
|
||||
unsigned char usb_buf[MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE];
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
usb_buf[0x01] = MOUNTAIN_KEYBOARD_SEND_CMD;
|
||||
usb_buf[0x02] = MOUNTAIN_KEYBOARD_CONFIRM_CMD;
|
||||
|
||||
for(unsigned char i=0;i<3;i++)
|
||||
{
|
||||
usb_buf[0x03] = i;
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE);
|
||||
std::this_thread::sleep_for(10ms);
|
||||
}
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendWheelColorChange(unsigned char color_data [3])
|
||||
{
|
||||
|
||||
wheel_config * usb_buf = GetWheelConfig();
|
||||
if (usb_buf != nullptr)
|
||||
{
|
||||
usb_buf->fixed_byte_1 = 0x01;
|
||||
usb_buf->fixed_byte_2 = 0x02;
|
||||
usb_buf->zero_byte = 0x00;
|
||||
usb_buf->r = color_data[0];
|
||||
usb_buf->g = color_data[1];
|
||||
usb_buf->b = color_data[2];
|
||||
hid_write(dev, (unsigned char *) usb_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
wheel_config * MountainKeyboardController::GetWheelConfig()
|
||||
{
|
||||
|
||||
unsigned char * usb_buf = new unsigned char [MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1];
|
||||
unsigned char * recv_buf = &usb_buf[1];
|
||||
|
||||
|
||||
for (int i =0; i < 1000; i++)
|
||||
{
|
||||
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1);
|
||||
wheel_config * usb_conf = (wheel_config *) usb_buf;
|
||||
usb_conf->config_start_first = 0x11;
|
||||
usb_conf->config_start_second = 0x14;
|
||||
hid_write(dev, usb_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE);
|
||||
memset(usb_buf, 0x00, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE+1);
|
||||
hid_read_timeout(dev, recv_buf, MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE, 1);
|
||||
if (usb_conf->config_start_first == MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIRST_BYTE &&
|
||||
usb_conf->config_start_second == MOUNTAIN_KEYBOARD_WHEEL_CONFIG_SECOND_BYTE)
|
||||
{
|
||||
return usb_conf;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
delete[] usb_buf;
|
||||
return nullptr;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void MountainKeyboardController::SendDirectColorEdgeCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int data_size)
|
||||
{
|
||||
static bool first_call = true;
|
||||
static unsigned char prv_buffer[MOUNTAIN_KEYBOARD_TRANSFER_EDGE_BUFFER_SIZE] = {0};
|
||||
|
||||
unsigned char pkt_no = 0;
|
||||
unsigned char *data_ptr = color_data;
|
||||
unsigned char *prv_data_ptr = prv_buffer;
|
||||
unsigned int data_len = data_size;
|
||||
|
||||
if(MOUNTAIN_KEYBOARD_TRANSFER_EDGE_BUFFER_SIZE >= data_len)
|
||||
{
|
||||
if(!quick_mode)
|
||||
{
|
||||
SendColorStartPacketCmd(brightness);
|
||||
}
|
||||
while(data_len>0)
|
||||
{
|
||||
if(data_len >= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
if(first_call || !quick_mode || memcmp(data_ptr,prv_data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE))
|
||||
{
|
||||
MountainKeyboardController::SendColorEdgePacketCmd(pkt_no,data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
memcpy(prv_data_ptr,data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
}
|
||||
pkt_no++;
|
||||
data_ptr += MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
prv_data_ptr += MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
data_len -= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(first_call || !quick_mode || memcmp(data_ptr,prv_data_ptr,data_len))
|
||||
{
|
||||
MountainKeyboardController::SendColorEdgePacketCmd(pkt_no,data_ptr,data_len);
|
||||
memcpy(prv_data_ptr,data_ptr,data_len);
|
||||
}
|
||||
data_len = 0;
|
||||
}
|
||||
}
|
||||
if(!quick_mode)
|
||||
{
|
||||
SendColorPacketFinishCmd();
|
||||
}
|
||||
|
||||
if (first_call)
|
||||
{
|
||||
first_call = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MountainKeyboardController::SendDirectColorCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int data_size)
|
||||
{
|
||||
static bool first_call = true;
|
||||
static unsigned char prv_buffer[MOUNTAIN_KEYBOARD_TRANSFER_BUFFER_SIZE] = {0};
|
||||
|
||||
unsigned char pkt_no = 0;
|
||||
unsigned char *data_ptr = color_data;
|
||||
unsigned char *prv_data_ptr = prv_buffer;
|
||||
unsigned int data_len = data_size;
|
||||
|
||||
if(MOUNTAIN_KEYBOARD_TRANSFER_BUFFER_SIZE >= data_len)
|
||||
{
|
||||
if(!quick_mode)
|
||||
{
|
||||
SendColorStartPacketCmd(brightness);
|
||||
}
|
||||
while(data_len>0)
|
||||
{
|
||||
if(data_len >= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE)
|
||||
{
|
||||
if(first_call || !quick_mode || memcmp(data_ptr,prv_data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE))
|
||||
{
|
||||
MountainKeyboardController::SendColorPacketCmd(pkt_no,brightness,data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
memcpy(prv_data_ptr,data_ptr,MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE);
|
||||
}
|
||||
pkt_no++;
|
||||
data_ptr += MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
prv_data_ptr += MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
data_len -= MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(first_call || !quick_mode || memcmp(data_ptr,prv_data_ptr,data_len))
|
||||
{
|
||||
MountainKeyboardController::SendColorPacketCmd(pkt_no,brightness,data_ptr,data_len);
|
||||
memcpy(prv_data_ptr,data_ptr,data_len);
|
||||
}
|
||||
data_len = 0;
|
||||
}
|
||||
}
|
||||
if(!quick_mode)
|
||||
{
|
||||
SendColorPacketFinishCmd();
|
||||
}
|
||||
|
||||
if (first_call)
|
||||
{
|
||||
first_call = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| MountainKeyboardController.h |
|
||||
| |
|
||||
| Driver for Mountain keyboard |
|
||||
| |
|
||||
| Wojciech Lazarski Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <hidapi.h>
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Mountain vendor ID |
|
||||
\*-----------------------------------------------------*/
|
||||
#define MOUNTAIN_VID 0x3282
|
||||
/*-----------------------------------------------------*\
|
||||
| Everest keyboard product IDs |
|
||||
\*-----------------------------------------------------*/
|
||||
#define MOUNTAIN_EVEREST_PID 0x0001
|
||||
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_MAX_TRANSFER_COLORS 126
|
||||
#define MOUNTAIN_KEYBOARD_TRANSFER_BUFFER_SIZE (3*MOUNTAIN_KEYBOARD_MAX_TRANSFER_COLORS)
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_MAX_TRANSFER_EDGE_COLORS 46
|
||||
#define MOUNTAIN_KEYBOARD_TRANSFER_EDGE_BUFFER_SIZE (3*MOUNTAIN_KEYBOARD_MAX_TRANSFER_EDGE_COLORS)
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE 65
|
||||
#define MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE 8
|
||||
#define MOUNTAIN_KEYBOARD_USB_MAX_DIRECT_PAYLOAD_SIZE \
|
||||
(MOUNTAIN_KEYBOARD_USB_BUFFER_SIZE-MOUNTAIN_KEYBOARD_USB_BUFFER_HEADER_SIZE)
|
||||
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_BUFFER_SIZE 65
|
||||
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIRST_BYTE 0x11
|
||||
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_SECOND_BYTE 0x14
|
||||
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIXED_BYTE_1 0x01
|
||||
#define MOUNTAIN_KEYBOARD_WHEEL_CONFIG_FIXED_BYTE_2 0x02
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_SAVE_CMD = 0x13,
|
||||
MOUNTAIN_KEYBOARD_SEND_CMD = 0x14
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_SEND_COLOR_DATA_CMD = 0x2C,
|
||||
MOUNTAIN_KEYBOARD_SEND_COLOR_EDGE_CMD = 0x2D,
|
||||
MOUNTAIN_KEYBOARD_SELECT_MODE_CMD = 0x00,
|
||||
MOUNTAIN_KEYBOARD_CONFIRM_CMD = 0xA0
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_STATIC_MSG = 0x00,
|
||||
MOUNTAIN_KEYBOARD_COLOR_WAVE_MSG = 0x04,
|
||||
MOUNTAIN_KEYBOARD_TORNADO_MSG = 0x07,
|
||||
MOUNTAIN_KEYBOARD_BREATHING_MSG = 0x01,
|
||||
MOUNTAIN_KEYBOARD_REACTIVE_MSG = 0x03,
|
||||
MOUNTAIN_KEYBOARD_MATRIX_MSG = 0x09,
|
||||
MOUNTAIN_KEYBOARD_CUSTOM_MSG = 0x0A,
|
||||
MOUNTAIN_KEYBOARD_OFF_MSG = 0x0C
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_IDX_STATIC = 0x00,
|
||||
MOUNTAIN_KEYBOARD_IDX_COLOR_WAVE = 0x01,
|
||||
MOUNTAIN_KEYBOARD_IDX_TORNADO = 0x02,
|
||||
MOUNTAIN_KEYBOARD_IDX_BREATHING = 0x03,
|
||||
MOUNTAIN_KEYBOARD_IDX_REACTIVE = 0x04,
|
||||
MOUNTAIN_KEYBOARD_IDX_MATRIX = 0x05,
|
||||
MOUNTAIN_KEYBOARD_IDX_CUSTOM = 0x06,
|
||||
MOUNTAIN_KEYBOARD_IDX_OFF = 0x08,
|
||||
MOUNTAIN_KEYBOARD_IDX_INVALID = 0xFF,
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_COLOR_MODE_RAINBOW = 0x00,
|
||||
MOUNTAIN_KEYBOARD_COLOR_MODE_SINGLE = 0x01,
|
||||
MOUNTAIN_KEYBOARD_COLOR_MODE_DUAL = 0x02
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_UP = 0x06,
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_DOWN = 0x02,
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_LEFT = 0x04,
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_RIGHT = 0x00,
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_ANTICLK = 0x0A,
|
||||
MOUNTAIN_KEYBOARD_DIRECTION_CLK = 0x09,
|
||||
};
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_SAVE_MAGIC1 0x55
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char color_mode;
|
||||
unsigned char brightness;
|
||||
unsigned char speed;
|
||||
unsigned char direction;
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
unsigned char r;
|
||||
unsigned char g;
|
||||
unsigned char b;
|
||||
} one_color;
|
||||
struct
|
||||
{
|
||||
unsigned char r1;
|
||||
unsigned char g1;
|
||||
unsigned char b1;
|
||||
unsigned char r2;
|
||||
unsigned char g2;
|
||||
unsigned char b2;
|
||||
} two_colors;
|
||||
} mode;
|
||||
} color_setup;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned char report_size;
|
||||
unsigned char config_start_first;
|
||||
unsigned char config_start_second;
|
||||
unsigned char zero_byte;
|
||||
unsigned char fixed_byte_1;
|
||||
unsigned char fixed_byte_2;
|
||||
unsigned char config_intermediate_values [2];
|
||||
unsigned char r;
|
||||
unsigned char g;
|
||||
unsigned char b;
|
||||
unsigned char config_end_values [54];
|
||||
|
||||
} wheel_config;
|
||||
|
||||
class MountainKeyboardController
|
||||
{
|
||||
public:
|
||||
MountainKeyboardController(hid_device* dev_handle, const char* path, std::string dev_name);
|
||||
~MountainKeyboardController();
|
||||
|
||||
std::string GetDeviceLocation();
|
||||
std::string GetNameString();
|
||||
std::string GetSerialString();
|
||||
|
||||
void SendOffCmd();
|
||||
void SendColorStaticCmd(color_setup setup);
|
||||
void SendColorWaveCmd(color_setup setup);
|
||||
void SendColorTornadoCmd(color_setup setup);
|
||||
void SendColorBreathingCmd(color_setup setup);
|
||||
void SendColorMatrixCmd(color_setup setup);
|
||||
void SendColorReactiveCmd(color_setup setup);
|
||||
|
||||
void SendDirectColorCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int color_count);
|
||||
void SendDirectColorEdgeCmd(bool quick_mode, unsigned char brightness, unsigned char *color_data, unsigned int data_size);
|
||||
|
||||
|
||||
void SendWheelColorChange(unsigned char color_data [3]);
|
||||
wheel_config * GetWheelConfig();
|
||||
|
||||
void SaveData(unsigned char mode_idx);
|
||||
void SelectMode(unsigned char mode_idx);
|
||||
|
||||
private:
|
||||
hid_device* dev;
|
||||
std::string location;
|
||||
std::string name;
|
||||
|
||||
void SendColorStartPacketCmd(unsigned char brightness);
|
||||
void SendColorPacketCmd(unsigned char pkt_no,unsigned char brightness, unsigned char *data, unsigned int data_size);
|
||||
void SendColorEdgePacketCmd(unsigned char pkt_no, unsigned char *data, unsigned int data_size);
|
||||
void SendColorPacketFinishCmd();
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| MountainKeyboardControllerDetect.cpp |
|
||||
| |
|
||||
| Detector for Mountain keyboard |
|
||||
| |
|
||||
| Wojciech Lazarski / O'D.Sæzl Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include <hidapi.h>
|
||||
#include "Detector.h"
|
||||
#include "MountainKeyboardController.h"
|
||||
#include "RGBController_MountainKeyboard.h"
|
||||
#include "Mountain60KeyboardController.h"
|
||||
#include "RGBController_Mountain60Keyboard.h"
|
||||
|
||||
/*---------------------------------------------------------------*\
|
||||
| Mountain vendor ID |
|
||||
\*---------------------------------------------------------------*/
|
||||
#define MOUNTAIN_VID 0x3282
|
||||
|
||||
/*----------------------------------------------------------------*\
|
||||
| Everest 60 keyboard Connection IDs |
|
||||
\*----------------------------------------------------------------*/
|
||||
#define MOUNTAIN60_EVEREST_60_PID_ANSII 0x0005
|
||||
#define MOUNTAIN60_EVEREST_60_PID_ISO 0x0006
|
||||
#define MOUNTAIN60_EVEREST_60_INTERFACE 2
|
||||
#define MOUNTAIN60_EVEREST_60_U 0x01
|
||||
#define MOUNTAIN60_EVEREST_60_UP 0xFFFF
|
||||
|
||||
/*----------------------------------------------------------------------------------------*\
|
||||
| |
|
||||
| DetectMountainKeyboardControllers |
|
||||
| |
|
||||
| Tests the USB address to see if a Mountain RGB Keyboard controller exists there. |
|
||||
| |
|
||||
\*----------------------------------------------------------------------------------------*/
|
||||
|
||||
void DetectMountain60KeyboardControllers(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
hid_device* dev = hid_open_path(info->path);
|
||||
|
||||
if(dev)
|
||||
{
|
||||
Mountain60KeyboardController* controller = new Mountain60KeyboardController(dev, info->path, name);
|
||||
RGBController_Mountain60Keyboard* rgb_controller = new RGBController_Mountain60Keyboard(controller);
|
||||
|
||||
ResourceManager::get()->RegisterRGBController(rgb_controller);
|
||||
}
|
||||
}
|
||||
|
||||
void DetectMountainKeyboardControllers(hid_device_info* info, const std::string& name)
|
||||
{
|
||||
hid_device* dev = hid_open_path(info->path);
|
||||
|
||||
if(dev)
|
||||
{
|
||||
MountainKeyboardController* controller = new MountainKeyboardController(dev, info->path, name);
|
||||
RGBController_MountainKeyboard* rgb_controller = new RGBController_MountainKeyboard(controller);
|
||||
|
||||
ResourceManager::get()->RegisterRGBController(rgb_controller);
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_HID_DETECTOR_IPU("Mountain Everest", DetectMountainKeyboardControllers, MOUNTAIN_VID, MOUNTAIN_EVEREST_PID, 3, 0xFF00, 0x01);
|
||||
REGISTER_HID_DETECTOR_IPU("Mountain Everest 60", DetectMountain60KeyboardControllers, MOUNTAIN_VID, MOUNTAIN60_EVEREST_60_PID_ANSII, MOUNTAIN60_EVEREST_60_INTERFACE, MOUNTAIN60_EVEREST_60_UP, MOUNTAIN60_EVEREST_60_U);
|
||||
REGISTER_HID_DETECTOR_IPU("Mountain Everest 60", DetectMountain60KeyboardControllers, MOUNTAIN_VID, MOUNTAIN60_EVEREST_60_PID_ISO, MOUNTAIN60_EVEREST_60_INTERFACE, MOUNTAIN60_EVEREST_60_UP, MOUNTAIN60_EVEREST_60_U);
|
||||
@@ -0,0 +1,463 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_MountainKeyboard.cpp |
|
||||
| |
|
||||
| RGBController for Mountain keyboard |
|
||||
| |
|
||||
| O'D.Sæzl Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#include "RGBController_Mountain60Keyboard.h"
|
||||
#include "RGBControllerKeyNames.h"
|
||||
#include "KeyboardLayoutManager.h"
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
/*---------------------------------------------------------*\
|
||||
| TODO: Detect detached keypad |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
std::vector<unsigned int> mountain60_keyboard_key_id_values =
|
||||
{
|
||||
/* ESC 1 2 3 4 5 6 7 8 9 0 - = BSPC */
|
||||
0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
|
||||
/* TAB Q W E R T Y U I O P [ ] \ */
|
||||
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
|
||||
/* CPLK A S D F G H J K L ; " ENTR */
|
||||
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 76,
|
||||
/* LSFT Z X C V B N M , . / RSFT ARWU DEL */
|
||||
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 97, 99, 56,
|
||||
/* LCTL LWIN LALT SPC RALT RFNC FNC ARWL ARWD ARWR */
|
||||
105, 106, 107, 110, 113, 115, 119, 120, 121,
|
||||
};
|
||||
|
||||
layout_values mountain60_layout =
|
||||
{
|
||||
mountain60_keyboard_key_id_values,
|
||||
{
|
||||
/*---------------------------------------------*\
|
||||
| No regional layout fix for the moment |
|
||||
\*---------------------------------------------*/
|
||||
},
|
||||
};
|
||||
|
||||
keyboard_keymap_overlay_values mountain60_keyboard_overlay_no_numpad =
|
||||
{
|
||||
KEYBOARD_SIZE::KEYBOARD_SIZE_SIXTY,
|
||||
mountain60_layout,
|
||||
{
|
||||
/*--------------------------------------------------------------------------------------------------------------------------------*\
|
||||
| Edit Keys |
|
||||
| Zone, Row, Column, Value, Key, Alt name, OpCode, |
|
||||
\*---------------------------------------------------------------------------------------------------------------------------------*/
|
||||
{ 0, 4, 13, 120, KEY_EN_DOWN_ARROW, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 12, 119, KEY_EN_LEFT_ARROW, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 14, 121, KEY_EN_RIGHT_ARROW, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 14, 121, KEY_EN_RIGHT_ARROW, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 3, 13, 99, KEY_EN_UP_ARROW, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 12, 97, KEY_EN_RIGHT_SHIFT, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 2, 85, KEY_EN_Z, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 3, 86, KEY_EN_X, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 4, 87, KEY_EN_C, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 5, 88, KEY_EN_B, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 6, 89, KEY_EN_V, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 7, 90, KEY_EN_N, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 8, 91, KEY_EN_M, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 9, 92, KEY_EN_COMMA, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 10, 93, KEY_EN_PERIOD, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 14, 56, KEY_EN_DELETE, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 2, 13, 76, KEY_EN_ANSI_ENTER, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 0, 84, KEY_EN_LEFT_SHIFT, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
//upper edge
|
||||
{ 0, 0, 0, 126, "Edge 1", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_ROW, },
|
||||
{ 0, 0, 1, 127, "Edge 2", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 2, 128, "Edge 3", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 3, 129, "Edge 4", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 4, 130, "Edge 5", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 5, 131, "Edge 6", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 6, 132, "Edge 7", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 7, 133, "Edge 8", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 8, 134, "Edge 9", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 9, 135, "Edge 10", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 10, 136, "Edge 11", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 11, 137, "Edge 12", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 12, 138, "Edge 13", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 13, 139, "Edge 14", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 14, 140, "Edge 15", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 15, 141, "Edge 16", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//left edge
|
||||
{ 0, 0, 0, 169, "Edge 44", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 1, 0, 168, "Edge 43", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 2, 0, 167, "Edge 42", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 3, 0, 166, "Edge 41", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 4, 0, 165, "Edge 40", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 5, 0, 164, "Edge 39", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//down edge
|
||||
{ 0, 6, 0, 1, KEY_EN_UNUSED, KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_ROW, },
|
||||
{ 0, 6, 0, 163, "Edge 38", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 1, 162, "Edge 37", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 2, 161, "Edge 36", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 3, 160, "Edge 35", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 4, 159, "Edge 34", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 5, 158, "Edge 33", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 6, 157, "Edge 32", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 7, 156, "Edge 31", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 8, 155, "Edge 30", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 9, 154, "Edge 29", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 10, 153, "Edge 28", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 11, 152, "Edge 27", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 12, 151, "Edge 26", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 13, 150, "Edge 25", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 14, 149, "Edge 24", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 15, 148, "Edge 23", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//right edge
|
||||
{ 0, 1, 16, 142, "Edge 17", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 2, 16, 143, "Edge 18", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 3, 16, 144, "Edge 19", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 4, 16, 145, "Edge 20", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 5, 16, 146, "Edge 21", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 16, 147, "Edge 22", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 16, 147, "Edge 22", KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
//numpad left edge
|
||||
{ 0, 0, 17, 191, "Numpad Edge 22", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 1, 17, 190, "Numpad Edge 21", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 2, 17, 189, "Numpad Edge 20", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 3, 17, 188, "Numpad Edge 19", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 4, 17, 187, "Numpad Edge 18", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 5, 17, 186, "Numpad Edge 17", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//numpad upper edge
|
||||
{ 0, 0, 18, 170, "Numpad Edge 1", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 19, 171, "Numpad Edge 2", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 20, 172, "Numpad Edge 3", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 21, 173, "Numpad Edge 4", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 0, 22, 174, "Numpad Edge 5", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//numpad down edge
|
||||
{ 0, 6, 17, 185, "Numpad Edge 12", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT },
|
||||
{ 0, 6, 18, 184, "Numpad Edge 13", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 19, 183, "Numpad Edge 14", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 20, 182, "Numpad Edge 15", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 21, 181, "Numpad Edge 16", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
//numpad right edge
|
||||
{ 0, 1, 22, 175, "Numpad Edge 6", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 2, 22, 176, "Numpad Edge 7", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 3, 22, 177, "Numpad Edge 8", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 4, 22, 178, "Numpad Edge 9", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 5, 22, 179, "Numpad Edge 10", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 22, 180, "Numpad Edge 11", KEY_EN_UNUSED, KEYBOARD_OPCODE_INSERT_SHIFT_RIGHT, },
|
||||
{ 0, 6, 22, 180, "Numpad Edge 11", KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
//numpad keys
|
||||
{ 0, 1, 18, 38, KEY_EN_NUMPAD_LOCK, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 1, 19, 39, KEY_EN_NUMPAD_DIVIDE, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 1, 20, 40, KEY_EN_NUMPAD_TIMES, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 1, 21, 41, KEY_EN_NUMPAD_MINUS, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 2, 18, 59, KEY_EN_NUMPAD_7, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 2, 19, 60, KEY_EN_NUMPAD_8, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 2, 20, 61, KEY_EN_NUMPAD_9, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 2, 21, 62, KEY_EN_NUMPAD_PLUS, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 18, 80, KEY_EN_NUMPAD_4, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 19, 81, KEY_EN_NUMPAD_5, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 3, 20, 82, KEY_EN_NUMPAD_6, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 18, 101, KEY_EN_NUMPAD_1, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 19, 102, KEY_EN_NUMPAD_2, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 4, 20, 103, KEY_EN_NUMPAD_3, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 5, 18, 122, KEY_EN_NUMPAD_0, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 5, 20, 124, KEY_EN_NUMPAD_PERIOD, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
{ 0, 5, 21, 125, KEY_EN_NUMPAD_ENTER, KEY_EN_UNUSED, KEYBOARD_OPCODE_SWAP_ONLY, },
|
||||
}
|
||||
};
|
||||
|
||||
/**------------------------------------------------------------------*\
|
||||
@name Mountain Keyboard
|
||||
@category Keyboard
|
||||
@type USB
|
||||
@save :white_check_mark:
|
||||
@direct :white_check_mark:
|
||||
@effects :white_check_mark:
|
||||
@detectors DetectMountainKeyboardControllers
|
||||
@comment
|
||||
\*-------------------------------------------------------------------*/
|
||||
|
||||
RGBController_Mountain60Keyboard::RGBController_Mountain60Keyboard(Mountain60KeyboardController* controller_ptr)
|
||||
{
|
||||
controller = controller_ptr;
|
||||
name = controller->GetNameString();
|
||||
vendor = "Mountain";
|
||||
type = DEVICE_TYPE_KEYBOARD;
|
||||
description = "Mountain Everest Keyboard 60% Device";
|
||||
location = controller->GetDeviceLocation();
|
||||
serial = controller->GetSerialString();
|
||||
|
||||
mode Direct;
|
||||
Direct.name = "Direct";
|
||||
Direct.value = MOUNTAIN60_KEYBOARD_MODE_CUSTOM;
|
||||
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
|
||||
Direct.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Direct.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Direct.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Direct.color_mode = MODE_COLORS_PER_LED;
|
||||
modes.push_back(Direct);
|
||||
|
||||
mode Off;
|
||||
Off.name = "Off";
|
||||
Off.value = MOUNTAIN60_KEYBOARD_MODE_OFF;
|
||||
Off.flags = MODE_FLAG_MANUAL_SAVE;
|
||||
Off.color_mode = MODE_COLORS_NONE;
|
||||
modes.push_back(Off);
|
||||
|
||||
mode Static;
|
||||
Static.name = "Static";
|
||||
Static.value = MOUNTAIN60_KEYBOARD_MODE_STATIC;
|
||||
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_MANUAL_SAVE;
|
||||
Static.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Static.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Static.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Static.colors_min = 1;
|
||||
Static.colors_max = 1;
|
||||
Static.colors.resize(1);
|
||||
modes.push_back(Static);
|
||||
|
||||
mode ColorWaveRainbow;
|
||||
ColorWaveRainbow.name = "Rainbow Wave";
|
||||
ColorWaveRainbow.value = MOUNTAIN60_KEYBOARD_MODE_COLOR_WAVE;
|
||||
ColorWaveRainbow.flags = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_MANUAL_SAVE;
|
||||
ColorWaveRainbow.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
ColorWaveRainbow.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
ColorWaveRainbow.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
ColorWaveRainbow.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
ColorWaveRainbow.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
ColorWaveRainbow.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
ColorWaveRainbow.color_mode = MODE_COLORS_RANDOM;
|
||||
|
||||
modes.push_back(ColorWaveRainbow);
|
||||
|
||||
mode ColorWave;
|
||||
ColorWave.name = "ColorWave";
|
||||
ColorWave.value = MOUNTAIN60_KEYBOARD_MODE_COLOR_WAVE;
|
||||
ColorWave.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD | MODE_FLAG_MANUAL_SAVE;
|
||||
ColorWave.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
ColorWave.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
ColorWave.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
ColorWave.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
ColorWave.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
ColorWave.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
ColorWave.colors_min = 1;
|
||||
ColorWave.colors_max = 2;
|
||||
ColorWave.colors.resize(2);
|
||||
ColorWave.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
modes.push_back(ColorWave);
|
||||
|
||||
mode Tornado;
|
||||
Tornado.name = "Tornado";
|
||||
Tornado.value = MOUNTAIN60_KEYBOARD_MODE_TORNADO;
|
||||
Tornado.flags = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_MANUAL_SAVE;
|
||||
Tornado.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Tornado.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Tornado.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Tornado.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
Tornado.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
Tornado.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
Tornado.colors_min = 1;
|
||||
Tornado.colors_max = 1;
|
||||
Tornado.colors.resize(1);
|
||||
Tornado.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
modes.push_back(Tornado);
|
||||
|
||||
mode Breathing;
|
||||
Breathing.name = "Breathing";
|
||||
Breathing.value = MOUNTAIN60_KEYBOARD_MODE_BREATHING;
|
||||
Breathing.flags = MODE_FLAG_HAS_RANDOM_COLOR | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
|
||||
Breathing.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Breathing.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Breathing.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Breathing.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
Breathing.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
Breathing.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
Breathing.colors_min = 1;
|
||||
Breathing.colors_max = 2;
|
||||
Breathing.colors.resize(2);
|
||||
Breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
modes.push_back(Breathing);
|
||||
|
||||
mode Reactive;
|
||||
Reactive.name = "Reactive";
|
||||
Reactive.value = MOUNTAIN60_KEYBOARD_MODE_REACTIVE;
|
||||
Reactive.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
|
||||
Reactive.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Reactive.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Reactive.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Reactive.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
Reactive.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
Reactive.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
Reactive.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Reactive.colors_min = 1;
|
||||
Reactive.colors_max = 2;
|
||||
Reactive.colors.resize(2);
|
||||
modes.push_back(Reactive);
|
||||
|
||||
mode Matrix;
|
||||
Matrix.name = "Matrix";
|
||||
Matrix.value = MOUNTAIN60_KEYBOARD_MODE_MATRIX;
|
||||
Matrix.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
|
||||
Matrix.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Matrix.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Matrix.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Matrix.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
Matrix.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
Matrix.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
Matrix.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Matrix.colors_min = 1;
|
||||
Matrix.colors_max = 2;
|
||||
Matrix.colors.resize(2);
|
||||
modes.push_back(Matrix);
|
||||
|
||||
mode Yeti;
|
||||
Yeti.name = "Yeti";
|
||||
Yeti.value = MOUNTAIN60_KEYBOARD_MODE_YETI;
|
||||
Yeti.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED | MODE_FLAG_MANUAL_SAVE;
|
||||
Yeti.brightness_min = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN;
|
||||
Yeti.brightness = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Yeti.brightness_max = MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX;
|
||||
Yeti.speed_min = MOUNTAIN60_KEYBOARD_SPEED_MIN;
|
||||
Yeti.speed = MOUNTAIN60_KEYBOARD_SPEED_DEFAULT;
|
||||
Yeti.speed_max = MOUNTAIN60_KEYBOARD_SPEED_MAX;
|
||||
Yeti.color_mode = MODE_COLORS_MODE_SPECIFIC;
|
||||
Yeti.colors_min = 1;
|
||||
Yeti.colors_max = 2;
|
||||
Yeti.colors.resize(2);
|
||||
modes.push_back(Yeti);
|
||||
|
||||
active_mode = 0;
|
||||
current_mode_value = -1;
|
||||
|
||||
SetupZones();
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| The Mountain Everest 60 keyboard need to send a |
|
||||
| specific packet frequently so that leds get updated |
|
||||
\*-----------------------------------------------------*/
|
||||
mountain_thread = new std::thread(&RGBController_Mountain60Keyboard::UpdateMountain, this);
|
||||
mountain_thread_running = true;
|
||||
}
|
||||
|
||||
RGBController_Mountain60Keyboard::~RGBController_Mountain60Keyboard()
|
||||
{
|
||||
mountain_thread_running = false;
|
||||
mountain_thread->join();
|
||||
delete mountain_thread;
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Delete the matrix map |
|
||||
\*-----------------------------------------------------*/
|
||||
for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++)
|
||||
{
|
||||
if(zones[zone_index].type == ZONE_TYPE_MATRIX)
|
||||
{
|
||||
delete zones[zone_index].matrix_map;
|
||||
}
|
||||
}
|
||||
|
||||
delete controller;
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::SetupZones()
|
||||
{
|
||||
KeyboardLayoutManager new_kb(KEYBOARD_LAYOUT_ANSI_QWERTY, KEYBOARD_SIZE_SIXTY, mountain60_layout);
|
||||
new_kb.ChangeKeys(mountain60_keyboard_overlay_no_numpad);
|
||||
|
||||
zone new_zone;
|
||||
matrix_map_type * new_map = new matrix_map_type;
|
||||
|
||||
new_zone.name = "Mountain Everest 60";
|
||||
new_zone.type = ZONE_TYPE_MATRIX;
|
||||
new_zone.matrix_map = new_map;
|
||||
new_zone.matrix_map->height = new_kb.GetRowCount();
|
||||
new_zone.matrix_map->width = new_kb.GetColumnCount();
|
||||
new_zone.matrix_map->map = new unsigned int[new_map->height * new_map->width];
|
||||
new_zone.leds_count = new_kb.GetKeyCount();
|
||||
new_zone.leds_min = new_zone.leds_count;
|
||||
new_zone.leds_max = new_zone.leds_count;
|
||||
|
||||
new_kb.GetKeyMap(new_map->map, KEYBOARD_MAP_FILL_TYPE_COUNT);
|
||||
|
||||
for(unsigned int led_idx = 0; led_idx < new_zone.leds_count; led_idx++)
|
||||
{
|
||||
led new_led;
|
||||
new_led.name = new_kb.GetKeyNameAt(led_idx);
|
||||
new_led.value = new_kb.GetKeyValueAt(led_idx);
|
||||
leds.push_back(new_led);
|
||||
}
|
||||
|
||||
zones.push_back(new_zone);
|
||||
|
||||
SetupColors();
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::ResizeZone(int /*zone*/, int /*new_size*/)
|
||||
{
|
||||
/*---------------------------------------------------------*\
|
||||
| This device does not support resizing zones |
|
||||
\*---------------------------------------------------------*/
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::DeviceUpdateLEDs()
|
||||
{
|
||||
unsigned char* color_data = new unsigned char[(leds.size()*4)];
|
||||
|
||||
/*-----------------------------------------------------*\
|
||||
| Filling the color_data vector with progressive index |
|
||||
| leaving space for RGB data |
|
||||
\*-----------------------------------------------------*/
|
||||
for(unsigned int led_idx = 0; led_idx < leds.size(); led_idx++)
|
||||
{
|
||||
const unsigned int idx = led_idx * 4;
|
||||
color_data[idx] = leds[led_idx].value;
|
||||
color_data[idx + 1] = RGBGetRValue(colors[led_idx]);
|
||||
color_data[idx + 2] = RGBGetGValue(colors[led_idx]);
|
||||
color_data[idx + 3] = RGBGetBValue(colors[led_idx]);
|
||||
}
|
||||
|
||||
controller->SendDirect(modes[active_mode].brightness, color_data, ((unsigned int)leds.size() * 4));
|
||||
delete[] color_data;
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::UpdateZoneLEDs(int /*zone*/)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::UpdateSingleLED(int /*led*/)
|
||||
{
|
||||
DeviceUpdateLEDs();
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::DeviceUpdateMode()
|
||||
{
|
||||
if(modes[active_mode].value != current_mode_value)
|
||||
{
|
||||
current_mode_value = modes[active_mode].value;
|
||||
controller->SelectMode(modes[active_mode].value);
|
||||
}
|
||||
|
||||
if(modes[active_mode].color_mode != MODE_FLAG_HAS_PER_LED_COLOR)
|
||||
{
|
||||
controller->SendModeDetails(&modes[active_mode]);
|
||||
}
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::DeviceSaveMode()
|
||||
{
|
||||
controller->SaveData(modes[active_mode].value);
|
||||
}
|
||||
|
||||
void RGBController_Mountain60Keyboard::UpdateMountain()
|
||||
{
|
||||
while(mountain_thread_running.load())
|
||||
{
|
||||
std::this_thread::sleep_for(MOUNTAIN60_KEEP_LIVE_PERIOD);
|
||||
|
||||
controller->UpdateData();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_MountainKeyboard.h |
|
||||
| |
|
||||
| RGBController for Mountain keyboard |
|
||||
| |
|
||||
| O'D.Sæzl Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-only |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstring>
|
||||
#include "RGBController.h"
|
||||
#include "Mountain60KeyboardController.h"
|
||||
|
||||
#define MOUNTAIN60_KEYBOARD_BRIGHTNESS_MIN 0
|
||||
#define MOUNTAIN60_KEYBOARD_BRIGHTNESS_MAX 4
|
||||
|
||||
#define MOUNTAIN60_KEYBOARD_SPEED_MIN 0
|
||||
#define MOUNTAIN60_KEYBOARD_SPEED_MAX 4
|
||||
#define MOUNTAIN60_KEYBOARD_SPEED_DEFAULT 2
|
||||
#define MOUNTAIN60_KEEP_LIVE_PERIOD 500ms
|
||||
|
||||
|
||||
class RGBController_Mountain60Keyboard : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_Mountain60Keyboard(Mountain60KeyboardController* controller_ptr);
|
||||
~RGBController_Mountain60Keyboard();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void ResizeZone(int zone, int new_size);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void UpdateZoneLEDs(int zone);
|
||||
void UpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
void DeviceSaveMode();
|
||||
void UpdateMountain();
|
||||
|
||||
private:
|
||||
Mountain60KeyboardController* controller;
|
||||
int current_mode_value;
|
||||
std::thread* mountain_thread;
|
||||
std::atomic<bool> mountain_thread_running;
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,61 @@
|
||||
/*---------------------------------------------------------*\
|
||||
| RGBController_MountainKeyboard.h |
|
||||
| |
|
||||
| RGBController for Mountain keyboard |
|
||||
| |
|
||||
| Wojciech Lazarski Jan 2023 |
|
||||
| |
|
||||
| This file is part of the OpenRGB project |
|
||||
| SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
\*---------------------------------------------------------*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstring>
|
||||
#include "RGBController.h"
|
||||
#include "MountainKeyboardController.h"
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_BRIGHTNESS_MIN 0
|
||||
#define MOUNTAIN_KEYBOARD_BRIGHTNESS_MAX 100
|
||||
|
||||
#define MOUNTAIN_KEYBOARD_SPEED_MIN 0
|
||||
#define MOUNTAIN_KEYBOARD_SPEED_MAX 4
|
||||
#define MOUNTAIN_KEYBOARD_SPEED_DEFAULT 3
|
||||
|
||||
enum
|
||||
{
|
||||
MOUNTAIN_KEYBOARD_MODE_DIRECT = MOUNTAIN_KEYBOARD_IDX_CUSTOM,
|
||||
MOUNTAIN_KEYBOARD_MODE_STATIC = MOUNTAIN_KEYBOARD_IDX_STATIC,
|
||||
MOUNTAIN_KEYBOARD_MODE_COLOR_WAVE = MOUNTAIN_KEYBOARD_IDX_COLOR_WAVE,
|
||||
MOUNTAIN_KEYBOARD_MODE_TORNADO = MOUNTAIN_KEYBOARD_IDX_TORNADO,
|
||||
MOUNTAIN_KEYBOARD_MODE_BREATHING = MOUNTAIN_KEYBOARD_IDX_BREATHING,
|
||||
MOUNTAIN_KEYBOARD_MODE_REACTIVE = MOUNTAIN_KEYBOARD_IDX_REACTIVE,
|
||||
MOUNTAIN_KEYBOARD_MODE_MATRIX = MOUNTAIN_KEYBOARD_IDX_MATRIX,
|
||||
MOUNTAIN_KEYBOARD_MODE_OFF = MOUNTAIN_KEYBOARD_IDX_OFF
|
||||
};
|
||||
|
||||
class RGBController_MountainKeyboard : public RGBController
|
||||
{
|
||||
public:
|
||||
RGBController_MountainKeyboard(MountainKeyboardController* controller_ptr);
|
||||
~RGBController_MountainKeyboard();
|
||||
|
||||
void SetupZones();
|
||||
|
||||
void ResizeZone(int zone, int new_size);
|
||||
|
||||
void DeviceUpdateLEDs();
|
||||
void UpdateZoneLEDs(int zone);
|
||||
void UpdateSingleLED(int led);
|
||||
|
||||
void DeviceUpdateMode();
|
||||
void DeviceSaveMode();
|
||||
|
||||
private:
|
||||
MountainKeyboardController* controller;
|
||||
int prv_mode;
|
||||
unsigned char wheel_color[3];
|
||||
|
||||
unsigned char ConvertDirection(unsigned int direction, bool rotation);
|
||||
void DeviceUpdate(const mode& current_mode);
|
||||
};
|
||||
Reference in New Issue
Block a user