| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -14,7 +14,6 @@ import (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"os/signal"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"syscall"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"time"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					rgbmatrix "gitea.wagshome.duckdns.org/publicWagsHome/go-rpi-rgb-led-matrix"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					"github.com/disintegration/imaging"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					MQTT "github.com/eclipse/paho.mqtt.golang"
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -23,7 +22,6 @@ import (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//  contents of struct mostly don't matter for toolkit.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				type incomingImage struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					Image string `json:"image"`
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -36,7 +34,8 @@ type Animation struct {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					width    int
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					stroke   int
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					image    []image.Image
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					updown   int
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					images   map[string]image.Image
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					updown   string
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					mqmsg    chan mqtt.Message
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					msg      string
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -112,6 +111,7 @@ func fatal(err error) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//initializes the struct for the an play animation function, this could all be dumped into function that's wrapping go routine if I wanted
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func NewAnimation(sz image.Point, mqMessages chan mqtt.Message) *Animation {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					imageMap := make(map[string]image.Image)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					reader, err := os.Open("marioUp.png")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if err != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						log.Fatal(err)
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -120,7 +120,7 @@ func NewAnimation(sz image.Point, mqMessages chan mqtt.Message) *Animation {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//marioUp := imaging.FlipH(imaging.Resize(rawMario, 16, 16, imaging.Lanczos))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					marioUp := imaging.Resize(rawMario, 16, 16, imaging.Lanczos)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					imageMap["marioUp"] = marioUp
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					reader, err = os.Open("marioDown.png")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if err != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						log.Fatal(err)
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -128,15 +128,17 @@ func NewAnimation(sz image.Point, mqMessages chan mqtt.Message) *Animation {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					rawMario, _, err = image.Decode(reader)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					//marioDown := imaging.FlipH(imaging.Resize(rawMario, 16, 16, imaging.Lanczos))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					marioDown := imaging.Resize(rawMario, 16, 16, imaging.Lanczos)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					images := []image.Image{marioUp, marioDown}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					imageMap["marioDown"] = marioDown
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					imageSlice := []image.Image{marioUp, marioDown}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return &Animation{
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						ctx:       gg.NewContext(sz.X, sz.Y),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						dir:       image.Point{1, 1},
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						height:    8,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						width:     8,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						stroke:    8,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						image:     images,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						updown:    0,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						image:     imageSlice,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						images:    imageMap,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						updown:    "marioUp",
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						mqmsg:     mqMessages,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						countDown: 5000,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -145,26 +147,20 @@ func NewAnimation(sz image.Point, mqMessages chan mqtt.Message) *Animation {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func appendImage(img string, a *Animation) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					baseImage, _ := b64.StdEncoding.DecodeString(img)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					bigImage, _, _ := image.Decode(bytes.NewReader(baseImage))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.image = append(a.image, imaging.Resize(bigImage, 64, 64, imaging.Lanczos))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.images["doorbell"] = imaging.Resize(bigImage, 64, 64, imaging.Lanczos)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				// what happens each frame, at an interval of 50 milliseconds
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func (a *Animation) Next() (image.Image, <-chan time.Time, error) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					incoming := incomingImage{}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					defer a.updatePosition()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.ctx.SetColor(color.Black)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.ctx.Clear()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if a.dir.X == 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.ctx.DrawImageAnchored(a.image[a.updown], a.position.X, a.position.Y, 0.5, 0.5)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.ctx.DrawImageAnchored(imaging.FlipH(a.image[a.updown]), a.position.X, a.position.Y, 0.5, 0.5)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(a.image) == 3 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.animateMario()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if a.images["doorbell"] != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if a.countDown > 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							a.ctx.DrawImageAnchored(a.image[2], 0, 0, 0, 0)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							a.countDown -= 50
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							a.image = a.image[:len(a.image)-1]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							//a.image = a.image[:len(a.image)-1]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							delete(a.images, "doorbell")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							a.countDown = 5000
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -183,16 +179,27 @@ func (a *Animation) Next() (image.Image, <-chan time.Time, error) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return a.ctx.Image(), time.After(time.Millisecond * 50), nil
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func (a *Animation) animateMario() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					defer a.updateMarioPosition()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.ctx.SetColor(color.Black)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.ctx.Clear()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if a.dir.X == 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.ctx.DrawImageAnchored(a.images[a.updown], a.position.X, a.position.Y, 0.5, 0.5)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.ctx.DrawImageAnchored(imaging.FlipH(a.images[a.updown]), a.position.X, a.position.Y, 0.5, 0.5)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				//what mario does every frame
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func (a *Animation) updatePosition() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func (a *Animation) updateMarioPosition() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.position.X += 1 * a.dir.X
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					a.position.Y += 1 * a.dir.Y
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if a.position.Y+a.height > a.ctx.Height() {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.dir.Y = -1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.updown = 0
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.updown = "marioUp"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if a.position.Y-a.height < 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.updown = 1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.updown = "marioDown"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						a.dir.Y = 1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |