@startuml
skinparam BackgroundColor F0F0F0
[*] --> WaitForStartPermission
WaitForStartPermission -> PowerDown : PowerDownRequest && !isModemActive
WaitForStartPermission --> PowerUpRequest : PowerUpRequest
PowerDown --> PowerUpRequest : PowerUpRequest
PowerUpRequest --> PowerUpProcedure : board == T3 | Linux
PowerUpRequest -> StatusCheck : board == T4
StatusCheck --> PowerUpInPorgress : modemActive
StatusCheck -> PowerUpProcedure : !modemActive
PowerUpProcedure --> CellularConfProcedure : hotStart
PowerUpProcedure --> PowerUpInPorgress : coldStart || event: modem ACTIVE
PowerUpInPorgress --> BaudDetect
BaudDetect -> CellularConfProcedure : Success
BaudDetect --> ModemFatalFailure : Failure
CellularConfProcedure --> AudioConfigurationProcedure : Success
CellularConfProcedure -> Failed : Failed
AudioConfigurationProcedure -> AudioConfigurationProcedure : Failed
AudioConfigurationProcedure --> Failed : Baud setup fail | radio enabling/disabling fail
AudioConfigurationProcedure ---> Idle : reset called
AudioConfigurationProcedure --> APNConfProcedure : Success
APNConfProcedure --> SanityCheck
SanityCheck --> ModemOn : Success
SanityCheck --> ModemFatalFailure : Failure
ModemOn -> URCReady
Event:CellularSimProcedure --> SimSelect
Event:SIM_READY --> SimInit
SimInit --> Failed : Failure
SimInit --> Ready : Success
Event:PowerDownDeregistering --> PowerDownStarted : state != PowerDownWaiting
Event:PowerDownDeregistered --> PowerDownWaiting
Event:PowerDownRequest -> PowerDownWaiting
PowerDownWaiting ---> PowerDown : (If T3 && timeout) \n || Event:modemInactive
PowerDown --> PowerUpRequest : nextPowerStateChangeAwaiting \n && nextPowerState == on
BaudDetect ---> PowerDownWaiting : nextPowerStateChangeAwaiting \n && nextPowerState == off
Event:PowerUpProcedureComplete --> CellularConfProcedure : board == T3 || Linux
Event:modemActive --> PowerDown : state != PowerUpProcedure
Event:powerDownRequest --> PowerDown : state != PowerDown,PowerDownWaiting,\n PowerUpProcedure,PowerUpInProgress
@enduml