CI and some more patterns
Signed-off-by: Martyn Ranyard <m@rtyn.berlin>
This commit is contained in:
parent
bed25ca03c
commit
aa4a46c074
|
@ -0,0 +1,14 @@
|
||||||
|
BUILD=`date +%FT%T%z`
|
||||||
|
|
||||||
|
LDFLAGS=-ldflags "-X main.buildDate=${BUILD}"
|
||||||
|
|
||||||
|
.PHONY: build deps static
|
||||||
|
|
||||||
|
build:
|
||||||
|
go build ${LDFLAGS}
|
||||||
|
|
||||||
|
deps:
|
||||||
|
go get
|
||||||
|
|
||||||
|
static:
|
||||||
|
CGO_ENABLED=0 GOOS=linux go build ${LDFLAGS} -a -installsuffix cgo -o LEDController .
|
|
@ -0,0 +1,63 @@
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: linux-amd64-taggedver
|
||||||
|
|
||||||
|
platform:
|
||||||
|
arch: amd64
|
||||||
|
os: linux
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: golang
|
||||||
|
commands:
|
||||||
|
- pwd
|
||||||
|
- mkdir -p /go/src/git.martyn.berlin/martyn
|
||||||
|
- ln -s /drone/src /go/src/git.martyn.berlin/martyn/LEDController
|
||||||
|
- cd /go/src/git.martyn.berlin/martyn/LEDController
|
||||||
|
- go get
|
||||||
|
- go build
|
||||||
|
|
||||||
|
- name: publish
|
||||||
|
image: plugins/docker:18
|
||||||
|
settings:
|
||||||
|
auto_tag: true
|
||||||
|
auto_tag_suffix: linux-amd64
|
||||||
|
dockerfile: build/package/Dockerfile
|
||||||
|
repo: imartyn/karaokardbot
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
when:
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- tag
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
ref:
|
||||||
|
- refs/tags/v*
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: linux-amd64-devel-master
|
||||||
|
|
||||||
|
platform:
|
||||||
|
arch: amd64
|
||||||
|
os: linux
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: golang
|
||||||
|
commands:
|
||||||
|
- pwd
|
||||||
|
- mkdir -p /go/src/git.martyn.berlin/martyn
|
||||||
|
- ln -s /drone/src /go/src/git.martyn.berlin/martyn/LEDController
|
||||||
|
- cd /go/src/git.martyn.berlin/martyn/LEDController
|
||||||
|
- go get
|
||||||
|
- go build
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
ref:
|
||||||
|
- refs/heads/devel
|
||||||
|
- refs/heads/master
|
|
@ -0,0 +1,14 @@
|
||||||
|
FROM golang@sha256:cee6f4b901543e8e3f20da3a4f7caac6ea643fd5a46201c3c2387183a332d989 AS builder
|
||||||
|
RUN apk update && apk add --no-cache git make ca-certificates && update-ca-certificates
|
||||||
|
COPY main.go /go/src/git.martyn.berlin/martyn/LEDController/
|
||||||
|
COPY internal/ /go/src/git.martyn.berlin/martyn/LEDController/internal/
|
||||||
|
COPY Makefile /go/src/git.martyn.berlin/martyn/LEDController/
|
||||||
|
RUN cd /go/src/git.martyn.berlin/martyn/LEDController/; make deps ; make static
|
||||||
|
|
||||||
|
FROM scratch
|
||||||
|
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
||||||
|
COPY --from=builder /go/src/git.martyn.berlin/martyn/LEDController /app/
|
||||||
|
COPY strings.json /app/strings.json
|
||||||
|
COPY web/ /app/web/
|
||||||
|
WORKDIR /app
|
||||||
|
CMD ["/app/LEDController"]
|
|
@ -14,3 +14,18 @@ func Gradient(fromR byte, fromG byte, fromB byte, toR byte, toG byte, toB byte,
|
||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GradientPanel(w int, h int, fromColour RGBcolor, toColour RGBcolor) [][]RGBcolor {
|
||||||
|
out := FillPanel(w, h, 255, 0, 0)
|
||||||
|
var stepR float32 = (float32(toColour[0]) - float32(fromColour[0])) / float32(w)
|
||||||
|
var stepG float32 = (float32(toColour[1]) - float32(fromColour[1])) / float32(w)
|
||||||
|
var stepB float32 = (float32(toColour[2]) - float32(fromColour[2])) / float32(w)
|
||||||
|
for y := 0; y < h; y++ {
|
||||||
|
for x := 0; x < w; x++ {
|
||||||
|
out[x][y][0] = fromColour[0] + byte(float32(x)*stepR)
|
||||||
|
out[x][y][1] = fromColour[1] + byte(float32(x)*stepG)
|
||||||
|
out[x][y][2] = fromColour[2] + byte(float32(x)*stepB)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ func RedPanel(w int, h int) [][]RGBcolor {
|
||||||
|
|
||||||
var lastColour RGBcolor
|
var lastColour RGBcolor
|
||||||
var lastIteration uint16 = 0
|
var lastIteration uint16 = 0
|
||||||
|
var lastPlasmaValue byte = 0
|
||||||
|
|
||||||
func RandomColourPanel(w int, h int, speed uint16) [][]RGBcolor {
|
func RandomColourPanel(w int, h int, speed uint16) [][]RGBcolor {
|
||||||
if lastIteration > 0 {
|
if lastIteration > 0 {
|
||||||
|
@ -25,3 +26,17 @@ func RandomColourPanel(w int, h int, speed uint16) [][]RGBcolor {
|
||||||
}
|
}
|
||||||
return FillPanel(w, h, lastColour[0], lastColour[1], lastColour[2])
|
return FillPanel(w, h, lastColour[0], lastColour[1], lastColour[2])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PlasmaColourPanel(w int, h int, speed uint16) [][]RGBcolor {
|
||||||
|
if lastIteration > 0 {
|
||||||
|
lastIteration -= 40
|
||||||
|
}
|
||||||
|
if lastIteration <= 0 {
|
||||||
|
lastPlasmaValue++
|
||||||
|
var newColour RGBcolor
|
||||||
|
newColour[0],newColour[1],newColour[2] = plasmaRGBFromVal(lastPlasmaValue)
|
||||||
|
lastColour = newColour
|
||||||
|
lastIteration = speed
|
||||||
|
}
|
||||||
|
return FillPanel(w, h, lastColour[0], lastColour[1], lastColour[2])
|
||||||
|
}
|
|
@ -1,7 +1,11 @@
|
||||||
package queue
|
package queue
|
||||||
|
|
||||||
|
type RGBcolor = [3]byte
|
||||||
|
|
||||||
type QueueItem struct {
|
type QueueItem struct {
|
||||||
Effect string
|
Effect string
|
||||||
Duration uint16
|
Duration uint16
|
||||||
Speed uint16 //only used by some patterns
|
Speed uint16 //only used by some patterns
|
||||||
|
SeedColour RGBcolor // only used by some patterns
|
||||||
|
SecondColour RGBcolor // only used by some patterns
|
||||||
}
|
}
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"github.com/gorilla/handlers"
|
"github.com/gorilla/handlers"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
queue "git.martyn.berlin/martyn/LEDController/internal/queue"
|
queue "git.martyn.berlin/martyn/LEDController/internal/queue"
|
||||||
|
"golang.org/x/image/colornames"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -35,13 +36,17 @@ func PatternHandler(response http.ResponseWriter, request *http.Request) {
|
||||||
response.Header().Add("Content-type", "text/plain")
|
response.Header().Add("Content-type", "text/plain")
|
||||||
var e queue.QueueItem
|
var e queue.QueueItem
|
||||||
e.Effect = vars["pattern"]
|
e.Effect = vars["pattern"]
|
||||||
|
_, found := vars["duration"]
|
||||||
|
if found {
|
||||||
i, _ := strconv.Atoi(vars["duration"])
|
i, _ := strconv.Atoi(vars["duration"])
|
||||||
e.Duration = uint16(i)
|
e.Duration = uint16(i)
|
||||||
_, found := vars["speed"]
|
} else {
|
||||||
|
e.Duration = 5000
|
||||||
|
}
|
||||||
|
_, found = vars["speed"]
|
||||||
if found {
|
if found {
|
||||||
i, _ := strconv.Atoi(vars["speed"])
|
i, _ := strconv.Atoi(vars["speed"])
|
||||||
e.Speed = uint16(i)
|
e.Speed = uint16(i)
|
||||||
fmt.Printf("Speed passed %d\n",e.Speed)
|
|
||||||
} else {
|
} else {
|
||||||
e.Speed = 40
|
e.Speed = 40
|
||||||
}
|
}
|
||||||
|
@ -49,6 +54,64 @@ func PatternHandler(response http.ResponseWriter, request *http.Request) {
|
||||||
fmt.Fprint(response, "OKAY")
|
fmt.Fprint(response, "OKAY")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ColourHandler(response http.ResponseWriter, request *http.Request) {
|
||||||
|
vars := mux.Vars(request)
|
||||||
|
response.Header().Add("Content-type", "text/plain")
|
||||||
|
var e queue.QueueItem
|
||||||
|
e.Effect = "colour"
|
||||||
|
_, found := vars["duration"]
|
||||||
|
if found {
|
||||||
|
i, _ := strconv.Atoi(vars["duration"])
|
||||||
|
e.Duration = uint16(i)
|
||||||
|
} else {
|
||||||
|
e.Duration = 5000
|
||||||
|
}
|
||||||
|
var c queue.RGBcolor
|
||||||
|
for cn, cv := range(colornames.Map) {
|
||||||
|
if cn == vars["name"] {
|
||||||
|
c[0] = cv.R
|
||||||
|
c[1] = cv.G
|
||||||
|
c[2] = cv.B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.SeedColour = c
|
||||||
|
globalQueue <- e
|
||||||
|
fmt.Fprint(response, "OKAY")
|
||||||
|
}
|
||||||
|
|
||||||
|
func FadeHandler(response http.ResponseWriter, request *http.Request) {
|
||||||
|
vars := mux.Vars(request)
|
||||||
|
response.Header().Add("Content-type", "text/plain")
|
||||||
|
var e queue.QueueItem
|
||||||
|
e.Effect = "fade"
|
||||||
|
_, found := vars["duration"]
|
||||||
|
if found {
|
||||||
|
i, _ := strconv.Atoi(vars["duration"])
|
||||||
|
e.Duration = uint16(i)
|
||||||
|
} else {
|
||||||
|
e.Duration = 5000
|
||||||
|
}
|
||||||
|
var c queue.RGBcolor
|
||||||
|
for cn, cv := range(colornames.Map) {
|
||||||
|
if cn == vars["namefrom"] {
|
||||||
|
c[0] = cv.R
|
||||||
|
c[1] = cv.G
|
||||||
|
c[2] = cv.B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.SeedColour = c
|
||||||
|
for cn, cv := range(colornames.Map) {
|
||||||
|
if cn == vars["nameto"] {
|
||||||
|
c[0] = cv.R
|
||||||
|
c[1] = cv.G
|
||||||
|
c[2] = cv.B
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e.SecondColour = c
|
||||||
|
globalQueue <- e
|
||||||
|
fmt.Fprint(response, "OKAY")
|
||||||
|
}
|
||||||
|
|
||||||
func HandleHTTP(queueChannel chan queue.QueueItem) {
|
func HandleHTTP(queueChannel chan queue.QueueItem) {
|
||||||
globalQueue = queueChannel
|
globalQueue = queueChannel
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
|
@ -56,8 +119,15 @@ func HandleHTTP(queueChannel chan queue.QueueItem) {
|
||||||
r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
|
r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
|
||||||
r.HandleFunc("/", RootHandler)
|
r.HandleFunc("/", RootHandler)
|
||||||
r.HandleFunc("/healthz", HealthHandler)
|
r.HandleFunc("/healthz", HealthHandler)
|
||||||
|
r.HandleFunc("/pattern/{pattern}", PatternHandler)
|
||||||
r.HandleFunc("/pattern/{pattern}/{duration}", PatternHandler)
|
r.HandleFunc("/pattern/{pattern}/{duration}", PatternHandler)
|
||||||
r.HandleFunc("/pattern/{pattern}/{duration}/{speed}", PatternHandler)
|
r.HandleFunc("/pattern/{pattern}/{duration}/{speed}", PatternHandler)
|
||||||
|
r.HandleFunc("/colour/{name}", ColourHandler)
|
||||||
|
r.HandleFunc("/colour/{name}/{duration}", ColourHandler)
|
||||||
|
r.HandleFunc("/color/{name}", ColourHandler)
|
||||||
|
r.HandleFunc("/color/{name}/{duration}", ColourHandler)
|
||||||
|
r.HandleFunc("/fade/{namefrom}/{nameto}", FadeHandler)
|
||||||
|
r.HandleFunc("/fade/{namefrom}/{nameto}/{duration}", FadeHandler)
|
||||||
http.Handle("/", r)
|
http.Handle("/", r)
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
Handler: loggedRouter,
|
Handler: loggedRouter,
|
||||||
|
|
17
main.go
17
main.go
|
@ -33,6 +33,13 @@ func foreverLoop() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func reduceBrightness(universe [512]byte, percentage int) [512]byte{
|
||||||
|
for i := range(universe) {
|
||||||
|
universe[i] = byte(float64(universe[i]) * (float64(percentage) / float64(100)))
|
||||||
|
}
|
||||||
|
return universe
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
go func() {
|
go func() {
|
||||||
fmt.Printf("Starting webserver on port %s\n", "5353")
|
fmt.Printf("Starting webserver on port %s\n", "5353")
|
||||||
|
@ -99,13 +106,19 @@ func main() {
|
||||||
var red patterns.RGBcolor
|
var red patterns.RGBcolor
|
||||||
red[0] = 255
|
red[0] = 255
|
||||||
rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.SineChase(68, 4, black, red, currentEffect.Speed)))
|
rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.SineChase(68, 4, black, red, currentEffect.Speed)))
|
||||||
|
case "plasmapulse":
|
||||||
|
rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.PlasmaColourPanel(68,4, currentEffect.Speed)))
|
||||||
|
case "colour":
|
||||||
|
rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.FillPanel(68,4, currentEffect.SeedColour[0], currentEffect.SeedColour[1], currentEffect.SeedColour[2])))
|
||||||
|
case "fade":
|
||||||
|
rearranged = remapping.SliceRearrange(68, 4, true, remapping.XYGridToLinear(68, 4, patterns.GradientPanel(68,4, currentEffect.SeedColour, currentEffect.SecondColour)))
|
||||||
default:
|
default:
|
||||||
rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.FillPanel(68,4, 128,0,128)))
|
rearranged = remapping.SliceRearrange(68, 4, false, remapping.XYGridToLinear(68, 4, patterns.FillPanel(68,4, 128,0,128)))
|
||||||
}
|
}
|
||||||
//rearranged := remapping.SliceRearrange(68,4,true,linearPlasma(68*4))
|
//rearranged := remapping.SliceRearrange(68,4,true,linearPlasma(68*4))
|
||||||
sema <- struct{}{} // acquire token
|
sema <- struct{}{} // acquire token
|
||||||
currentFrame[0] = remapping.Slice512(rearranged[0])
|
currentFrame[0] = reduceBrightness(remapping.Slice512(rearranged[0]),10)
|
||||||
currentFrame[1] = remapping.Slice512(rearranged[1])
|
currentFrame[1] = reduceBrightness(remapping.Slice512(rearranged[1]),10)
|
||||||
<- sema
|
<- sema
|
||||||
time.Sleep(40 * time.Millisecond)
|
time.Sleep(40 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue