From 2fa57a73a16d78cc1c7bae48b85e053eb6bff877 Mon Sep 17 00:00:00 2001 From: Gabriel Augendre Date: Mon, 16 Sep 2024 18:09:00 +0200 Subject: [PATCH] refresh only when image changes --- img.go | 2 +- main.go | 2 +- run_darwin_arm64.go | 2 +- run_linux_arm64.go | 49 +++++++++++++++++++++++++++++++++------------ 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/img.go b/img.go index cfaad76..34f25bf 100644 --- a/img.go +++ b/img.go @@ -29,7 +29,7 @@ const ( rightX = 530 ) -func getBlack( +func getImg( ctx context.Context, nowFunc func() time.Time, transportsClient *transports.Client, diff --git a/main.go b/main.go index bd7246f..97453eb 100644 --- a/main.go +++ b/main.go @@ -41,7 +41,7 @@ func main() { CacheLocation: os.Getenv("WEATHER_CACHE_LOCATION"), }) - const minSleep = 30 * time.Second + const minSleep = 1 * time.Second sleep, err := time.ParseDuration(os.Getenv("SLEEP_DURATION")) if err != nil || sleep < minSleep { diff --git a/run_darwin_arm64.go b/run_darwin_arm64.go index 80bd6e8..1a5e2fc 100644 --- a/run_darwin_arm64.go +++ b/run_darwin_arm64.go @@ -17,7 +17,7 @@ func run( feteClient *fete.Client, weatherClient *weather.Client, ) error { - img, err := getBlack( + img, err := getImg( ctx, func() time.Time { t, err := time.Parse(time.DateOnly, "2024-08-01zzz") diff --git a/run_linux_arm64.go b/run_linux_arm64.go index b64e2da..25fbbc9 100644 --- a/run_linux_arm64.go +++ b/run_linux_arm64.go @@ -7,6 +7,7 @@ import ( "github.com/Crocmagnon/display-epaper/fete" "github.com/Crocmagnon/display-epaper/transports" "github.com/Crocmagnon/display-epaper/weather" + "image" "log" "os" "periph.io/x/host/v3" @@ -30,6 +31,8 @@ func run( return fmt.Errorf("initializing epd: %w", err) } + var currentImg image.Image + for { select { case <-ctx.Done(): @@ -40,9 +43,10 @@ func run( log.Println("running loop") - err = loop( + img, err := loop( ctx, display, + currentImg, transportsClient, feteClient, weatherClient, @@ -51,19 +55,15 @@ func run( log.Printf("error looping: %v\n", err) } + currentImg = img + log.Printf("time.Sleep(%v)\n", sleep) time.Sleep(sleep) } } -func loop( - ctx context.Context, - display *epd.EPD, - transportsClient *transports.Client, - feteClient *fete.Client, - weatherClient *weather.Client, -) error { - black, err := getBlack( +func loop(ctx context.Context, display *epd.EPD, currentImg image.Image, transportsClient *transports.Client, feteClient *fete.Client, weatherClient *weather.Client) (image.Image, error) { + img, err := getImg( ctx, time.Now, transportsClient, @@ -71,7 +71,12 @@ func loop( weatherClient, ) if err != nil { - return fmt.Errorf("getting black: %w", err) + return nil, fmt.Errorf("getting black: %w", err) + } + + if imgEqual(currentImg, img, epd.Width, epd.Height) { + log.Println("Images are equal, doing nothing.") + return img, nil } defer func() { @@ -82,15 +87,15 @@ func loop( err = initDisplay(display) if err != nil { - return fmt.Errorf("initializing display: %w", err) + return nil, fmt.Errorf("initializing display: %w", err) } display.Clear() - display.Send(black) + display.Send(img) display.Refresh() - return nil + return img, nil } const filename = "/perm/display-epaper-lastFullRefresh" @@ -131,3 +136,21 @@ func markInitFull() { f.Close() } + +func imgEqual(img1, img2 image.Image, width, height int) bool { + if img1 == nil || img2 == nil { + return false + } + + for y := 0; y < height; y++ { + for x := 0; x < width; x++ { + r1, g1, b1, a1 := img1.At(x, y).RGBA() + r2, g2, b2, a2 := img2.At(x, y).RGBA() + if r1 != r2 || g1 != g2 || b1 != b2 || a1 != a2 { + return false + } + } + } + + return true +}