From 8c7b230646adc22d191bffe74b06e8f54a62551c Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 15 Dec 2025 12:28:41 -0600 Subject: [PATCH] [WIP] Add per-zone modes to RGBController API --- RGBController/RGBController.cpp | 364 +++++++++++++++++++++ RGBController/RGBController.h | 258 +++++++++------ qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp | 142 +++++--- 3 files changed, 617 insertions(+), 147 deletions(-) diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index e03228a0..5142fad0 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -189,6 +189,24 @@ void RGBController::SetHidden(bool hidden) /*---------------------------------------------------------*\ | Zone Functions | \*---------------------------------------------------------*/ +int RGBController::GetZoneActiveMode(unsigned int zone) +{ + int active_mode; + + AccessMutex.lock_shared(); + if(zone < zones.size()) + { + active_mode = zones[zone].active_mode; + } + else + { + active_mode = 0; + } + AccessMutex.unlock_shared(); + + return(active_mode); +} + RGBColor RGBController::GetZoneColor(unsigned int zone, unsigned int color_index) { RGBColor color; @@ -373,6 +391,294 @@ unsigned int RGBController::GetZoneMatrixMapWidth(unsigned int zone) return(width); } +std::size_t RGBController::GetZoneModeCount(unsigned int zone) +{ + std::size_t mode_count; + + AccessMutex.lock_shared(); + if(zone < zones.size()) + { + mode_count = zones[zone].modes.size(); + } + else + { + mode_count = 0; + } + AccessMutex.unlock_shared(); + + return(mode_count); +} + +unsigned int RGBController::GetZoneModeBrightness(unsigned int zone, unsigned int mode) +{ + unsigned int brightness; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + brightness = zones[zone].modes[mode].brightness; + } + else + { + brightness = 0; + } + AccessMutex.unlock_shared(); + + return(brightness); +} + +unsigned int RGBController::GetZoneModeBrightnessMax(unsigned int zone, unsigned int mode) +{ + unsigned int brightness_max; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + brightness_max = zones[zone].modes[mode].brightness_max; + } + else + { + brightness_max = 0; + } + AccessMutex.unlock_shared(); + + return(brightness_max); +} + +unsigned int RGBController::GetZoneModeBrightnessMin(unsigned int zone, unsigned int mode) +{ + unsigned int brightness_min; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + brightness_min = zones[zone].modes[mode].brightness_min; + } + else + { + brightness_min = 0; + } + AccessMutex.unlock_shared(); + + return(brightness_min); +} + +RGBColor RGBController::GetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index) +{ + RGBColor color; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size()) && (color_index < zones[zone].modes[mode].colors.size())) + { + color = zones[zone].modes[mode].colors[color_index]; + } + else + { + color = 0; + } + AccessMutex.unlock_shared(); + + return(color); +} + +unsigned int RGBController::GetZoneModeColorMode(unsigned int zone, unsigned int mode) +{ + unsigned int color_mode; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + color_mode = zones[zone].modes[mode].color_mode; + } + else + { + color_mode = 0; + } + AccessMutex.unlock_shared(); + + return(color_mode); +} + +std::size_t RGBController::GetZoneModeColorsCount(unsigned int zone, unsigned int mode) +{ + std::size_t colors_count; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + colors_count = zones[zone].modes[mode].colors.size(); + } + else + { + colors_count = 0; + } + AccessMutex.unlock_shared(); + + return(colors_count); +} + +unsigned int RGBController::GetZoneModeColorsMax(unsigned int zone, unsigned int mode) +{ + unsigned int colors_max; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + colors_max = zones[zone].modes[mode].colors_max; + } + else + { + colors_max = 0; + } + AccessMutex.unlock_shared(); + + return(colors_max); +} + +unsigned int RGBController::GetZoneModeColorsMin(unsigned int zone, unsigned int mode) +{ + unsigned int colors_min; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + colors_min = zones[zone].modes[mode].colors_min; + } + else + { + colors_min = 0; + } + AccessMutex.unlock_shared(); + + return(colors_min); +} + +unsigned int RGBController::GetZoneModeDirection(unsigned int zone, unsigned int mode) +{ + unsigned int direction; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + direction = zones[zone].modes[mode].direction; + } + else + { + direction = 0; + } + AccessMutex.unlock_shared(); + + return(direction); +} + +unsigned int RGBController::GetZoneModeFlags(unsigned int zone, unsigned int mode) +{ + unsigned int flags; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + flags = zones[zone].modes[mode].flags; + } + else + { + flags = 0; + } + AccessMutex.unlock_shared(); + + return(flags); +} + +std::string RGBController::GetZoneModeName(unsigned int zone, unsigned int mode) +{ + std::string name; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + name = zones[zone].modes[mode].name; + } + else + { + name = ""; + } + AccessMutex.unlock_shared(); + + return(name); +} + +unsigned int RGBController::GetZoneModeSpeed(unsigned int zone, unsigned int mode) +{ + unsigned int speed; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + speed = zones[zone].modes[mode].speed; + } + else + { + speed = 0; + } + AccessMutex.unlock_shared(); + + return(speed); +} + +unsigned int RGBController::GetZoneModeSpeedMax(unsigned int zone, unsigned int mode) +{ + unsigned int speed_max; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + speed_max = zones[zone].modes[mode].speed_max; + } + else + { + speed_max = 0; + } + AccessMutex.unlock_shared(); + + return(speed_max); +} + +unsigned int RGBController::GetZoneModeSpeedMin(unsigned int zone, unsigned int mode) +{ + unsigned int speed_min; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + speed_min = zones[zone].modes[mode].speed_min; + } + else + { + speed_min = 0; + } + AccessMutex.unlock_shared(); + + return(speed_min); +} + +int RGBController::GetZoneModeValue(unsigned int zone, unsigned int mode) +{ + unsigned int value; + + AccessMutex.lock_shared(); + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + value = zones[zone].modes[mode].value; + } + else + { + value = 0; + } + AccessMutex.unlock_shared(); + + return(value); +} + std::string RGBController::GetZoneName(unsigned int zone) { std::string name; @@ -627,6 +933,64 @@ unsigned int RGBController::GetLEDsInZone(unsigned int zone) return(leds_count); } +void RGBController::SetZoneActiveMode(unsigned int zone, int mode) +{ + if(zone < zones.size()) + { + zones[zone].active_mode = mode; + + UpdateMode(); + } +} + +void RGBController::SetZoneModeBrightness(unsigned int zone, unsigned int mode, unsigned int brightness) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + zones[zone].modes[mode].brightness = brightness; + } +} + +void RGBController::SetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index, RGBColor color) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size()) && (color_index < zones[zone].modes[mode].colors.size())) + { + zones[zone].modes[mode].colors[color_index] = color; + } +} + +void RGBController::SetZoneModeColorMode(unsigned int zone, unsigned int mode, unsigned int color_mode) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + zones[zone].modes[mode].color_mode = color_mode; + } +} + +void RGBController::SetZoneModeColorsCount(unsigned int zone, unsigned int mode, std::size_t count) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + zones[zone].modes[mode].colors.resize(count); + } +} + +void RGBController::SetZoneModeDirection(unsigned int zone, unsigned int mode, unsigned int direction) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + zones[zone].modes[mode].direction = direction; + } +} + +void RGBController::SetZoneModeSpeed(unsigned int zone, unsigned int mode, unsigned int speed) +{ + if((zone < zones.size()) && (mode < zones[zone].modes.size())) + { + zones[zone].modes[mode].speed = speed; + } +} + /*---------------------------------------------------------*\ | Mode Functions | \*---------------------------------------------------------*/ diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index fa85a517..4d99a2bd 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -49,6 +49,8 @@ enum MODE_FLAG_HAS_RANDOM_COLOR = (1 << 7), /* Mode has random color option */ MODE_FLAG_MANUAL_SAVE = (1 << 8), /* Mode can manually be saved */ MODE_FLAG_AUTOMATIC_SAVE = (1 << 9), /* Mode automatically saves */ + MODE_FLAG_REQUIRES_ENTIRE_DEVICE = (1 << 10),/* Mode always applies to entire */ + /* device, overrides per-zone modes */ }; /*---------------------------------------------------------*\ @@ -195,6 +197,8 @@ public: matrix_map_type * matrix_map; /* Matrix map pointer */ std::vector segments; /* Segments in zone */ unsigned int flags; /* Zone flags bitfield */ + std::vector modes; /* Zone-specific modes */ + int active_mode; /* Active zone-specific mode*/ /*-----------------------------------------------------*\ | Zone Constructor / Destructor | @@ -280,159 +284,184 @@ public: /*-----------------------------------------------------*\ | Controller Information | \*-----------------------------------------------------*/ - virtual std::string GetName() = 0; - virtual std::string GetVendor() = 0; - virtual std::string GetDescription() = 0; - virtual std::string GetVersion() = 0; - virtual std::string GetSerial() = 0; - virtual std::string GetLocation() = 0; + virtual std::string GetName() = 0; + virtual std::string GetVendor() = 0; + virtual std::string GetDescription() = 0; + virtual std::string GetVersion() = 0; + virtual std::string GetSerial() = 0; + virtual std::string GetLocation() = 0; - virtual device_type GetDeviceType() = 0; - virtual unsigned int GetFlags() = 0; + virtual device_type GetDeviceType() = 0; + virtual unsigned int GetFlags() = 0; /*-----------------------------------------------------*\ | Hidden Flag Functions | \*-----------------------------------------------------*/ - virtual bool GetHidden() = 0; - virtual void SetHidden(bool hidden) = 0; + virtual bool GetHidden() = 0; + virtual void SetHidden(bool hidden) = 0; /*-----------------------------------------------------*\ | Zone Functions | \*-----------------------------------------------------*/ - virtual RGBColor GetZoneColor(unsigned int zone, unsigned int color_index) = 0; - virtual RGBColor* GetZoneColorsPointer(unsigned int zone) = 0; - virtual std::size_t GetZoneCount() = 0; - virtual unsigned int GetZoneFlags(unsigned int zone) = 0; - virtual unsigned int GetZoneLEDsCount(unsigned int zone) = 0; - virtual unsigned int GetZoneLEDsMax(unsigned int zone) = 0; - virtual unsigned int GetZoneLEDsMin(unsigned int zone) = 0; - virtual bool GetZoneMatrixMapAvailable(unsigned int zone) = 0; - virtual unsigned int GetZoneMatrixMapHeight(unsigned int zone) = 0; - virtual const unsigned int * GetZoneMatrixMap(unsigned int zone) = 0; - virtual unsigned int GetZoneMatrixMapWidth(unsigned int zone) = 0; - virtual std::string GetZoneName(unsigned int zone) = 0; - virtual std::size_t GetZoneSegmentCount(unsigned int zone) = 0; - virtual unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment) = 0; - virtual bool GetZoneSegmentMatrixMapAvailable(unsigned int zone, unsigned int segment) = 0; - virtual unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) = 0; - virtual const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) = 0; - virtual unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment) = 0; - virtual std::string GetZoneSegmentName(unsigned int zone, unsigned int segment) = 0; - virtual unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment) = 0; - virtual unsigned int GetZoneSegmentType(unsigned int zone, unsigned int segment) = 0; - virtual unsigned int GetZoneStartIndex(unsigned int zone) = 0; - virtual zone_type GetZoneType(unsigned int zone) = 0; + virtual int GetZoneActiveMode(unsigned int zone) = 0; + virtual RGBColor GetZoneColor(unsigned int zone, unsigned int color_index) = 0; + virtual RGBColor* GetZoneColorsPointer(unsigned int zone) = 0; + virtual std::size_t GetZoneCount() = 0; + virtual unsigned int GetZoneFlags(unsigned int zone) = 0; + virtual unsigned int GetZoneLEDsCount(unsigned int zone) = 0; + virtual unsigned int GetZoneLEDsMax(unsigned int zone) = 0; + virtual unsigned int GetZoneLEDsMin(unsigned int zone) = 0; + virtual bool GetZoneMatrixMapAvailable(unsigned int zone) = 0; + virtual unsigned int GetZoneMatrixMapHeight(unsigned int zone) = 0; + virtual const unsigned int * GetZoneMatrixMap(unsigned int zone) = 0; + virtual unsigned int GetZoneMatrixMapWidth(unsigned int zone) = 0; + virtual std::size_t GetZoneModeCount(unsigned int zone) = 0; + virtual unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeBrightnessMax(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeBrightnessMin(unsigned int zone, unsigned int mode) = 0; + virtual RGBColor GetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index) = 0; + virtual unsigned int GetZoneModeColorMode(unsigned int zone, unsigned int mode) = 0; + virtual std::size_t GetZoneModeColorsCount(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeColorsMax(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeColorsMin(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeDirection(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeFlags(unsigned int zone, unsigned int mode) = 0; + virtual std::string GetZoneModeName(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeSpeed(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeSpeedMax(unsigned int zone, unsigned int mode) = 0; + virtual unsigned int GetZoneModeSpeedMin(unsigned int zone, unsigned int mode) = 0; + virtual int GetZoneModeValue(unsigned int zone, unsigned int mode) = 0; + virtual std::string GetZoneName(unsigned int zone) = 0; + virtual std::size_t GetZoneSegmentCount(unsigned int zone) = 0; + virtual unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment) = 0; + virtual bool GetZoneSegmentMatrixMapAvailable(unsigned int zone, unsigned int segment) = 0; + virtual unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) = 0; + virtual const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) = 0; + virtual unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment) = 0; + virtual std::string GetZoneSegmentName(unsigned int zone, unsigned int segment) = 0; + virtual unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment) = 0; + virtual unsigned int GetZoneSegmentType(unsigned int zone, unsigned int segment) = 0; + virtual unsigned int GetZoneStartIndex(unsigned int zone) = 0; + virtual zone_type GetZoneType(unsigned int zone) = 0; - virtual unsigned int GetLEDsInZone(unsigned int zone) = 0; + virtual unsigned int GetLEDsInZone(unsigned int zone) = 0; + + virtual void SetZoneActiveMode(unsigned int zone, int mode) = 0; + virtual void SetZoneModeBrightness(unsigned int zone, unsigned int mode, unsigned int brightness) = 0; + virtual void SetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index, RGBColor color) = 0; + virtual void SetZoneModeColorMode(unsigned int zone, unsigned int mode, unsigned int color_mode) = 0; + virtual void SetZoneModeColorsCount(unsigned int zone, unsigned int mode, std::size_t count) = 0; + virtual void SetZoneModeDirection(unsigned int zone, unsigned int mode, unsigned int direction) = 0; + virtual void SetZoneModeSpeed(unsigned int zone, unsigned int mode, unsigned int speed) = 0; /*-----------------------------------------------------*\ | Mode Functions | \*-----------------------------------------------------*/ - virtual std::size_t GetModeCount() = 0; - virtual unsigned int GetModeBrightness(unsigned int mode) = 0; - virtual unsigned int GetModeBrightnessMax(unsigned int mode) = 0; - virtual unsigned int GetModeBrightnessMin(unsigned int mode) = 0; - virtual RGBColor GetModeColor(unsigned int mode, unsigned int color_index) = 0; - virtual unsigned int GetModeColorMode(unsigned int mode) = 0; - virtual std::size_t GetModeColorsCount(unsigned int mode) = 0; - virtual unsigned int GetModeColorsMax(unsigned int mode) = 0; - virtual unsigned int GetModeColorsMin(unsigned int mode) = 0; - virtual unsigned int GetModeDirection(unsigned int mode) = 0; - virtual unsigned int GetModeFlags(unsigned int mode) = 0; - virtual std::string GetModeName(unsigned int mode) = 0; - virtual unsigned int GetModeSpeed(unsigned int mode) = 0; - virtual unsigned int GetModeSpeedMax(unsigned int mode) = 0; - virtual unsigned int GetModeSpeedMin(unsigned int mode) = 0; - virtual int GetModeValue(unsigned int mode) = 0; + virtual std::size_t GetModeCount() = 0; + virtual unsigned int GetModeBrightness(unsigned int mode) = 0; + virtual unsigned int GetModeBrightnessMax(unsigned int mode) = 0; + virtual unsigned int GetModeBrightnessMin(unsigned int mode) = 0; + virtual RGBColor GetModeColor(unsigned int mode, unsigned int color_index) = 0; + virtual unsigned int GetModeColorMode(unsigned int mode) = 0; + virtual std::size_t GetModeColorsCount(unsigned int mode) = 0; + virtual unsigned int GetModeColorsMax(unsigned int mode) = 0; + virtual unsigned int GetModeColorsMin(unsigned int mode) = 0; + virtual unsigned int GetModeDirection(unsigned int mode) = 0; + virtual unsigned int GetModeFlags(unsigned int mode) = 0; + virtual std::string GetModeName(unsigned int mode) = 0; + virtual unsigned int GetModeSpeed(unsigned int mode) = 0; + virtual unsigned int GetModeSpeedMax(unsigned int mode) = 0; + virtual unsigned int GetModeSpeedMin(unsigned int mode) = 0; + virtual int GetModeValue(unsigned int mode) = 0; - virtual void SetModeBrightness(unsigned int mode, unsigned int brightness) = 0; - virtual void SetModeColor(unsigned int mode, unsigned int color_index, RGBColor color) = 0; - virtual void SetModeColorMode(unsigned int mode, unsigned int color_mode) = 0; - virtual void SetModeColorsCount(unsigned int mode, std::size_t count) = 0; - virtual void SetModeDirection(unsigned int mode, unsigned int direction) = 0; - virtual void SetModeSpeed(unsigned int mode, unsigned int speed) = 0; + virtual void SetModeBrightness(unsigned int mode, unsigned int brightness) = 0; + virtual void SetModeColor(unsigned int mode, unsigned int color_index, RGBColor color) = 0; + virtual void SetModeColorMode(unsigned int mode, unsigned int color_mode) = 0; + virtual void SetModeColorsCount(unsigned int mode, std::size_t count) = 0; + virtual void SetModeDirection(unsigned int mode, unsigned int direction) = 0; + virtual void SetModeSpeed(unsigned int mode, unsigned int speed) = 0; - virtual int GetActiveMode() = 0; - virtual void SetActiveMode(int mode) = 0; - virtual void SetCustomMode() = 0; + virtual int GetActiveMode() = 0; + virtual void SetActiveMode(int mode) = 0; + virtual void SetCustomMode() = 0; /*-----------------------------------------------------*\ | LED Functions | \*-----------------------------------------------------*/ - virtual std::size_t GetLEDCount() = 0; - virtual std::string GetLEDName(unsigned int led) = 0; - virtual unsigned int GetLEDValue(unsigned int led) = 0; + virtual std::size_t GetLEDCount() = 0; + virtual std::string GetLEDName(unsigned int led) = 0; + virtual unsigned int GetLEDValue(unsigned int led) = 0; - virtual std::string GetLEDDisplayName(unsigned int led) = 0; + virtual std::string GetLEDDisplayName(unsigned int led) = 0; /*-----------------------------------------------------*\ | Color Functions | \*-----------------------------------------------------*/ - virtual RGBColor GetColor(unsigned int led) = 0; - virtual RGBColor* GetColorsPointer() = 0; - virtual void SetColor(unsigned int led, RGBColor color) = 0; + virtual RGBColor GetColor(unsigned int led) = 0; + virtual RGBColor* GetColorsPointer() = 0; + virtual void SetColor(unsigned int led, RGBColor color) = 0; - virtual void SetAllColors(RGBColor color) = 0; - virtual void SetAllZoneColors(int zone, RGBColor color) = 0; + virtual void SetAllColors(RGBColor color) = 0; + virtual void SetAllZoneColors(int zone, RGBColor color) = 0; /*-----------------------------------------------------*\ | Serialized Description Functions | \*-----------------------------------------------------*/ - virtual unsigned char * GetDeviceDescription(unsigned int protocol_version) = 0; - virtual void ReadDeviceDescription(unsigned char* data_buf, unsigned int protocol_version) = 0; + virtual unsigned char * GetDeviceDescription(unsigned int protocol_version) = 0; + virtual void ReadDeviceDescription(unsigned char* data_buf, unsigned int protocol_version) = 0; - virtual unsigned char * GetModeDescription(int mode, unsigned int protocol_version) = 0; - virtual void SetModeDescription(unsigned char* data_buf, unsigned int protocol_version) = 0; + virtual unsigned char * GetModeDescription(int mode, unsigned int protocol_version) = 0; + virtual void SetModeDescription(unsigned char* data_buf, unsigned int protocol_version) = 0; - virtual unsigned char * GetColorDescription() = 0; - virtual void SetColorDescription(unsigned char* data_buf) = 0; + virtual unsigned char * GetColorDescription() = 0; + virtual void SetColorDescription(unsigned char* data_buf) = 0; - virtual unsigned char * GetZoneColorDescription(int zone) = 0; - virtual void SetZoneColorDescription(unsigned char* data_buf) = 0; + virtual unsigned char * GetZoneColorDescription(int zone) = 0; + virtual void SetZoneColorDescription(unsigned char* data_buf) = 0; - virtual unsigned char * GetSingleLEDColorDescription(int led) = 0; - virtual void SetSingleLEDColorDescription(unsigned char* data_buf) = 0; + virtual unsigned char * GetSingleLEDColorDescription(int led) = 0; + virtual void SetSingleLEDColorDescription(unsigned char* data_buf) = 0; - virtual unsigned char * GetSegmentDescription(int zone, segment new_segment) = 0; - virtual void SetSegmentDescription(unsigned char* data_buf) = 0; + virtual unsigned char * GetSegmentDescription(int zone, segment new_segment) = 0; + virtual void SetSegmentDescription(unsigned char* data_buf) = 0; /*-----------------------------------------------------*\ | JSON Description Functions | \*-----------------------------------------------------*/ - virtual nlohmann::json GetDeviceDescriptionJSON() = 0; - virtual nlohmann::json GetLEDDescriptionJSON(int led) = 0; - virtual nlohmann::json GetModeDescriptionJSON(int mode) = 0; - virtual nlohmann::json GetSegmentDescriptionJSON(int zone, int segment) = 0; - virtual nlohmann::json GetZoneDescriptionJSON(int zone) = 0; + virtual nlohmann::json GetDeviceDescriptionJSON() = 0; + virtual nlohmann::json GetLEDDescriptionJSON(int led) = 0; + virtual nlohmann::json GetModeDescriptionJSON(int mode) = 0; + virtual nlohmann::json GetSegmentDescriptionJSON(int zone, int segment) = 0; + virtual nlohmann::json GetZoneDescriptionJSON(int zone) = 0; - virtual void SetDeviceDescriptionJSON(nlohmann::json controller_json) = 0; - virtual led SetLEDDescriptionJSON(nlohmann::json led_json) = 0; - virtual mode SetModeDescriptionJSON(nlohmann::json mode_json) = 0; - virtual segment SetSegmentDescriptionJSON(nlohmann::json segment_json) = 0; - virtual zone SetZoneDescriptionJSON(nlohmann::json zone_json) = 0; + virtual void SetDeviceDescriptionJSON(nlohmann::json controller_json) = 0; + virtual led SetLEDDescriptionJSON(nlohmann::json led_json) = 0; + virtual mode SetModeDescriptionJSON(nlohmann::json mode_json) = 0; + virtual segment SetSegmentDescriptionJSON(nlohmann::json segment_json) = 0; + virtual zone SetZoneDescriptionJSON(nlohmann::json zone_json) = 0; /*-----------------------------------------------------*\ | Update Callback Functions | \*-----------------------------------------------------*/ - virtual void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) = 0; - virtual void UnregisterUpdateCallback(void * callback_arg) = 0; - virtual void ClearCallbacks() = 0; - virtual void SignalUpdate(unsigned int update_reason) = 0; + virtual void RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) = 0; + virtual void UnregisterUpdateCallback(void * callback_arg) = 0; + virtual void ClearCallbacks() = 0; + virtual void SignalUpdate(unsigned int update_reason) = 0; /*-----------------------------------------------------*\ | Device Update Functions | \*-----------------------------------------------------*/ - virtual void UpdateLEDs() = 0; - virtual void UpdateZoneLEDs(int zone) = 0; - virtual void UpdateSingleLED(int led) = 0; + virtual void UpdateLEDs() = 0; + virtual void UpdateZoneLEDs(int zone) = 0; + virtual void UpdateSingleLED(int led) = 0; - virtual void UpdateMode() = 0; - virtual void SaveMode() = 0; + virtual void UpdateMode() = 0; + virtual void SaveMode() = 0; - virtual void ClearSegments(int zone) = 0; - virtual void AddSegment(int zone, segment new_segment) = 0; + virtual void ClearSegments(int zone) = 0; + virtual void AddSegment(int zone, segment new_segment) = 0; - virtual void ResizeZone(int zone, int new_size) = 0; + virtual void ResizeZone(int zone, int new_size) = 0; }; class RGBController : public RGBControllerInterface @@ -466,6 +495,7 @@ public: /*-----------------------------------------------------*\ | Zone Functions | \*-----------------------------------------------------*/ + int GetZoneActiveMode(unsigned int zone); RGBColor GetZoneColor(unsigned int zone, unsigned int color_index); RGBColor* GetZoneColorsPointer(unsigned int zone); std::size_t GetZoneCount(); @@ -477,6 +507,22 @@ public: unsigned int GetZoneMatrixMapHeight(unsigned int zone); const unsigned int* GetZoneMatrixMap(unsigned int zone); unsigned int GetZoneMatrixMapWidth(unsigned int zone); + std::size_t GetZoneModeCount(unsigned int zone); + unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeBrightnessMax(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeBrightnessMin(unsigned int zone, unsigned int mode); + RGBColor GetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index); + unsigned int GetZoneModeColorMode(unsigned int zone, unsigned int mode); + std::size_t GetZoneModeColorsCount(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeColorsMax(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeColorsMin(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeDirection(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeFlags(unsigned int zone, unsigned int mode); + std::string GetZoneModeName(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeSpeed(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeSpeedMax(unsigned int zone, unsigned int mode); + unsigned int GetZoneModeSpeedMin(unsigned int zone, unsigned int mode); + int GetZoneModeValue(unsigned int zone, unsigned int mode); std::string GetZoneName(unsigned int zone); std::size_t GetZoneSegmentCount(unsigned int zone); unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment); @@ -492,6 +538,14 @@ public: unsigned int GetLEDsInZone(unsigned int zone); + void SetZoneActiveMode(unsigned int zone, int mode); + void SetZoneModeBrightness(unsigned int zone, unsigned int mode, unsigned int brightness); + void SetZoneModeColor(unsigned int zone, unsigned int mode, unsigned int color_index, RGBColor color); + void SetZoneModeColorMode(unsigned int zone, unsigned int mode, unsigned int color_mode); + void SetZoneModeColorsCount(unsigned int zone, unsigned int mode, std::size_t count); + void SetZoneModeDirection(unsigned int zone, unsigned int mode, unsigned int direction); + void SetZoneModeSpeed(unsigned int zone, unsigned int mode, unsigned int speed); + /*-----------------------------------------------------*\ | Mode Functions | \*-----------------------------------------------------*/ diff --git a/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp b/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp index 0bc4e31b..09e84cbd 100644 --- a/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp +++ b/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp @@ -726,45 +726,97 @@ void OpenRGBDevicePage::UpdateModeUi() unsigned int selected_mode = (unsigned int)ui->ModeBox->currentIndex(); /*-----------------------------------------------------*\ - | Don't update the UI if the current mode is invalid | + | Determine what is selected, either all zones, a zone, | + | or a segment | \*-----------------------------------------------------*/ - if(selected_mode < device->GetModeCount()) - { - bool supports_per_led = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_PER_LED_COLOR ); - bool supports_mode_specific = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR ); - bool supports_random = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_RANDOM_COLOR ); - bool supports_speed = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_SPEED ); - bool supports_brightness = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_BRIGHTNESS); - bool supports_dir_lr = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_DIRECTION_LR ); - bool supports_dir_ud = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_DIRECTION_UD ); - bool supports_dir_hv = ( device->GetModeFlags(selected_mode) & MODE_FLAG_HAS_DIRECTION_HV ); - bool per_led = device->GetModeColorMode(selected_mode) == MODE_COLORS_PER_LED; - bool mode_specific = device->GetModeColorMode(selected_mode) == MODE_COLORS_MODE_SPECIFIC; - bool random = device->GetModeColorMode(selected_mode) == MODE_COLORS_RANDOM; - unsigned int dir = device->GetModeDirection(selected_mode); - bool manual_save = ( device->GetModeFlags(selected_mode) & MODE_FLAG_MANUAL_SAVE ); - bool automatic_save = ( device->GetModeFlags(selected_mode) & MODE_FLAG_AUTOMATIC_SAVE ); + bool selected_all_zones; + int selected_zone; + int selected_segment; + getSelectedZone(&selected_all_zones, &selected_zone, &selected_segment); + + /*-----------------------------------------------------*\ + | Read mode variables | + \*-----------------------------------------------------*/ + unsigned int brightness; + unsigned int brightness_min; + unsigned int brightness_max; + unsigned int color_mode; + unsigned int direction; + unsigned int flags; + unsigned int speed; + unsigned int speed_min; + unsigned int speed_max; + + if((!selected_all_zones) && (selected_mode < device->GetZoneModeCount(selected_zone))) + { + brightness = device->GetZoneModeBrightness(selected_zone, selected_mode); + brightness_min = device->GetZoneModeBrightnessMin(selected_zone, selected_mode); + brightness_max = device->GetZoneModeBrightnessMax(selected_zone, selected_mode); + color_mode = device->GetZoneModeColorMode(selected_zone, selected_mode); + direction = device->GetZoneModeDirection(selected_zone, selected_mode); + flags = device->GetZoneModeFlags(selected_zone, selected_mode); + speed = device->GetZoneModeSpeed(selected_zone, selected_mode); + speed_min = device->GetZoneModeSpeedMin(selected_zone, selected_mode); + speed_max = device->GetZoneModeSpeedMax(selected_zone, selected_mode); + } + else if(selected_mode < device->GetModeCount()) + { + brightness = device->GetModeBrightness(selected_mode); + brightness_min = device->GetModeBrightnessMin(selected_mode); + brightness_max = device->GetModeBrightnessMax(selected_mode); + color_mode = device->GetModeColorMode(selected_mode); + direction = device->GetModeDirection(selected_mode); + flags = device->GetModeFlags(selected_mode); + speed = device->GetModeSpeed(selected_mode); + speed_min = device->GetModeSpeedMin(selected_mode); + speed_max = device->GetModeSpeedMax(selected_mode); + } + else + { + /*-------------------------------------------------*\ + | Don't update the UI if the current mode is invalid| + \*-------------------------------------------------*/ + return; + } + + /*-----------------------------------------------------*\ + | Read mode flags | + \*-----------------------------------------------------*/ + bool supports_per_led = flags & MODE_FLAG_HAS_PER_LED_COLOR; + bool supports_mode_specific = flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR; + bool supports_random = flags & MODE_FLAG_HAS_RANDOM_COLOR; + bool supports_speed = flags & MODE_FLAG_HAS_SPEED; + bool supports_brightness = flags & MODE_FLAG_HAS_BRIGHTNESS; + bool supports_dir_lr = flags & MODE_FLAG_HAS_DIRECTION_LR; + bool supports_dir_ud = flags & MODE_FLAG_HAS_DIRECTION_UD; + bool supports_dir_hv = flags & MODE_FLAG_HAS_DIRECTION_HV; + bool per_led = color_mode == MODE_COLORS_PER_LED; + bool mode_specific = color_mode == MODE_COLORS_MODE_SPECIFIC; + bool random = color_mode == MODE_COLORS_RANDOM; + bool manual_save = flags & MODE_FLAG_MANUAL_SAVE; + bool automatic_save = flags & MODE_FLAG_AUTOMATIC_SAVE; + if(supports_speed) { ui->SpeedSlider->blockSignals(true); int current_speed; - InvertedSpeed = device->GetModeSpeedMin(selected_mode) > device->GetModeSpeedMax(selected_mode); + InvertedSpeed = speed_min > speed_max; if(InvertedSpeed) { /*-----------------------------------------------------*\ | If Speed Slider is inverted, invert value | \*-----------------------------------------------------*/ - ui->SpeedSlider->setMinimum(device->GetModeSpeedMax(selected_mode)); - ui->SpeedSlider->setMaximum(device->GetModeSpeedMin(selected_mode)); - current_speed = device->GetModeSpeedMin(selected_mode) - device->GetModeSpeed(selected_mode) + device->GetModeSpeedMax(selected_mode); + ui->SpeedSlider->setMinimum(speed_max); + ui->SpeedSlider->setMaximum(speed_min); + current_speed = speed_min - speed + speed_max; } else { - ui->SpeedSlider->setMinimum(device->GetModeSpeedMin(selected_mode)); - ui->SpeedSlider->setMaximum(device->GetModeSpeedMax(selected_mode)); - current_speed = device->GetModeSpeed(selected_mode); + ui->SpeedSlider->setMinimum(speed_min); + ui->SpeedSlider->setMaximum(speed_max); + current_speed = speed; } ui->SpeedSlider->setValue(current_speed); @@ -782,22 +834,22 @@ void OpenRGBDevicePage::UpdateModeUi() { ui->BrightnessSlider->blockSignals(true); int current_brightness; - InvertedBrightness = device->GetModeBrightnessMin(selected_mode) > device->GetModeBrightnessMax(selected_mode); + InvertedBrightness = brightness_min > brightness_max; if(InvertedBrightness) { /*-----------------------------------------------------*\ | If Brightness Slider is inverted, invert value | \*-----------------------------------------------------*/ - ui->BrightnessSlider->setMinimum(device->GetModeBrightnessMax(selected_mode)); - ui->BrightnessSlider->setMaximum(device->GetModeBrightnessMin(selected_mode)); - current_brightness = device->GetModeBrightnessMin(selected_mode) - device->GetModeBrightness(selected_mode) + device->GetModeBrightnessMax(selected_mode); + ui->BrightnessSlider->setMinimum(brightness_max); + ui->BrightnessSlider->setMaximum(brightness_min); + current_brightness = brightness_min - brightness + brightness_max; } else { - ui->BrightnessSlider->setMinimum(device->GetModeBrightnessMin(selected_mode)); - ui->BrightnessSlider->setMaximum(device->GetModeBrightnessMax(selected_mode)); - current_brightness = device->GetModeBrightness(selected_mode); + ui->BrightnessSlider->setMinimum(brightness_min); + ui->BrightnessSlider->setMaximum(brightness_max); + current_brightness = brightness; } ui->BrightnessSlider->setValue(current_brightness); @@ -835,41 +887,41 @@ void OpenRGBDevicePage::UpdateModeUi() if(supports_dir_lr || supports_dir_ud || supports_dir_hv) { if((supports_dir_lr) - &&((dir == MODE_DIRECTION_LEFT) - ||(dir == MODE_DIRECTION_RIGHT))) + &&((direction == MODE_DIRECTION_LEFT) + ||(direction == MODE_DIRECTION_RIGHT))) { - ui->DirectionBox->setCurrentIndex(dir); + ui->DirectionBox->setCurrentIndex(direction); } if((supports_dir_ud) - &&((dir == MODE_DIRECTION_UP) - ||(dir == MODE_DIRECTION_DOWN))) + &&((direction == MODE_DIRECTION_UP) + ||(direction == MODE_DIRECTION_DOWN))) { if(supports_dir_lr) { - ui->DirectionBox->setCurrentIndex(dir); + ui->DirectionBox->setCurrentIndex(direction); } else { - ui->DirectionBox->setCurrentIndex(dir - 2); + ui->DirectionBox->setCurrentIndex(direction - 2); } } if((supports_dir_hv) - &&((dir == MODE_DIRECTION_HORIZONTAL) - ||(dir == MODE_DIRECTION_VERTICAL))) + &&((direction == MODE_DIRECTION_HORIZONTAL) + ||(direction == MODE_DIRECTION_VERTICAL))) { if(supports_dir_lr && supports_dir_ud) { - ui->DirectionBox->setCurrentIndex(dir); + ui->DirectionBox->setCurrentIndex(direction); } else if(supports_dir_lr || supports_dir_ud) { - ui->DirectionBox->setCurrentIndex(dir - 2); + ui->DirectionBox->setCurrentIndex(direction - 2); } else { - ui->DirectionBox->setCurrentIndex(dir - 4); + ui->DirectionBox->setCurrentIndex(direction - 4); } } @@ -946,7 +998,7 @@ void OpenRGBDevicePage::UpdateModeUi() /*-----------------------------------------------------*\ | Fill in the zone box based on color mode | \*-----------------------------------------------------*/ - switch(device->GetModeColorMode(selected_mode)) + switch(color_mode) { case MODE_COLORS_NONE: case MODE_COLORS_RANDOM: @@ -1046,7 +1098,7 @@ void OpenRGBDevicePage::UpdateModeUi() ui->ApplyColorsButton->setEnabled(true); break; } - } + } void OpenRGBDevicePage::UpdateMode()