rotate_display.go (1567B)
1 package main 2 3 import ( 4 "encoding/json" 5 "log" 6 "os" 7 "path" 8 "slices" 9 ) 10 11 const ( 12 apifile = "api/display" 13 imagesbase = "https://trmnl.mfashby.net/images/" 14 ) 15 var ( 16 rotation = []string{"weather.png", "hello.png"} 17 ) 18 19 20 func main() { 21 err := do() 22 if err != nil { 23 log.Fatal(err) 24 } 25 } 26 27 func do() error { 28 dispraw, err := os.ReadFile(apifile) 29 var current string 30 var d Display 31 if os.IsNotExist(err) { 32 current = rotation[0] 33 } else if err != nil { 34 return err 35 } else { 36 err = json.Unmarshal(dispraw, &d) 37 if err != nil { 38 return err 39 } 40 current = d.Filename 41 } 42 ix := slices.IndexFunc(rotation, func (x string) bool { 43 return x == current 44 }) 45 ix = (ix + 1) % len(rotation) 46 d = NewDisplay(imagesbase + rotation[ix]) 47 dispraw, err = json.MarshalIndent(d, "", " ") 48 if err != nil { 49 return err 50 } 51 err = os.WriteFile(apifile, dispraw, 0644) 52 if err != nil { 53 return err 54 } 55 return nil 56 } 57 58 func NewDisplay(imageUrl string) Display { 59 filename := path.Base(imageUrl) 60 return Display{ 61 ImageUrl: imageUrl, 62 Filename: filename, 63 RefreshRate: 300, 64 ResetFirmware: false, 65 UpdateFirmware: false, 66 FirmwareUrl: "https://trmnl.com/firmware/1.0.0.bin", 67 SpecialFunction: "identify", 68 Action: "identify", 69 } 70 } 71 72 type Display struct { 73 ImageUrl string `json:"image_url"` 74 Filename string `json:"filename"` 75 RefreshRate int `json:"refresh_rate"` 76 ResetFirmware bool `json:"reset_firmware"` 77 UpdateFirmware bool `json:"update_firmware"` 78 FirmwareUrl string `json:"firmware_url"` 79 SpecialFunction string `json:"special_function"` 80 Action string `json:"action"` 81 }