From e6c21f0a72035720c1cc39264e369018df8b3c51 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Tue, 10 Mar 2020 15:57:46 -0500 Subject: [PATCH] Add firmware version to Corsair Lighting Node driver --- .../CorsairLightingNodeController.cpp | 34 +++++++++++++++++++ .../CorsairLightingNodeController.h | 6 ++++ .../RGBController_CorsairLightingNode.cpp | 1 + 3 files changed, 41 insertions(+) diff --git a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp index d7cf307e..487d2ffd 100644 --- a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp +++ b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.cpp @@ -54,6 +54,8 @@ CorsairLightingNodeController::CorsairLightingNodeController(libusb_device_handl channel_leds[0] = 60; channel_leds[1] = 60; + SendFirmwareRequest(); + /*-----------------------------------------------------*\ | The Corsair Lighting Node Pro requires a packet within| | 20 seconds of sending the lighting change in order | @@ -81,6 +83,11 @@ void CorsairLightingNodeController::KeepaliveThread() } } +std::string CorsairLightingNodeController::GetFirmwareString() +{ + return(firmware_version); +} + void CorsairLightingNodeController::SetChannelEffect(unsigned char channel, unsigned char num_leds, unsigned char mode, @@ -276,6 +283,33 @@ void CorsairLightingNodeController::SetChannelLEDs(unsigned char channel, RGBCol | Private packet sending functions. | \*-------------------------------------------------------------------------------------------------*/ +void CorsairLightingNodeController::SendFirmwareRequest() +{ + int actual; + unsigned char usb_buf[64]; + + /*-----------------------------------------------------*\ + | Zero out buffer | + \*-----------------------------------------------------*/ + memset(usb_buf, 0x00, sizeof(usb_buf)); + + /*-----------------------------------------------------*\ + | Set up Firmware Version Request packet | + \*-----------------------------------------------------*/ + usb_buf[0x00] = CORSAIR_LIGHTING_NODE_PACKET_ID_FIRMWARE; + + /*-----------------------------------------------------*\ + | Send packet | + \*-----------------------------------------------------*/ + libusb_interrupt_transfer(dev, endpoint, usb_buf, 64, &actual, 0); + libusb_interrupt_transfer(dev, 0x80 + endpoint, usb_buf, 64, &actual, 0); + + if(actual > 0) + { + firmware_version = std::to_string(usb_buf[0x01]) + "." + std::to_string(usb_buf[0x02]) + "." + std::to_string(usb_buf[0x03]); + } +} + void CorsairLightingNodeController::SendDirect ( unsigned char channel, diff --git a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h index 38222fac..6a03f0de 100644 --- a/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h +++ b/Controllers/CorsairLightingNodeController/CorsairLightingNodeController.h @@ -12,6 +12,7 @@ enum { + CORSAIR_LIGHTING_NODE_PACKET_ID_FIRMWARE = 0x02, /* Get firmware version */ CORSAIR_LIGHTING_NODE_PACKET_ID_DIRECT = 0x32, /* Direct mode LED update packet */ CORSAIR_LIGHTING_NODE_PACKET_ID_COMMIT = 0x33, /* Commit changes packet */ CORSAIR_LIGHTING_NODE_PACKET_ID_BEGIN = 0x34, /* Begin effect packet */ @@ -80,6 +81,8 @@ public: CorsairLightingNodeController(libusb_device_handle* dev_handle, unsigned int dev_endpoint); ~CorsairLightingNodeController(); + std::string GetFirmwareString(); + unsigned int GetStripsOnChannel(unsigned int channel); void SetChannelEffect(unsigned char channel, @@ -107,6 +110,9 @@ public: private: libusb_device_handle* dev; unsigned int endpoint; + std::string firmware_version; + + void SendFirmwareRequest(); void SendDirect ( diff --git a/RGBController/RGBController_CorsairLightingNode.cpp b/RGBController/RGBController_CorsairLightingNode.cpp index d03d9e61..49ba6495 100644 --- a/RGBController/RGBController_CorsairLightingNode.cpp +++ b/RGBController/RGBController_CorsairLightingNode.cpp @@ -17,6 +17,7 @@ RGBController_CorsairLightingNode::RGBController_CorsairLightingNode(CorsairLigh name = "Corsair Lighting Node Device"; description = "Corsair Lighting Node Device"; type = DEVICE_TYPE_LEDSTRIP; + version = corsair->GetFirmwareString(); mode Direct; Direct.name = "Direct";