93 lines
1.4 KiB
Go
93 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"dancefloor/api"
|
|
"dancefloor/patterns"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
var client http.Client
|
|
var lock sync.Mutex
|
|
var pattern patterns.Pattern
|
|
|
|
var address string
|
|
var width, height int
|
|
|
|
func main() {
|
|
var err error
|
|
address = os.Getenv("ADDRESS")
|
|
if address == "" {
|
|
fmt.Println("no address provided")
|
|
os.Exit(1)
|
|
return
|
|
}
|
|
width, err = strconv.Atoi(os.Getenv("WIDTH"))
|
|
if err != nil {
|
|
width = 6
|
|
err = nil
|
|
}
|
|
height, err = strconv.Atoi(os.Getenv("HEIGHT"))
|
|
if err != nil {
|
|
height = 5
|
|
err = nil
|
|
}
|
|
|
|
SetPattern(&patterns.SuperRgb{Brightness: 128})
|
|
|
|
go api.Start(SetPattern)
|
|
defer api.Stop()
|
|
|
|
go drawLoop()
|
|
|
|
select {}
|
|
}
|
|
|
|
func SetPattern(new patterns.Pattern) {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
pattern = new
|
|
}
|
|
|
|
func draw() *[][]patterns.Colour {
|
|
lock.Lock()
|
|
defer lock.Unlock()
|
|
return pattern.Draw(width, height)
|
|
}
|
|
|
|
func render(data *[][]patterns.Colour) {
|
|
content, err := json.Marshal(struct {
|
|
Data [][]patterns.Colour `json:"data"`
|
|
}{
|
|
Data: *data,
|
|
})
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
req, err := http.NewRequest("PUT", fmt.Sprintf("http://%s:5000/update", address), bytes.NewReader(content))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
req.Header.Add("Content-Type", "application/json")
|
|
|
|
_, err = client.Do(req)
|
|
if err != nil {
|
|
fmt.Println("render request failed")
|
|
time.Sleep(time.Second)
|
|
}
|
|
}
|
|
|
|
func drawLoop() {
|
|
for {
|
|
render(draw())
|
|
}
|
|
}
|