63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package main
|
|
|
|
import "log"
|
|
|
|
type moving struct {
|
|
samp chan []byte
|
|
slowAvg []float64
|
|
fastAvg []float64
|
|
state []bool
|
|
changes chan stateFlip
|
|
}
|
|
|
|
type stateFlip struct {
|
|
i int
|
|
lowHigh bool
|
|
slow float64
|
|
fast float64
|
|
}
|
|
|
|
func (m *moving) watch() {
|
|
log.Println("Watching for samples...")
|
|
for samp := range m.samp {
|
|
for len(m.slowAvg) < len(samp) {
|
|
i := len(m.slowAvg)
|
|
m.slowAvg = append(m.slowAvg, float64(samp[i]))
|
|
m.fastAvg = append(m.fastAvg, float64(samp[i]))
|
|
m.state = append(m.state, true)
|
|
}
|
|
|
|
for i, s := range samp {
|
|
if s == 0 {
|
|
continue
|
|
}
|
|
m.slowAvg[i] += (m.slowAvg[i] - float64(s)) * 0.001
|
|
m.fastAvg[i] += (m.fastAvg[i] - float64(s)) * 0.3
|
|
|
|
// TODO: possible exception for 220kOhm resistors
|
|
if m.slowAvg[i] < m.fastAvg[i]+1 {
|
|
if !m.state[i] {
|
|
log.Print("p")
|
|
m.changes <- stateFlip{i, true, m.slowAvg[i], m.fastAvg[i]}
|
|
}
|
|
m.state[i] = true
|
|
}
|
|
if m.slowAvg[i] > m.fastAvg[i]-1 {
|
|
if m.state[i] {
|
|
log.Print("r")
|
|
m.changes <- stateFlip{i, false, m.slowAvg[i], m.fastAvg[i]}
|
|
}
|
|
m.state[i] = false
|
|
}
|
|
}
|
|
}
|
|
log.Println("No more samples")
|
|
}
|
|
|
|
func newMoving(samp chan []byte) *moving {
|
|
return &moving{
|
|
samp: samp,
|
|
changes: make(chan stateFlip),
|
|
}
|
|
}
|