Tool Adjustments for OTA Update
This commit is contained in:
parent
cf42e86322
commit
3abdd8816c
153
goTool/main.go
153
goTool/main.go
@ -3,8 +3,11 @@ package main
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/pterm/pterm"
|
"github.com/pterm/pterm"
|
||||||
"go.bug.st/serial"
|
"go.bug.st/serial"
|
||||||
@ -12,6 +15,19 @@ import (
|
|||||||
|
|
||||||
type ParserState int
|
type ParserState int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// MISC
|
||||||
|
UART_ECHO = 0x01
|
||||||
|
UART_VERSION = 0x02
|
||||||
|
UART_CLIENT_INFO = 0x03
|
||||||
|
|
||||||
|
// OTA
|
||||||
|
UART_OTA_START = 0x10
|
||||||
|
UART_OTA_PAYLOAD = 0x11
|
||||||
|
UART_OTA_END = 0x12
|
||||||
|
UART_OTA_STATUS = 0x13
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
WAITING_FOR_START_BYTE ParserState = iota
|
WAITING_FOR_START_BYTE ParserState = iota
|
||||||
ESCAPED_MESSAGE_ID
|
ESCAPED_MESSAGE_ID
|
||||||
@ -43,6 +59,23 @@ type MessageReceive struct {
|
|||||||
raw_write_index int
|
raw_write_index int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OTASyncManager struct {
|
||||||
|
OTA_MessageCounter int
|
||||||
|
OTA_PayloadMessageSequence int
|
||||||
|
NewOTAMessage chan MessageReceive
|
||||||
|
TimeoutMessage time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func initMessageReceive(mr *MessageReceive) {
|
func initMessageReceive(mr *MessageReceive) {
|
||||||
mr.raw_message = make([]byte, 1024*4)
|
mr.raw_message = make([]byte, 1024*4)
|
||||||
mr.parsed_message = make([]byte, 1024*4)
|
mr.parsed_message = make([]byte, 1024*4)
|
||||||
@ -63,7 +96,17 @@ func addByteToParsedBuffer(mr *MessageReceive, pbyte byte) {
|
|||||||
mr.checksum ^= pbyte
|
mr.checksum ^= pbyte
|
||||||
}
|
}
|
||||||
|
|
||||||
func parse_03_payload(payloadBuffer []byte, payload_len int) {
|
func parse_uart_ota_payload_payload(payloadBuffer []byte, payload_len int) {
|
||||||
|
fmt.Printf("RAW BUFFER: % 02X", payloadBuffer[:payload_len])
|
||||||
|
if payload_len != 4 {
|
||||||
|
fmt.Printf("Payload should be 4 is %v", payload_len)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Sequence %v, WriteIndex %v", binary.LittleEndian.Uint16(payloadBuffer[0:1]), binary.LittleEndian.Uint16(payloadBuffer[2:3]))
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse_uart_client_info_payload(payloadBuffer []byte, payload_len int) {
|
||||||
|
|
||||||
type payload_data struct {
|
type payload_data struct {
|
||||||
ClientID uint8
|
ClientID uint8
|
||||||
@ -135,12 +178,25 @@ func parse_03_payload(payloadBuffer []byte, payload_len int) {
|
|||||||
func message_receive_callback(mr MessageReceive) {
|
func message_receive_callback(mr MessageReceive) {
|
||||||
log.Printf("Message Received: % 02X\n", mr.raw_message[:mr.raw_write_index])
|
log.Printf("Message Received: % 02X\n", mr.raw_message[:mr.raw_write_index])
|
||||||
switch mr.parsed_message[0] {
|
switch mr.parsed_message[0] {
|
||||||
case 0x01:
|
case byte(UART_ECHO):
|
||||||
break
|
break
|
||||||
case 0x02:
|
case UART_VERSION:
|
||||||
break
|
break
|
||||||
case 0x03:
|
case UART_CLIENT_INFO:
|
||||||
parse_03_payload(mr.parsed_message, mr.write_index)
|
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
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -150,6 +206,7 @@ func message_receive_failed_callback(mr MessageReceive) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseByte(mr *MessageReceive, pbyte byte) {
|
func parseByte(mr *MessageReceive, pbyte byte) {
|
||||||
|
fmt.Printf("Parsing %v", pbyte)
|
||||||
addByteToRawBuffer(mr, pbyte)
|
addByteToRawBuffer(mr, pbyte)
|
||||||
switch mr.state {
|
switch mr.state {
|
||||||
case WAITING_FOR_START_BYTE:
|
case WAITING_FOR_START_BYTE:
|
||||||
@ -179,18 +236,18 @@ func parseByte(mr *MessageReceive, pbyte byte) {
|
|||||||
}
|
}
|
||||||
if pbyte == START_BYTE {
|
if pbyte == START_BYTE {
|
||||||
mr.error = UNEXPECETD_BYTE
|
mr.error = UNEXPECETD_BYTE
|
||||||
message_receive_failed_callback(*mr)
|
go message_receive_failed_callback(*mr)
|
||||||
initMessageReceive(mr)
|
initMessageReceive(mr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if pbyte == END_BYTE {
|
if pbyte == END_BYTE {
|
||||||
if mr.checksum != 0 { // checksum wrong
|
if mr.checksum != 0 { // checksum wrong
|
||||||
mr.error = WRONG_CHECKSUM
|
mr.error = WRONG_CHECKSUM
|
||||||
message_receive_failed_callback(*mr)
|
go message_receive_failed_callback(*mr)
|
||||||
initMessageReceive(mr)
|
initMessageReceive(mr)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
message_receive_callback(*mr)
|
go message_receive_callback(*mr)
|
||||||
initMessageReceive(mr)
|
initMessageReceive(mr)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -240,7 +297,22 @@ func sendMessage(port serial.Port, sendBuffer []byte) {
|
|||||||
fmt.Printf("Send Message % 02X\n", sendBuffer[:n])
|
fmt.Printf("Send Message % 02X\n", sendBuffer[:n])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
updatePath string
|
||||||
|
OTA_UpdateHandler OTASyncManager
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
flag.StringVar(&updatePath, "update", "", "Path to Updatefile")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
OTA_UpdateHandler = OTASyncManager{
|
||||||
|
OTA_MessageCounter: 0,
|
||||||
|
OTA_PayloadMessageSequence: 0,
|
||||||
|
NewOTAMessage: make(chan MessageReceive),
|
||||||
|
TimeoutMessage: time.Millisecond * 1000,
|
||||||
|
}
|
||||||
|
|
||||||
mode := &serial.Mode{
|
mode := &serial.Mode{
|
||||||
BaudRate: 115200,
|
BaudRate: 115200,
|
||||||
}
|
}
|
||||||
@ -279,6 +351,47 @@ func main() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
if updatePath != "" {
|
||||||
|
// start update
|
||||||
|
update, err := os.ReadFile(updatePath)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Could not read Update file %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("Update Buffer read, update size %v", len(update))
|
||||||
|
log.Printf("Gonna break it down in 200 Bytes packages will send %v packages", len(update)/200)
|
||||||
|
|
||||||
|
// start
|
||||||
|
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])
|
||||||
|
_, err = OTA_UpdateHandler.WaitForNextMessageTimeout()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error Message not acked %v", err)
|
||||||
|
} else {
|
||||||
|
log.Printf("Message Waiting hat funktionioert")
|
||||||
|
}
|
||||||
|
|
||||||
|
// write update parts
|
||||||
|
|
||||||
|
// end
|
||||||
|
payload_buffer = make([]byte, 1024)
|
||||||
|
send_buffer = make([]byte, 1024)
|
||||||
|
payload_buffer[0] = UART_OTA_END
|
||||||
|
n = buildMessage(payload_buffer, 1, send_buffer)
|
||||||
|
sendMessage(port, send_buffer[:n])
|
||||||
|
|
||||||
|
_, err = OTA_UpdateHandler.WaitForNextMessageTimeout()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error Message not acked %v", err)
|
||||||
|
} else {
|
||||||
|
log.Printf("Message Waiting hat funktionioert")
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
var input string
|
var input string
|
||||||
_, err := fmt.Scanln(&input)
|
_, err := fmt.Scanln(&input)
|
||||||
@ -293,24 +406,42 @@ func main() {
|
|||||||
case "1":
|
case "1":
|
||||||
payload_buffer := make([]byte, 1024)
|
payload_buffer := make([]byte, 1024)
|
||||||
send_buffer := make([]byte, 1024)
|
send_buffer := make([]byte, 1024)
|
||||||
payload_buffer[0] = 0x01
|
payload_buffer[0] = UART_ECHO
|
||||||
n := buildMessage(payload_buffer, 1, send_buffer)
|
n := buildMessage(payload_buffer, 1, send_buffer)
|
||||||
sendMessage(port, send_buffer[:n])
|
sendMessage(port, send_buffer[:n])
|
||||||
break
|
break
|
||||||
case "2":
|
case "2":
|
||||||
payload_buffer := make([]byte, 1024)
|
payload_buffer := make([]byte, 1024)
|
||||||
send_buffer := make([]byte, 1024)
|
send_buffer := make([]byte, 1024)
|
||||||
payload_buffer[0] = 0x02
|
payload_buffer[0] = UART_VERSION
|
||||||
n := buildMessage(payload_buffer, 1, send_buffer)
|
n := buildMessage(payload_buffer, 1, send_buffer)
|
||||||
sendMessage(port, send_buffer[:n])
|
sendMessage(port, send_buffer[:n])
|
||||||
break
|
break
|
||||||
case "3":
|
case "3":
|
||||||
payload_buffer := make([]byte, 1024)
|
payload_buffer := make([]byte, 1024)
|
||||||
send_buffer := make([]byte, 1024)
|
send_buffer := make([]byte, 1024)
|
||||||
payload_buffer[0] = 0x03
|
payload_buffer[0] = UART_CLIENT_INFO
|
||||||
n := buildMessage(payload_buffer, 1, send_buffer)
|
n := buildMessage(payload_buffer, 1, send_buffer)
|
||||||
sendMessage(port, send_buffer[:n])
|
sendMessage(port, send_buffer[:n])
|
||||||
break
|
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)
|
||||||
|
payload_buffer[0] = UART_OTA_PAYLOAD
|
||||||
|
for i := range 200 {
|
||||||
|
payload_buffer[i+1] = byte(i)
|
||||||
|
}
|
||||||
|
n := buildMessage(payload_buffer, 201, send_buffer)
|
||||||
|
sendMessage(port, send_buffer[:n])
|
||||||
|
break
|
||||||
|
case "6": // end update
|
||||||
default:
|
default:
|
||||||
fmt.Printf("Not a valid input")
|
fmt.Printf("Not a valid input")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user