65 lines
1.1 KiB
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()
|
|
}
|