99 lines
2.4 KiB
Go
99 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"time"
|
|
|
|
"alox.tool/api"
|
|
"alox.tool/eventbus"
|
|
"alox.tool/uart"
|
|
)
|
|
|
|
type OTAManager struct {
|
|
Bus eventbus.EventBus
|
|
Com *uart.Com
|
|
Update [][]byte
|
|
CurrentSlice uint16
|
|
Partition byte
|
|
StartTime time.Time
|
|
EndTime time.Time
|
|
}
|
|
|
|
func NewOTAManager(bus eventbus.EventBus, com *uart.Com, update [][]byte) OTAManager {
|
|
return OTAManager{
|
|
Bus: bus,
|
|
Com: com,
|
|
Update: update,
|
|
CurrentSlice: 0,
|
|
}
|
|
}
|
|
|
|
func (om *OTAManager) StartUpdateHandler(ctx context.Context) {
|
|
OtaChanel := om.Bus.Subscribe(api.TopicOTA)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case msg := <-OtaChanel:
|
|
om.handleOtaMessage(msg)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func (om *OTAManager) handleOtaMessage(msg any) {
|
|
switch msgT := msg.(type) {
|
|
case api.PayloadOtaStart:
|
|
// Send First Payload
|
|
om.StartTime = time.Now()
|
|
om.Partition = msgT.Parition
|
|
err := om.Com.Send(api.CmdOtaPayload, om.Update[om.CurrentSlice])
|
|
if err != nil {
|
|
log.Printf("Error Sending Update Step!: %v", err)
|
|
return
|
|
}
|
|
om.CurrentSlice = om.CurrentSlice + 1
|
|
log.Printf("First Update Step %d", om.CurrentSlice)
|
|
log.Printf("%v", msgT)
|
|
case api.PayloadOtaPayload:
|
|
// Send Next Payload until there is no more then send end package
|
|
|
|
log.Printf("msgT %v", msgT)
|
|
|
|
if msgT.Error != 0x00 {
|
|
log.Printf("Error in Sending Update! Check ESP Log")
|
|
return
|
|
}
|
|
|
|
log.Printf("NEXT PAYLOAD")
|
|
if om.CurrentSlice == uint16(len(om.Update)) {
|
|
log.Printf("LAST PAYLOAD SEND ENDING")
|
|
om.Com.Send(api.CmdOtaEnd, make([]byte, 1))
|
|
return
|
|
}
|
|
err := om.Com.Send(api.CmdOtaPayload, om.Update[om.CurrentSlice])
|
|
if err != nil {
|
|
log.Printf("Error Sending Update Step!: %v", err)
|
|
return
|
|
}
|
|
om.CurrentSlice = om.CurrentSlice + 1
|
|
log.Printf("UPDATE CURRENT SLICE %d/%d", om.CurrentSlice, len(om.Update))
|
|
log.Printf("UPDATE Part/WriteIndex %d/%d", msgT.SequenzCounter, msgT.WriteIndex)
|
|
log.Printf("Progress: %05.2f%%", (float32(om.CurrentSlice)/float32(len(om.Update)))*100)
|
|
|
|
case api.PayloadOtaEnd:
|
|
// End bestätigung
|
|
om.EndTime = time.Now()
|
|
duration := om.EndTime.Sub(om.StartTime)
|
|
log.Printf("Partition %d Update done in %f.2s!", om.Partition, duration.Seconds())
|
|
log.Printf("%v", msgT)
|
|
case api.PayloadOtaStatus:
|
|
log.Printf("%v", msgT)
|
|
case api.PayloadOtaStartEspNow:
|
|
log.Printf("%v", msgT)
|
|
}
|
|
}
|