udp input except no clean shutdown
parent
126f5ab60a
commit
287b9c7b4e
|
|
@ -3,6 +3,7 @@ package input
|
|||
import (
|
||||
"context"
|
||||
"os"
|
||||
"strconv"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
|
|
@ -47,6 +48,12 @@ func newSourceFunc() func() Input {
|
|||
return singletonKeyboard
|
||||
}
|
||||
}
|
||||
if port, _ := strconv.Atoi(os.Getenv("INPUT_UDP")); port != 0 {
|
||||
singletonUDP := NewUDP(port)
|
||||
return func() Input {
|
||||
return singletonUDP
|
||||
}
|
||||
}
|
||||
return func() Input {
|
||||
generator := randomCharFromRange('a', 'g')
|
||||
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ func TestInput(t *testing.T) {
|
|||
var _ Input = &Buffered{}
|
||||
var _ Input = Remap{}
|
||||
var _ Input = &Refresh{}
|
||||
var _ Input = UDP{}
|
||||
}
|
||||
|
||||
func TestNewNew(t *testing.T) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
package input
|
||||
|
||||
import (
|
||||
"net"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
type UDP struct {
|
||||
conn net.PacketConn
|
||||
}
|
||||
|
||||
func NewUDP(port int) UDP {
|
||||
conn, err := net.ListenPacket("udp", ":"+strconv.Itoa(port))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return UDP{
|
||||
conn: conn,
|
||||
}
|
||||
}
|
||||
|
||||
func (udp UDP) Read() []Button {
|
||||
panic("NEEDS TO BE IN BG THREAD SO WE CAN SHUT DOWN WITHOUT BLOCKING ON READ OR AT LEAST BE RESPONSIVE")
|
||||
buff := make([]byte, 1024)
|
||||
n, _, err := udp.conn.ReadFrom(buff)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
buttons := make([]Button, 0, n)
|
||||
down := true
|
||||
for i := range buff[:n] {
|
||||
if buff[i] == '!' {
|
||||
down = false
|
||||
} else {
|
||||
if buff[i] != '\n' {
|
||||
buttons = append(buttons, Button{Char: buff[i], Down: down})
|
||||
}
|
||||
down = true
|
||||
}
|
||||
}
|
||||
return buttons
|
||||
}
|
||||
|
||||
func (udp UDP) Close() {
|
||||
udp.conn.Close()
|
||||
}
|
||||
Loading…
Reference in New Issue