diff --git a/display.go b/display.go index aab19fbc..59708160 100644 --- a/display.go +++ b/display.go @@ -1,6 +1,7 @@ package kvm import ( + "context" "errors" "fmt" "os" @@ -110,10 +111,14 @@ func clearDisplayState() { currentScreen = "ui_Boot_Screen" } +const ( + cloudBlinkInterval = 2 * time.Second + cloudBlinkDuration = 1 * time.Second +) + var ( - cloudBlinkLock sync.Mutex = sync.Mutex{} - cloudBlinkStopped bool - cloudBlinkTicker *time.Ticker + cloudBlinkTicker *time.Ticker + cloudBlinkCancel context.CancelFunc ) func updateDisplay() { @@ -160,40 +165,48 @@ func updateDisplay() { } func startCloudBlink() { - if cloudBlinkTicker == nil { - cloudBlinkTicker = time.NewTicker(2 * time.Second) - } else { - // do nothing if the blink isn't stopped - if cloudBlinkStopped { - cloudBlinkLock.Lock() - defer cloudBlinkLock.Unlock() + // Stop any existing blink animation + stopCloudBlink() - cloudBlinkStopped = false - cloudBlinkTicker.Reset(2 * time.Second) - } + // Create new ticker and context + if cloudBlinkTicker == nil { + cloudBlinkTicker = time.NewTicker(cloudBlinkInterval) + } else { + cloudBlinkTicker.Reset(cloudBlinkInterval) } - go func() { - for range cloudBlinkTicker.C { + ctx, cancel := context.WithCancel(context.Background()) + cloudBlinkCancel = cancel + + go doCloudBlink(ctx) +} + +func doCloudBlink(ctx context.Context) { + for { + select { + case <-ctx.Done(): + return + case <-cloudBlinkTicker.C: if cloudConnectionState != CloudConnectionStateConnecting { continue } - _, _ = lvObjFadeOut("ui_Home_Header_Cloud_Status_Icon", 1000) - time.Sleep(1000 * time.Millisecond) - _, _ = lvObjFadeIn("ui_Home_Header_Cloud_Status_Icon", 1000) - time.Sleep(1000 * time.Millisecond) + _, _ = lvObjFadeOut("ui_Home_Header_Cloud_Status_Icon", uint32(cloudBlinkDuration.Milliseconds())) + time.Sleep(cloudBlinkDuration) + _, _ = lvObjFadeIn("ui_Home_Header_Cloud_Status_Icon", uint32(cloudBlinkDuration.Milliseconds())) + time.Sleep(cloudBlinkDuration) } - }() + } } func stopCloudBlink() { + if cloudBlinkCancel != nil { + cloudBlinkCancel() + cloudBlinkCancel = nil + } + if cloudBlinkTicker != nil { cloudBlinkTicker.Stop() } - - cloudBlinkLock.Lock() - defer cloudBlinkLock.Unlock() - cloudBlinkStopped = true } var ( diff --git a/resource/jetkvm_native b/resource/jetkvm_native index a47288b9..68d0d4e0 100644 Binary files a/resource/jetkvm_native and b/resource/jetkvm_native differ diff --git a/resource/jetkvm_native.sha256 b/resource/jetkvm_native.sha256 index ceba8b20..0c0a4ff5 100644 --- a/resource/jetkvm_native.sha256 +++ b/resource/jetkvm_native.sha256 @@ -1 +1 @@ -6dabd0e657dd099280d9173069687786a4a8c9c25cf7f9e7ce2f940cab67c521 +01db2bbcd0bad46c3e21eb3cc5687d15df2153c3d8e2d4665b37acb55f0b5a57