From eff728fdf5f090663ebcc7e5f5bd49e91f676591 Mon Sep 17 00:00:00 2001 From: DavutHaxor <37223772+DavutHaxor@users.noreply.github.com> Date: Tue, 14 Apr 2026 17:27:36 +0300 Subject: [PATCH] Fix ddc brightness not applying because process exits before debounce timer runs (#2217) * Fix ddc brightness not applying because process exits before debounce timer runs * Added sync.WaitGroup to DDCBackend and use it instead of loop in wait logic, added timeout in case i2c hangs. * go fmt --------- Co-authored-by: bbedward --- core/cmd/dms/commands_brightness.go | 1 + core/internal/server/brightness/ddc.go | 16 ++++++++++++++++ core/internal/server/brightness/types.go | 1 + 3 files changed, 18 insertions(+) diff --git a/core/cmd/dms/commands_brightness.go b/core/cmd/dms/commands_brightness.go index 8e7aafd5..0f734937 100644 --- a/core/cmd/dms/commands_brightness.go +++ b/core/cmd/dms/commands_brightness.go @@ -236,6 +236,7 @@ func runBrightnessSet(cmd *cobra.Command, args []string) { defer ddc.Close() time.Sleep(100 * time.Millisecond) if err := ddc.SetBrightnessWithExponent(deviceID, percent, exponential, exponent, nil); err == nil { + ddc.WaitPending() fmt.Printf("Set %s to %d%%\n", deviceID, percent) return } diff --git a/core/internal/server/brightness/ddc.go b/core/internal/server/brightness/ddc.go index a5e4802d..00cf2d9a 100644 --- a/core/internal/server/brightness/ddc.go +++ b/core/internal/server/brightness/ddc.go @@ -218,7 +218,9 @@ func (b *DDCBackend) SetBrightnessWithExponent(id string, value int, exponential if timer, exists := b.debounceTimers[id]; exists { timer.Reset(200 * time.Millisecond) } else { + b.debounceWg.Add(1) b.debounceTimers[id] = time.AfterFunc(200*time.Millisecond, func() { + defer b.debounceWg.Done() b.debounceMutex.Lock() pending, exists := b.debouncePending[id] if exists { @@ -490,5 +492,19 @@ func (b *DDCBackend) valueToPercent(value int, max int, exponential bool) int { return percent } +func (b *DDCBackend) WaitPending() { + done := make(chan struct{}) + go func() { + b.debounceWg.Wait() + close(done) + }() + + select { + case <-done: + case <-time.After(5 * time.Second): + log.Debug("WaitPending timed out waiting for DDC writes") + } +} + func (b *DDCBackend) Close() { } diff --git a/core/internal/server/brightness/types.go b/core/internal/server/brightness/types.go index 0db7f7a6..81e00cfe 100644 --- a/core/internal/server/brightness/types.go +++ b/core/internal/server/brightness/types.go @@ -84,6 +84,7 @@ type DDCBackend struct { debounceMutex sync.Mutex debounceTimers map[string]*time.Timer debouncePending map[string]ddcPendingSet + debounceWg sync.WaitGroup } type ddcPendingSet struct {