implement party mode

This commit is contained in:
Drew Bowering 2024-04-03 00:57:50 -06:00
parent 4a29e0c600
commit 10db8f6d89
Signed by: drew
GPG Key ID: DC9462335BDDAC6B

150
main.go
View File

@ -2,6 +2,7 @@ package main
import ( import (
"machine" "machine"
"runtime"
"time" "time"
) )
@ -73,8 +74,11 @@ var (
const ( const (
period = uint64(1e9 / 500) period = uint64(1e9 / 500)
pressdelay = time.Millisecond * 500 pressdelay = time.Millisecond * 300
brightnesspeak = uint32(255) brightnesspeak = uint32(256)
defaultrng = uint32(time.Millisecond * 250)
maxrng = uint32(time.Millisecond * 500)
minrng = uint32(time.Millisecond * 50)
) )
func main() { func main() {
@ -247,18 +251,17 @@ func loop(lights lightSet, insidebrightness chan uint32, outsidebrightness chan
for { for {
go normal(lights, insidebrightness, outsidebrightness, partyChange, lastBrightness) go normal(lights, insidebrightness, outsidebrightness, partyChange, lastBrightness)
<-partypushed <-partypushed
// go party(lights)
// <-partypushed
partyChange <- true partyChange <- true
lb := <-lastBrightness lb := <-lastBrightness
select { insidebrightness <- lb.inside
case insidebrightness <- lb.inside: outsidebrightness <- lb.outside
default:
} go party(lights, insidebrightness, outsidebrightness, partyChange, lastBrightness)
select { <-partypushed
case outsidebrightness <- lb.outside: partyChange <- true
default: lb = <-lastBrightness
} insidebrightness <- lb.inside
outsidebrightness <- lb.outside
} }
} }
@ -285,3 +288,126 @@ func setNormal(light *lighthardware, brightness uint32) {
light.green.set(brightness) light.green.set(brightness)
light.blue.set(brightness) light.blue.set(brightness)
} }
func party(lights lightSet, inBrightChange <-chan uint32, outBrightChange <-chan uint32, partyChange <-chan bool, lastBrightness chan<- brightnesses) {
var brightIn uint32
var brightOut uint32
inBright := make(chan uint32, 1)
in2Bright := make(chan uint32, 1)
outBright := make(chan uint32, 1)
partysOver := make(chan bool, 3)
partysDone := make(chan bool, 3)
go partyLight(lights.inside, inBright, partysOver, partysDone)
go partyLight(lights.inside2, in2Bright, partysOver, partysDone)
go partyLight(lights.outside, outBright, partysOver, partysDone)
runtime.Gosched()
for {
select {
case brightIn = <-inBrightChange:
inBright <- brightIn
in2Bright <- brightIn
case brightOut = <-outBrightChange:
outBright <- brightOut
case <-partyChange:
partysOver <- true
partysOver <- true
partysOver <- true
runtime.Gosched()
<-partysDone
<-partysDone
<-partysDone
lastBrightness <- brightnesses{inside: brightIn, outside: brightOut}
return
}
}
}
func partyLight(light *lighthardware, brightChange <-chan uint32, endParty <-chan bool, partyEnded chan<- bool) {
rBright := make(chan uint32, 1)
gBright := make(chan uint32, 1)
bBright := make(chan uint32, 1)
partysOver := make(chan bool, 3)
partysDone := make(chan bool, 3)
go partyColour(light.red, rBright, partysOver, partysDone)
go partyColour(light.green, gBright, partysOver, partysDone)
go partyColour(light.blue, bBright, partysOver, partysDone)
runtime.Gosched()
for {
select {
case brightness := <-brightChange:
rBright <- brightness
gBright <- brightness
bBright <- brightness
case <-endParty:
partysOver <- true
partysOver <- true
partysOver <- true
runtime.Gosched()
<-partysDone
<-partysDone
<-partysDone
partyEnded <- true
return
}
}
}
func partyColour(light led, brightChange <-chan uint32, endParty <-chan bool, partyEnded chan<- bool) {
brightness := <-brightChange
LOOP:
for {
if brightness > 0 {
r, err := machine.GetRNG()
if err != nil {
r = defaultrng
}
r = (r % maxrng) + minrng
delaytime := time.Duration(r / brightness)
for i := brightness; i > 0; i-- {
light.set(i)
runtime.Gosched()
time.Sleep(delaytime)
select {
case brightness = <-brightChange:
continue LOOP
case <-endParty:
partyEnded <- true
return
default:
}
}
for i := uint32(0); i <= brightness; i++ {
light.set(i)
runtime.Gosched()
time.Sleep(delaytime)
select {
case brightness = <-brightChange:
continue LOOP
case <-endParty:
partyEnded <- true
return
default:
}
}
} else {
light.set(0)
select {
case brightness = <-brightChange:
continue
case <-endParty:
partyEnded <- true
return
}
}
}
}