Working OTA Update over UART to the Master

This commit is contained in:
2025-08-03 22:52:01 +02:00
parent 3abdd8816c
commit 3b560799af
5 changed files with 112 additions and 33 deletions
+41 -7
View File
@@ -69,7 +69,6 @@ type OTASyncManager struct {
func (ot *OTASyncManager) WaitForNextMessageTimeout() (*MessageReceive, error) {
select {
case msg := <-ot.NewOTAMessage:
log.Printf("OTASyncManager MessageReceive %v", msg)
return &msg, nil
case <-time.After(ot.TimeoutMessage):
return nil, fmt.Errorf("Message Timeout")
@@ -97,7 +96,7 @@ func addByteToParsedBuffer(mr *MessageReceive, pbyte byte) {
}
func parse_uart_ota_payload_payload(payloadBuffer []byte, payload_len int) {
fmt.Printf("RAW BUFFER: % 02X", payloadBuffer[:payload_len])
//fmt.Printf("RAW BUFFER: % 02X", payloadBuffer[:payload_len])
if payload_len != 4 {
fmt.Printf("Payload should be 4 is %v", payload_len)
return
@@ -206,7 +205,6 @@ func message_receive_failed_callback(mr MessageReceive) {
}
func parseByte(mr *MessageReceive, pbyte byte) {
fmt.Printf("Parsing %v", pbyte)
addByteToRawBuffer(mr, pbyte)
switch mr.state {
case WAITING_FOR_START_BYTE:
@@ -279,6 +277,10 @@ func buildMessage(payloadBuffer []byte, payload_len int, sendBuffer []byte) int
writeIndex++
checksum ^= b
}
if checksum == START_BYTE || checksum == ESCAPE_BYTE || checksum == END_BYTE {
sendBuffer[writeIndex] = ESCAPE_BYTE
writeIndex++
}
sendBuffer[writeIndex] = checksum
writeIndex++
sendBuffer[writeIndex] = END_BYTE
@@ -310,11 +312,12 @@ func main() {
OTA_MessageCounter: 0,
OTA_PayloadMessageSequence: 0,
NewOTAMessage: make(chan MessageReceive),
TimeoutMessage: time.Millisecond * 1000,
TimeoutMessage: time.Millisecond * 30000,
}
mode := &serial.Mode{
BaudRate: 115200,
//BaudRate: 115200,
BaudRate: 921600,
}
port, err := serial.Open("/dev/ttyUSB0", mode)
if err != nil {
@@ -367,15 +370,45 @@ func main() {
payload_buffer[0] = UART_OTA_START
n := buildMessage(payload_buffer, 1, send_buffer)
sendMessage(port, send_buffer[:n])
_, err = OTA_UpdateHandler.WaitForNextMessageTimeout()
msg, err := OTA_UpdateHandler.WaitForNextMessageTimeout()
if err != nil {
log.Printf("Error Message not acked %v", err)
} else {
log.Printf("Message Waiting hat funktionioert")
if msg.parsed_message[2] != 0x00 {
log.Printf("Update Start failed %v", msg.parsed_message[2])
return
} else {
log.Printf("Update Start confirmed Updating Partition %v", msg.parsed_message[1])
}
}
update_write_index := 0
// write update parts
for update_write_index < len(update) {
payload_buffer = make([]byte, 1024)
send_buffer = make([]byte, 1024)
payload_buffer[0] = UART_OTA_PAYLOAD
write_len := min(200, len(update)-update_write_index)
//end_payload_len := min(update_write_index+200, len(update))
copy(payload_buffer[1:write_len+1], update[update_write_index:update_write_index+write_len])
n = buildMessage(payload_buffer, write_len+1, send_buffer)
sendMessage(port, send_buffer[:n])
msg, err := OTA_UpdateHandler.WaitForNextMessageTimeout()
if err != nil {
log.Printf("Error Message not acked %v", err)
return
} else {
seqCounter := binary.LittleEndian.Uint16(msg.parsed_message[1:3])
buff_write_index := binary.LittleEndian.Uint16(msg.parsed_message[3:5])
log.Printf("Sequenzce Counter: %d, Update buffer Write Index: %d", seqCounter, buff_write_index)
}
update_write_index += 200
}
log.Printf("Update übertragen beende hier!!!")
// end
payload_buffer = make([]byte, 1024)
send_buffer = make([]byte, 1024)
@@ -386,6 +419,7 @@ func main() {
_, err = OTA_UpdateHandler.WaitForNextMessageTimeout()
if err != nil {
log.Printf("Error Message not acked %v", err)
return
} else {
log.Printf("Message Waiting hat funktionioert")
}