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) } }