diff --git a/goTool/api/uart.go b/goTool/api/uart.go index 4d30cc8..b5aefa4 100644 --- a/goTool/api/uart.go +++ b/goTool/api/uart.go @@ -20,6 +20,15 @@ const ( CmdClientInput byte = 0x04 ) +const ( + ClientCountOffset = 1 + + // Payload Sizes + PayloadVersionSize = 10 + PayloadClientInfoSize = 19 + PayloadClientInputSize = 13 +) + type PayloadVersion struct { Version uint16 Buildhash [7]uint8 @@ -36,4 +45,8 @@ type PayloadClientInfo struct { } type PayloadClientInput struct { + ClientID byte + X float32 + Y float32 + InputMask uint32 } diff --git a/goTool/main.go b/goTool/main.go index 7a34a24..417c9da 100644 --- a/goTool/main.go +++ b/goTool/main.go @@ -68,6 +68,18 @@ func StartApp(config Config) { log.Printf("\tVersion %d", c.Version) log.Printf("\tMACAddr % X", c.MACAddr) } + case api.CmdClientInput: + v, err := uart.ParseFrameClientInput(val) + if err != nil { + log.Printf("Could not Parse Client Input %v", err) + continue + } + for _, c := range v { + log.Printf("Client ID %d", c.ClientID) + log.Printf("\tX %f", c.X) + log.Printf("\tY %f", c.Y) + log.Printf("\tBitmask %08b", c.InputMask) + } } } } @@ -78,6 +90,7 @@ func StartApp(config Config) { com.Send(api.CmdEcho, make([]byte, 0)) com.Send(api.CmdVersion, make([]byte, 0)) com.Send(api.CmdClientInfo, make([]byte, 0)) + com.Send(api.CmdClientInput, make([]byte, 0)) url := fmt.Sprintf("%s:%d", config.Host, config.Port) fserver := frontend.New(bus) diff --git a/goTool/uart/commands.go b/goTool/uart/commands.go index ccf5324..07480dd 100644 --- a/goTool/uart/commands.go +++ b/goTool/uart/commands.go @@ -10,7 +10,7 @@ import ( ) func ParseFrameVersion(frame api.Frame) (api.PayloadVersion, error) { - if len(frame.Data) != 10 { + if len(frame.Data) != api.PayloadVersionSize { return api.PayloadVersion{}, fmt.Errorf("payload wrong size: got %d bytes, want 10", len(frame.Data)) } @@ -21,7 +21,7 @@ func ParseFrameVersion(frame api.Frame) (api.PayloadVersion, error) { } func parseFrameClientInfoPart(data []byte) (api.PayloadClientInfo, error) { - if len(data) != 19 { + if len(data) != api.PayloadClientInfoSize { return api.PayloadClientInfo{}, fmt.Errorf("payload wrong size: got %d bytes, want 19", len(data)) } @@ -47,7 +47,7 @@ func ParseFrameClientInfo(frame api.Frame) ([]api.PayloadClientInfo, error) { log.Printf("Clients %d", clientCount) - expectedLen := 1 + (clientCount * 19) + expectedLen := 1 + (clientCount * api.PayloadClientInfoSize) if len(frame.Data) < expectedLen { return nil, fmt.Errorf("frame data too short: got %d, want %d", len(frame.Data), expectedLen) @@ -56,8 +56,8 @@ func ParseFrameClientInfo(frame api.Frame) ([]api.PayloadClientInfo, error) { clientList := make([]api.PayloadClientInfo, 0, clientCount) for i := 0; i < clientCount; i++ { - start := 1 + (i * 19) - end := start + 19 + start := 1 + (i * api.PayloadClientInfoSize) + end := start + api.PayloadClientInfoSize client, err := parseFrameClientInfoPart(frame.Data[start:end]) if err != nil { @@ -70,40 +70,50 @@ func ParseFrameClientInfo(frame api.Frame) ([]api.PayloadClientInfo, error) { return clientList, nil } -func parse_uart_client_input(payloadBuffer []byte, payload_len int) { - - clientCount := payloadBuffer[1] - fmt.Printf("Client Count %d\n", clientCount) - clientInputLen := 13 - - for i := 0; i < int(clientCount); i++ { - offset := 2 + (i * clientInputLen) - - // --- Client ID (uint8) --- - clientID := payloadBuffer[offset] - offset += 1 - - fmt.Printf("Client: %d\n", clientID) - - // --- Lage X (float32) --- - xBits := binary.LittleEndian.Uint32(payloadBuffer[offset : offset+4]) - lageX := math.Float32frombits(xBits) - offset += 4 - - fmt.Printf("\tLAGE_X: %f\n", lageX) - - // --- Lage Y (float32) --- - yBits := binary.LittleEndian.Uint32(payloadBuffer[offset : offset+4]) - lageY := math.Float32frombits(yBits) - offset += 4 - - fmt.Printf("\tLAGE_Y: %f\n", lageY) - - // --- Bitmask (int32) --- - maskBits := binary.LittleEndian.Uint32(payloadBuffer[offset : offset+4]) - bitmask := uint32(maskBits) - offset += 4 - - fmt.Printf("\tBITMASK: %032b\n", bitmask) +func parseFrameClientInputPart(data []byte) (api.PayloadClientInput, error) { + if len(data) != api.PayloadClientInputSize { + return api.PayloadClientInput{}, fmt.Errorf("payload wrong size: got %d bytes, want 13", len(data)) } + + v := api.PayloadClientInput{ + ClientID: data[0], + X: math.Float32frombits(binary.LittleEndian.Uint32(data[1 : 1+4])), + Y: math.Float32frombits(binary.LittleEndian.Uint32(data[5 : 5+4])), + InputMask: binary.LittleEndian.Uint32(data[9 : 9+4]), + } + + return v, nil +} + +func ParseFrameClientInput(frame api.Frame) ([]api.PayloadClientInput, error) { + if len(frame.Data) == 0 { + return nil, fmt.Errorf("empty frame data") + } + + clientCount := int(frame.Data[0]) + + log.Printf("Clients %d", clientCount) + + expectedLen := 1 + (clientCount * api.PayloadClientInputSize) + + if len(frame.Data) < expectedLen { + return nil, fmt.Errorf("frame data too short: got %d, want %d", len(frame.Data), expectedLen) + } + + clientList := make([]api.PayloadClientInput, 0, clientCount) + + for i := 0; i < clientCount; i++ { + start := 1 + (i * api.PayloadClientInputSize) + end := start + api.PayloadClientInputSize + + client, err := parseFrameClientInputPart(frame.Data[start:end]) + if err != nil { + log.Printf("Could not parse client art %d: %v", i, err) + continue + } + clientList = append(clientList, client) + } + + return clientList, nil + }