Implement Global Corsair Mutex

This commit is contained in:
Ben Miller 2023-08-28 13:48:17 +00:00 committed by Adam Honse
parent 6b9aef10a9
commit 6c8da3a04f
2 changed files with 54 additions and 3 deletions

View file

@ -23,6 +23,9 @@ CorsairCommanderCoreController::CorsairCommanderCoreController(hid_device* dev_h
packet_size = CORSAIR_COMMANDER_CORE_PACKET_SIZE_V2;
command_res_size = packet_size - 4;
this->pid = pid;
#ifdef _WIN32
global_corsair_access_handle = CreateMutexA(NULL, FALSE, GLOBAL_CORSAIR_MUTEX_NAME);
#endif
/*-----------------------------------------------------*\
| Initialize controller |
@ -40,6 +43,12 @@ CorsairCommanderCoreController::~CorsairCommanderCoreController()
/*-----------------------------------------------------*\
| Close keepalive thread |
\*-----------------------------------------------------*/
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
CloseHandle(global_corsair_access_handle);
}
#endif
keepalive_thread_run = 0;
keepalive_thread->join();
delete keepalive_thread;
@ -57,18 +66,19 @@ void CorsairCommanderCoreController::InitController()
\*-----------------------------------------------------*/
unsigned char command[2] = {0x02, 0x13};
unsigned char* res = new unsigned char[command_res_size];
SendCommand(command, NULL, 0, res);
version[0] = res[0];
version[1] = res[1];
version[2] = res[2];
delete[] res;
if (pid == 0x0C1C && version[0] == 1)
if(pid == 0x0C1C && version[0] == 1)
{
packet_size = CORSAIR_COMMANDER_CORE_PACKET_SIZE_V1;
command_res_size = packet_size - 4;
}
else if (pid == 0x0C32)
else if(pid == 0x0C32)
{
packet_size = CORSAIR_COMMANDER_CORE_PACKET_SIZE_V3;
}
@ -98,7 +108,7 @@ void CorsairCommanderCoreController::KeepaliveThread()
{
while(keepalive_thread_run.load())
{
if (controller_ready)
if(controller_ready)
{
if((std::chrono::steady_clock::now() - last_commit_time) > std::chrono::seconds(10))
{
@ -143,6 +153,13 @@ void CorsairCommanderCoreController::SendCommand(unsigned char command[2], unsig
\*---------------------------------------------------------*/
unsigned char* buf = new unsigned char[packet_size];
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
WaitForSingleObject(global_corsair_access_handle, INFINITE);
}
#endif
memset(buf, 0, packet_size);
buf[0] = 0x00;
buf[1] = 0x08;
@ -165,6 +182,13 @@ void CorsairCommanderCoreController::SendCommand(unsigned char command[2], unsig
memcpy(res, &buf[3], command_res_size);
}
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
ReleaseMutex(global_corsair_access_handle);
}
#endif
delete[] buf;
}
@ -177,6 +201,13 @@ void CorsairCommanderCoreController::WriteData(unsigned char endpoint[2], unsign
/*---------------------------------------------------------*\
| Open endpoint |
\*---------------------------------------------------------*/
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
WaitForSingleObject(global_corsair_access_handle, INFINITE);
}
#endif
unsigned char command[2] = {0x0d, 0x00};
SendCommand(command, endpoint, 2, NULL);
@ -240,6 +271,13 @@ void CorsairCommanderCoreController::WriteData(unsigned char endpoint[2], unsign
command[0] = 0x05;
command[1] = 0x01;
SendCommand(command, NULL, 0, NULL);
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
ReleaseMutex(global_corsair_access_handle);
}
#endif
}
void CorsairCommanderCoreController::SetDirectColor

View file

@ -9,10 +9,15 @@
\*---------------------------------------------------------*/
#include "RGBController.h"
#include <vector>
#include <chrono>
#include <hidapi/hidapi.h>
#ifdef _WIN32
#include <Windows.h>
#endif
#pragma once
#define CORSAIR_COMMANDER_CORE_PACKET_SIZE_V1 1025 // First bit is the report bit
@ -23,6 +28,10 @@
#define CORSAIR_QL_FAN_ZONE_OFFSET 102
#define CORSAIR_COMMANDER_CORE_NUM_CHANNELS 6
#ifdef _WIN32
#define GLOBAL_CORSAIR_MUTEX_NAME "Global\\CorsairLinkReadWriteGuardMutex"
#endif
enum
{
CORSAIR_COMMANDER_CORE_MODE_DIRECT = 0x00,
@ -60,6 +69,10 @@ private:
int pid;
std::chrono::time_point<std::chrono::steady_clock> last_commit_time;
#ifdef _WIN32
HANDLE global_corsair_access_handle = NULL;
#endif
void SendCommand(unsigned char command[2], unsigned char data[], unsigned short int data_len, unsigned char res[]);
void WriteData(unsigned char endpoint[2], unsigned char data_type[2], unsigned char data[], unsigned short int data_len);