@startuml Class_Overview title Leahi Real-time CDT — Class Overview skinparam classAttributeIconSize 0 skinparam class { BackgroundColor<> LightYellow BackgroundColor<> LightCyan } package "CloudConnect (process)" { class CloudConnectController { -_settings: QSettings -_canInterface: Can::CanInterface -_canThread: QThread -_dispatcher: Can::MessageDispatcher -_msgHandling: QHash -_msgCache: QMap> -_appServer: CloudConnectServer -_txSequence: quint16 __ +CloudConnectController(configPath, msgHandlingPath) +listenForApp(): bool -loadMsgHandling(msgHandlingPath) __ -onFrameReceive(QCanBusFrame) -onMessageReceive(Can::Message) } } package "Comms (lib)" { class "Can::CanInterface" as CanInterface { -_canDevice: QSharedPointer -_rxFrameCount: FrameCount -_txFrameCount: FrameCount -_erFrameCount: FrameCount __ +init(thread: QThread&): bool +quitDevice() +enableConsoleOut(bool) +status(): QString __ +didFrameReceive(QCanBusFrame) <> +didFrameTransmit(bool) <> +didFrameError(QString) <> +didFrameWritten(qint64) <> __ -onFrameReceive() <> -onFrameTransmit(QCanBusFrame) <> -onFrameError(CanBusError) <> -onFrameWritten(qint64) <> } class CloudConnectClient { -_socket: QLocalSocket -_reconnectTimer: QTimer -_socketPath: QString -_rxBuf: QByteArray -_rxMsg: CloudConnectFrame __ +init(socketPath, reconnectIntervalMs, thread): bool +send(type, sequence, payload): bool +quit() <> __ +didMessageReceive(Type, seq, payload) <> +didConnect() <> +didDisconnect() <> __ -onConnected() <> -onDisconnected() <> -onError(LocalSocketError) <> -onReadyRead() <> -onReconnectTimer() <> } class CloudConnectServer { -_server: QLocalServer -_client: QLocalSocket* -_rxBuf: QByteArray -_rxMsg: CloudConnectFrame __ +listen(socketPath): bool +send(type, sequence, payload): bool +isConnected(): bool __ +didMessageReceive(Type, seq, payload) <> +didConnect() <> +didDisconnect() <> __ -onNewConnection() <> -onDisconnected() <> -onReadyRead() <> } class "Can::MessageDispatcher" as MessageDispatcher { -_messageList: QHash -_rxSequence: Sequence -_builder: Can::MessageBuilder __ +didActionReceive(Can::Message) <> __ +onFrameReceive(CanId, payload) <> -buildMessage(CanId, payload): bool -rxCount(): Sequence } class "Can::MessageBuilder" as MessageBuilder { __ +buildFrames(MsgId, data, frameList, sequence): bool +buildMessage(payload, message, canId): bool +enableConsoleOut(bool) } class CloudConnectFrame { -_headerBuf: QByteArray -_rxType: Type -_rxSequence: quint16 -_rxPayloadLen: quint32 -_rxPayload: QByteArray __ +{static} build(type, sequence, payload): QByteArray +read(bytes: QByteArray&): ReadState +type(): Type +sequence(): quint16 +payload(): QByteArray +reset() } enum "CloudConnectFrame::Type" as Type { HighPriority = 0x0001 NormalPriority = 0x0002 DeviceLogFile = 0x0003 TreatmentLogFile = 0x0004 CloudSyncLogFile = 0x0005 } enum "CloudConnectFrame::ReadState" as ReadState { Incomplete Complete HeaderError PayloadError } } package "CANDumpPlayer (process)" { class "CANDumpPlayer\n(main)" <> { +can_interface: string +candump_file: string +--speed: double +--test: bool __ Parses candump log and replays\nframes onto SocketCAN at a\nconfigurable speed multiplier } } ' --- composition --- CloudConnectController *-- CanInterface CloudConnectController *-- CloudConnectServer CloudConnectController *-- MessageDispatcher ' --- internal composition --- MessageDispatcher *-- MessageBuilder ' --- usage --- CloudConnectServer ..> CloudConnectFrame : uses CloudConnectClient ..> CloudConnectFrame : uses ' --- enum nesting --- CloudConnectFrame +-- Type CloudConnectFrame +-- ReadState ' --- layout hints --- CanInterface -[hidden]- CloudConnectClient @enduml