[{"data":1,"prerenderedAt":100},["ShallowReactive",2],{"docs-nav":3,"doc:development":56},[4,12,30,42,50],{"title":5,"items":6},"Getting Started",[7,10],{"path":8,"title":9},"\u002Fdocs\u002Finstallation","Installation",{"path":11,"title":5},"\u002Fdocs\u002Fgetting-started",{"title":13,"items":14},"User Documentation",[15,18,21,24,27],{"path":16,"title":17},"\u002Fdocs\u002Fuser-guide","User Guide",{"path":19,"title":20},"\u002Fdocs\u002Fsupported-ecu-formats","Supported ECU Formats",{"path":22,"title":23},"\u002Fdocs\u002Funit-conversion","Unit Conversion",{"path":25,"title":26},"\u002Fdocs\u002Ffield-normalization","Field Normalization",{"path":28,"title":29},"\u002Fdocs\u002Ftuning-table-generators","Tuning Table Generators",{"title":31,"items":32},"Support",[33,36,39],{"path":34,"title":35},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":37,"title":38},"\u002Fdocs\u002Ffaq","Frequently Asked Questions",{"path":40,"title":41},"\u002Fdocs\u002Fprivacy","Privacy & Analytics",{"title":43,"items":44},"Development",[45,47],{"path":46,"title":43},"\u002Fdocs\u002Fdevelopment",{"path":48,"title":49},"\u002Fdocs\u002Fcontributing","Contributing",{"title":51,"items":52},"Legal",[53],{"path":54,"title":55},"\u002Fdocs\u002Flegal","Legal Notices",{"slug":57,"name":43,"title":43,"html":58,"toc":59,"editUrl":98,"sourceUrl":99},"development","\u003Cp>This guide covers setting up a development environment, building from source, and contributing to UltraLog.\u003C\u002Fp>\n\u003Ch2 id=\"table-of-contents\">Table of Contents\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"#development-setup\">Development Setup\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#building\">Building\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#project-structure\">Project Structure\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#architecture-overview\">Architecture Overview\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#adding-new-ecu-support\">Adding New ECU Support\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#code-style\">Code Style\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#testing\">Testing\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#cicd\">CI\u002FCD\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"#contributing\">Contributing\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"development-setup\">Development Setup\u003C\u002Fh2>\n\u003Ch3 id=\"prerequisites\">Prerequisites\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Rust\u003C\u002Fstrong> - Latest stable version\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Git\u003C\u002Fstrong> - For version control\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Platform build tools\u003C\u002Fstrong> - See below\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"install-rust\">Install Rust\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl --proto &#39;=https&#39; --tlsv1.2 -sSf https:\u002F\u002Fsh.rustup.rs | sh\nsource $HOME\u002F.cargo\u002Fenv\n\n# Verify installation\nrustc --version\ncargo --version\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"platform-specific-dependencies\">Platform-Specific Dependencies\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Linux (Ubuntu\u002FDebian):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo apt-get update\nsudo apt-get install -y \\\n    build-essential \\\n    libxcb-render0-dev \\\n    libxcb-shape0-dev \\\n    libxcb-xfixes0-dev \\\n    libxkbcommon-dev \\\n    libssl-dev \\\n    libgtk-3-dev \\\n    libglib2.0-dev \\\n    libatk1.0-dev \\\n    libcairo2-dev \\\n    libpango1.0-dev \\\n    libgdk-pixbuf2.0-dev\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Linux (Fedora):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo dnf install -y \\\n    gcc \\\n    libxcb-devel \\\n    libxkbcommon-devel \\\n    openssl-devel \\\n    gtk3-devel \\\n    glib2-devel \\\n    atk-devel \\\n    cairo-devel \\\n    pango-devel \\\n    gdk-pixbuf2-devel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>macOS:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">xcode-select --install\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Windows:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Col>\n\u003Cli>Install \u003Ca href=\"https:\u002F\u002Fvisualstudio.microsoft.com\u002Fvisual-cpp-build-tools\u002F\" rel=\"noopener\">Visual Studio Build Tools\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>Select &quot;Desktop development with C++&quot;\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"clone-the-repository\">Clone the Repository\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">git clone https:\u002F\u002Fgithub.com\u002FSomethingNew71\u002FUltraLog.git\ncd UltraLog\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"building\">Building\u003C\u002Fh2>\n\u003Ch3 id=\"development-build\">Development Build\u003C\u002Fh3>\n\u003Cp>Faster compile time, slower runtime, includes debug symbols:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo build\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"release-build\">Release Build\u003C\u002Fh3>\n\u003Cp>Slower compile time, optimized runtime:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo build --release\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"run-the-application\">Run the Application\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Debug mode\ncargo run\n\n# Release mode\ncargo run --release\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"run-the-parser-test-utility\">Run the Parser Test Utility\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo run --bin test_parser -- path\u002Fto\u002Flogfile.csv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"project-structure\">Project Structure\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>UltraLog\u002F\n├── src\u002F\n│   ├── main.rs              # Application entry point\n│   ├── lib.rs               # Library module exports\n│   ├── app.rs               # Main UltraLogApp struct (934 lines)\n│   │                        # - Application state management\n│   │                        # - File loading pipeline\n│   │                        # - eframe::App implementation\n│   ├── state.rs             # Core data types (206 lines)\n│   │                        # - LoadedFile, SelectedChannel\n│   │                        # - Color palettes\n│   │                        # - Loading states\n│   ├── units.rs             # Unit conversion system (278 lines)\n│   ├── normalize.rs         # Field name normalization (500 lines)\n│   ├── parsers\u002F\n│   │   ├── mod.rs           # Parser module exports\n│   │   ├── types.rs         # Core parser traits &amp; enums\n│   │   │                    # - Log, Channel, Value, Meta\n│   │   │                    # - Parseable trait\n│   │   │                    # - EcuType enumeration\n│   │   ├── haltech.rs       # Haltech CSV parser (547 lines)\n│   │   ├── ecumaster.rs     # ECUMaster CSV parser (366 lines)\n│   │   └── speeduino.rs     # Speeduino MLG parser (542 lines)\n│   ├── ui\u002F\n│   │   ├── mod.rs           # UI module exports\n│   │   ├── sidebar.rs       # File list &amp; view options\n│   │   ├── channels.rs      # Channel selection panel\n│   │   ├── chart.rs         # Main chart &amp; LTTB algorithm\n│   │   ├── timeline.rs      # Playback controls\n│   │   ├── menu.rs          # Menu bar &amp; units UI\n│   │   ├── tab_bar.rs       # Chrome-style tabs\n│   │   ├── toast.rs         # Notification system\n│   │   ├── icons.rs         # Icon drawing utilities\n│   │   ├── export.rs        # PNG\u002FPDF export\n│   │   ├── normalization_editor.rs  # Custom field mapping UI\n│   │   ├── scatter_plot.rs  # XY scatter visualization\n│   │   └── tool_switcher.rs # Tool selection UI\n│   └── bin\u002F\n│       └── test_parser.rs   # CLI parser testing utility\n├── assets\u002F\n│   ├── icons\u002F               # Platform-specific app icons\n│   ├── Outfit-Regular.ttf   # Custom font\n│   └── Outfit-Bold.ttf      # Custom font (bold)\n├── exampleLogs\u002F             # Test data\n├── .github\u002F\n│   └── workflows\u002F\n│       ├── ci.yml           # CI pipeline\n│       └── release.yml      # Release automation\n├── build.rs                 # Windows icon embedding\n├── Cargo.toml               # Project manifest\n└── README.md                # Documentation\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"lines-of-code\">Lines of Code\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Core app:\u003C\u002Fstrong> 934 lines\u003C\u002Fli>\n\u003Cli>\u003Cstrong>UI modules:\u003C\u002Fstrong> ~3,148 lines\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Parsers:\u003C\u002Fstrong> ~1,667 lines\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supporting:\u003C\u002Fstrong> ~1,108 lines\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Total:\u003C\u002Fstrong> ~6,857 lines\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"architecture-overview\">Architecture Overview\u003C\u002Fh2>\n\u003Ch3 id=\"data-flow\">Data Flow\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>┌─────────────┐    ┌──────────────┐    ┌─────────────┐\n│  Log File   │───►│    Parser    │───►│  Log Struct │\n└─────────────┘    └──────────────┘    └─────────────┘\n                                              │\n                                              ▼\n┌─────────────┐    ┌──────────────┐    ┌─────────────┐\n│   Display   │◄───│  LTTB Down-  │◄───│  Selected   │\n│   (egui)    │    │   sample     │    │  Channels   │\n└─────────────┘    └──────────────┘    └─────────────┘\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"key-components\">Key Components\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>UltraLogApp\u003C\u002Fstrong> (\u003Ccode>app.rs\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Main application state\u003C\u002Fli>\n\u003Cli>Implements \u003Ccode>eframe::App\u003C\u002Fcode> trait\u003C\u002Fli>\n\u003Cli>Manages file loading, tabs, playback\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Parsers\u003C\u002Fstrong> (\u003Ccode>parsers\u002F\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Each ECU format has its own parser\u003C\u002Fli>\n\u003Cli>All implement the \u003Ccode>Parseable\u003C\u002Fcode> trait\u003C\u002Fli>\n\u003Cli>Convert ECU-specific data to common \u003Ccode>Log\u003C\u002Fcode> struct\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>UI Modules\u003C\u002Fstrong> (\u003Ccode>ui\u002F\u003C\u002Fcode>)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Each UI section is a separate module\u003C\u002Fli>\n\u003Cli>Uses egui&#39;s immediate mode paradigm\u003C\u002Fli>\n\u003Cli>Renders from application state each frame\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"state-management\">State Management\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">pub struct UltraLogApp {\n    \u002F\u002F Files and tabs\n    files: Vec&lt;LoadedFile&gt;,\n    tabs: Vec&lt;Tab&gt;,\n    active_tab: Option&lt;usize&gt;,\n\n    \u002F\u002F Playback\n    cursor_time: Option&lt;f64&gt;,\n    is_playing: bool,\n    playback_speed: f64,\n\n    \u002F\u002F Settings\n    unit_preferences: UnitPreferences,\n    color_blind_mode: bool,\n    field_normalization: bool,\n\n    \u002F\u002F UI state\n    loading_state: LoadingState,\n    downsample_cache: HashMap&lt;...&gt;,\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"adding-new-ecu-support\">Adding New ECU Support\u003C\u002Fh2>\n\u003Ch3 id=\"step-1-add-ecu-type\">Step 1: Add ECU Type\u003C\u002Fh3>\n\u003Cp>In \u003Ccode>src\u002Fparsers\u002Ftypes.rs\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">#[derive(Debug, Clone, PartialEq)]\npub enum EcuType {\n    Haltech,\n    EcuMaster,\n    Speeduino,\n    NewEcu,  \u002F\u002F Add your ECU type\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"step-2-create-parser-module\">Step 2: Create Parser Module\u003C\u002Fh3>\n\u003Cp>Create \u003Ccode>src\u002Fparsers\u002Fnewecu.rs\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">use super::types::{Channel, Log, Meta, Parseable, Value};\nuse anyhow::Result;\n\npub struct NewEcuParser;\n\nimpl Parseable for NewEcuParser {\n    fn parse(&amp;self, data: &amp;str) -&gt; Result&lt;Log&gt; {\n        \u002F\u002F Parse your ECU format here\n\n        let channels = vec![\n            Channel {\n                name: &quot;RPM&quot;.to_string(),\n                unit: Some(&quot;rpm&quot;.to_string()),\n                ..Default::default()\n            },\n            \u002F\u002F ... more channels\n        ];\n\n        let data = vec![\n            vec![Value::Float(3500.0), \u002F* ... *\u002F],\n            \u002F\u002F ... more records\n        ];\n\n        let times = vec![&quot;0.000&quot;.to_string(), \u002F* ... *\u002F];\n\n        Ok(Log {\n            meta: Meta::default(),\n            channels,\n            times,\n            data,\n        })\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"step-3-register-parser\">Step 3: Register Parser\u003C\u002Fh3>\n\u003Cp>In \u003Ccode>src\u002Fparsers\u002Fmod.rs\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">pub mod newecu;\npub use newecu::NewEcuParser;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"step-4-add-format-detection\">Step 4: Add Format Detection\u003C\u002Fh3>\n\u003Cp>In \u003Ccode>src\u002Fapp.rs\u003C\u002Fcode>, add detection logic in the file loading function:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">fn detect_format(content: &amp;str) -&gt; Option&lt;EcuType&gt; {\n    if content.starts_with(&quot;NewECU Header&quot;) {\n        return Some(EcuType::NewEcu);\n    }\n    \u002F\u002F ... existing detection\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"step-5-add-to-format-handler\">Step 5: Add to Format Handler\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-rust\">match ecu_type {\n    EcuType::NewEcu =&gt; NewEcuParser.parse(&amp;content),\n    \u002F\u002F ... existing handlers\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"step-6-add-field-normalizations\">Step 6: Add Field Normalizations\u003C\u002Fh3>\n\u003Cp>In \u003Ccode>src\u002Fnormalize.rs\u003C\u002Fcode>, add mappings for your ECU&#39;s channel names:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-rust\">(&quot;newecu_rpm&quot;, &quot;Engine RPM&quot;),\n(&quot;newecu_map&quot;, &quot;Manifold Pressure&quot;),\n\u002F\u002F ... more mappings\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"code-style\">Code Style\u003C\u002Fh2>\n\u003Ch3 id=\"formatting\">Formatting\u003C\u002Fh3>\n\u003Cp>Use rustfmt for consistent formatting:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo fmt\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"linting\">Linting\u003C\u002Fh3>\n\u003Cp>Use clippy with warnings as errors:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo clippy -- -D warnings\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"naming-conventions\">Naming Conventions\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>render_*\u003C\u002Fcode> - UI rendering methods\u003C\u002Fli>\n\u003Cli>\u003Ccode>start_*\u003C\u002Fcode> - Async operations\u003C\u002Fli>\n\u003Cli>\u003Ccode>get_*\u002Fset_*\u003C\u002Fcode> - Accessors\u003C\u002Fli>\n\u003Cli>\u003Ccode>SCREAMING_SNAKE_CASE\u003C\u002Fcode> - Constants\u003C\u002Fli>\n\u003Cli>\u003Ccode>PascalCase\u003C\u002Fcode> - Types and traits\u003C\u002Fli>\n\u003Cli>\u003Ccode>snake_case\u003C\u002Fcode> - Functions and variables\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"error-handling\">Error Handling\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Use \u003Ccode>anyhow\u003C\u002Fcode> for parser errors\u003C\u002Fli>\n\u003Cli>Use \u003Ccode>thiserror\u003C\u002Fcode> for custom error types\u003C\u002Fli>\n\u003Cli>Show user-friendly errors via toast notifications\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"testing\">Testing\u003C\u002Fh2>\n\u003Ch3 id=\"run-tests\">Run Tests\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo test\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"test-parser\">Test Parser\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">cargo run --bin test_parser -- path\u002Fto\u002Flogfile.csv\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"example-log-files\">Example Log Files\u003C\u002Fh3>\n\u003Cp>The \u003Ccode>exampleLogs\u002F\u003C\u002Fcode> directory contains sample files:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>haltech\u002F\u003C\u002Fcode> - Haltech CSV samples\u003C\u002Fli>\n\u003Cli>\u003Ccode>ecumaster\u002F\u003C\u002Fcode> - ECUMaster CSV samples\u003C\u002Fli>\n\u003Cli>\u003Ccode>speeduino\u002F\u003C\u002Fcode> - Speeduino MLG samples\u003C\u002Fli>\n\u003Cli>\u003Ccode>rusefi\u002F\u003C\u002Fcode> - rusEFI MLG samples\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"cicd\">CI\u002FCD\u003C\u002Fh2>\n\u003Ch3 id=\"ci-pipeline-ciyml\">CI Pipeline (ci.yml)\u003C\u002Fh3>\n\u003Cp>Runs on every push and pull request:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Check\u003C\u002Fstrong> - Compile check on all platforms\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Test\u003C\u002Fstrong> - Run test suite\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Clippy\u003C\u002Fstrong> - Lint for issues\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Format\u003C\u002Fstrong> - Verify code formatting\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"release-pipeline-releaseyml\">Release Pipeline (release.yml)\u003C\u002Fh3>\n\u003Cp>Triggered by version tags (\u003Ccode>v*\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Build\u003C\u002Fstrong> - Create binaries for all platforms\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Release\u003C\u002Fstrong> - Create GitHub release with binaries\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"creating-a-release\">Creating a Release\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Update version in Cargo.toml\n# Commit changes\ngit add .\ngit commit -m &quot;Release v1.0.0&quot;\n\n# Create and push tag\ngit tag v1.0.0\ngit push origin v1.0.0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2 id=\"contributing\">Contributing\u003C\u002Fh2>\n\u003Ch3 id=\"how-to-contribute\">How to Contribute\u003C\u002Fh3>\n\u003Col>\n\u003Cli>\u003Cstrong>Fork\u003C\u002Fstrong> the repository\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Create\u003C\u002Fstrong> a feature branch\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Make\u003C\u002Fstrong> your changes\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Test\u003C\u002Fstrong> thoroughly\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Submit\u003C\u002Fstrong> a pull request\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 id=\"pull-request-guidelines\">Pull Request Guidelines\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Keep PRs focused on a single change\u003C\u002Fli>\n\u003Cli>Update documentation if needed\u003C\u002Fli>\n\u003Cli>Add tests for new functionality\u003C\u002Fli>\n\u003Cli>Ensure CI passes\u003C\u002Fli>\n\u003Cli>Write clear commit messages\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"commit-message-format\">Commit Message Format\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>type: short description\n\nLonger description if needed.\n\nFixes #123\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Types:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>feat\u003C\u002Fcode> - New feature\u003C\u002Fli>\n\u003Cli>\u003Ccode>fix\u003C\u002Fcode> - Bug fix\u003C\u002Fli>\n\u003Cli>\u003Ccode>docs\u003C\u002Fcode> - Documentation\u003C\u002Fli>\n\u003Cli>\u003Ccode>refactor\u003C\u002Fcode> - Code refactoring\u003C\u002Fli>\n\u003Cli>\u003Ccode>test\u003C\u002Fcode> - Tests\u003C\u002Fli>\n\u003Cli>\u003Ccode>chore\u003C\u002Fcode> - Maintenance\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"areas-for-contribution\">Areas for Contribution\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>New ECU formats\u003C\u002Fstrong> - Add support for more ECUs\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Features\u003C\u002Fstrong> - Implement roadmap items\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Bug fixes\u003C\u002Fstrong> - Fix reported issues\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Documentation\u003C\u002Fstrong> - Improve wiki and comments\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Performance\u003C\u002Fstrong> - Optimize parsing or rendering\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Accessibility\u003C\u002Fstrong> - Improve accessibility features\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"roadmap\">Roadmap\u003C\u002Fh2>\n\u003Ch3 id=\"planned-features\">Planned Features\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cinput checked=\"\" disabled=\"\" type=\"checkbox\"> MegaSquirt format support\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> AEM format support\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> MaxxECU format support\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> MoTeC format support\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Link ECU format support\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Data export to CSV\u002FExcel\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Advanced statistical analysis\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Data filtering and smoothing\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Custom formula channels\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Persistent settings storage\u003C\u002Fli>\n\u003Cli>\u003Cinput disabled=\"\" type=\"checkbox\"> Multi-log comparison tools\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"feature-requests\">Feature Requests\u003C\u002Fh3>\n\u003Cp>Open an issue on GitHub to request features.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2 id=\"resources\">Resources\u003C\u002Fh2>\n\u003Ch3 id=\"dependencies-documentation\">Dependencies Documentation\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fegui\" rel=\"noopener\">egui\u003C\u002Fa> - GUI framework\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Feframe\" rel=\"noopener\">eframe\u003C\u002Fa> - egui framework\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fegui_plot\" rel=\"noopener\">egui_plot\u003C\u002Fa> - Plotting\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fserde\" rel=\"noopener\">serde\u003C\u002Fa> - Serialization\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fanyhow\" rel=\"noopener\">anyhow\u003C\u002Fa> - Error handling\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"related-links\">Related Links\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSomethingNew71\u002FUltraLog\" rel=\"noopener\">GitHub Repository\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSomethingNew71\u002FUltraLog\u002Fissues\" rel=\"noopener\">GitHub Issues\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FSomethingNew71\u002FUltraLog\u002Freleases\" rel=\"noopener\">Releases\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Chr>\n\u003Ch2 id=\"next-steps\">Next Steps\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fgetting-started\">Getting Started\u003C\u002Fa> - User introduction\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Fsupported-ecu-formats\">Supported ECU Formats\u003C\u002Fa> - Current ECU support\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fdocs\u002Ftroubleshooting\">Troubleshooting\u003C\u002Fa> - Common issues\u003C\u002Fli>\n\u003C\u002Ful>\n",[60,63,66,69,72,75,78,81,84,87,89,92,95],{"id":61,"text":62},"table-of-contents","Table of Contents",{"id":64,"text":65},"development-setup","Development Setup",{"id":67,"text":68},"building","Building",{"id":70,"text":71},"project-structure","Project Structure",{"id":73,"text":74},"architecture-overview","Architecture Overview",{"id":76,"text":77},"adding-new-ecu-support","Adding New ECU Support",{"id":79,"text":80},"code-style","Code Style",{"id":82,"text":83},"testing","Testing",{"id":85,"text":86},"cicd","CI\u002FCD",{"id":88,"text":49},"contributing",{"id":90,"text":91},"roadmap","Roadmap",{"id":93,"text":94},"resources","Resources",{"id":96,"text":97},"next-steps","Next Steps","https:\u002F\u002Fgithub.com\u002FClassicMiniDIY\u002FUltraLog\u002Fwiki\u002FDevelopment\u002F_edit","https:\u002F\u002Fgithub.com\u002FClassicMiniDIY\u002FUltraLog\u002Fwiki\u002FDevelopment",1792894560931]