pub mod server;
pub mod source;
pub mod translate;
pub use server::TraceServer;
pub use source::Source;
pub use translate::{TraceEvent, Translator, VarType, VariableMap};
pub const DEFAULT_WS_PORT: u16 = 7878;
pub struct TraceOptions {
pub ws_addr: String,
pub source: Source,
pub openocd: Option<(String, u16, u32, u32)>,
pub variables: VariableMap,
}
pub fn run_blocking(opts: TraceOptions) -> std::io::Result<()> {
let runtime = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()?;
runtime.block_on(async move {
let server = TraceServer::new(opts.variables);
let (addr, _accept) = server.serve_ws(&opts.ws_addr).await?;
eprintln!("nucleus trace: streaming events on ws://{addr}");
if let Some((telnet, port, cpu, swo)) = &opts.openocd {
if let Err(err) = source::openocd_enable(telnet, *port, *cpu, *swo).await {
eprintln!("nucleus trace: warning: OpenOCD setup failed ({err}); continuing");
}
}
let reader = opts.source.open().await?;
eprintln!("nucleus trace: reading SWO from source…");
server.run_source(reader).await?;
eprintln!("nucleus trace: source ended");
Ok(())
})
}