commit 76180c302197e83a257b975394768e5affa4054e
parent efe8866f28f229446440c6d871e4f9845a97266f
Author: Martin Ashby <martin@martin-laptop.lan>
Date:   Fri,  1 Jun 2018 19:34:30 +0100
Fixed problem with image changing during render
Diffstat:
3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/unicorn/FakeUnicorn2.go b/unicorn/FakeUnicorn2.go
@@ -9,7 +9,7 @@ import (
 )
 
 type FakeUnicorn2 struct {
-	BaseUnicorn2
+	*BaseUnicorn2
 	*BaseFakeUnicorn
 }
 
@@ -49,7 +49,7 @@ func NewUnicorn2() (*FakeUnicorn2, error) {
 		return nil, err
 	}
 	return &FakeUnicorn2{
-		BaseUnicorn2{},
+		NewBaseUnicorn2(),
 		baseFake,
 	}, nil
 }
diff --git a/unicorn/RealUnicorn2.go b/unicorn/RealUnicorn2.go
@@ -13,7 +13,7 @@ import (
 )
 
 type RealUnicorn2 struct {
-	BaseUnicorn2
+	*BaseUnicorn2
 	device *spi.Device
 }
 
@@ -55,7 +55,7 @@ func NewUnicorn2() (*RealUnicorn2, error) {
 		return nil, err
 	}
 	return &RealUnicorn2{
-		BaseUnicorn2{},
+		NewBaseUnicorn2(),
 		dev,
 	}, nil
 }
diff --git a/unicorn/Unicorn2.go b/unicorn/Unicorn2.go
@@ -5,6 +5,7 @@ package unicorn
 
 import (
 	"image"
+	"image/color/palette"
 	"image/gif"
 	"time"
 )
@@ -18,7 +19,7 @@ type Unicorn2 interface {
 	SetGif(*gif.GIF)
 
 	// Starts the rendering goroutine
-	StartRender()
+	StartRender() chan bool
 
 	// Must be implemented to actually render the image to device
 	renderImage(image.Image)
@@ -42,6 +43,23 @@ func (u *BaseUnicorn2) SetGif(g *gif.GIF) {
 	u.g = g
 }
 
+func NewBaseUnicorn2() *BaseUnicorn2 {
+	im := image.NewPaletted(
+		image.Rect(0, 0, 16, 16),
+		palette.WebSafe)
+
+	gf := &gif.GIF{
+		Image:           []*image.Paletted{im},
+		Delay:           []int{50},
+		Disposal:        []byte{gif.DisposalBackground},
+		BackgroundIndex: 0, // This is black in the websafe palette
+	}
+
+	return &BaseUnicorn2{
+		g: gf,
+	}
+}
+
 // StartRenderBase ...
 // Deals with the timing aspect of animated GIFs
 func (u *BaseUnicorn2) StartRenderBase(renderImage func(image.Image)) chan bool {
@@ -57,6 +75,12 @@ func (u *BaseUnicorn2) StartRenderBase(renderImage func(image.Image)) chan bool 
 				running = false
 			case <-timer.C:
 				gf := u.GetGif()
+
+				// Image could change underneath us, but there should always be 1 image at least.
+				if imageIndex >= len(gf.Image) {
+					imageIndex = 0
+				}
+
 				im := gf.Image[imageIndex]
 				delay := gf.Delay[imageIndex] //100ths of a second, 10^-2
 				renderImage(im)