{"id":50175520,"url":"https://github.com/c7ex/stormtrack-oscilloscope","last_synced_at":"2026-06-01T00:01:21.903Z","repository":{"id":354528235,"uuid":"1224008272","full_name":"c7ex/StormTrack-Oscilloscope","owner":"c7ex","description":"C++ real-time oscilloscope / time series plotting library for Windows using pure WinAPI \u0026 GDI. Supports static and streaming data, zoom/pan, auto X‑scaling, data tracking, and adaptive grid. Multithreaded, no dependencies.","archived":false,"fork":false,"pushed_at":"2026-05-25T01:52:19.000Z","size":6918,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-25T03:08:18.150Z","etag":null,"topics":["console-app","cpp","engineering","gdi","high-performance","real-time","streaming","timeseries","visual-studio","visualization","winapi","windows","zero-dependencies"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/c7ex.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-28T21:48:08.000Z","updated_at":"2026-05-25T01:52:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/c7ex/StormTrack-Oscilloscope","commit_stats":null,"previous_names":["c7ex/stormtrack","c7ex/stormtrack-oscilloscope"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/c7ex/StormTrack-Oscilloscope","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c7ex%2FStormTrack-Oscilloscope","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c7ex%2FStormTrack-Oscilloscope/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c7ex%2FStormTrack-Oscilloscope/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c7ex%2FStormTrack-Oscilloscope/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/c7ex","download_url":"https://codeload.github.com/c7ex/StormTrack-Oscilloscope/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/c7ex%2FStormTrack-Oscilloscope/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33753925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["console-app","cpp","engineering","gdi","high-performance","real-time","streaming","timeseries","visual-studio","visualization","winapi","windows","zero-dependencies"],"created_at":"2026-05-25T03:05:31.859Z","updated_at":"2026-06-01T00:01:21.890Z","avatar_url":"https://github.com/c7ex.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# StormTrack\n\n**Read this in other languages:** [Русский](README.ru.md)\n\n**StormTrack** — is a C++ WinAPI library for real-time time series visualization on Windows using GDI. Its main purpose is to speed up R\u0026D projects that need visualization in Visual Studio. The library works as a software oscilloscope: it can plot both static and streaming data. The rendering window runs in a separate thread, keeping the console responsive. Great performance even with a million data points.\n\n![Interface example](screen/Demo.gif) \n\n## Key Features\n\n- **Multiple plots** in a single window.\n- **Streaming updates** — data is continuously loaded in real time.\n- **Static data** — medium-sized datasets (1M+).\n- **Zoom** via mouse wheel (both XY or X-only with Shift held); zooming relative to cursor position.\n- **Pan** (dragging) with left mouse button within the plot area.\n- **Auto-fit on X** — the `A` hotkey toggles automatic adjustment of the visible area to match all active traces.\n- **FPS display** — the `F` hotkey toggles the rendering performance overlay on/off.\n- **Legend** — a list of traces with show/hide toggles (click the colored square).\n- **Data tracking** — hovering over the plot highlights the nearest point and displays its coordinates.\n- **Adaptive grid** with numeric labels.\n- **Resizable plot area** — plot boundaries can be dragged.\n- **Multithreading** — the window runs in its own thread without blocking the main console thread.\n\n## Build Instructions\n\n### Method 1 — Ready-to-use SDK (recommended)\n1. Get the SDK. If a prebuilt SDK (.zip) is available in [Releases](https://github.com/c7ex/StormTrack-Oscilloscope/releases), download and extract it.\n   Otherwise, open the solution and build the `StormTrack` project in Release configuration —\n   `StormTrack.lib` and the `StormTrackHeaders` folder will appear in `bin/x64/Release`.\n2. Copy the `StormTrackHeaders` folder and `StormTrack.lib` into your project.\n3. In your Visual Studio project settings:\n   - **C/C++ → General → Additional Include Directories** – add the path to the `StormTrackHeaders` folder.\n   - **Linker → Input → Additional Dependencies** – add `StormTrack.lib`.\n   - **Linker → General → Additional Library Directories** – specify the folder containing `StormTrack.lib`.\n4. Include the header: `#include \"StormTrack.hpp\"`.\n\n**Note:** the `Demo` project includes a usage example.\n\n### Method 2 — Adding source files directly to your project\n1. Create a console application in Visual Studio.\n2. Add all source folders to your project: `GraphCore/`, `GraphModules/`, `RaiiWinApi/`, `StormTrack/`. Make sure to include all paths to `.hpp` and `.cpp` files.\n3. Build in Debug/Release.\n\n**Note:** if you encounter error C1010, disable precompiled headers in your project settings.\n\n\u003e **Compiler toolset compatibility**  \n\u003e  \n\u003e The prebuilt `StormTrack.lib` in the SDK is compiled with **Platform Toolset v143** (Visual Studio 2022).  \n\u003e If your project uses a newer toolset (e.g. **v145** from Visual Studio 2026 Preview), you may encounter linker errors (`LNK2038` or similar) due to ABI mismatches.  \n\u003e  \n\u003e **To resolve this:**  \n\u003e - **Option 1 (recommended):** Switch your project’s Platform Toolset to **v143** (or any version between v140 and v143). This ensures binary compatibility without rebuilding the SDK.  \n\u003e - **Option 2:** Rebuild `StormTrack.lib` yourself using your exact toolset. Download the source code, open the solution, change the project’s Platform Toolset to your version (e.g. v145), and build in Debug/Release configuration.\n\nYour console application will then be ready to use the visualization.\n\n## Quick Start\n\n### Static Plot\n\n```cpp\n#include \"StormTrack.hpp\"\n\nstd::vector\u003cdouble\u003e data = // ...\n\nHINSTANCE hInstance = GetModuleHandle(nullptr);\nStormTrack window(hInstance, L\"[Example] static data\");\nwindow.JustView(data, L\"Data\", RGB(255, 120, 120));\nwindow.Show();\n\n// ...\n\nwindow.Close();\nwindow.WaitForClose();\n```\n\n### Frame Streaming\n\nFull data replacement every frame. The vector is moved — becomes empty after call.\n\n```cpp\n#include \"StormTrack.hpp\"\n\nHINSTANCE hInstance = GetModuleHandle(nullptr);\nStormTrack window(hInstance, L\"[Example] frame streaming\");\nwindow.Show();\n\nsize_t traceId = window.AddTrace(L\"Data\", RGB(255, 120, 120));\n\nfor (;;) {\n    std::vector\u003cdouble\u003e data = // ...\n    window.FrameView(data, traceId); // data is moved, becomes empty\n}\n\nwindow.Close();\nwindow.WaitForClose();\n```\n\n### Real-Time Accumulation\n\nAppends data to the end of trace. The original vector is preserved.\n\n```cpp\n#include \"StormTrack.hpp\"\n\nHINSTANCE hInstance = GetModuleHandle(nullptr);\nStormTrack window(hInstance, L\"[Example] real-time data\");\nwindow.Show();\n\nsize_t traceId = window.AddTrace(L\"Data\", RGB(255, 120, 120));\n\nfor (;;) {\n    std::vector\u003cdouble\u003e chunk = // ...\n    window.RealtimeView(chunk, traceId); // chunk is copied, stays intact\n}\n\nwindow.Close();\nwindow.WaitForClose();\n```\n\n## API Reference\n\n| Method | Description | Data ownership |\n|--------|-------------|----------------|\n| `JustView(data, name, color, step, offset)` | Load static plot once | Copies |\n| `AddTrace(name, color, step, offset)` | Create trace, returns ID | — |\n| `FrameView(data, traceId)` | Full frame replace | Moves |\n| `RealtimeView(data, traceId)` | Append data to trace end | Copies |\n| `Show()` | Open window in background thread | — |\n| `Close()` | Send close signal to window | — |\n| `WaitForClose()` | Block until window thread exits | — |\n| `IsActive()` | Check if window is still open | — |\n\n## Controls\n\n| Action | Control |\n|--------|---------|\n| Zoom | Mouse wheel. Default — both X and Y. With `Shift` held — X only. With `Ctrl` held — fast zoom. Zoom is centered on cursor position. |\n| Pan | Hold left mouse button over the plot area and drag. |\n| Auto-fit X | `A` key (toggles on/off). When enabled, the visible area automatically adjusts to cover the full X range of all active traces. |\n| FPS display | The `F` key (toggles on/off). When enabled, displays the number of rendered frames per second. |\n| Legend (show/hide trace) | Click the colored square in the right panel. The trace is temporarily hidden or shown again. |\n| Coordinate tracking | Hover over the plot — the nearest data point is highlighted, and a tooltip with its coordinates appears near the cursor. |\n| Plot area resize | Move the cursor to the edge of the dark border (a double-sided arrow will appear) and drag the boundary. Expands or collapses the legend panel. |\n\n## Requirements\n- Windows XP or later\n- A C++11-compatible compiler (Visual Studio 2015+, MinGW-w64 with GCC 5+)\n- No external libraries: only standard `kernel32`, `user32`, `gdi32`\n\n## License\nMIT License. See the `LICENSE` file in the repository root.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc7ex%2Fstormtrack-oscilloscope","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fc7ex%2Fstormtrack-oscilloscope","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fc7ex%2Fstormtrack-oscilloscope/lists"}