From 267dfff2470dc4a2aecf63c2622c966782233484 Mon Sep 17 00:00:00 2001 From: K900 Date: Wed, 3 Feb 2021 11:23:25 +0300 Subject: [PATCH] SapphireGPUController: reimplement configuration readback Commit amended for code style by Adam Honse --- .../RGBController_SapphireNitroGlowV1.cpp | 42 ++++++- .../RGBController_SapphireNitroGlowV1.h | 2 + .../RGBController_SapphireNitroGlowV3.cpp | 92 ++++++++++++++- .../RGBController_SapphireNitroGlowV3.h | 2 + .../SapphireGPUControllerDetect.cpp | 2 - .../SapphireNitroGlowV1Controller.cpp | 9 +- .../SapphireNitroGlowV1Controller.h | 6 +- .../SapphireNitroGlowV3Controller.cpp | 109 +++++++++++------- .../SapphireNitroGlowV3Controller.h | 27 ++++- 9 files changed, 239 insertions(+), 52 deletions(-) diff --git a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.cpp b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.cpp index 0daf0939..d606ee8f 100644 --- a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.cpp +++ b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.cpp @@ -36,8 +36,7 @@ RGBController_SapphireNitroGlowV1::RGBController_SapphireNitroGlowV1(SapphireNit SetupZones(); - // Initialize active mode - active_mode = 0; + ReadConfiguration(); } RGBController_SapphireNitroGlowV1::~RGBController_SapphireNitroGlowV1() @@ -72,6 +71,43 @@ void RGBController_SapphireNitroGlowV1::SetupZones() SetupColors(); } +void RGBController_SapphireNitroGlowV1::ReadConfiguration() +{ + colors[0] = ToRGBColor( + sapphire->GetRed(), + sapphire->GetGreen(), + sapphire->GetBlue() + ); + + switch(sapphire->GetMode()) + { + case SAPPHIRE_NITRO_GLOW_V1_MODE_CUSTOM: + active_mode = 0; + break; + + case SAPPHIRE_NITRO_GLOW_V1_MODE_RAINBOW: + active_mode = 1; + break; + + case SAPPHIRE_NITRO_GLOW_V1_MODE_BOARD_TEMPERATURE: + active_mode = 2; + break; + + case SAPPHIRE_NITRO_GLOW_V1_MODE_FAN_SPEED: + active_mode = 3; + break; + + case SAPPHIRE_NITRO_GLOW_V1_MODE_OFF: + active_mode = 0; + colors[0] = ToRGBColor(0, 0, 0); + break; + + default: + active_mode = 0; + break; + } +} + void RGBController_SapphireNitroGlowV1::ResizeZone(int /*zone*/, int /*new_size*/) { /*---------------------------------------------------------*\ @@ -106,5 +142,5 @@ void RGBController_SapphireNitroGlowV1::SetCustomMode() void RGBController_SapphireNitroGlowV1::DeviceUpdateMode() { - sapphire->SetMode((unsigned char)modes[(unsigned int)active_mode].value, (unsigned char)modes[(unsigned int)active_mode].speed); + sapphire->SetMode((unsigned char)modes[(unsigned int)active_mode].value); } diff --git a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.h b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.h index a6355417..ab5bab00 100644 --- a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.h +++ b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV1.h @@ -31,4 +31,6 @@ public: private: SapphireNitroGlowV1Controller* sapphire; + + void ReadConfiguration(); }; diff --git a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.cpp b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.cpp index 7a0d15ab..2c9ff7d9 100644 --- a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.cpp +++ b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.cpp @@ -72,7 +72,7 @@ RGBController_SapphireNitroGlowV3::RGBController_SapphireNitroGlowV3(SapphireNit SetupZones(); - active_mode = 0; + ReadConfiguration(); } RGBController_SapphireNitroGlowV3::~RGBController_SapphireNitroGlowV3() @@ -107,6 +107,58 @@ void RGBController_SapphireNitroGlowV3::SetupZones() SetupColors(); } +void RGBController_SapphireNitroGlowV3::ReadConfiguration() +{ + modes[1].speed = sapphire->GetRainbowAnimationSpeed(); + modes[2].speed = sapphire->GetRunwayAnimationSpeed(); + modes[3].speed = sapphire->GetColorCycleAnimationSpeed(); + modes[4].speed = sapphire->GetSerialAnimationSpeed(); + + colors[0] = ToRGBColor( + sapphire->GetRed(), + sapphire->GetBlue(), + sapphire->GetGreen() + ); + + if(sapphire->GetExternalControl()) + { + active_mode = 5; + return; + } + + switch(sapphire->GetMode()) + { + case SAPPHIRE_NITRO_GLOW_V3_MODE_CUSTOM: + active_mode = 0; + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_RAINBOW: + active_mode = 1; + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_RUNWAY: + active_mode = 2; + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_COLOR_CYCLE: + active_mode = 3; + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_SERIAL: + active_mode = 4; + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_OFF: + active_mode = 0; + colors[0] = ToRGBColor(0, 0, 0); + break; + + default: + active_mode = 0; + break; + } +} + void RGBController_SapphireNitroGlowV3::ResizeZone(int /*zone*/, int /*new_size*/) { /*---------------------------------------------------------*\ @@ -141,5 +193,41 @@ void RGBController_SapphireNitroGlowV3::SetCustomMode() void RGBController_SapphireNitroGlowV3::DeviceUpdateMode() { - sapphire->SetMode((unsigned char)modes[(unsigned int)active_mode].value, (unsigned char)modes[(unsigned int)active_mode].speed); + auto mode = modes[active_mode]; + + switch(mode.value) + { + case SAPPHIRE_NITRO_GLOW_V3_MODE_CUSTOM: + sapphire->SetExternalControl(false); + sapphire->SetMode(mode.value); + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_RAINBOW: + sapphire->SetExternalControl(false); + sapphire->SetRainbowAnimationSpeed(mode.speed); + sapphire->SetMode(mode.value); + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_RUNWAY: + sapphire->SetExternalControl(false); + sapphire->SetRunwayAnimationSpeed(mode.speed); + sapphire->SetMode(mode.value); + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_COLOR_CYCLE: + sapphire->SetExternalControl(false); + sapphire->SetColorCycleAnimationSpeed(mode.speed); + sapphire->SetMode(mode.value); + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_SERIAL: + sapphire->SetExternalControl(false); + sapphire->SetSerialAnimationSpeed(mode.speed); + sapphire->SetMode(mode.value); + break; + + case SAPPHIRE_NITRO_GLOW_V3_MODE_EXTERNAL_CONTROL: + sapphire->SetExternalControl(true); + break; + } } diff --git a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.h b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.h index f1e9d390..bbfdadaa 100644 --- a/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.h +++ b/Controllers/SapphireGPUController/RGBController_SapphireNitroGlowV3.h @@ -31,4 +31,6 @@ public: private: SapphireNitroGlowV3Controller* sapphire; + + void ReadConfiguration(); }; diff --git a/Controllers/SapphireGPUController/SapphireGPUControllerDetect.cpp b/Controllers/SapphireGPUController/SapphireGPUControllerDetect.cpp index 4209224f..00452798 100644 --- a/Controllers/SapphireGPUController/SapphireGPUControllerDetect.cpp +++ b/Controllers/SapphireGPUController/SapphireGPUControllerDetect.cpp @@ -100,8 +100,6 @@ void DetectSapphireGPUControllers(std::vector &busses, st busses[bus]->pci_subsystem_vendor == device_list[dev_idx].pci_subsystem_vendor && busses[bus]->pci_subsystem_device == device_list[dev_idx].pci_subsystem_device) { - RGBController *controller; - switch(device_list[dev_idx].version) { case SAPPHIRE_NITRO_GLOW_V1: diff --git a/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.cpp b/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.cpp index 381b42c7..67f50492 100644 --- a/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.cpp +++ b/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.cpp @@ -52,7 +52,12 @@ void SapphireNitroGlowV1Controller::SetColor(unsigned char red, unsigned char gr bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V1_REG_BLUE, blue); } -void SapphireNitroGlowV1Controller::SetMode(unsigned char mode, unsigned char /*speed*/) +unsigned char SapphireNitroGlowV1Controller::GetMode() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V1_REG_MODE)); +} + +void SapphireNitroGlowV1Controller::SetMode(unsigned char mode) { bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V1_REG_MODE, mode); -} \ No newline at end of file +} diff --git a/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.h b/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.h index 5b303ece..f78424f0 100644 --- a/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.h +++ b/Controllers/SapphireGPUController/SapphireNitroGlowV1Controller.h @@ -46,10 +46,12 @@ public: unsigned char GetBlue(); void SetColor(unsigned char red, unsigned char green, unsigned char blue); - void SetMode(unsigned char mode, unsigned char speed); + + unsigned char GetMode(); + void SetMode(unsigned char mode); private: i2c_smbus_interface* bus; sapphire_dev_id dev; -}; \ No newline at end of file +}; diff --git a/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.cpp b/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.cpp index 4f8efc82..2a2ce7d5 100644 --- a/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.cpp +++ b/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.cpp @@ -52,51 +52,82 @@ void SapphireNitroGlowV3Controller::SetColor(unsigned char red, unsigned char gr bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_BLUE, blue); } -void SapphireNitroGlowV3Controller::SetMode(unsigned char mode, unsigned char speed) +unsigned char SapphireNitroGlowV3Controller::GetMode() { - switch(mode) - { - case SAPPHIRE_NITRO_GLOW_V3_MODE_RAINBOW: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 0); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RAINBOW_ANIMATION_SPEED, speed); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); - break; + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE)); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_RUNWAY: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 0); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_SPEED, speed); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_REPEAT_COUNT, 5); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); - break; +void SapphireNitroGlowV3Controller::SetMode(unsigned char mode) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_COLOR_CYCLE: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 0); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_COLOR_CYCLE_ANIMATION_SPEED, speed); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); - break; +bool SapphireNitroGlowV3Controller::GetExternalControl() +{ + return((bool)bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL)); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_SERIAL: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 0); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_SERIAL_ANIMATION_SPEED, speed); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); - break; +void SapphireNitroGlowV3Controller::SetExternalControl(bool enabled) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, (unsigned char)enabled); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_SAPPHIRE_BLUE: - break; +unsigned char SapphireNitroGlowV3Controller::GetBrightness() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE)); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_AUDIO_VISUALIZATION: - break; +void SapphireNitroGlowV3Controller::SetBrightness(unsigned char brightness) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_BRIGHTNESS, brightness); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_CUSTOM: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 0); - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_MODE, mode); - break; +unsigned char SapphireNitroGlowV3Controller::GetRainbowAnimationSpeed() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RAINBOW_ANIMATION_SPEED)); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_OFF: - break; +void SapphireNitroGlowV3Controller::SetRainbowAnimationSpeed(unsigned char speed) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RAINBOW_ANIMATION_SPEED, speed); +} - case SAPPHIRE_NITRO_GLOW_V3_MODE_EXTERNAL_CONTROL: - bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_EXTERNAL_CONTROL, 1); - break; - } -} \ No newline at end of file +unsigned char SapphireNitroGlowV3Controller::GetRunwayAnimationSpeed() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_SPEED)); +} + +void SapphireNitroGlowV3Controller::SetRunwayAnimationSpeed(unsigned char speed) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_SPEED, speed); +} + +unsigned char SapphireNitroGlowV3Controller::GetRunwayAnimationRepeatCount() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_REPEAT_COUNT)); +} + +void SapphireNitroGlowV3Controller::SetRunwayAnimationRepeatCount(unsigned char count) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_RUNWAY_ANIMATION_REPEAT_COUNT, count); +} + +unsigned char SapphireNitroGlowV3Controller::GetColorCycleAnimationSpeed() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_COLOR_CYCLE_ANIMATION_SPEED)); +} + +void SapphireNitroGlowV3Controller::SetColorCycleAnimationSpeed(unsigned char speed) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_COLOR_CYCLE_ANIMATION_SPEED, speed); +} + +unsigned char SapphireNitroGlowV3Controller::GetSerialAnimationSpeed() +{ + return(bus->i2c_smbus_read_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_SERIAL_ANIMATION_SPEED)); +} + +void SapphireNitroGlowV3Controller::SetSerialAnimationSpeed(unsigned char speed) +{ + bus->i2c_smbus_write_byte_data(dev, SAPPHIRE_NITRO_GLOW_V3_REG_SERIAL_ANIMATION_SPEED, speed); +} diff --git a/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.h b/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.h index 6231f95d..2ee36f2f 100644 --- a/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.h +++ b/Controllers/SapphireGPUController/SapphireNitroGlowV3Controller.h @@ -56,10 +56,33 @@ public: unsigned char GetBlue(); void SetColor(unsigned char red, unsigned char green, unsigned char blue); - void SetMode(unsigned char mode, unsigned char speed); + + unsigned char GetMode(); + void SetMode(unsigned char mode); + + bool GetExternalControl(); + void SetExternalControl(bool enabled); + + unsigned char GetBrightness(); + void SetBrightness(unsigned char brightness); + + unsigned char GetRainbowAnimationSpeed(); + void SetRainbowAnimationSpeed(unsigned char speed); + + unsigned char GetRunwayAnimationSpeed(); + void SetRunwayAnimationSpeed(unsigned char speed); + + unsigned char GetRunwayAnimationRepeatCount(); + void SetRunwayAnimationRepeatCount(unsigned char count); + + unsigned char GetColorCycleAnimationSpeed(); + void SetColorCycleAnimationSpeed(unsigned char speed); + + unsigned char GetSerialAnimationSpeed(); + void SetSerialAnimationSpeed(unsigned char speed); private: i2c_smbus_interface* bus; sapphire_dev_id dev; -}; \ No newline at end of file +};