mayhem-party/src/device/input/wrap/refresh.go

65 lines
1.1 KiB
Go

package wrap
import (
"context"
"log"
"mayhem-party/src/device/input/button"
"mayhem-party/src/device/input/raw"
"os"
"os/signal"
"syscall"
)
var (
ChSigUsr1 = func() chan os.Signal {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGUSR1)
return c
}()
)
type Refresh struct {
can context.CancelFunc
input Wrap
}
func NewRefresh(ctx context.Context, newWrap func() Wrap) *Refresh {
return NewRefreshWith(ctx, newWrap, ChSigUsr1)
}
func NewRefreshWith(ctx context.Context, newWrap func() Wrap, ch <-chan os.Signal) *Refresh {
ctx, can := context.WithCancel(ctx)
result := &Refresh{
can: can,
input: newWrap(),
}
go func() {
defer log.Println("refreshing done")
for {
select {
case <-ctx.Done():
return
case sig := <-ch:
log.Println("refreshing for", sig)
result.input.CloseWrap()
result.input = newWrap()
}
}
}()
return result
}
func (r *Refresh) CloseWrap() raw.Raw {
r.can()
return r.input.CloseWrap()
}
func (r *Refresh) Read() []button.Button {
return r.input.Read()
}
func (r *Refresh) Close() {
r.can()
r.input.Close()
}