Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
c0f4ab9
Kick Off Chipmunk as Native UI Application
AmmarAbouZor Oct 15, 2025
de5cad2
Specify internal crates in workspace only.
AmmarAbouZor Oct 15, 2025
30be236
Building Desktop App main parts
AmmarAbouZor Oct 15, 2025
c4e0c78
Simple implementation for Open File dialog.
AmmarAbouZor Oct 16, 2025
4edb9c0
Basic implementation for tabs & Open files as tabs
AmmarAbouZor Oct 16, 2025
34863cb
Architecture: Split app into two main modules
AmmarAbouZor Oct 17, 2025
ef8d4e8
Session UI & Wire up starting session and its events
AmmarAbouZor Oct 17, 2025
05274cc
Native UI: Wake up UI on each event.
AmmarAbouZor Oct 20, 2025
7d716c3
Native UI: Handle incoming events for all session
AmmarAbouZor Oct 20, 2025
31d8a9d
Native UI: Add notification support.
AmmarAbouZor Oct 20, 2025
7275596
Native UI: Close session & Improve Notifications
AmmarAbouZor Oct 21, 2025
0e05514
Native UI: Improve handing send errors
AmmarAbouZor Oct 21, 2025
08a2fb7
UI-Actions struct to handle UI components communication
AmmarAbouZor Oct 27, 2025
4ca96fc
Native UI: Refactoring ...
AmmarAbouZor Oct 27, 2025
0f4d61e
Native UI: use egui table to show logs (initial)
AmmarAbouZor Oct 27, 2025
07d67f4
Native UI: Solve tables sharing state across tabs
AmmarAbouZor Oct 27, 2025
80c0799
Integrating core session in native UI with text files (WIP)
AmmarAbouZor Oct 28, 2025
6d0aa91
Integrating core session in native UI with text files (WIP)
AmmarAbouZor Oct 29, 2025
52b923b
Integrating core session in native UI with text files (WIP)
AmmarAbouZor Oct 29, 2025
f642059
Display logs in native using sliding window approach
AmmarAbouZor Oct 30, 2025
dbf3514
Logs Viewer with map & Request UI discard on fetch
AmmarAbouZor Oct 30, 2025
fa40a4c
Solve clashing ID between tables (part 2)
AmmarAbouZor Oct 30, 2025
aa95d01
Add bottom panel to session with its UI components
AmmarAbouZor Oct 30, 2025
bb9a576
Build search input control
AmmarAbouZor Oct 31, 2025
243b298
Native UI: Commands for filter & Debug prints
AmmarAbouZor Nov 2, 2025
d3e8166
Wire filter callbacks & Display search status & Cancelling
AmmarAbouZor Nov 3, 2025
9174499
Tabs with close buttons & Close session properly
AmmarAbouZor Nov 3, 2025
2a1541b
Table for search results
AmmarAbouZor Nov 4, 2025
8827265
Offset for search results range & Fix layouts
AmmarAbouZor Nov 4, 2025
1e20547
Highlight filter matches in main logs view
AmmarAbouZor Nov 4, 2025
a5852ef
Tables: Improve requesting paint discard
AmmarAbouZor Nov 5, 2025
00c379a
Open file via CLI arguments
AmmarAbouZor Nov 6, 2025
fe36291
Change communication to fit grabbing into tables
AmmarAbouZor Nov 6, 2025
f3060ca
Select log with mouse & Scroll into it in both tables
AmmarAbouZor Nov 7, 2025
f732ab0
Details view & Avoid unnecessary log scrolling
AmmarAbouZor Nov 7, 2025
bd8a831
Activate winit default features explicitly
AmmarAbouZor Nov 10, 2025
88ad1df
Search: Fix requesting logs after dropping search.
AmmarAbouZor Nov 14, 2025
9ee57d7
Charts UI and commands & Refactoring
AmmarAbouZor Nov 16, 2025
26c694a
Chart: Jump on Click & Visual optimizations
AmmarAbouZor Nov 17, 2025
720300a
Charts: Detailed charts on zoom in & Reset
AmmarAbouZor Nov 18, 2025
1e57358
Refactor: Clone command senders instead of passing references.
AmmarAbouZor Nov 19, 2025
81e5459
Tables: Add some offset when scrolling into row
AmmarAbouZor Nov 19, 2025
c4e2974
Show an overlay on file dialog
AmmarAbouZor Nov 19, 2025
8b2cdc8
Native: Run UI thread outside of tokio runtime
AmmarAbouZor Nov 20, 2025
bd93b8a
Change communications to Command & Callback
AmmarAbouZor Nov 20, 2025
52fbdea
Native UI: Rework communications in sessions
AmmarAbouZor Nov 20, 2025
6c6c456
Native UI: Merge blocking and async commands
AmmarAbouZor Nov 21, 2025
3209145
Add signals to session UI fixing drop search handling
AmmarAbouZor Nov 21, 2025
f3aeb89
Reset charts view on dropping search & Cleanup
AmmarAbouZor Nov 21, 2025
bccf91f
Load Chart data on scroll & drag
AmmarAbouZor Nov 21, 2025
32cbfd8
Charts: Use last requested range for reset & Fix offset
AmmarAbouZor Dec 1, 2025
2c16ca6
Merge Host & App + Group Common + Refactoring
AmmarAbouZor Dec 2, 2025
218a9c6
Charts: Throttle data requests on UI input
AmmarAbouZor Dec 2, 2025
5990e18
Change host tabs management & Session Setup Module
AmmarAbouZor Dec 3, 2025
35bbf1a
General Session Setup view + Basic DLT implementation
AmmarAbouZor Dec 5, 2025
89dec9e
Remove Debug Printing
AmmarAbouZor Dec 5, 2025
ea11cef
Timeout for logs Receivers + Retry for Senders
AmmarAbouZor Dec 8, 2025
8bfc036
Log schema for built-in data formats & Integrations
AmmarAbouZor Dec 9, 2025
353c47f
Search Log: Fix highlight selected log
AmmarAbouZor Dec 11, 2025
dea19eb
Update charts with search count & Status bar
AmmarAbouZor Dec 11, 2025
816bba5
Add native-ui for dlt-options
kruss Dec 8, 2025
421475a
DLT configs improvements & Extend file dialog
AmmarAbouZor Dec 12, 2025
cb2e957
Refactor: Move UI configuration types to UI modules
AmmarAbouZor Dec 15, 2025
a691cc8
File dialog improvements & Use it for DLT fibex
AmmarAbouZor Dec 15, 2025
a9fcba6
Support for SomeIP files in session setup
AmmarAbouZor Dec 15, 2025
a4feeaf
Session Setup for Streams & Icons & Refactoring
AmmarAbouZor Dec 17, 2025
ab349c1
Use phosphor for UI icons
AmmarAbouZor Dec 19, 2025
f0a3e25
Native UI: Suppress unused warning + Add TODO
AmmarAbouZor Dec 19, 2025
7b591ac
TCP session setup & Validation errors
AmmarAbouZor Dec 20, 2025
e14ff19
Update egui-table version & Improve row handling
AmmarAbouZor Jan 7, 2026
05d6b65
Improve space allocation
AmmarAbouZor Jan 7, 2026
08b1f52
Session Setup for UDP & Improve space allocation
AmmarAbouZor Jan 8, 2026
e5a0e16
Session Setup for Serial Ports
AmmarAbouZor Jan 9, 2026
b847fca
Native UI: Cross-platform method to get file size
AmmarAbouZor Jan 14, 2026
89d1937
Session UI: Side panel with tab control
AmmarAbouZor Jan 12, 2026
5f0eb49
Native UI: Keep track on running observe operations.
AmmarAbouZor Jan 14, 2026
b1df964
Show busy indicator while session is initialized
AmmarAbouZor Jan 14, 2026
7cd7391
Native: Extend CLI arguments
AmmarAbouZor Jan 14, 2026
7a95223
Native: Theme toggle menu
AmmarAbouZor Jan 14, 2026
d2362dc
Native UI: Observe operations in status bar
AmmarAbouZor Jan 15, 2026
428b060
Native: Extend process session setup validation
AmmarAbouZor Jan 15, 2026
12d89da
Improve closing sessions & Close in busy indicator
AmmarAbouZor Jan 15, 2026
a831b15
Native: Move handling search operation to UI
AmmarAbouZor Jan 16, 2026
e5e9a4b
Native: Multiple File Setup & File Concatenation
AmmarAbouZor Jan 26, 2026
945fc05
Add unit tests for general utilities
AmmarAbouZor Jan 17, 2026
910964e
Native UI: Improve Graceful Shutdown
AmmarAbouZor Jan 29, 2026
cd8fca2
Add DLT statistics native-ui with chart
kruss Feb 4, 2026
e9f4ee9
Add DLT-Statistics host-command for native-ui
kruss Feb 5, 2026
552a4d7
Native: Box large enum variants HostMessage
AmmarAbouZor Feb 10, 2026
3e2f71d
Native UI: Set Label to not selectable by default
AmmarAbouZor Feb 10, 2026
36da565
Native: Session Observe view + Files view
AmmarAbouZor Jan 23, 2026
ae4cee5
Native: Attach sources to running session & Cleanup
AmmarAbouZor Feb 12, 2026
923d746
Session observe tab: Refactor & Add process
AmmarAbouZor Feb 13, 2026
a6df8b8
Session observe tab: Add TCP connection
AmmarAbouZor Feb 13, 2026
e987e42
Session observe: Add UDP connection & Refactoring
AmmarAbouZor Feb 13, 2026
63db682
Session Observe: Extend actions via context menu
AmmarAbouZor Feb 16, 2026
0832103
Native: Distinct multiple sources in logs table
AmmarAbouZor Feb 18, 2026
7d18e79
Refactoring: Unify logs map for all tables
AmmarAbouZor Feb 18, 2026
ad9e3e8
Refactoring: Reuse shared code in tables
AmmarAbouZor Feb 19, 2026
bb1d7a2
Native: Enable Stick-to-bottom for logs table
AmmarAbouZor Feb 20, 2026
51cf38f
wip: native home-screen
kruss Feb 25, 2026
2b55c26
wip: native home-screen
kruss Mar 4, 2026
b4f928a
wip: native home-screen
kruss Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion application/apps/indexer/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
**/*.rs.bk
**/proptest-regressions
*.out
lineMetadata.json
vim-markdown-preview.html
.DS_Store
Cargo.lock
*.json
72 changes: 67 additions & 5 deletions application/apps/indexer/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
# TODO AAZ:
# * Resolve all TODOs in this file before final merge.
# * Resolve all [allow(unused)] in gui/.. Crates.

[workspace]
resolver = "3"

members = [
"gui/application",
"addons/dlt-tools",
"addons/someip-tools",
"addons/shell-tools",
Expand All @@ -18,7 +23,31 @@ members = [
"stypes"
]

[workspace.package]
edition = "2024"
version = "4.0.0"
authors = ["esrlabs.com"]

[workspace.dependencies]

# Internal crates
application = { path = "gui/application" }
dlt-tools = { path = "addons/dlt-tools"}
someip-tools = { path = "addons/someip-tools"}
file-tools = { path = "addons/file-tools"}
shell-tools = { path = "addons/shell-tools"}
text_grep = { path = "addons/text_grep"}
bufread = { path = "addons/bufread"}
indexer_base = { path = "indexer_base"}
merging = { path = "merging"}
parsers = { path = "parsers"}
plugins_host = { path = "plugins_host"}
processor = { path = "processor"}
session = { path = "session"}
sources = { path = "sources"}
stypes = { path = "stypes"}

# External dependencies
log = "0.4"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
Expand All @@ -43,29 +72,62 @@ anyhow = "1.0"
toml = "0.8"
blake3 = "1.8"
which = "8"
itertools = "0.14"
chrono = "0.4"
chrono-tz = "0.8"
serialport = "4.8"

clap = { version = "4", features = ["derive"] }

egui = "0.33"
eframe = { version = "0.33", default-features = false }
rfd = "0.17"
egui_extras = { version = "0.33", default-features = false }
egui_table = "0.7"
egui_plot = "0.34"
# We don't have direct dependency to winit but we need to specify it here to activate
# its default features which won't be activated otherwise without activating egui default
# features.
# TODO: This can be removed once egui default features are activated.
winit = { version = "0.30"}
egui-phosphor = "0.11"


## Development Dependencies ##
# Support for `html_reports` needs running the benchmarks via `cargo-criterion` tool.
criterion = { version = "0.5", features = ["html_reports"] }
insta = { version = "1.41", features = ["yaml"] }
proptest = "1.6"

[patch.crates-io]
# This is needed until corresponding PR is merged. Link: https://github.com/rerun-io/egui_table/pull/47
egui_table = { git = "https://github.com/AmmarAbouZor/egui_table.git", rev = "348d5fa8b44f6070fd7f311211a93ebc44473851" }

[workspace.lints.clippy]
undocumented_unsafe_blocks = "deny"

# Optimize all dependencies even in debug builds (does not affect workspace packages):
# This makes initial clean build slower, but doesn't affect tests.
# TODO: Decide if upgrading all packages compared to egui ones only.
# [profile.dev.package."*"]
# opt-level = 2

# `insta` crate and its dependency `similar` will be compiled once and run many times,
# therefore it's suggested to compile them with more optimizations for faster runs.
[profile.dev.package]
insta.opt-level = 3
similar.opt-level = 3
# NOTE: For now I'm keeping the optimizations for egui only.
egui.opt-level = 2
eframe.opt-level = 2

[profile.test.package]
# Proptest and its random number generator can be CPU intensive, therefore setting their optimizations level
# to max will have significant performance improvement for the tests.
[profile.test.package.proptest]
opt-level = 3

[profile.test.package.rand_chacha]
opt-level = 3
proptest.opt-level = 3
rand_chacha.opt-level = 3
insta.opt-level = 3
similar.opt-level = 3

# only uncomment when profiling
# [profile.release]
Expand Down
4 changes: 2 additions & 2 deletions application/apps/indexer/addons/bufread/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "bufread"
version = "0.1.1"
edition = "2024"
version.workspace = true
edition.workspace = true

[lints]
workspace = true
Expand Down
12 changes: 6 additions & 6 deletions application/apps/indexer/addons/dlt-tools/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
[package]
name = "dlt-tools"
version = "0.1.0"
edition = "2024"
version.workspace = true
edition.workspace = true

[lints]
workspace = true

[dependencies]
dlt-core.workspace = true
indexer_base = { path = "../../indexer_base" }
indexer_base.workspace = true
log.workspace = true
parsers = { path = "../../parsers" }
sources = { path = "../../sources" }
processor = { path = "../../processor"}
parsers.workspace = true
sources.workspace = true
processor.workspace = true
tokio = { workspace = true , features = ["full"] }
tokio-util = { workspace = true, features = ["codec", "net"] }

Expand Down
4 changes: 2 additions & 2 deletions application/apps/indexer/addons/file-tools/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "file-tools"
version = "0.1.0"
edition = "2024"
version.workspace = true
edition.workspace = true

[lints]
workspace = true
Expand Down
7 changes: 3 additions & 4 deletions application/apps/indexer/addons/file-tools/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
use anyhow::Result;
use std::{
fs::{File, metadata},
io::Read,
io::{Read, Result},
path::Path,
str::from_utf8,
};

const BYTES_TO_READ: u64 = 10240;

pub fn is_binary(file_path: String) -> Result<bool> {
let buffer = fetch_starting_chunk(Path::new(&file_path))?;
pub fn is_binary(file_path: impl AsRef<Path>) -> Result<bool> {
let buffer = fetch_starting_chunk(file_path.as_ref())?;
Ok(from_utf8(&buffer).map_or(true, |_file_content| false))
}

Expand Down
4 changes: 2 additions & 2 deletions application/apps/indexer/addons/someip-tools/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "someip-tools"
version = "0.1.0"
edition = "2024"
version.workspace = true
edition.workspace = true

[lints]
workspace = true
Expand Down
6 changes: 3 additions & 3 deletions application/apps/indexer/addons/text_grep/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "text_grep"
version = "0.1.0"
edition = "2024"
version.workspace = true
edition.workspace = true

[lib]
name = "text_grep"
Expand All @@ -14,7 +14,7 @@ workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
tokio = { workspace = true, features = ["full"] }
bufread = { path = "../bufread" }
bufread.workspace = true
tokio-util.workspace = true
grep-searcher.workspace = true
grep-regex.workspace = true
Expand Down
68 changes: 68 additions & 0 deletions application/apps/indexer/gui/application/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
[package]
name = "application"
authors.workspace = true
description = "Chipmunk is one of the fastest desktop applications for viewing log files, with no limitations on data size."
version.workspace = true
edition.workspace = true

default-run = "chipmunk" # Start this on `cargo run` in this workspace.

[[bin]]
name = "chipmunk"
path = "src/main.rs"


[dependencies]
# *** Internal ***
stypes = { workspace = true, features=["rustcore"] }
merging.workspace = true
processor.workspace = true
sources.workspace = true
file-tools.workspace = true
shell-tools.workspace = true
parsers.workspace = true
#TODO: We need to avoid clashing with module `session` in Workaround to avoid potential merge conflict
session_core = { package = "session", path = "../../session" }

# *** External ***
anyhow.workspace = true
thiserror.workspace = true
clap.workspace = true
serde.workspace = true
serde_json.workspace = true
log.workspace = true
tokio.workspace = true
rfd.workspace = true
uuid = { workspace = true, features = ["v4"] }
itertools.workspace = true
chrono.workspace = true
chrono-tz.workspace = true
dirs.workspace = true
serialport.workspace = true
dlt-core.workspace = true
blake3.workspace = true
rustc-hash = "2.1"

#TODO: Replace env logger with log4rs
env_logger.workspace = true

winit.workspace = true
egui.workspace = true
# TODO: Check which dependency is needed in the final version.
# Enabling the default features provides the system title bar on ubuntu 22.04
eframe = { workspace = true, default_features = false, features = [
# "accesskit", # Make egui compatible with screen readers. NOTE: adds a lot of dependencies.
"default_fonts", # Embed the default egui fonts.
"glow", # Use the glow rendering backend. Alternative: "wgpu".
"persistence", # Enable restoring app state when restarting the app.
"wayland", # To support Linux (and CI)
"x11", # To support older Linux distributions (restores one of the default features)
] }

egui_extras.workspace = true
egui_table.workspace = true
egui_plot.workspace = true
egui-phosphor = { workspace = true, features = ["regular", "fill"] }

[lints]
workspace = true
13 changes: 13 additions & 0 deletions application/apps/indexer/gui/application/src/cli/command.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use std::path::PathBuf;

/// Represents commands from CLI to be executed after app is started.
#[derive(Debug, Clone)]
pub enum CliCommand {
OpenFiles {
paths: Vec<PathBuf>,
},
ProcessCommand {
command: String,
cwd: Option<PathBuf>,
},
}
72 changes: 72 additions & 0 deletions application/apps/indexer/gui/application/src/cli/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
use std::path::PathBuf;

mod command;

use clap::{Subcommand, ValueHint};
pub use command::CliCommand;

const HELP_TEMPLATE: &str = "\
{before-help}{about}
version: {version}

{usage-heading} {usage}

{all-args}{after-help}
";

#[derive(Debug, clap::Parser)]
#[clap(name = "chipmunk", version, about, help_template = HELP_TEMPLATE)]
pub struct Cli {
#[command(subcommand)]
pub source: Option<SourcesCommand>,
}

#[derive(Debug, Clone, Subcommand)]
pub enum SourcesCommand {
/// Open file(s) in new session(s).
Files {
/// Paths to the source files.
#[arg(index = 1, name = "PATHS", required = true, value_hint = ValueHint::FilePath)]
paths: Vec<PathBuf>,
},
/// Execute shell command in new session.
#[clap(visible_alias = "command")]
Process {
#[arg(index = 1, name = "COMMAND", required = true, value_hint = ValueHint::DirPath)]
/// Command to run.
command: String,
#[arg(long)]
/// Current working directory
cwd: Option<PathBuf>,
},
}

impl Cli {
pub fn get_commands(mut self) -> Vec<CliCommand> {
let mut cli_cmds = Vec::new();

if let Some(source) = self.source.take() {
let cmd = match source {
SourcesCommand::Files { paths } => CliCommand::OpenFiles { paths },
SourcesCommand::Process { command, cwd } => {
CliCommand::ProcessCommand { command, cwd }
}
};
cli_cmds.push(cmd);
}

cli_cmds
}
}

#[cfg(test)]
mod tests {
use super::*;

/// Ensure the CLI configurations are valid.
#[test]
fn verify_cli() {
use clap::CommandFactory;
Cli::command().debug_assert();
}
}
Loading