diff --git a/goTool/main.go b/goTool/main.go index 9da00fd..213c974 100644 --- a/goTool/main.go +++ b/goTool/main.go @@ -6,7 +6,9 @@ import ( "flag" "fmt" "log" + "math" "os" + "strconv" "time" "github.com/pterm/pterm" @@ -17,9 +19,10 @@ type ParserState int const ( // MISC - UART_ECHO = 0x01 - UART_VERSION = 0x02 - UART_CLIENT_INFO = 0x03 + UART_ECHO = 0x01 + UART_VERSION = 0x02 + UART_CLIENT_INFO = 0x03 + UART_CLIENT_INPUT = 0x04 // OTA UART_OTA_START = 0x10 @@ -199,30 +202,63 @@ func parse_uart_client_info_payload(payloadBuffer []byte, payload_len int) { } } +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 message_receive_callback(mr MessageReceive) { log.Printf("Message Received: % 02X\n", mr.raw_message[:mr.raw_write_index]) switch mr.parsed_message[0] { case byte(UART_ECHO): - break case UART_VERSION: parse_uart_version_payload(mr.parsed_message, mr.write_index) - break case UART_CLIENT_INFO: parse_uart_client_info_payload(mr.parsed_message, mr.write_index) - break case UART_OTA_START: OTA_UpdateHandler.NewOTAMessage <- mr - break case UART_OTA_PAYLOAD: parse_uart_ota_payload_payload(mr.parsed_message, mr.write_index) OTA_UpdateHandler.NewOTAMessage <- mr - break case UART_OTA_END: OTA_UpdateHandler.NewOTAMessage <- mr - break case UART_OTA_STATUS: OTA_UpdateHandler.NewOTAMessage <- mr - break + case UART_CLIENT_INPUT: + parse_uart_client_input(mr.parsed_message, mr.write_index) } } @@ -240,7 +276,6 @@ func parseByte(mr *MessageReceive, pbyte byte) { addByteToRawBuffer(mr, pbyte) } // ignore every other byte - break case GET_MESSAGE_ID: if pbyte == ESCAPE_BYTE { mr.state = ESCAPED_MESSAGE_ID @@ -248,11 +283,9 @@ func parseByte(mr *MessageReceive, pbyte byte) { addByteToParsedBuffer(mr, pbyte) mr.state = IN_PAYLOD } - break case ESCAPED_MESSAGE_ID: addByteToParsedBuffer(mr, pbyte) mr.state = IN_PAYLOD - break case IN_PAYLOD: if pbyte == ESCAPE_BYTE { mr.state = ESCAPED_PAYLOAD_BYTE @@ -277,11 +310,9 @@ func parseByte(mr *MessageReceive, pbyte byte) { } // normal case addByteToParsedBuffer(mr, pbyte) - break case ESCAPED_PAYLOAD_BYTE: addByteToParsedBuffer(mr, pbyte) mr.state = IN_PAYLOD - break default: panic(fmt.Sprintf("unexpected main.ParserState: %#v", mr.state)) } @@ -454,9 +485,11 @@ func main() { for { var input string - _, err := fmt.Scanln(&input) + var input2 string + _, err := fmt.Scanln(&input, &input2) if err != nil { - log.Fatalf("Could not read from stdin") + log.Fatalf("Could not read from stdin %v", err) + return } fmt.Printf("Input %v", input) @@ -469,28 +502,24 @@ func main() { payload_buffer[0] = UART_ECHO n := buildMessage(payload_buffer, 1, send_buffer) sendMessage(port, send_buffer[:n]) - break case "2": payload_buffer := make([]byte, 1024) send_buffer := make([]byte, 1024) payload_buffer[0] = UART_VERSION n := buildMessage(payload_buffer, 1, send_buffer) sendMessage(port, send_buffer[:n]) - break case "3": payload_buffer := make([]byte, 1024) send_buffer := make([]byte, 1024) payload_buffer[0] = UART_CLIENT_INFO n := buildMessage(payload_buffer, 1, send_buffer) sendMessage(port, send_buffer[:n]) - break case "4": // start update payload_buffer := make([]byte, 1024) send_buffer := make([]byte, 1024) payload_buffer[0] = UART_OTA_START n := buildMessage(payload_buffer, 1, send_buffer) sendMessage(port, send_buffer[:n]) - break case "5": // send payload payload_buffer := make([]byte, 1024) send_buffer := make([]byte, 1024) @@ -500,15 +529,25 @@ func main() { } n := buildMessage(payload_buffer, 201, send_buffer) sendMessage(port, send_buffer[:n]) - break case "6": // end update case "7": // Start OTA for ESP-NOW clients payload_buffer := make([]byte, 1024) send_buffer := make([]byte, 1024) - payload_buffer[0] = UART_OTA_START_ESPNOW // Use the new constant + payload_buffer[0] = UART_OTA_START_ESPNOW n := buildMessage(payload_buffer, 1, send_buffer) sendMessage(port, send_buffer[:n]) - break + case "8": // Get Fake Client Input + payload_buffer := make([]byte, 1024) + send_buffer := make([]byte, 1024) + payload_buffer[0] = UART_CLIENT_INPUT + seed, err := strconv.Atoi(input2) + if err != nil { + log.Printf("Could not parse %v to a number", input2) + return + } + payload_buffer[1] = byte(seed) + n := buildMessage(payload_buffer, 2, send_buffer) + sendMessage(port, send_buffer[:n]) default: fmt.Printf("Not a valid input") } diff --git a/main/main.c b/main/main.c index cd4debf..5341494 100644 --- a/main/main.c +++ b/main/main.c @@ -42,6 +42,64 @@ static ESP_MessageBrokerTaskParams_t esp_broker_task_params; ClientList clientList = {.Clients = {{0}}, .ClientCount = 0}; +size_t build_ClientInfoPart(uint8_t clientid, float_t lagex, float_t lagey, + int32_t bitmask, uint8_t *outputArray, + size_t outputArrayOffset, size_t outputArraySize) { + + size_t offset = outputArrayOffset; + memcpy(&outputArray[offset], &clientid, sizeof(clientid)); + offset += sizeof(clientid); + + // lagex (typischerweise 4 Bytes) + memcpy(&outputArray[offset], &lagex, sizeof(lagex)); + offset += sizeof(lagex); + + // lagey (typischerweise 4 Bytes) + memcpy(&outputArray[offset], &lagey, sizeof(lagey)); + offset += sizeof(lagey); + + // bitmask (4 Bytes) + memcpy(&outputArray[offset], &bitmask, sizeof(bitmask)); + offset += sizeof(bitmask); + + return offset - outputArrayOffset; +} + +void fakeDataCallback(uint8_t msgid, const uint8_t *payload, size_t payload_len, + uint8_t *send_payload_buffer, + size_t send_payload_buffer_size, uint8_t *send_buffer, + size_t send_buffer_size) { + + uint8_t seed = payload[1]; + ESP_LOGI(TAG, "Sending Fake Client Infos with seed %d", seed); + srand(seed); + + size_t offset = 1; + send_payload_buffer[0] = 3; // Client Count + offset += + build_ClientInfoPart(1, rand() * 1.0, rand() * 1.0, rand() * 1, + send_payload_buffer, 1, send_payload_buffer_size); + offset += build_ClientInfoPart(2, rand() * 2.0, rand() * 2.0, rand() * 2, + send_payload_buffer, offset, + send_payload_buffer_size); + offset += build_ClientInfoPart(3, rand() * 3.0, rand() * 3.0, rand() * 3, + send_payload_buffer, offset, + send_payload_buffer_size); + + int len = build_message(UART_CLIENT_INPUT, send_payload_buffer, offset, + send_buffer, send_buffer_size); + + if (len < 0) { + ESP_LOGE(TAG, + "Error Building UART Message: payload_len, %d, sendbuffer_size: " + "%d, mes_len(error): %d", + payload_len, send_buffer_size, len); + return; + } + + uart_write_bytes(MASTER_UART, send_buffer, len); +} + void echoCallback(uint8_t msgid, const uint8_t *payload, size_t payload_len, uint8_t *send_payload_buffer, size_t send_payload_buffer_size, uint8_t *send_buffer, size_t send_buffer_size) { @@ -310,6 +368,7 @@ void app_main(void) { RegisterCallback(0x01, echoCallback); RegisterCallback(0x02, versionCallback); RegisterCallback(0x03, clientInfoCallback); +RegisterCallback(0x04, fakeDataCallback); RegisterCallback(UART_OTA_START_ESPNOW, start_ota_update_espnow); init_ota(); diff --git a/main/uart_msg_ids.h b/main/uart_msg_ids.h index a684e2e..f54c9c0 100644 --- a/main/uart_msg_ids.h +++ b/main/uart_msg_ids.h @@ -6,6 +6,7 @@ enum UART_MSG_IDS { UART_ECHO = 0x01, UART_VERSION = 0x02, UART_CLIENT_INFO = 0x03, + UART_CLIENT_INPUT = 0x04, // OTA UART_OTA_START = 0x10,