Matrix/main.go

156 lines
3.6 KiB
Go
Raw Normal View History

2024-04-12 07:54:27 +00:00
package main
import (
2024-04-12 08:00:53 +00:00
"errors"
2024-04-12 07:54:27 +00:00
"fmt"
2024-04-12 08:00:53 +00:00
"log"
"os"
"strconv"
"github.com/go-resty/resty/v2"
"github.com/joho/godotenv"
2024-04-12 07:54:27 +00:00
)
2024-04-12 08:01:24 +00:00
type Response struct {
success bool
}
type Endpoint string
const (
RECTANGLE Endpoint = "rectangle"
UPDATE Endpoint = "update"
COLOR Endpoint = "color"
)
type Update struct {
endpoint Endpoint
}
type Color struct {
R int
G int
B int
endpoint Endpoint
}
type Rectangle struct {
X int
Y int
W int
H int
endpoint Endpoint
}
func GetEnvFallback(key string, fallback ...string) (string, error) {
// Check for function fallback signature
length := len(fallback)
if length > 1 {
return "", errors.New("Invalid signature: Too many fallback values provided!")
}
// Try to get environment variable
value, exists := os.LookupEnv(key)
if exists {
return value, nil
}
// Try using fallback value instead
if length == 1 {
return fallback[0], nil
} else if length == 0 {
// No fallback value provided
return "", errors.New("Panic: No fallback value provided!")
}
// Could not get environment variable
return "", errors.New("Could not get environment variable: " + key)
}
func ConvertFallback(input string, fallback ...int) (int, error) {
// Check for function fallback signature
length := len(fallback)
if length > 1 {
return 0, errors.New("Invalid signature: Too many fallback values provided!")
}
// Try to convert input to int
value, err := strconv.Atoi(input)
if err == nil {
return value, nil
}
// Try using fallback value instead
if length == 1 {
return fallback[0], nil
} else if length == 0 {
// No fallback value provided
return 0, errors.New("Panic: No fallback value provided!")
}
// Could not convert input
return 0, err
}
func LoadMatrixData() (string, int, int) {
// Remote server info
API_SERVER_IP, _ := GetEnvFallback(os.Getenv("API_SERVER_IP"), "localhost")
API_SERVER_PORT, _ := GetEnvFallback(os.Getenv("API_SERVER_PORT"), "8080")
// LED panel info
PUBLIC_LED_WIDTH, _ := ConvertFallback(os.Getenv("PUBLIC_LED_WIDTH"), 64)
PUBLIC_LED_HEIGHT, _ := ConvertFallback(os.Getenv("PUBLIC_LED_HEIGHT"), 64)
// Matrix arrangement info
PUBLIC_LED_CHAIN, _ := ConvertFallback(os.Getenv("PUBLIC_LED_CHAIN"), 1)
PUBLIC_LED_PARALLEL, _ := ConvertFallback(os.Getenv("PUBLIC_LED_PARALLEL"), 1)
// Prepare remote server url
url := fmt.Sprintf("http://%s:%s", API_SERVER_IP, API_SERVER_PORT)
// Calculate combined resolution
width := PUBLIC_LED_WIDTH * PUBLIC_LED_CHAIN
height := PUBLIC_LED_HEIGHT * PUBLIC_LED_PARALLEL
return url, width, height
}
2024-04-12 08:03:36 +00:00
func SendRequest(client *resty.Client, url string, ins []interface{}) {
2024-04-12 08:05:14 +00:00
// Build and send request
2024-04-12 08:03:36 +00:00
resp, err := client.R().
SetHeader("Content-Type", "application/json").
SetBody(ins).
Post(fmt.Sprintf("%s/instructions", url))
2024-04-12 08:05:14 +00:00
// Error handling
2024-04-12 08:03:36 +00:00
if err != nil {
log.Fatal(err)
return
}
2024-04-12 08:05:14 +00:00
// Print response status
2024-04-12 08:03:36 +00:00
log.Printf("Response Status: %s\n", resp.Status())
}
2024-04-12 07:54:27 +00:00
func main() {
2024-04-12 08:02:12 +00:00
// Load .env file if it exists
err := godotenv.Load(".env")
if err != nil {
log.Fatal("Error loading .env file")
}
// Load env server data
url, _, _ := LoadMatrixData()
// Initialize resty client
client := resty.New()
// Initialize custom matrix data
col := Color{R: 255, G: 0, B: 255, endpoint: COLOR}
rct := Rectangle{X: 0, Y: 0, W: 10, H: 10, endpoint: RECTANGLE}
upd := Update{endpoint: UPDATE}
2024-04-12 08:03:36 +00:00
// Send request to remote server
SendRequest(client, url, []interface{}{col, rct, upd})
2024-04-12 07:54:27 +00:00
}