Commit Graph

5 Commits

Author SHA1 Message Date
David Montero eb6a59adf6 style(ui): unify every interactive surface on the single #0071e3 accent
Sweep all off-brand blues (#007acc logo-blue, #0e639c, #3b82f6) and the neon
cyan family (#4fc3f7, #00b8d4, #00e5ff, rgba 0,184,212 / 0,122,204) across the
editor, simulator, examples gallery and pages to var(--color-action-primary).
The Code/Both/Circuit toggle, board chips, library manager, modals etc. now
match the Libraries / +Add buttons. Also keep the editor Libraries label
visible in the default split (lower the container-query threshold).
2026-06-21 05:34:25 +02:00
David Montero aab380e80b feat(scope/trigger): add Auto / Normal / Single-shot trigger modes
Real digital storage scopes have a trigger that pins the visible window
around a detected edge — without it, sparse activity (UART bytes once
per loop, an interrupt firing every few seconds) scrolls off the screen
faster than the eye can catch.  Velxio's scope was free-running only,
which made the recent UART TX waveform work effectively invisible at
fine time/div settings: the byte burst was 87 µs but the window only
showed the most recent 1 ms.

Three trigger modes, matching what you'd find on a Rigol / Tektronix:

  * Auto    — current free-running behaviour, window's right edge
              tracks the most recent sample.  Default.
  * Normal  — window pins around each triggering edge so the event
              lands at `triggerPosition * windowMs` from the left
              (default centred at 0.5).  Keeps re-pinning on every
              new triggering edge.
  * Single  — arms once, freezes the trace on the first triggering
              edge by flipping `running = false`.  User clicks
              "Re-arm" to capture again.

Three knobs configurable per mode:
  - source: which channel produces the trigger event
  - edge:   rising (↑) / falling (↓) / either (⇅)
  - position: trigger lands at this fraction of the window
              (UI hard-codes centre 0.5 for now; the store field
              accepts any value if we want a draggable handle later)

UI additions in the scope header (only shown when mode != auto):
  - source / edge dropdowns
  - status badge (Armed / Triggered / Captured) with pulse animation
    on Armed so the user knows the scope is waiting for an event
  - Re-arm button in Single mode after capture

Canvas changes:
  - Dashed orange "T" marker drawn at the trigger position when an
    edge is latched and within the visible window.

Store changes:
  - pushSample peeks at the trigger channel's previous state, detects
    a matching edge, sets triggeredAtMs (and stops `running` for
    Single mode).  matchesTriggerEdge() exported for unit testing.
  - clearSamples / setTriggerMode / setTriggerChannel / setTriggerEdge
    all re-arm the trigger; rearmTrigger() explicitly resets and resumes
    capture (used by the Re-arm button after a single-shot).

Covered by 11 new vitest cases (oscilloscope-trigger.test.ts) plus the
existing 1892 tests still pass.

Closes the "I set 0.1 ms/div on a Serial.print sketch and see a flat
line" UX trap reported on the Discord follow-up — at 0.1 ms/div the
window is 1 ms but bytes fire every 2 s, so without a trigger the
chance of catching the burst is < 0.05 %.  With Normal trigger on
rising D1 the burst pins in the middle of the window and the user can
zoom down to bit level (8.68 µs each) without losing it.
2026-05-22 21:11:03 +02:00
David Montero Crespo 212ecd1bcb refactor: rename components and update prefixes to 'velxio-' for consistency
- Modified the index file to reflect the new naming convention for Velxio components.
- Changed JSX declarations to use 'velxio-' prefix for various components.
- Updated component overrides to replace 'wokwi-' with 'velxio-' for logic gates and other components.
- Adjusted SVG generation script to use 'velxio-' prefix for BMP280 and Raspberry Pi components.
- Marked submodules as dirty in QEMU and RP2040 libraries.
- Added .prettierignore and .prettierrc.json for consistent code formatting.
- Introduced InstrumentComponent with support for Voltmeter and Ammeter, including pin information handling.
2026-04-21 16:45:45 -03:00
David Montero Crespo 5e6c5d451b feat: enhance oscilloscope dropdown and multi-board picker styles 2026-03-16 10:30:51 -03:00
copilot-swe-agent[bot] ad0656b1cc feat: add built-in oscilloscope / logic analyzer panel
- Add useOscilloscopeStore with ring-buffer sample storage and channel management
- Add onPinChangeWithTime callback to AVRSimulator (fires on every bit transition with cycle-derived timestamp)
- Add onPinChangeWithTime callback to RP2040Simulator (fires on GPIO state change)
- Wire oscilloscope callbacks in useSimulatorStore (initSimulator + setBoardType)
- Create Oscilloscope React component with canvas-based waveform rendering
- Add oscilloscope panel to EditorPage (resizable bottom panel, same as SerialMonitor)
- Add 'Scope' toggle button to SimulatorCanvas toolbar

Co-authored-by: davidmonterocrespo24 <47928504+davidmonterocrespo24@users.noreply.github.com>
2026-03-11 15:09:24 +00:00