diff --git a/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.cpp b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.cpp new file mode 100644 index 00000000..ac6ea0f7 --- /dev/null +++ b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.cpp @@ -0,0 +1,45 @@ +/*-----------------------------------------*\ +| RGBFusion2SMBusController.cpp | +| | +| Driver for Gigabyte Aorus RGB Fusion 2 | +| SMBus lighting controller | +| | +| Adam Honse (CalcProgrammer1) 3/12/2020 | +\*-----------------------------------------*/ + +#include "RGBFusion2SMBusController.h" +#include +#include +#include + +RGBFusion2SMBusController::RGBFusion2SMBusController(i2c_smbus_interface* bus, rgb_fusion_dev_id dev) +{ + this->bus = bus; + this->dev = dev; +} + +std::string RGBFusion2SMBusController::GetDeviceLocation() +{ + std::string return_string(bus->device_name); + char addr[5]; + snprintf(addr, 5, "0x%02X", dev); + return_string.append(", address "); + return_string.append(addr); + return(return_string); +} + +void RGBFusion2SMBusController::SetLEDEffect + ( + unsigned int led, + int mode, + unsigned int speed, + unsigned char red, + unsigned char green, + unsigned char blue + ) +{ +led_data[led][RGB_FUSION_2_IDX_MODE] = mode; +led_data[led][RGB_FUSION_2_IDX_RED] = red; +led_data[led][RGB_FUSION_2_IDX_GREEN] = green; +led_data[led][RGB_FUSION_2_IDX_BLUE] = blue; +} \ No newline at end of file diff --git a/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.h b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.h new file mode 100644 index 00000000..bbcd5ce3 --- /dev/null +++ b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.h @@ -0,0 +1,62 @@ +/*-----------------------------------------*\ +| RGBFusion2SMBusController.h | +| | +| Definitions and types for Gigabyte Aorus | +| RGB Fusion 2 SMBus lighting controller | +| | +| Adam Honse (CalcProgrammer1) 3/12/2020 | +\*-----------------------------------------*/ + +#include +#include "i2c_smbus.h" + +#pragma once + +typedef unsigned char rgb_fusion_dev_id; + +enum +{ + RGB_FUSION_2_IDX_MODE = 0x01, /* Mode index */ + RGB_FUSION_2_IDX_BRIGHTNESS = 0x02, /* Brightness index */ + RGB_FUSION_2_IDX_BLUE = 0x04, /* Blue index */ + RGB_FUSION_2_IDX_GREEN = 0x05, /* Green index */ + RGB_FUSION_2_IDX_RED = 0x06, /* Red index */ + RGB_FUSION_2_TIMER_1_LSB = 0x08, /* Timer 1 LSB */ + RGB_FUSION_2_TIMER_1_MSB = 0x09, /* Timer 1 MSB */ + RGB_FUSION_2_TIMER_2_LSB = 0x0A, /* Timer 2 LSB */ + RGB_FUSION_2_TIMER_2_MSB = 0x0B, /* Timer 2 MSB */ +}; + +enum +{ + RGB_FUSION_2_MODE_PULSE = 0x01, /* Pulse mode */ + RGB_FUSION_2_MODE_COLOR_CYCLE = 0x03, /* Color cycle mode */ + RGB_FUSION_2_MODE_STATIC = 0x04, /* Static color mode */ + RGB_FUSION_2_MODE_FLASHING = 0x05, /* Flashing / Double Flashing mode */ +}; + +class RGBFusion2SMBusController +{ +public: + RGBFusion2SMBusController(i2c_smbus_interface* bus, rgb_fusion_dev_id dev); + ~RGBFusion2SMBusController(); + + std::string GetDeviceLocation(); + + void SetLEDEffect + ( + unsigned int led, + int mode, + unsigned int speed, + unsigned char red, + unsigned char green, + unsigned char blue + ); + +private: + unsigned int led_count; + i2c_smbus_interface* bus; + rgb_fusion_dev_id dev; + + unsigned char led_data[10][16]; +} \ No newline at end of file diff --git a/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusControllerDetect.cpp b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusControllerDetect.cpp new file mode 100644 index 00000000..5a17498e --- /dev/null +++ b/Controllers/RGBFusion2SMBusController/RGBFusion2SMBusControllerDetect.cpp @@ -0,0 +1,67 @@ +#include "RGBFusion2SMBusController.h" +#include "RGBController.h" +#include "RGBController_RGBFusion2SMBus.h" +#include "i2c_smbus.h" +#include +#include +#include + +/******************************************************************************************\ +* * +* TestForRGBFusion2SMBusController * +* * +* Tests the given address to see if an RGB 2 Fusion controller exists there. First * +* does a quick write to test for a response * +* * +\******************************************************************************************/ + +bool TestForRGBFusion2SMBusController(i2c_smbus_interface* bus, unsigned char address) +{ + bool pass = false; + + int res = bus->i2c_smbus_write_quick(address, I2C_SMBUS_WRITE); + + if (res >= 0) + { + pass = true; + + // res = bus->i2c_smbus_read_byte_data(address, 0xF2); + + // if (res != 0xC4) + // { + // pass = false; + // } + } + + return(pass); + +} /* TestForRGBFusion2SMBusController() */ + +/******************************************************************************************\ +* * +* DetectRGBFusion2SMBusControllers * +* * +* Detect RGB Fusion 2 controllers on the enumerated I2C busses at address 0x68. * +* * +* bus - pointer to i2c_smbus_interface where RGB Fusion device is connected * +* dev - I2C address of RGB Fusion device * +* * +\******************************************************************************************/ + +void DetectRGBFusion2SMBusControllers(std::vector& busses, std::vector& rgb_controllers) +{ + RGBFusion2SMBusController* new_rgb_fusion; + RGBController_RGBFusion2SMBus* new_controller; + + for (unsigned int bus = 0; bus < busses.size(); bus++) + { + // Check for RGB Fusion 2 controller at 0x68 + if (TestForRGBFusion2SMBusController(busses[bus], 0x68)) + { + new_rgb_fusion = new RGBFusion2SMBusController(busses[bus], 0x68); + new_controller = new RGBController_RGBFusion2SMBus(new_rgb_fusion); + rgb_controllers.push_back(new_controller); + } + } + +} /* DetectRGBFusion2SMBusControllers() */ \ No newline at end of file diff --git a/OpenRGB.pro b/OpenRGB.pro index 7f604cc3..4541c8cd 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -55,6 +55,7 @@ INCLUDEPATH += \ Controllers/PoseidonZRGBController/ \ Controllers/RedragonController/ \ Controllers/RGBFusionController/ \ + Controllers/RGBFusion2SMBusController/ \ Controllers/RGBFusion2USBController/ \ Controllers/RGBFusionGPUController/ \ Controllers/ThermaltakeRiingController/ \ @@ -136,6 +137,8 @@ SOURCES += \ Controllers/RGBFusionController/RGBFusionControllerDetect.cpp \ Controllers/RGBFusion2USBController/RGBFusion2USBController.cpp \ Controllers/RGBFusion2USBController/RGBFusion2USBControllerDetect.cpp \ + Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.cpp \ + Controllers/RGBFusion2SMBusController/RGBFusion2SMBusControllerDetect.cpp \ Controllers/RGBFusionGPUController/RGBFusionGPUController.cpp \ Controllers/RGBFusionGPUController/RGBFusionGPUControllerDetect.cpp \ Controllers/RedragonController/RedragonK556Controller.cpp \ @@ -174,6 +177,7 @@ SOURCES += \ RGBController/RGBController_RedragonK556.cpp \ RGBController/RGBController_RedragonM711.cpp \ RGBController/RGBController_RGBFusion.cpp \ + RGBController/RGBController_RGBFusion2SMBus.cpp \ RGBController/RGBController_RGBFusion2USB.cpp \ RGBController/RGBController_RGBFusionGPU.cpp \ RGBController/RGBController_ThermaltakeRiing.cpp \ @@ -223,6 +227,7 @@ HEADERS += \ Controllers/PoseidonZRGBController/PoseidonZRGBController.h \ Controllers/RGBFusionController/RGBFusionController.h \ Controllers/RGBFusion2USBController/RGBFusion2USBController.h \ + Controllers/RGBFusion2SMBusController/RGBFusion2SMBusController.h \ Controllers/RGBFusionGPUController/RGBFusionGPUController.h \ Controllers/RedragonController/RedragonK556Controller.h \ Controllers/RedragonController/RedragonM711Controller.h \ @@ -256,6 +261,7 @@ HEADERS += \ RGBController/RGBController_RedragonK556.h \ RGBController/RGBController_RedragonM711.h \ RGBController/RGBController_RGBFusion.h \ + RGBController/RGBController_RGBFusion2SMBus.h \ RGBController/RGBController_RGBFusion2USB.h \ RGBController/RGBController_RGBFusionGPU.h \ RGBController/RGBController_ThermaltakeRiing.h \ diff --git a/RGBController/RGBController_RGBFusion2SMBus.cpp b/RGBController/RGBController_RGBFusion2SMBus.cpp new file mode 100644 index 00000000..e69de29b diff --git a/RGBController/RGBController_RGBFusion2SMBus.h b/RGBController/RGBController_RGBFusion2SMBus.h new file mode 100644 index 00000000..e69de29b