diff --git a/main.go b/main.go index 709d684..4b4e12f 100644 --- a/main.go +++ b/main.go @@ -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 }