@startuml
title Remote Operations

sprite $close [48x48/16] {
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000005EF700000000000001BFC20000000000000
0000000000006FFFF8000000000001DFFFE2000000000000
000000000006FFFFFF80000000001DFFFFFE200000000000
00000000006FFFFFFFF800000001DFFFFFFFE20000000000
0000000003FFFFFFFFFF8000001DFFFFFFFFFC0000000000
0000000007FFFFFFFFFFF90001DFFFFFFFFFFF1000000000
0000000004FFFFFFFFFFFF901DFFFFFFFFFFFE0000000000
00000000008FFFFFFFFFFFF9DFFFFFFFFFFFF30000000000
000000000008FFFFFFFFFFFFFFFFFFFFFFFF300000000000
0000000000008FFFFFFFFFFFFFFFFFFFFFF3000000000000
00000000000008FFFFFFFFFFFFFFFFFFFF30000000000000
000000000000008FFFFFFFFFFFFFFFFFF300000000000000
0000000000000008FFFFFFFFFFFFFFFF3000000000000000
00000000000000008FFFFFFFFFFFFFF30000000000000000
00000000000000001EFFFFFFFFFFFFA00000000000000000
0000000000000001DFFFFFFFFFFFFFF80000000000000000
000000000000001DFFFFFFFFFFFFFFFF8000000000000000
00000000000001DFFFFFFFFFFFFFFFFFF800000000000000
0000000000001DFFFFFFFFFFFFFFFFFFFF90000000000000
000000000001DFFFFFFFFFFFFFFFFFFFFFF9000000000000
00000000001DFFFFFFFFFFFFFFFFFFFFFFFF900000000000
0000000000DFFFFFFFFFFFF38FFFFFFFFFFFF80000000000
0000000006FFFFFFFFFFFF3008FFFFFFFFFFFF0000000000
0000000006FFFFFFFFFFF300008FFFFFFFFFFF0000000000
0000000000DFFFFFFFFF30000008FFFFFFFFF80000000000
00000000001DFFFFFFF3000000008FFFFFFF900000000000
000000000001DFFFFF300000000008FFFFF9000000000000
0000000000002EFFF30000000000008FFF90000000000000
000000000000018820000000000000059500000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
}


!define FA_CLOSE(_alias) ENTITY(rectangle,black,close,_alias,FA CLOSE)
!define FA_CLOSE(_alias, _label) ENTITY(rectangle,black,close,_label, _alias,FA CLOSE)
!define FA_CLOSE(_alias, _label, _shape) ENTITY(_shape,black,close,_label, _alias,FA CLOSE)
!define FA_CLOSE(_alias, _label, _shape, _color) ENTITY(_shape,_color,close,_label, _alias,FA CLOSE)
skinparam folderBackgroundColor<<FA CLOSE>> White

sprite $exclamation_triangle [48x48/16] {
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
00000000000000000000008CB40000000000000000000000
000000000000000000000BFFFF4000000000000000000000
000000000000000000005FFFFFD000000000000000000000
00000000000000000000DFFFFFF600000000000000000000
00000000000000000006FFFFFFFE00000000000000000000
0000000000000000000EFFFFFFFF70000000000000000000
0000000000000000008FFFFFFFFFF1000000000000000000
000000000000000001FFFFFFFFFFF9000000000000000000
000000000000000009FFFFFFFFFFFF200000000000000000
00000000000000002FFFFFFFFFFFFFA00000000000000000
0000000000000000BFFFFFFFFFFFFFF30000000000000000
0000000000000003FFFFFFFFFFFFFFFC0000000000000000
000000000000000CFFFFD888889FFFFF4000000000000000
000000000000005FFFFF4000000CFFFFD000000000000000
00000000000000DFFFFF5000000DFFFFF600000000000000
00000000000006FFFFFF5000000DFFFFFE00000000000000
0000000000000EFFFFFF6000000EFFFFFF70000000000000
0000000000008FFFFFFF7000000FFFFFFFF1000000000000
000000000001FFFFFFFF7000000FFFFFFFF9000000000000
000000000009FFFFFFFF8000000FFFFFFFFF200000000000
00000000002FFFFFFFFF8000000FFFFFFFFFA00000000000
0000000000BFFFFFFFFF9000001FFFFFFFFFF30000000000
0000000003FFFFFFFFFFA000002FFFFFFFFFFC0000000000
000000000CFFFFFFFFFFA000002FFFFFFFFFFF4000000000
000000005FFFFFFFFFFFD222227FFFFFFFFFFFD000000000
00000000DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF600000000
00000006FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000
0000000EFFFFFFFFFFFFFFEEEEFFFFFFFFFFFFFF70000000
0000008FFFFFFFFFFFFFC000004FFFFFFFFFFFFFF1000000
000001FFFFFFFFFFFFFFA000002FFFFFFFFFFFFFF9000000
000009FFFFFFFFFFFFFFA000002FFFFFFFFFFFFFFF200000
00002FFFFFFFFFFFFFFFA000002FFFFFFFFFFFFFFFA00000
0000BFFFFFFFFFFFFFFFA000002FFFFFFFFFFFFFFFF30000
0003FFFFFFFFFFFFFFFFC000004FFFFFFFFFFFFFFFFC0000
000CFFFFFFFFFFFFFFFFFEDDDDFFFFFFFFFFFFFFFFFF4000
005FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD000
00BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF400
00DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF500
008FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF100
000AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4000
000024444444444444444444444444444444444444300000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
}


!define FA_EXCLAMATION_TRIANGLE(_alias) ENTITY(rectangle,black,exclamation_triangle,_alias,FA EXCLAMATION_TRIANGLE)
!define FA_EXCLAMATION_TRIANGLE(_alias, _label) ENTITY(rectangle,black,exclamation_triangle,_label, _alias,FA EXCLAMATION_TRIANGLE)
!define FA_EXCLAMATION_TRIANGLE(_alias, _label, _shape) ENTITY(_shape,black,exclamation_triangle,_label, _alias,FA EXCLAMATION_TRIANGLE)
!define FA_EXCLAMATION_TRIANGLE(_alias, _label, _shape, _color) ENTITY(_shape,_color,exclamation_triangle,_label, _alias,FA EXCLAMATION_TRIANGLE)
skinparam folderBackgroundColor<<FA EXCLAMATION_TRIANGLE>> White

sprite $check [6x6/16] {
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000004BA2000000000
00000000000000000000000000000000006FFFE300000000
0000000000000000000000000000000006FFFFFE30000000
000000000000000000000000000000006FFFFFFFE3000000
00000000000000000000000000000006FFFFFFFFFE100000
0000000000000000000000000000006FFFFFFFFFFF600000
000000000000000000000000000006FFFFFFFFFFFF400000
00000000000000000000000000006FFFFFFFFFFFFA000000
0000000000000000000000000006FFFFFFFFFFFFB0000000
000000001BFD300000000000006FFFFFFFFFFFFB00000000
00000000CFFFF4000000000006FFFFFFFFFFFFB000000000
0000000CFFFFFF40000000006FFFFFFFFFFFFB0000000000
000001CFFFFFFFF300000006FFFFFFFFFFFFB00000000000
00000AFFFFFFFFFF3000006FFFFFFFFFFFFB000000000000
00000EFFFFFFFFFFF30006FFFFFFFFFFFFB0000000000000
00000AFFFFFFFFFFFF306FFFFFFFFFFFFB00000000000000
000001DFFFFFFFFFFFF8FFFFFFFFFFFFB000000000000000
0000001DFFFFFFFFFFFFFFFFFFFFFFFB0000000000000000
00000001DFFFFFFFFFFFFFFFFFFFFFB00000000000000000
000000001DFFFFFFFFFFFFFFFFFFFB000000000000000000
0000000001DFFFFFFFFFFFFFFFFFB0000000000000000000
00000000001DFFFFFFFFFFFFFFFB00000000000000000000
000000000001DFFFFFFFFFFFFFB000000000000000000000
0000000000001DFFFFFFFFFFFB0000000000000000000000
00000000000001DFFFFFFFFFB00000000000000000000000
000000000000001DFFFFFFFB000000000000000000000000
0000000000000001DFFFFFB0000000000000000000000000
00000000000000001DFFFB00000000000000000000000000
0000000000000000019C8000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
}


!define FA_CHECK(_alias) ENTITY(rectangle,black,check,_alias,FA CHECK)
!define FA_CHECK(_alias, _label) ENTITY(rectangle,black,check,_label, _alias,FA CHECK)
!define FA_CHECK(_alias, _label, _shape) ENTITY(_shape,black,check,_label, _alias,FA CHECK)
!define FA_CHECK(_alias, _label, _shape, _color) ENTITY(_shape,_color,check,_label, _alias,FA CHECK)
skinparam folderBackgroundColor<<FA CHECK>> White


sprite $ban [48x48/16] {
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000159BCDDCA730000000000000000000
00000000000000005BFFFFFFFFFFFE920000000000000000
000000000000005DFFFFFFFFFFFFFFFFA200000000000000
0000000000001BFFFFFFFFFFFFFFFFFFFF70000000000000
000000000003EFFFFFFFFFFFFFFFFFFFFFFB000000000000
00000000004FFFFFFFFFEB989ADFFFFFFFFFC00000000000
0000000003FFFFFFFFA4000000016DFFFFFFFB0000000000
000000001EFFFFFFC20000000000007FFFFFFF8000000000
00000000AFFFFFF700000000000000BFFFFFFFF400000000
00000004FFFFFF600000000000000BFFFFFFFFFD00000000
0000000CFFFFF800000000000000BFFFFFFFFFFF60000000
0000004FFFFFC00000000000000BFFFFFFDFFFFFD0000000
000000AFFFFF30000000000000BFFFFFFC1AFFFFF3000000
000000FFFFFB0000000000000BFFFFFFC102FFFFF8000000
000003FFFFF5000000000000BFFFFFFC1000CFFFFC000000
000006FFFFF100000000000BFFFFFFC100008FFFFF000000
000009FFFFD00000000000BFFFFFFC1000004FFFFF200000
00000AFFFFC0000000000BFFFFFFC10000002FFFFF300000
00000BFFFFB000000000BFFFFFFC100000001FFFFF400000
00000AFFFFB00000000BFFFFFFC1000000002FFFFF400000
000009FFFFD0000000BFFFFFFC10000000004FFFFF300000
000007FFFFF000000BFFFFFFC100000000006FFFFF100000
000005FFFFF40000BFFFFFFC100000000000BFFFFE000000
000001FFFFF9000BFFFFFFC1000000000001FFFFFA000000
000000CFFFFF10BFFFFFFC10000000000008FFFFF5000000
0000006FFFFFABFFFFFFC10000000000001FFFFFF0000000
0000000EFFFFFFFFFFFC10000000000000AFFFFF80000000
00000007FFFFFFFFFFC100000000000008FFFFFF10000000
00000000DFFFFFFFFC100000000000007FFFFFF700000000
000000004FFFFFFFE10000000000001BFFFFFFC000000000
0000000008FFFFFFFC400000000018FFFFFFFE2000000000
00000000009FFFFFFFFE9532347BFFFFFFFFF30000000000
000000000008FFFFFFFFFFFFFFFFFFFFFFFF300000000000
0000000000005FFFFFFFFFFFFFFFFFFFFFD2000000000000
00000000000002BFFFFFFFFFFFFFFFFFF700000000000000
0000000000000004CFFFFFFFFFFFFFF81000000000000000
0000000000000000027BFFFFFFFEA5000000000000000000
000000000000000000000134320000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
}


!define FA_BAN(_alias) ENTITY(rectangle,black,ban,_alias,FA BAN)
!define FA_BAN(_alias, _label) ENTITY(rectangle,black,ban,_label, _alias,FA BAN)
!define FA_BAN(_alias, _label, _shape) ENTITY(_shape,black,ban,_label, _alias,FA BAN)
!define FA_BAN(_alias, _label, _shape, _color) ENTITY(_shape,_color,ban,_label, _alias,FA BAN)
skinparam folderBackgroundColor<<FA BAN>> White


box "TBM" #Lightgreen
participant "Vehicle CAN\n Interface" as CAN
participant "RO App" as RO
participant "TC Client" as TBM
end box

box "GSDP components" #Lightblue
participant "GSDP-MQTT" as GSDPMqtt
participant DeviceMessaging
participant "GSDP-Kafka" as GSDPKafka
participant "GSDP-RO-\nStreamProcessor" as ROSP
participant "RO-DB" as RODB
participant "GSDP-ROWS" as GSDPROWS
participant apiGateway
end box

participant "Access Layer" as Access
participant "Control Command Gateway" as Gateway
participant "TSP Proxy" as TSP
participant "SDP Router" as FCASDPRouter
participant "UI/Callcenter" as User

	
autonumber "<b>[A0]"	
note right of User : Includes Mobile, Web, Call Center
User->FCASDPRouter:RO Request with with user details (userid,vehicle id,PIN Token)\t <$close>
FCASDPRouter->apiGateway :  RO Request with user details (userid,vehicle id,PIN Token)\t  <$check>
		
	apiGateway->apiGateway:PIN Token Validation
	alt PIN token Validation Failure
	apiGateway->FCASDPRouter: PIN Token Validation Failed
	FCASDPRouter-> User: PIN Token Validation Failed
	else PIN token Validation Success
	apiGateway->FCASDPRouter:Acknowledge PIN Token Validation Success with Correlation ID 
	FCASDPRouter-> User: Acknowledge PIN Token Validation Success
	end
	note right of FCASDPRouter : Refer Authorisation & Authentication DFMEA
	
apiGateway->GSDPROWS: RO Request 
GSDPROWS -> GSDPROWS: Create/Add Session Id / client Request Id
GSDPROWS->RODB: Persist RO request
GSDPROWS->GSDPKafka:RO Request to RO device Messaging Topic

GSDPKafka->DeviceMessaging:RO Request
note left of DeviceMessaging
DeviceMessaging does priority \n arbitration and GPB serialization
end note

DeviceMessaging -> DeviceMessaging: check MQTT connection status
    alt active MQTT \nconnection
       DeviceMessaging -> GSDPMqtt : RO Request
    else No active MQTT connection
        DeviceMessaging->TBM: Send shoulder tap SMS
        TBM ->CAN: wake up command
        CAN ->TBM: wake up Ack
        TBM ->GSDPMqtt: Request to Set up connection
        DeviceMessaging -> GSDPMqtt : Once active MQTT connection established, \nRO Request
end

GSDPMqtt->TBM:RO Request
TBM->TBM : RO Command is stored in the RO topic
RO-> TBM : Retrieves the message from RO topic
RO -> RO :  Converts the proto buff message to byte format
RO -> CAN : Applies the command

activate TBM
activate CAN
CAN ->RO :RO Ack OR ROStatusUpload Success\n or Failure
RO-> TBM : Send the Feedback
note right : If failure is returned, send error in response report
alt Success and failure paths
RO -> CAN : Monitor the appropriate status signal \n to determine success or failure
...up to 30 seconds...
CAN --> RO : Signal state response
else Timed Out send error response in report
RO -> TBM: Signal Changed (Success)
 end
deactivate TBM
deactivate CAN
== Remote Operations2 ===
title Remote Operations

box "TBM" #Lightgreen
participant "Vehicle CAN\n Interface" as CAN
participant "RO App" as RO
participant "TC Client" as TBM
end box

box "GSDP components" #Lightblue
participant "GSDP-MQTT" as GSDPMqtt
participant DeviceMessaging
participant "GSDP-Kafka" as GSDPKafka
participant "GSDP-RO-\nStreamProcessor" as ROSP
participant "RO-DB" as RODB
participant "GSDP-ROWS" as GSDPROWS
participant apiGateway
end box

participant "Access Layer" as Access
participant "Control Command Gateway" as Gateway
participant "TSP Proxy" as TSP
participant "SDP Router" as FCASDPRouter
participant "UI/Callcenter" as User

	
autonumber "<b>[A0]"	
note right of User : Includes Mobile, Web, Call Center
User->FCASDPRouter:RO Request with with user details (userid,vehicle id,PIN Token)
FCASDPRouter->apiGateway :RO Request with user details (userid,vehicle id,PIN Token)
		
	apiGateway->apiGateway:PIN Token Validation
	alt PIN token Validation Failure
	apiGateway->FCASDPRouter: PIN Token Validation Failed
	FCASDPRouter-> User: PIN Token Validation Failed
	else PIN token Validation Success
	apiGateway->FCASDPRouter:Acknowledge PIN Token Validation Success with Correlation ID 
	FCASDPRouter-> User: Acknowledge PIN Token Validation Success
	end
	note right of FCASDPRouter : Refer Authorisation & Authentication DFMEA
	
apiGateway->GSDPROWS: RO Request 
GSDPROWS -> GSDPROWS: Create/Add Session Id / client Request Id
GSDPROWS->RODB: Persist RO request
GSDPROWS->GSDPKafka:RO Request to RO device Messaging Topic

GSDPKafka->DeviceMessaging:RO Request
note left of DeviceMessaging
DeviceMessaging does priority \n arbitration and GPB serialization
end note

DeviceMessaging -> DeviceMessaging: check MQTT connection status
    alt active MQTT \nconnection
       DeviceMessaging -> GSDPMqtt : RO Request
    else No active MQTT connection
        DeviceMessaging->TBM: Send shoulder tap SMS
        TBM ->CAN: wake up command
        CAN ->TBM: wake up Ack
        TBM ->GSDPMqtt: Request to Set up connection
        DeviceMessaging -> GSDPMqtt : Once active MQTT connection established, \nRO Request
end

GSDPMqtt->TBM:RO Request
TBM->TBM : RO Command is stored in the RO topic
RO-> TBM : Retrieves the message from RO topic
RO -> RO :  Converts the proto buff message to byte format
RO -> CAN : Applies the command

activate TBM
activate CAN
CAN ->RO :RO Ack OR ROStatusUpload Success\n or Failure
RO-> TBM : Send the Feedback
note right : If failure is returned, send error in response report
alt Success and failure paths
RO -> CAN : Monitor the appropriate status signal \n to determine success or failure
...up to 30 seconds...
CAN --> RO : Signal state response
else Timed Out send error response in report
RO -> TBM: Signal Changed (Success)
 end
deactivate TBM
deactivate CAN

TBM->GSDPMqtt:RO Ack OR ROStatusUpload  \n over MQTT RO
GSDPMqtt->GSDPKafka : Publish Response/Status to RO topic
GSDPKafka->ROSP:RO Response/Status
ROSP->ROSP:create correlationID
ROSP --> DeviceMessaging : ackMessage
DeviceMessaging --> GSDPMqtt : ackMessage
GSDPMqtt -->TBM : ackMessage

ROSP->ROSP:Convert GPB to JSON + base64 (bin)
ROSP->RODB: Persist RO Response/Status

ROSP -> GSDPKafka :Route to\n Archive kafka Topic
note left of GSDPKafka
ArchiveStreamProcessor \nreads RODataUpload and archive
end note

GSDPKafka -> FCASDPRouter : HTTPS call to push the RO status
== Notifications ==
 alt FCA In App and Push
 FCASDPRouter -> FCASDPRouter : Notification Enabled
FCASDPRouter -> User : Send Success Notifications
end
	
autonumber stop

opt MobileApp/Portal accessing RO/telematics services 
autonumber "<b>[00]"
	    User->FCASDPRouter: Access RO/telematics services 
	    FCASDPRouter -> GSDPROWS :  Access Remote operation service 
	    GSDPROWS -> GSDPROWS : validate SVLA mode ON for deviceId
	    GSDPROWS -> FCASDPRouter : Allow/Deny
	    FCASDPRouter -> User : Allow/Deny
end
autonumber stop

== Status == 
	
TBM->GSDPMqtt:RO Ack OR ROStatusUpload  \n over MQTT RO
GSDPMqtt->GSDPKafka : Publish Response/Status to RO topic
GSDPKafka->ROSP:RO Response/Status
ROSP->ROSP:create correlationID
ROSP --> DeviceMessaging : ackMessage
DeviceMessaging --> GSDPMqtt : ackMessage
GSDPMqtt -->TBM : ackMessage

ROSP->ROSP:Convert GPB to JSON + base64 (bin)
ROSP->RODB: Persist RO Response/Status

ROSP -> GSDPKafka :Route to\n Archive kafka Topic
note left of GSDPKafka
ArchiveStreamProcessor \nreads RODataUpload and archive
end note

GSDPKafka -> FCASDPRouter : HTTPS call to push the RO status

== Notifications ==
 alt FCA In App and Push
 FCASDPRouter -> FCASDPRouter : Notification Enabled
FCASDPRouter -> User : Send Success Notifications
end
	
autonumber stop

opt MobileApp/Portal accessing RO/telematics services 
autonumber "<b>[00]"
	    User->FCASDPRouter: Access RO/telematics services 
	    FCASDPRouter -> GSDPROWS :  Access Remote operation service 
	    GSDPROWS -> GSDPROWS : validate SVLA mode ON for deviceId
	    GSDPROWS -> FCASDPRouter : Allow/Deny
	    FCASDPRouter -> User : Allow/Deny
end
autonumber stop

@enduml 
	