# genivi/candevstudio architecture

> Architecture diagram of the GitHub repository genivi/candevstudio, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/genivi/candevstudio
- Repository: https://github.com/genivi/candevstudio

## Overview

CANdevStudio is a modular visual CAN simulation and development application. The main workflow is to create or load a project, configure a CAN device and connect components in the project graph, start simulation, then inspect traffic or exercise signal and raw-frame tools. Its component library also covers filtering, logging, playback, database-backed signal decoding and encoding, and scripting. The README documents the device-to-view workflow; unsampled component wiring is shown only as unverified. Evidence is limited to the README and the supplied source excerpts and index.

Main entry points: [`src/components/candevice/candevice.cpp`](https://github.com/genivi/candevstudio/blob/master/src/components/candevice/candevice.cpp) (CAN Device), [`src/gui/projectconfig`](https://github.com/genivi/candevstudio/tree/master/src/gui/projectconfig) (Project Editor), [`src/components/canrawsender/canrawsender.h`](https://github.com/genivi/candevstudio/blob/master/src/components/canrawsender/canrawsender.h) (Raw Sender), [`src/gui/mainwindow.cpp`](https://github.com/genivi/candevstudio/blob/master/src/gui/mainwindow.cpp) (Main Window)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Application"]
  node_mainwindow["Main Window<br/>[mainwindow.cpp]"]
  node_project["Project Editor"]
end

subgraph group_framework["Component Framework"]
  node_framework["Component Runtime"]
end

subgraph group_raw["Raw CAN Tools"]
  node_device["CAN Device<br/>[candevice.cpp]"]
  node_rawview["Raw Viewer<br/>[canrawview_p.h]"]
  node_rawfilter["Raw Filter<br/>[canrawfilter_p.cpp]"]
  node_rawlogger["Raw Logger<br/>[canrawlogger_p.cpp]"]
  node_rawplayer["Raw Player<br/>[canrawplayer_p.cpp]"]
  node_rawsender["Raw Sender<br/>[canrawsender.h]"]
  node_newline["Frame Controls<br/>[newlinemanager.cpp]"]
  node_load["Bus Load<br/>[canload.cpp]"]
end

subgraph group_signals["Signal Tools"]
  node_signaldata["Signal Database<br/>[cansignaldata.cpp]"]
  node_decoder["Signal Decoder"]
  node_viewer["Signal Viewer"]
  node_encoder["Signal Encoder"]
  node_signalsender["Signal Sender"]
end

subgraph group_scripting["Scripting"]
  node_executor["QML Executor<br/>[qmlexecutor.cpp]"]
end

node_user(("Engineer"))
node_externalcan{{"CAN Interface"}}

node_user -->|"uses"| node_mainwindow
node_mainwindow -->|"opens editor"| node_project
node_project -.->|"hosts components"| node_framework
node_project -.->|"configures"| node_device
node_project -->|"connects"| node_rawview
node_device -->|"accesses bus"| node_externalcan
node_device -.->|"passes traffic"| node_rawview
node_device -.->|"passes traffic"| node_rawfilter
node_rawfilter -.->|"filtered frames"| node_rawlogger
node_rawplayer -.->|"replays frames"| node_device
node_rawsender -->|"uses controls"| node_newline
node_rawsender -.->|"sends frames"| node_device
node_signaldata -.->|"supplies database"| node_decoder
node_decoder -.->|"decoded signals"| node_viewer
node_encoder -.->|"encoded signals"| node_signalsender
node_signalsender -.->|"sends signals"| node_device
node_executor -.->|"controls bus"| node_device

click node_mainwindow "https://github.com/genivi/candevstudio/blob/master/src/gui/mainwindow.cpp"
click node_project "https://github.com/genivi/candevstudio/tree/master/src/gui/projectconfig"
click node_framework "https://github.com/genivi/candevstudio/tree/master/src/common"
click node_device "https://github.com/genivi/candevstudio/blob/master/src/components/candevice/candevice.cpp"
click node_rawview "https://github.com/genivi/candevstudio/blob/master/src/components/canrawview/canrawview_p.h"
click node_rawfilter "https://github.com/genivi/candevstudio/blob/master/src/components/canrawfilter/canrawfilter_p.cpp"
click node_rawlogger "https://github.com/genivi/candevstudio/blob/master/src/components/canrawlogger/canrawlogger_p.cpp"
click node_rawplayer "https://github.com/genivi/candevstudio/blob/master/src/components/canrawplayer/canrawplayer_p.cpp"
click node_rawsender "https://github.com/genivi/candevstudio/blob/master/src/components/canrawsender/canrawsender.h"
click node_newline "https://github.com/genivi/candevstudio/blob/master/src/components/canrawsender/newlinemanager.cpp"
click node_load "https://github.com/genivi/candevstudio/blob/master/src/components/canload/canload.cpp"
click node_signaldata "https://github.com/genivi/candevstudio/blob/master/src/components/cansignaldata/cansignaldata.cpp"
click node_decoder "https://github.com/genivi/candevstudio/blob/master/src/components/cansignaldecoder/cansignaldecoder_p.cpp"
click node_viewer "https://github.com/genivi/candevstudio/blob/master/src/components/cansignalviewer/cansignalviewer_p.cpp"
click node_encoder "https://github.com/genivi/candevstudio/blob/master/src/components/cansignalencoder/cansignalencoder_p.cpp"
click node_signalsender "https://github.com/genivi/candevstudio/blob/master/src/components/cansignalsender/cansignalsender_p.cpp"
click node_executor "https://github.com/genivi/candevstudio/blob/master/src/components/qmlexecutor/qmlexecutor.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_mainwindow,node_project toneBlue
class node_framework toneAmber
class node_device,node_rawview,node_rawfilter,node_rawlogger,node_rawplayer,node_rawsender,node_newline,node_load toneMint
class node_signaldata,node_decoder,node_viewer,node_encoder,node_signalsender toneRose
class node_executor,node_user,node_externalcan toneIndigo
```

## Components

### Application

- [Main Window](https://github.com/genivi/candevstudio/blob/master/src/gui/mainwindow.cpp): `src/gui/mainwindow.cpp`
- [Project Editor](https://github.com/genivi/candevstudio/tree/master/src/gui/projectconfig): `src/gui/projectconfig`

### Component Framework

- [Component Runtime](https://github.com/genivi/candevstudio/tree/master/src/common): `src/common`

### Raw CAN Tools

- [CAN Device](https://github.com/genivi/candevstudio/blob/master/src/components/candevice/candevice.cpp): `src/components/candevice/candevice.cpp`
- [Raw Viewer](https://github.com/genivi/candevstudio/blob/master/src/components/canrawview/canrawview_p.h): `src/components/canrawview/canrawview_p.h`
- [Raw Filter](https://github.com/genivi/candevstudio/blob/master/src/components/canrawfilter/canrawfilter_p.cpp): `src/components/canrawfilter/canrawfilter_p.cpp`
- [Raw Logger](https://github.com/genivi/candevstudio/blob/master/src/components/canrawlogger/canrawlogger_p.cpp): `src/components/canrawlogger/canrawlogger_p.cpp`
- [Raw Player](https://github.com/genivi/candevstudio/blob/master/src/components/canrawplayer/canrawplayer_p.cpp): `src/components/canrawplayer/canrawplayer_p.cpp`
- [Raw Sender](https://github.com/genivi/candevstudio/blob/master/src/components/canrawsender/canrawsender.h): `src/components/canrawsender/canrawsender.h`
- [Frame Controls](https://github.com/genivi/candevstudio/blob/master/src/components/canrawsender/newlinemanager.cpp): `src/components/canrawsender/newlinemanager.cpp`
- [Bus Load](https://github.com/genivi/candevstudio/blob/master/src/components/canload/canload.cpp): `src/components/canload/canload.cpp`

### Signal Tools

- [Signal Database](https://github.com/genivi/candevstudio/blob/master/src/components/cansignaldata/cansignaldata.cpp): `src/components/cansignaldata/cansignaldata.cpp`
- [Signal Decoder](https://github.com/genivi/candevstudio/blob/master/src/components/cansignaldecoder/cansignaldecoder_p.cpp): `src/components/cansignaldecoder/cansignaldecoder_p.cpp`
- [Signal Viewer](https://github.com/genivi/candevstudio/blob/master/src/components/cansignalviewer/cansignalviewer_p.cpp): `src/components/cansignalviewer/cansignalviewer_p.cpp`
- [Signal Encoder](https://github.com/genivi/candevstudio/blob/master/src/components/cansignalencoder/cansignalencoder_p.cpp): `src/components/cansignalencoder/cansignalencoder_p.cpp`
- [Signal Sender](https://github.com/genivi/candevstudio/blob/master/src/components/cansignalsender/cansignalsender_p.cpp): `src/components/cansignalsender/cansignalsender_p.cpp`

### Scripting

- [QML Executor](https://github.com/genivi/candevstudio/blob/master/src/components/qmlexecutor/qmlexecutor.cpp): `src/components/qmlexecutor/qmlexecutor.cpp`

### Other components

- **Engineer**
- **CAN Interface**

## Connections

- Engineer → Main Window: uses
- Main Window → Project Editor: opens editor (evidence: `src/gui/mainwindow.cpp`)
- Project Editor → Component Runtime: hosts components (evidence: `src/gui/projectconfig/pcimpl.h`)
- Project Editor → CAN Device: configures
- Project Editor → Raw Viewer: connects
- CAN Device → CAN Interface: accesses bus
- CAN Device → Raw Viewer: passes traffic
- CAN Device → Raw Filter: passes traffic
- Raw Filter → Raw Logger: filtered frames
- Raw Player → CAN Device: replays frames
- Raw Sender → Frame Controls: uses controls (evidence: `src/components/canrawsender/newlinemanager.cpp`)
- Raw Sender → CAN Device: sends frames
- Signal Database → Signal Decoder: supplies database
- Signal Decoder → Signal Viewer: decoded signals
- Signal Encoder → Signal Sender: encoded signals
- Signal Sender → CAN Device: sends signals
- QML Executor → CAN Device: controls bus
