@startuml REQ-0040_OTA_Firmware_Update
autonumber
skinparam maxMessageSize 200
skinparam responseMessageBelowArrow true

entity "Cloud" as Cloud
entity "Hardware" as Hardware

box "System" #LightBlue
  participant "OTA Manager" as OTA_Manager
  participant "Comm Manager" as Comm_Manager
  participant "Event Bus" as Event_Bus
end box

header
  **REQ-0040: OTA Firmware Update**
  //Description:// Orchestrate firmware update lifecycle: receive cloud\nnotification, coordinate download, write to flash, verify\nintegrity, report result.
  //Acceptance Criteria:// OTA state machine progresses through download, write,\nverify. CRC verification passes before reporting success.
  //Preconditions:// REQ-0020 (Remote Status Reporting)
end header


Cloud --> OTA_Manager: EVENT_CLOUD_OTA_AVAILABLE\nOTA_OnUpdateAvailable()
activate OTA_Manager
Comm_Manager --> OTA_Manager: EVENT_COMM_CHUNK_RECEIVED\nOTA_OnChunkReceived()
Comm_Manager --> OTA_Manager: EVENT_COMM_DOWNLOAD_COMPLETE\nOTA_OnDownloadComplete()
== OTA_Init() ==
OTA_Manager -> Event_Bus: Event_register(EVENT_CLOUD_OTA_AVAILABLE, OTA_OnUpdateAvailable)
activate Event_Bus
Event_Bus <-- OTA_Manager: return
deactivate Event_Bus
OTA_Manager -> Event_Bus: Event_register(EVENT_COMM_CHUNK_RECEIVED, OTA_OnChunkReceived)
activate Event_Bus
Event_Bus <-- OTA_Manager: return
deactivate Event_Bus
OTA_Manager -> Event_Bus: Event_register(EVENT_COMM_DOWNLOAD_COMPLETE, OTA_OnDownloadComplete)
activate Event_Bus
Event_Bus <-- OTA_Manager: return
deactivate Event_Bus
== OTA_OnUpdateAvailable() ==
note right of OTA_Manager: Ota State Change
OTA_Manager --> Comm_Manager: EVENT_COMM_DOWNLOAD_START\nOTA_OnUpdateAvailable() -> Comm_DownloadFirmware()
loop http_has_data(&stream)
Comm_Manager --> OTA_Manager: EVENT_COMM_CHUNK_RECEIVED\nComm_DownloadFirmware() -> OTA_OnChunkReceived()
OTA_Manager --> Hardware: EVENT_HW_FLASH_WRITE\nOTA_OnChunkReceived()
end loop
Comm_Manager --> OTA_Manager: EVENT_COMM_DOWNLOAD_COMPLETE\nComm_DownloadFirmware() -> OTA_OnDownloadComplete()
note right of OTA_Manager: Ota Verify Crc
OTA_Manager -> Comm_Manager: Comm_SendStatus(&status)
activate Comm_Manager
Comm_Manager <-- OTA_Manager: return
deactivate Comm_Manager
OTA_Manager --> Cloud: EVENT_CLOUD_OTA_RESULT\nOTA_OnDownloadComplete()
deactivate OTA_Manager

@enduml