Working OTA Update over UART to the Master
This commit is contained in:
+41
-7
@@ -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")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user