diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index b603e742e..0726ca639 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -341,11 +341,6 @@ unsigned int RGBController::GetZoneLEDsCount(unsigned int zone) if(zone < zones.size()) { leds_count = zones[zone].leds_count; - - if((zones[zone].flags & ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE_EFFECTS_ONLY) && (leds_count > 1)) - { - leds_count = 1; - } } else { @@ -1909,6 +1904,8 @@ void RGBController::UpdateZoneLEDs(int zone) AccessMutex.lock_shared(); DeviceUpdateZoneLEDs(zone); AccessMutex.unlock_shared(); + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); } void RGBController::UpdateSingleLED(int led) @@ -1916,6 +1913,8 @@ void RGBController::UpdateSingleLED(int led) AccessMutex.lock_shared(); DeviceUpdateSingleLED(led); AccessMutex.unlock_shared(); + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); } void RGBController::UpdateMode() @@ -1930,6 +1929,8 @@ void RGBController::UpdateZoneMode(int zone) AccessMutex.lock_shared(); DeviceUpdateZoneMode(zone); AccessMutex.unlock_shared(); + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATEMODE); } void RGBController::SaveMode() @@ -3770,6 +3771,23 @@ unsigned char* RGBController::SetZoneDescription(unsigned char* data_ptr, unsign COPY_DATA_FIELD(data_ptr, data_start, zone->flags); } + /*-----------------------------------------------------*\ + | Set the manually configurable flag if older protocol | + | and the LED minimum and maximum differ | + \*-----------------------------------------------------*/ + if(protocol_version < 6) + { + if((zone->leds_min != zone->leds_max) && !(zone->flags & ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE_EFFECTS_ONLY)) + { + zone->flags |= ZONE_FLAG_MANUALLY_CONFIGURABLE_SIZE; + } + + if(zone->leds_count > 0) + { + zone->flags |= ZONE_FLAG_MANUALLY_CONFIGURED_SIZE; + } + } + /*-----------------------------------------------------*\ | Copy in zone modes | \*-----------------------------------------------------*/ diff --git a/RGBController/RGBController_Network.cpp b/RGBController/RGBController_Network.cpp index 7cca43d20..bae4c825f 100644 --- a/RGBController/RGBController_Network.cpp +++ b/RGBController/RGBController_Network.cpp @@ -32,7 +32,14 @@ unsigned int RGBController_Network::GetID() void RGBController_Network::SetHidden(bool hidden) { - client->SendRequest_RGBController_SetHidden(dev_id, hidden); + if(client->GetProtocolVersion() < 6) + { + RGBController::SetHidden(hidden); + } + else + { + client->SendRequest_RGBController_SetHidden(dev_id, hidden); + } } void RGBController_Network::ClearSegments(int zone) @@ -395,20 +402,67 @@ void RGBController_Network::SetDeviceSpecificZoneConfiguration(int zone, nlohman client->WaitOnControllerData(); } -/*-----------------------------------------------------*\ -| This function overrides RGBController::UpdateLEDs()! | -| Normally, UpdateLEDs() sets a flag for the updater | -| thread to update the device asynchronously, which | -| prevents delays updating local devices. This causes | -| instability and flickering with network devices though| -| so for the network implementation, process all updates| -| synchronously. | -\*-----------------------------------------------------*/ +/*---------------------------------------------------------*\ +| This function overrides RGBController::UpdateLEDs()! | +| Normally, UpdateLEDs() sets a flag for the updater | +| thread to update the device asynchronously, which | +| prevents delays updating local devices. This causes | +| instability and flickering with network devices though | +| so for the network implementation, process all updates | +| synchronously. | +\*---------------------------------------------------------*/ void RGBController_Network::UpdateLEDs() { AccessMutex.lock_shared(); DeviceUpdateLEDs(); AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); + } +} + +void RGBController_Network::UpdateZoneLEDs(int zone) +{ + AccessMutex.lock_shared(); + DeviceUpdateZoneLEDs(zone); + AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); + } +} + +void RGBController_Network::UpdateSingleLED(int led) +{ + AccessMutex.lock_shared(); + DeviceUpdateSingleLED(led); + AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); + } } void RGBController_Network::UpdateMode() @@ -416,6 +470,53 @@ void RGBController_Network::UpdateMode() AccessMutex.lock_shared(); DeviceUpdateMode(); AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATEMODE); + } +} + +void RGBController_Network::UpdateZoneMode(int zone) +{ + AccessMutex.lock_shared(); + DeviceUpdateZoneMode(zone); + AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATEMODE); + } +} + +void RGBController_Network::SaveMode() +{ + AccessMutex.lock_shared(); + DeviceSaveMode(); + AccessMutex.unlock_shared(); + + /*-----------------------------------------------------*\ + | On protocol 6+, the server sends SignalUpdate packets | + | back to the client, but on earlier protocols we need | + | to signal the update internally and assume it was | + | successfully updated on the server. | + \*-----------------------------------------------------*/ + if(client->GetProtocolVersion() < 6) + { + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_SAVEMODE); + } } unsigned char * RGBController_Network::CreateUpdateLEDsPacket(unsigned int protocol_version) diff --git a/RGBController/RGBController_Network.h b/RGBController/RGBController_Network.h index ef4311845..1ccee8697 100644 --- a/RGBController/RGBController_Network.h +++ b/RGBController/RGBController_Network.h @@ -43,7 +43,12 @@ public: void SetDeviceSpecificZoneConfiguration(int zone, nlohmann::json configuration_json); void UpdateLEDs(); + void UpdateZoneLEDs(int zone); + void UpdateSingleLED(int led); + void UpdateMode(); + void UpdateZoneMode(int zone); + void SaveMode(); void DeviceUpdateMode(); void DeviceUpdateZoneMode(int zone); diff --git a/cli.cpp b/cli.cpp index 44d26e369..bbb0aa9d1 100644 --- a/cli.cpp +++ b/cli.cpp @@ -1207,7 +1207,7 @@ void ApplyOptions(DeviceOptions& options, std::vector& rgb_cont else { start_from = (std::size_t)device->GetZoneStartIndex(options.zone); - led_count = (std::size_t)device->GetZoneLEDsCount(options.zone); + led_count = (std::size_t)device->GetLEDsInZone(options.zone); } for(std::size_t led_idx = 0; led_idx < led_count; led_idx++) diff --git a/qt/OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.cpp b/qt/OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.cpp index bf8beb5da..3a24218b5 100644 --- a/qt/OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.cpp +++ b/qt/OpenRGBZoneInitializationDialog/OpenRGBZoneInitializationDialog.cpp @@ -155,7 +155,7 @@ void OpenRGBZoneInitializationDialog::CreateZoneWidget(RGBController* controller | Spin box: controls the zone size | \*---------------------------------------------------------*/ QSpinBox* spin_box = new QSpinBox(this); - spin_box->setValue(0); + spin_box->setValue(controller->GetZoneLEDsCount(zone_index)); spin_box->setMinimum(controller->GetZoneLEDsMin(zone_index)); spin_box->setMaximum(controller->GetZoneLEDsMax(zone_index));