package src import ( "context" "log" "mayhem-party/src/device/input" "mayhem-party/src/device/output" "mayhem-party/src/device/output/key" "os" "time" ) func Main(ctx context.Context) error { reader := input.New(ctx) writer := output.New(ctx) defer writer.Close() defer reader.Close() interval := time.Millisecond * 50 if intervalS := os.Getenv("MAIN_INTERVAL_DURATION"); intervalS == "" { } else if v, err := time.ParseDuration(intervalS); err != nil { return err } else { interval = v } c := time.NewTicker(interval) defer c.Stop() block := func() bool { select { case <-c.C: return true case <-ctx.Done(): return false } } state := map[key.Key]bool{} for block() { delta := reader.Read() if os.Getenv("DEBUG") == "true" { log.Printf("src.Main.reader.Read(): %+v", delta) } for _, button := range delta { state[key.FromChar(button.Char)] = button.Down } keys := make([]key.Key, 0) for k, v := range state { if v { keys = append(keys, k) } } if os.Getenv("DEBUG") == "true" { log.Printf("src.Main.writer.Press(%+v) (from %+v)", keys, delta) } writer.Press(keys...) } return ctx.Err() }