mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-07-26 18:48:41 +00:00
0ea72e7f1e
Signed-off-by: deadprogram <ron@hybridgroup.com>
66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package makeybutton
|
|
|
|
const (
|
|
bufferSize = 3
|
|
maxSumAllowed = 4
|
|
)
|
|
|
|
// Buffer is a buffer to keep track of the most recent readings for a button.
|
|
// in bit form.
|
|
type Buffer struct {
|
|
data [bufferSize]byte
|
|
byteCounter int
|
|
bitCounter int
|
|
sum int
|
|
}
|
|
|
|
// NewBuffer returns a new buffer.
|
|
func NewBuffer() *Buffer {
|
|
return &Buffer{}
|
|
}
|
|
|
|
// Sum returns the sum of all measurements
|
|
func (b *Buffer) Sum() int {
|
|
return b.sum
|
|
}
|
|
|
|
// Put stores a boolean button state into the buffer.
|
|
func (b *Buffer) Put(val bool) {
|
|
currentMeasurement, oldestMeasurement := b.updateData(val)
|
|
b.updateCounters()
|
|
|
|
if currentMeasurement != 0 && b.sum < maxSumAllowed {
|
|
b.sum++
|
|
}
|
|
|
|
if oldestMeasurement != 0 && b.sum > 0 {
|
|
b.sum--
|
|
}
|
|
}
|
|
|
|
func (b *Buffer) updateData(val bool) (byte, byte) {
|
|
currentByte := b.data[b.byteCounter]
|
|
oldestMeasurement := (currentByte >> b.bitCounter) & 0x01
|
|
|
|
if val {
|
|
currentByte |= (1 << b.bitCounter)
|
|
} else {
|
|
currentByte &= ^(1 << b.bitCounter)
|
|
}
|
|
|
|
b.data[b.byteCounter] = currentByte
|
|
|
|
return (currentByte >> b.bitCounter) & 0x01, oldestMeasurement
|
|
}
|
|
|
|
func (b *Buffer) updateCounters() {
|
|
b.bitCounter++
|
|
if b.bitCounter == 8 {
|
|
b.bitCounter = 0
|
|
b.byteCounter++
|
|
if b.byteCounter == bufferSize {
|
|
b.byteCounter = 0
|
|
}
|
|
}
|
|
}
|