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()) } }