2024-04-12 07:54:27 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-04-14 19:47:13 +00:00
|
|
|
"fmt"
|
2024-04-12 08:00:53 +00:00
|
|
|
|
2024-04-14 23:25:33 +00:00
|
|
|
"github.com/buger/goterm"
|
2024-04-12 08:00:53 +00:00
|
|
|
"github.com/go-resty/resty/v2"
|
|
|
|
"github.com/joho/godotenv"
|
2024-04-12 07:54:27 +00:00
|
|
|
)
|
|
|
|
|
2024-04-17 06:11:23 +00:00
|
|
|
func output(client *resty.Client, url string, scale, width, height uint, arr [][]Cell) {
|
2024-04-15 15:35:02 +00:00
|
|
|
goterm.MoveCursor(1, 4)
|
2024-04-14 20:46:27 +00:00
|
|
|
// Prepare instructions for matrix
|
2024-04-17 06:18:22 +00:00
|
|
|
instructions := make([]interface{}, 0)
|
2024-04-14 20:46:27 +00:00
|
|
|
// Append all live cells as pixel instructions
|
2024-04-17 06:11:23 +00:00
|
|
|
for j := 0; j < int(height/scale); j++ {
|
|
|
|
for i := 0; i < int(width/scale); i++ {
|
2024-04-14 19:47:13 +00:00
|
|
|
if arr[i][j].live {
|
2024-04-17 06:11:23 +00:00
|
|
|
instructions = append(instructions, Rectangle{X: i * int(scale), Y: j * int(scale), W: scale, H: scale, Endpoint: RECTANGLE})
|
2024-04-14 23:25:33 +00:00
|
|
|
goterm.Print("X")
|
|
|
|
continue
|
2024-04-14 19:47:13 +00:00
|
|
|
}
|
2024-04-14 23:25:33 +00:00
|
|
|
goterm.Print(" ")
|
2024-04-14 19:47:13 +00:00
|
|
|
}
|
2024-04-14 23:25:33 +00:00
|
|
|
goterm.Println()
|
2024-04-14 19:47:13 +00:00
|
|
|
}
|
2024-04-14 20:46:27 +00:00
|
|
|
// Append update instruction
|
|
|
|
instructions = append(instructions, Update{Endpoint: UPDATE})
|
|
|
|
// Send to matrix
|
|
|
|
sendRequest(client, url, instructions)
|
2024-04-14 23:25:33 +00:00
|
|
|
|
|
|
|
// Update terminal UI
|
|
|
|
goterm.Flush()
|
2024-04-14 19:47:13 +00:00
|
|
|
}
|
|
|
|
|
2024-04-12 07:54:27 +00:00
|
|
|
func main() {
|
2024-04-17 06:11:23 +00:00
|
|
|
const FPS = 2
|
|
|
|
const SCALE = 2
|
2024-04-14 23:39:43 +00:00
|
|
|
|
2024-04-15 15:35:02 +00:00
|
|
|
// Try loading .env file if it exists
|
|
|
|
godotenv.Load(".env")
|
2024-04-12 08:02:59 +00:00
|
|
|
|
|
|
|
// Load env server data
|
2024-04-12 11:30:00 +00:00
|
|
|
url, width, height := loadMatrixData()
|
2024-04-14 23:39:59 +00:00
|
|
|
goterm.Printf("On '%s' at [%d x %d] with %d FPS\n", url, width, height, FPS)
|
2024-04-12 08:02:59 +00:00
|
|
|
|
|
|
|
// Initialize resty client
|
|
|
|
client := resty.New()
|
2024-04-14 20:46:27 +00:00
|
|
|
// Initialize pixel color
|
2024-04-15 15:35:02 +00:00
|
|
|
err := sendRequest(client, url, []interface{}{Color{R: 255, G: 255, B: 255, Endpoint: COLOR}})
|
|
|
|
if err != nil {
|
|
|
|
goterm.Println(err)
|
|
|
|
}
|
2024-04-12 08:02:59 +00:00
|
|
|
|
2024-04-14 19:48:03 +00:00
|
|
|
// Run Game of Life
|
|
|
|
done := setup(func(c [][]Cell) {
|
2024-04-17 06:11:23 +00:00
|
|
|
output(client, url, SCALE, width, height, c)
|
|
|
|
}, SCALE, width, height, FPS)
|
2024-04-12 12:13:21 +00:00
|
|
|
|
2024-04-14 19:48:03 +00:00
|
|
|
// Wait for user input to quit
|
2024-04-14 20:34:59 +00:00
|
|
|
fmt.Scanln()
|
2024-04-14 19:48:03 +00:00
|
|
|
// Stop Game of Life, wait for routine
|
|
|
|
done <- true
|
2024-04-12 07:54:27 +00:00
|
|
|
}
|