| Crates.io | pitwall-tauri |
| lib.rs | pitwall-tauri |
| version | 0.1.0 |
| created_at | 2025-10-31 21:43:48.595697+00 |
| updated_at | 2025-10-31 21:43:48.595697+00 |
| description | Tauri integration for Pitwall telemetry library |
| homepage | https://werace.au/opensource/pitwall |
| repository | |
| max_upload_size | |
| id | 1910864 |
| size | 139,398 |
Tauri integration for Pitwall - stream iRacing telemetry to TypeScript frontends with compile-time type safety.
to_channel) handles all streaming# src-tauri/Cargo.toml
[dependencies]
pitwall = { version = "0.1", features = ["derive"] }
pitwall-tauri = "0.1"
tauri = "2"
tauri-specta = { version = "2.0.0-rc", features = ["typescript"] }
specta = { version = "2.0.0-rc", features = ["derive"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["full"] }
use pitwall::PitwallFrame;
use serde::{Serialize, Deserialize};
use specta::Type;
#[derive(Debug, Clone, Serialize, Deserialize, Type, PitwallFrame)]
pub struct MyTelemetry {
#[pitwall(name = "Speed")]
pub speed: f32,
#[pitwall(name = "RPM")]
pub rpm: f32,
}
use tauri::ipc::Channel;
use pitwall_tauri::{Pitwall, SessionInfo, to_channel};
#[tauri::command]
#[specta::specta]
pub async fn start_telemetry(
telemetry: Channel<MyTelemetry>,
session: Channel<SessionInfo>,
) -> Result<(), String> {
let conn = Pitwall::connect().await.map_err(|e| e.to_string())?;
// Stream telemetry frames (60Hz)
tokio::spawn(to_channel(
conn.subscribe::<MyTelemetry>(UpdateRate::Native),
telemetry
));
// Stream session updates
tokio::spawn(to_channel(
conn.session_updates(),
session
));
Ok(())
}
// src-tauri/src/main.rs
#[cfg(debug_assertions)]
{
tauri_specta::ts::export(
specta::collect_types![start_telemetry],
"../src/bindings.ts"
).expect("Failed to export bindings");
}
import { invoke, Channel } from '@tauri-apps/api/core';
import type { MyTelemetry, SessionInfo } from './bindings';
const telemetryChannel = new Channel<MyTelemetry>();
telemetryChannel.onmessage = (data) => {
console.log(`Speed: ${data.speed}, RPM: ${data.rpm}`);
};
const sessionChannel = new Channel<SessionInfo>();
sessionChannel.onmessage = (info) => {
console.log(`Track: ${info.weekend_info.track_display_name}`);
};
await invoke('start_telemetry', {
telemetry: telemetryChannel,
session: sessionChannel,
});
Licensed under the MIT License.