@startuml skinparam BackgroundColor F0F0F0 participant ServiceCellular as cellular participant RequestFactory as factory participant IRequest as request participant CellularRequestHandler as handler participant DLCChannel as channel ?-> cellular + : ""call request"" cellular -> factory + : Create factory -> factory : emergencyCheck() alt is emergency and allowed factory -> request ** : <> factory --> cellular : <> else is emergency and not allowed factory -> request : <> factory --> cellular : <> end note left: decision depends on the emergency\nnumber itself and state of SIM card loop request types factory -> factory : <> alt matched factory -> request : <> factory --> cellular : << matched : IRequest>> end end alt SIM not present factory -> request : <> factory --> cellular : <> else else factory -> request : <> factory --> cellular -: <> end cellular ->request : command() request --> cellular: <> cellular -> channel: cmd(command) channel -->cellular : at::Result cellular -> request +: Handle(CellularRequestHandler, at::Result) request -> handler + : Handle(IRequest) handler->? - : <> ?<-- cellular -- : ""multicast response"" cellular -> request !! : delete @enduml