From 99bef0f362bd7f7027d718ff2d8524852e036594 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Thu, 3 Feb 2022 15:35:47 -0600 Subject: [PATCH] Speed up Direct mode by only sending the necessary portion of the packet --- .../GigabyteRGBFusion2DRAMController.cpp | 46 ++++++++++++++++++- .../GigabyteRGBFusion2DRAMController.h | 1 + 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.cpp b/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.cpp index 18eda93b1..ab2622424 100644 --- a/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.cpp +++ b/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.cpp @@ -32,6 +32,8 @@ RGBFusion2DRAMController::RGBFusion2DRAMController(i2c_smbus_interface* bus, rgb \*-----------------------------------------------------*/ led_count = 6; + direct_initialized = false; + /*-----------------------------------------------------*\ | Initialize brightness to 100% | \*-----------------------------------------------------*/ @@ -73,21 +75,54 @@ void RGBFusion2DRAMController::SetLEDEffect unsigned char blue ) { + bool truncate_packet = false; + if(mode == RGB_FUSION_2_DRAM_MODE_DIRECT) { + /*-----------------------------------------------------*\ + | In Direct mode, set one LED at a time | + \*-----------------------------------------------------*/ led_data[RGB_FUSION_2_DRAM_LED_EN_MASK] = (1 << led); - // hack for direct mode + /*-----------------------------------------------------*\ + | Hack for Direct mode | + \*-----------------------------------------------------*/ led_data[16] = 1; led_data[22] = 2; led_data[29] = 1; led_data[30] = 1; + /*-----------------------------------------------------*\ + | If bytes 15-31 have already been set, we can speed up | + | repeat direct mode packets by only sending the portion| + | that changes, in this case bytes 0-14. If direct mode| + | has already been initialized, truncate the packet by | + | only sending the first 15 bytes. | + \*-----------------------------------------------------*/ + if(direct_initialized) + { + truncate_packet = true; + } + + direct_initialized = true; + + /*-----------------------------------------------------*\ + | Direct mode is implemented using Pulse mode | + \*-----------------------------------------------------*/ mode = RGB_FUSION_2_DRAM_MODE_PULSE; } else { + /*-----------------------------------------------------*\ + | In all other modes, set all LEDs at once | + \*-----------------------------------------------------*/ led_data[RGB_FUSION_2_DRAM_LED_EN_MASK] = 0x3F; + + /*-----------------------------------------------------*\ + | Clear direct mode initialized flag when setting a non-| + | Direct mode | + \*-----------------------------------------------------*/ + direct_initialized = false; } led_data[RGB_FUSION_2_DRAM_IDX_MODE] = mode; @@ -95,7 +130,14 @@ void RGBFusion2DRAMController::SetLEDEffect led_data[RGB_FUSION_2_DRAM_IDX_GREEN] = green; led_data[RGB_FUSION_2_DRAM_IDX_BLUE] = blue; - bus->i2c_smbus_write_block_data(dev, RGB_FUSION_2_DRAM_LED_START_ADDR, 32, led_data); + if(truncate_packet) + { + bus->i2c_smbus_write_block_data(dev, RGB_FUSION_2_DRAM_LED_START_ADDR, 15, led_data); + } + else + { + bus->i2c_smbus_write_block_data(dev, RGB_FUSION_2_DRAM_LED_START_ADDR, 32, led_data); + } Apply(); } diff --git a/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.h b/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.h index 61afec547..62b82d5b7 100644 --- a/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.h +++ b/Controllers/GigabyteRGBFusion2DRAMController/GigabyteRGBFusion2DRAMController.h @@ -76,6 +76,7 @@ private: unsigned int led_count; i2c_smbus_interface* bus; rgb_fusion_dev_id dev; + bool direct_initialized; unsigned char led_data[32]; };