chuniio: Add OpenITHM LED protocol support

This commit is contained in:
d4nin3u 2024-07-25 21:10:27 +01:00
parent 92fe2751e7
commit 2f23264068
5 changed files with 69 additions and 3 deletions

View File

@ -19,6 +19,7 @@ static uint8_t chuni_io_hand_pos;
static HANDLE chuni_io_slider_thread; static HANDLE chuni_io_slider_thread;
static bool chuni_io_slider_stop_flag; static bool chuni_io_slider_stop_flag;
static struct chuni_io_config chuni_io_cfg; static struct chuni_io_config chuni_io_cfg;
static HANDLE chuni_io_slider_led_port;
uint16_t chuni_io_get_api_version(void) uint16_t chuni_io_get_api_version(void)
{ {
@ -121,6 +122,38 @@ void chuni_io_slider_start(chuni_io_slider_callback_t callback)
callback, callback,
0, 0,
NULL); NULL);
chuni_io_slider_led_port = CreateFileW(chuni_io_cfg.led_com,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (chuni_io_slider_led_port == INVALID_HANDLE_VALUE)
dprintf("OpenITHM LEDs: Failed to open COM port (Attempted on %S)\n", chuni_io_cfg.led_com);
else
dprintf("OpenITHM LEDs: COM Port Success!\n");
DCB dcb_serial_params = { 0 };
dcb_serial_params.DCBlength = sizeof(dcb_serial_params);
status = GetCommState(chuni_io_slider_led_port, &dcb_serial_params);
dcb_serial_params.BaudRate = CBR_115200; // Setting BaudRate = 115200
dcb_serial_params.ByteSize = 8; // Setting ByteSize = 8
dcb_serial_params.StopBits = ONESTOPBIT;// Setting StopBits = 1
dcb_serial_params.Parity = NOPARITY; // Setting Parity = None
SetCommState(chuni_io_slider_led_port, &dcb_serial_params);
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50; // in milliseconds
timeouts.ReadTotalTimeoutConstant = 50; // in milliseconds
timeouts.ReadTotalTimeoutMultiplier = 10; // in milliseconds
timeouts.WriteTotalTimeoutConstant = 50; // in milliseconds
timeouts.WriteTotalTimeoutMultiplier = 10; // in milliseconds
SetCommTimeouts(chuni_io_slider_led_port, &timeouts);
} }
void chuni_io_slider_stop(void) void chuni_io_slider_stop(void)
@ -135,11 +168,34 @@ void chuni_io_slider_stop(void)
CloseHandle(chuni_io_slider_thread); CloseHandle(chuni_io_slider_thread);
chuni_io_slider_thread = NULL; chuni_io_slider_thread = NULL;
chuni_io_slider_stop_flag = false; chuni_io_slider_stop_flag = false;
dprintf("OpenITHM LEDs: Closing COM port\n");
CloseHandle(chuni_io_slider_led_port);
} }
void chuni_io_slider_set_leds(const uint8_t *rgb) void chuni_io_slider_set_leds(const uint8_t *rgb)
{ {
led_output_update(2, rgb); led_output_update(2, rgb);
if (chuni_io_slider_led_port != INVALID_HANDLE_VALUE)
{
char led_buffer[100];
DWORD bytes_to_write; // No of bytes to write into the port
DWORD bytes_written = 0; // No of bytes written to the port
bytes_to_write = sizeof(led_buffer);
BOOL status;
led_buffer[0] = 0xAA;
led_buffer[1] = 0xAA;
memcpy(led_buffer+2, rgb, sizeof(uint8_t) * 96);
led_buffer[98] = 0xDD;
led_buffer[99] = 0xDD;
status = WriteFile(chuni_io_slider_led_port, // Handle to the Serial port
led_buffer, // Data to be written to the port
bytes_to_write, //No of bytes to write
&bytes_written, //Bytes written
NULL);
}
} }
static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx) static unsigned int __stdcall chuni_io_slider_thread_proc(void *ctx)

View File

@ -139,9 +139,10 @@ void chuni_io_slider_start(chuni_io_slider_callback_t callback);
void chuni_io_slider_stop(void); void chuni_io_slider_stop(void);
/* Update the RGB lighting on the slider. A pointer to an array of 32 * 3 = 96 /* Update the RGB lighting on the slider. A pointer to an array of 32 * 3 = 96
bytes is supplied. The illuminated areas on the touch slider are some bytes is supplied, organized in BRG format.
combination of rectangular regions and dividing lines between these regions The first set of bytes is the right-most slider key, and from there the bytes
but the exact mapping of this lighting control buffer is still TBD. alternate between the dividers and the keys until the left-most key.
There are 31 illuminated sections in total.
Minimum API version: 0x0100 */ Minimum API version: 0x0100 */

View File

@ -57,6 +57,10 @@ void chuni_io_config_load(
filename); filename);
} }
GetPrivateProfileStringW(L"slider", L"ledport", L"COM5", port_input, 6, filename);
wcsncpy(cfg->led_com, L"\\\\.\\", 4);
wcsncat_s(cfg->led_com, 11, port_input, 6);
cfg->cab_led_output_pipe = GetPrivateProfileIntW(L"led", L"cabLedOutputPipe", 1, filename); cfg->cab_led_output_pipe = GetPrivateProfileIntW(L"led", L"cabLedOutputPipe", 1, filename);
cfg->cab_led_output_serial = GetPrivateProfileIntW(L"led", L"cabLedOutputSerial", 0, filename); cfg->cab_led_output_serial = GetPrivateProfileIntW(L"led", L"cabLedOutputSerial", 0, filename);

View File

@ -10,6 +10,7 @@ struct chuni_io_config {
uint8_t vk_ir_emu; uint8_t vk_ir_emu;
uint8_t vk_ir[6]; uint8_t vk_ir[6];
uint8_t vk_cell[32]; uint8_t vk_cell[32];
wchar_t led_com[12];
// Which ways to output LED information are enabled // Which ways to output LED information are enabled
bool cab_led_output_pipe; bool cab_led_output_pipe;

View File

@ -4,6 +4,10 @@ chuniio_lib = static_library(
include_directories : inc, include_directories : inc,
implicit_include_directories : false, implicit_include_directories : false,
c_pch : '../precompiled.h', c_pch : '../precompiled.h',
link_with : [
util_lib
],
sources : [ sources : [
'chu2to3.c', 'chu2to3.c',
'chu2to3.h', 'chu2to3.h',