udp input except no clean shutdown

master
Bel LaPointe 2023-03-24 18:48:54 -06:00
parent 126f5ab60a
commit 287b9c7b4e
3 changed files with 54 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package input
import ( import (
"context" "context"
"os" "os"
"strconv"
"syscall" "syscall"
) )
@ -47,6 +48,12 @@ func newSourceFunc() func() Input {
return singletonKeyboard return singletonKeyboard
} }
} }
if port, _ := strconv.Atoi(os.Getenv("INPUT_UDP")); port != 0 {
singletonUDP := NewUDP(port)
return func() Input {
return singletonUDP
}
}
return func() Input { return func() Input {
generator := randomCharFromRange('a', 'g') generator := randomCharFromRange('a', 'g')
if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 { if p, ok := os.LookupEnv("INPUT_RANDOM_WEIGHT_FILE"); ok && len(p) > 0 {

View File

@ -12,6 +12,7 @@ func TestInput(t *testing.T) {
var _ Input = &Buffered{} var _ Input = &Buffered{}
var _ Input = Remap{} var _ Input = Remap{}
var _ Input = &Refresh{} var _ Input = &Refresh{}
var _ Input = UDP{}
} }
func TestNewNew(t *testing.T) { func TestNewNew(t *testing.T) {

46
src/device/input/udp.go Normal file
View File

@ -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()
}