@startuml Comms_Overview title Leahi Real-time CDT — Signal/Slot Wiring Overview participant "Can::CanInterface" as CAN participant "Can::MessageDispatcher" as DISP participant "CloudConnectController" as CC participant "MqttClient" as MQTT participant "AWS IoT Core" as AWS == CloudConnectController signals → slots == note over CC CanInterface::didFrameReceive → CloudConnectController::onCanFrameReceive MessageDispatcher::didActionReceive → CloudConnectController::onCanMessageReceive MqttClient::didStateChanged → CloudConnectController::onCloudStateChanged MqttClient::didMessageStatusChanged → CloudConnectController::onCloudMessageStatusChanged MqttClient::didMessageReceived → CloudConnectController::onCloudMessageReceived end note == CAN frame → Assembled CAN Message == CAN -> CC : didFrameReceive(QCanBusFrame)\n→ onCanFrameReceive() CC -> DISP : onFrameReceive(canId, payload) DISP -> CC : didActionReceive(Can::Message)\n→ onCanMessageReceive() == CAN Message Routing & MQTT Publish == CC -> CC : policy from LeahiCanRouting.ini\n(Drop / SendAlways / SendDelta) CC -> CC : canMessageToProtobufByteArray()\n→ protobuf CC -> MQTT : publish(mqttTopic(topic), payload, pubId, qos = 1) MQTT -> AWS : PUBLISH (QoS 1, retain = false) == MQTT Publish ACK == AWS -> MQTT : PUBACK MQTT -> CC : didMessageStatusChanged(id, Acknowledged, props)\n→ onCloudMessageStatusChanged() == MQTT Subscription == CC -> MQTT : subscribe(topic, QoS) MQTT -> AWS : SUBSCRIBE (topic, requested QoS) AWS -> MQTT : SUBACK == Inbound Subscription == AWS -> MQTT : PUBLISH on subscribed topic MQTT -> CC : didMessageReceived(payload, topic)\n→ onCloudMessageReceived() @enduml