Software for live hardware

From live signals to real control.

Acquire telemetry, command hardware, and automate test sequences in one connected workspace.

Connect. Operate. Understand.

01 / Channel Searcher

Find the signal. See its state.

Search live channels and inspect values, units, freshness, and command authority in one place. Browse by module, task, or hardware configuration to adjust device settings and channel mappings.

Explore Channel Search
Search and inspect live channels
Browse channels by module and task
View channels by hardware configuration
02 / Operate

Put live hardware in view.

Bring channels, plots, and interactive schematics together. Inspect live values and issue commands with the system in context.

Explore schematics
03 / Automate

Put your logic to work.

Sequences, sensor calculations, events, and reusable controls—written in DCode.

Explore DCode

Fill the run tank from supply, wait two seconds for ignition, then open the engine feed valves. Each stage checks the abort before commanding outputs.

  • Measured fill target
  • Two-second ignition
  • Abort and recovery
Open the example walkthroughs →
test_sequence.dcode DCode68 lines
task_timeline rocket_test 20:
    clock:
        start: T-2m

    at T-2m (setup):
        hold_at: next_bucket
        execute:
            test_name = promptString(
                "Engine test recording",
                "Name the data frame for this engine test.",
                [],
                "Enter a test name.",
                0,
                0
            )
            test_data_frame = startDataFrame(test_name, [
                "rocket_sim_run_fill", "rocket_sim_run_fill_target", "rocket_sim_run_tank_pressure",
                "rocket_sim_fill_position", "rocket_sim_vent_position", "rocket_sim_phase",
                "rocket_sim_temperature_voted", "rocket_sim_pressure", "rocket_sim_flow"
            ])

    at T-1m (tank_fill):
        hold_at: next_bucket
        execute:
            wait_until(|rocket_sim_sensor_valid| == 1 and |rocket_sim_abort_active| == 0, 0, 15)
            |rocket_sim_phase| = 1
            |engine_tank_fill_complete| = 0
            command |engine_tank_fill_running| = 1
            command |engine_tank_fill_target_state| = 1
            wait_until(|engine_tank_fill_complete| == 1, 0)
            command |engine_tank_fill_target_state| = 0
            wait_until(|engine_tank_fill_current_state| == 0, 0)
            free |engine_tank_fill_target_state|
            free |engine_tank_fill_running|

    at T+0s (ignition):
        hold_at: next_bucket
        execute:
            wait_until(|engine_tank_fill_complete| == 1, 0)
            wait_until(|rocket_sim_sensor_valid| == 1 and |rocket_sim_abort_active| == 0, 0, 15)
            |rocket_sim_phase| = 2
            |engine_ignition_complete| = 0
            command |engine_ignition_running| = 1
            wait_until(|engine_ignition_complete| == 1, 0, 60)
            |rocket_sim_phase| = 0
            log("Engine test", "Test fire complete")

    at T+15s (cleanup):
        execute:
            stopDataFrame(test_data_frame)
            test_data_frame = nil
            log("Engine test", "Recording saved")

    abort:
        if test_data_frame:
            stopDataFrame(test_data_frame)
            test_data_frame = nil
        command |engine_tank_fill_target_state| = 0
        command |engine_ignition_running| = 0
        |rocket_sim_phase| = 0

    stop:
        if test_data_frame:
            stopDataFrame(test_data_frame)
            test_data_frame = nil
        command |engine_tank_fill_target_state| = 0
        command |engine_ignition_running| = 0
        |rocket_sim_phase| = 0
04 / Events

See what needs your attention.

Review warnings, errors, and operator prompts in the ARGUS events board. Open an event to understand its source, related channels, and available actions before responding.

Explore ARGUS Events
05 / Review

Know what happened after the run.

Save each test as a named DataFrame, keeping selected channel recordings, events, and logs together over the run's time range. Reopen a test to plot its signals, understand what happened, and export the data for analysis.

Review and export data
Live and historical plots
Recorded test: signals, events, and logs

Built to be extended

Your hardware. Your interface.

Write native device drivers in C++ or extend the interface with new tools. Plugins let you build into DARTWIC, from the engine backend to the operator's workspace.

Explore plugin development

C++ / Engine plugins

Native drivers. Inside the engine.

Your C++ plugin runs natively in the engine backend and talks directly to your device or its SDK. No separate client, network bridge, or extra network hop between your driver and the engine—just your device's own connection.

  • Direct device access
  • Native runtime logic
  • Channels, tasks & commands
Build an engine plugin

React / Interface plugins

Make the interface your own.

Add new functionality directly to the DARTWIC interface: custom resource pages, task editors, settings panels, and schematic nodes. Build the tools your operators need into their existing workspace.

  • Custom views & controls
  • Task & module editors
  • Schematic nodes
Build an interface plugin

Names and marks identify the respective technologies; no endorsement is implied.

In use

From hardware to operator control.

Discover devices, configure channels and tasks, use channels directly in DCode, and build an operator interface around them.

01 / Device discovery
02 / Channel & task setup
03 / Use channels in automation
04 / Build an operator interface

Remote nodes

One system. Across nodes.

Connect DARTWIC nodes to share channels and events across your system. See how your interface, engine, and remote nodes connect in the Network Map.

Explore the Network Map
Node usage, traffic, and operations

Node to node

Connect TEMPEST peers.

Link DARTWIC engines and bring remote telemetry and ARGUS events into your operator workspace. Keep the originating node in context as you work across the system.

Connect remote nodes

Your system, connected

Bridge beyond DARTWIC.

Write a custom TEMPEST Peer transport to exchange channels and events with a separate system—like a flight computer. Map its protocol into DARTWIC and back, exposing the data and actions your integration supports.

Explore the flight example

Beyond the interface

Your tools. Connected.

Plugins bring hardware into the engine. Clients bring the engine into your tools—whether that's a Python script for analysis or a React dashboard built for your team.

PythonScripts & analysis

Work with data your way.

Find channels, query recorded ranges, and call engine operations from your own scripts. Spend your time on the analysis, not rebuilding the connection.

  • Dataframe & channel search
  • Bounded history queries
  • Runtime compatibility checks
Connect and find channels
find_channels.py Python6 lines
from dartwic_client import DartwicClient

client = DartwicClient()
client.connect(ip="127.0.0.1", port=7000)
keys = client.get_channel_keys(query="rpm")
client.disconnect()
ReactDashboards & applications

Build your own view.

Bring live telemetry and engine operations into a custom React app. Use a provider and hooks to build the views and controls your workflow needs.

  • Live channel state
  • Stale-data awareness
  • Subscriptions restored on reconnect
Provider and hook · integration sketch
Dashboard.jsx JSX7 lines
// Wrap your app
<DartwicProvider>
  <YourDashboard />
</DartwicProvider>

// Inside YourDashboard
const { channels, connect } = useDartwic();

Start building

Your next step.

Try a first session, connect your own hardware, or build a custom integration.

Recent updates

DARTWIC 2.1.0

DARTWIC 2.1 brings together the changes made since DARTWIC 2.0: a simpler way to build connected applications, shared configuration editors, improvements to DCode and channel ownership, and a lot of smaller fixes across the Interface.

_attachments/Pasted image 20261019214534

DARTWIC 2.0.0

DARTWIC 2.0 expands the platform from a single-node acquisition and control workspace into a system for distributed operation, more capable automation, and recorded evidence of what happened.