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 {