Generic device guard; use Corsair implementation for all Corsair HID cooling-capable controllers

This commit is contained in:
Evan Mulawski 2023-11-10 15:12:26 +00:00 committed by Adam Honse
parent c5c5bf519b
commit f672397563
15 changed files with 387 additions and 109 deletions

View file

@ -7,6 +7,7 @@
\*---------------------------------------------------------*/
#include "CorsairCommanderCoreController.h"
#include "CorsairDeviceGuard.h"
#include <cstring>
#include <iomanip>
@ -23,9 +24,7 @@ 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
guard_manager_ptr = new DeviceGuardManager(new CorsairDeviceGuard());
/*-----------------------------------------------------*\
| Initialize controller |
@ -43,12 +42,6 @@ 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,6 +50,7 @@ CorsairCommanderCoreController::~CorsairCommanderCoreController()
| Close HID device |
\*-----------------------------------------------------*/
hid_close(dev);
delete guard_manager_ptr;
}
void CorsairCommanderCoreController::InitController()
@ -153,13 +147,6 @@ 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;
@ -170,25 +157,28 @@ void CorsairCommanderCoreController::SendCommand(unsigned char command[2], unsig
memcpy(&buf[4], data, data_len);
}
hid_write(dev, buf, packet_size);
do
/*---------------------------------------------------------*\
| HID I/O start |
\*---------------------------------------------------------*/
{
hid_read(dev, buf, packet_size);
DeviceGuardLock _ = guard_manager_ptr->AwaitExclusiveAccess();
hid_write(dev, buf, packet_size);
do
{
hid_read(dev, buf, packet_size);
}
while (buf[0] != 0x00);
}
while (buf[0] != 0x00);
/*---------------------------------------------------------*\
| HID I/O end (lock released) |
\*---------------------------------------------------------*/
if(res != NULL)
{
memcpy(res, &buf[3], command_res_size);
}
#ifdef _WIN32
if(global_corsair_access_handle != NULL)
{
ReleaseMutex(global_corsair_access_handle);
}
#endif
delete[] buf;
}
@ -201,17 +191,9 @@ 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);
/*---------------------------------------------------------*\
| Write data |
\*---------------------------------------------------------*/
@ -271,13 +253,6 @@ 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
@ -371,6 +346,6 @@ void CorsairCommanderCoreController::SetFanMode()
}
WriteData(endpoint, data_type, buf, 15);
controller_ready = 1;
}

View file

@ -9,15 +9,12 @@
\*---------------------------------------------------------*/
#include "RGBController.h"
#include "DeviceGuardManager.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
@ -28,10 +25,6 @@
#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,
@ -56,23 +49,20 @@ public:
void SetFanMode();
private:
hid_device* dev;
std::thread* keepalive_thread;
std::atomic<bool> keepalive_thread_run;
std::atomic<bool> controller_ready;
std::string location;
std::vector<RGBColor> lastcolors;
std::vector<zone> lastzones;
unsigned short int version[3] = {0, 0, 0};
int packet_size;
int command_res_size;
int pid;
std::chrono::time_point<std::chrono::steady_clock> last_commit_time;
hid_device* dev;
std::thread* keepalive_thread;
std::atomic<bool> keepalive_thread_run;
std::atomic<bool> controller_ready;
std::string location;
std::vector<RGBColor> lastcolors;
std::vector<zone> lastzones;
unsigned short int version[3] = {0, 0, 0};
int packet_size;
int command_res_size;
int pid;
std::chrono::time_point<std::chrono::steady_clock> last_commit_time;
DeviceGuardManager* guard_manager_ptr;
#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);