Added go stuff
This commit is contained in:
parent
a1e7a6ca12
commit
23fc55a003
8
go/Dockerfile
Normal file
8
go/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
FROM golang:1.14-alpine
|
||||||
|
|
||||||
|
WORKDIR /go/src/app
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN go install
|
||||||
|
|
||||||
|
CMD ["dancefloor"]
|
71
go/main.go
Normal file
71
go/main.go
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"dancefloor/patterns"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client http.Client
|
||||||
|
var lock sync.Mutex
|
||||||
|
var pattern Pattern
|
||||||
|
|
||||||
|
var width, height int
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
width = 6
|
||||||
|
height = 5
|
||||||
|
|
||||||
|
go drawLoop()
|
||||||
|
|
||||||
|
SetPattern(&patterns.ScrollingText{Text: "Jake is the best!", Colour: [3]uint8{0, 0, 255}, Background: [3]uint8{24, 24, 24}})
|
||||||
|
|
||||||
|
select {}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Pattern interface {
|
||||||
|
Draw(width, height int) *[][]patterns.Colour
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetPattern(new 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", "http://10.10.0.26:5000/update", bytes.NewReader(content))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
req.Header.Add("Content-Type", "application/json")
|
||||||
|
|
||||||
|
_, err = client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func drawLoop() {
|
||||||
|
for {
|
||||||
|
render(draw())
|
||||||
|
}
|
||||||
|
}
|
303
go/patterns/character.go
Normal file
303
go/patterns/character.go
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
package patterns
|
||||||
|
|
||||||
|
// character maps referenced [y][x]
|
||||||
|
var masks = make(map[rune]*[5][]bool)
|
||||||
|
|
||||||
|
type Character struct {
|
||||||
|
Character rune
|
||||||
|
Colour Colour
|
||||||
|
Background Colour
|
||||||
|
|
||||||
|
initiated bool
|
||||||
|
drawn [][]Colour
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Character) Draw(width, height int) *[][]Colour {
|
||||||
|
if !s.initiated {
|
||||||
|
s.init(width, height)
|
||||||
|
s.initiated = true
|
||||||
|
}
|
||||||
|
return &s.drawn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Character) init(width, height int) {
|
||||||
|
if width == 0 {
|
||||||
|
if _, ok := masks[s.Character]; ok {
|
||||||
|
width = len(masks[s.Character][0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.drawn = make([][]Colour, width)
|
||||||
|
for i := 0; i < width; i++ {
|
||||||
|
s.drawn[i] = make([]Colour, height)
|
||||||
|
for j := 0; j < height; j++ {
|
||||||
|
s.drawn[i][j] = s.Background
|
||||||
|
if val, ok := masks[s.Character]; ok {
|
||||||
|
y := 5 - j - 1
|
||||||
|
if i < len(val[y]) && val[y][i] {
|
||||||
|
s.drawn[i][j] = s.Colour
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
masks['a'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['A'] = masks['a']
|
||||||
|
|
||||||
|
masks['b'] = &[5][]bool{
|
||||||
|
{true, true, true, true, false},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, false},
|
||||||
|
}
|
||||||
|
masks['B'] = masks['b']
|
||||||
|
|
||||||
|
masks['c'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['C'] = masks['c']
|
||||||
|
|
||||||
|
masks['d'] = &[5][]bool{
|
||||||
|
{true, true, true, true, false},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, false},
|
||||||
|
}
|
||||||
|
masks['D'] = masks['d']
|
||||||
|
|
||||||
|
masks['e'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['E'] = masks['e']
|
||||||
|
|
||||||
|
masks['f'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
}
|
||||||
|
masks['F'] = masks['f']
|
||||||
|
|
||||||
|
masks['g'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['G'] = masks['g']
|
||||||
|
|
||||||
|
masks['h'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['H'] = masks['h']
|
||||||
|
|
||||||
|
masks['i'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['I'] = masks['i']
|
||||||
|
|
||||||
|
masks['j'] = &[5][]bool{
|
||||||
|
{true, true, true, true},
|
||||||
|
{false, false, true, false},
|
||||||
|
{false, false, true, false},
|
||||||
|
{true, false, true, false},
|
||||||
|
{true, true, true, false},
|
||||||
|
}
|
||||||
|
masks['J'] = masks['j']
|
||||||
|
|
||||||
|
masks['k'] = &[5][]bool{
|
||||||
|
{true, false, false, true},
|
||||||
|
{true, false, true, false},
|
||||||
|
{true, true, false, false},
|
||||||
|
{true, false, true, false},
|
||||||
|
{true, false, false, true},
|
||||||
|
}
|
||||||
|
masks['K'] = masks['k']
|
||||||
|
|
||||||
|
masks['l'] = &[5][]bool{
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['L'] = masks['l']
|
||||||
|
|
||||||
|
masks['m'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, false, true, true},
|
||||||
|
{true, false, true, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['M'] = masks['m']
|
||||||
|
|
||||||
|
masks['n'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, false, false, true},
|
||||||
|
{true, false, true, false, true},
|
||||||
|
{true, false, false, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['N'] = masks['n']
|
||||||
|
|
||||||
|
masks['o'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['O'] = masks['o']
|
||||||
|
|
||||||
|
masks['p'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
}
|
||||||
|
masks['P'] = masks['p']
|
||||||
|
|
||||||
|
masks['q'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, true, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['Q'] = masks['q']
|
||||||
|
|
||||||
|
masks['r'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, true, false},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['R'] = masks['r']
|
||||||
|
|
||||||
|
masks['s'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{true, false, false, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{false, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['S'] = masks['s']
|
||||||
|
|
||||||
|
masks['t'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
}
|
||||||
|
masks['T'] = masks['t']
|
||||||
|
|
||||||
|
masks['u'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['U'] = masks['u']
|
||||||
|
|
||||||
|
masks['v'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{false, true, false, true, false},
|
||||||
|
{false, true, false, true, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
}
|
||||||
|
masks['V'] = masks['v']
|
||||||
|
|
||||||
|
masks['w'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{true, false, true, false, true},
|
||||||
|
{true, true, false, true, true},
|
||||||
|
}
|
||||||
|
masks['W'] = masks['w']
|
||||||
|
|
||||||
|
masks['x'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{false, true, false, true, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, true, false, true, false},
|
||||||
|
{true, false, false, false, true},
|
||||||
|
}
|
||||||
|
masks['X'] = masks['x']
|
||||||
|
|
||||||
|
masks['y'] = &[5][]bool{
|
||||||
|
{true, false, false, false, true},
|
||||||
|
{false, true, false, true, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
}
|
||||||
|
masks['Y'] = masks['y']
|
||||||
|
|
||||||
|
masks['z'] = &[5][]bool{
|
||||||
|
{true, true, true, true, true},
|
||||||
|
{false, false, false, true, false},
|
||||||
|
{false, false, true, false, false},
|
||||||
|
{false, true, false, false, false},
|
||||||
|
{true, true, true, true, true},
|
||||||
|
}
|
||||||
|
masks['Z'] = masks['z']
|
||||||
|
|
||||||
|
masks[' '] = &[5][]bool{
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
}
|
||||||
|
|
||||||
|
masks['.'] = &[5][]bool{
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{false},
|
||||||
|
{true},
|
||||||
|
}
|
||||||
|
|
||||||
|
masks['!'] = &[5][]bool{
|
||||||
|
{true},
|
||||||
|
{true},
|
||||||
|
{true},
|
||||||
|
{false},
|
||||||
|
{true},
|
||||||
|
}
|
||||||
|
}
|
3
go/patterns/patterns.go
Normal file
3
go/patterns/patterns.go
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
package patterns
|
||||||
|
|
||||||
|
type Colour [3]uint8
|
59
go/patterns/scrolling_text.go
Normal file
59
go/patterns/scrolling_text.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package patterns
|
||||||
|
|
||||||
|
type ScrollingText struct {
|
||||||
|
Text string
|
||||||
|
Colour Colour
|
||||||
|
Background Colour
|
||||||
|
|
||||||
|
initiated bool
|
||||||
|
fullRender [][]Colour
|
||||||
|
step int
|
||||||
|
substep int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ScrollingText) Draw(width, height int) *[][]Colour {
|
||||||
|
if !s.initiated {
|
||||||
|
s.init(width, height)
|
||||||
|
s.initiated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
out := s.fullRender[s.step : s.step+width]
|
||||||
|
|
||||||
|
s.substep++
|
||||||
|
s.substep %= 12
|
||||||
|
if s.substep == 0 {
|
||||||
|
s.step++
|
||||||
|
s.step %= len(s.fullRender) - width
|
||||||
|
}
|
||||||
|
return &out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ScrollingText) init(width, height int) {
|
||||||
|
// add extra cells so it flows in from the right
|
||||||
|
for i := 0; i < width-1; i++ {
|
||||||
|
s.fullRender = append(s.fullRender, s.blankCol(height))
|
||||||
|
}
|
||||||
|
|
||||||
|
var c rune
|
||||||
|
for _, c = range s.Text {
|
||||||
|
subpattern := Character{Character: c, Colour: s.Colour, Background: s.Background}
|
||||||
|
drawnSubpattern := subpattern.Draw(0, height)
|
||||||
|
for _, v := range *drawnSubpattern {
|
||||||
|
s.fullRender = append(s.fullRender, v)
|
||||||
|
}
|
||||||
|
s.fullRender = append(s.fullRender, s.blankCol(height))
|
||||||
|
}
|
||||||
|
|
||||||
|
// add extra cells to avoid overflow
|
||||||
|
for i := 0; i < width-1; i++ {
|
||||||
|
s.fullRender = append(s.fullRender, s.blankCol(height))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *ScrollingText) blankCol(height int) (col []Colour) {
|
||||||
|
col = make([]Colour, height)
|
||||||
|
for j := 0; j < height; j++ {
|
||||||
|
col[j] = s.Background
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
16
go/patterns/solid_colour.go
Normal file
16
go/patterns/solid_colour.go
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package patterns
|
||||||
|
|
||||||
|
type SolidColour struct {
|
||||||
|
Colour
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *SolidColour) Draw(width, height int) *[][][3]uint8 {
|
||||||
|
out := make([][][3]uint8, width)
|
||||||
|
for i := 0; i < width; i++ {
|
||||||
|
out[i] = make([][3]uint8, height)
|
||||||
|
for j := 0; j < height; j++ {
|
||||||
|
out[i][j] = p.Colour
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &out
|
||||||
|
}
|
25
go/patterns/super_rgb.go
Normal file
25
go/patterns/super_rgb.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package patterns
|
||||||
|
|
||||||
|
type SuperRgb struct {
|
||||||
|
Brightness uint8
|
||||||
|
iteration int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *SuperRgb) Draw(width, height int) *[][]Colour {
|
||||||
|
out := make([][]Colour, width)
|
||||||
|
for i := 0; i < width; i++ {
|
||||||
|
out[i] = make([]Colour, height)
|
||||||
|
for j := 0; j < height; j++ {
|
||||||
|
switch (i + j + p.iteration/12) % 4 {
|
||||||
|
case 0, 2:
|
||||||
|
out[i][j] = [3]uint8{p.Brightness, 0, 0}
|
||||||
|
case 1:
|
||||||
|
out[i][j] = [3]uint8{0, p.Brightness, 0}
|
||||||
|
case 3:
|
||||||
|
out[i][j] = [3]uint8{0, 0, p.Brightness}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.iteration++
|
||||||
|
return &out
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user