fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
piper_sdk::init_logger!();
println!("🎯 Piper Frame Dump Example\n");
#[cfg(feature = "serde")]
{
use piper_sdk::can::PiperFrame;
use serde_json;
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Write};
let frames = vec![
PiperFrame::new_standard(0x1A1, &[0x01, 0x02, 0x03, 0x04]),
PiperFrame::new_standard(0x2A1, &[0x05, 0x06, 0x07, 0x08]),
PiperFrame::new_extended(0x12345678, &[0xFF, 0xFF, 0xFF, 0xFF]),
];
println!("📝 Original frames:");
for (i, frame) in frames.iter().enumerate() {
println!(
" Frame {}: ID=0x{:03X}, len={}, data={:?}",
i,
frame.id,
frame.len,
&frame.data[..frame.len as usize]
);
}
println!("\n🔄 Serializing to JSON...");
let json = serde_json::to_string_pretty(&frames)?;
println!("{}", json);
println!("\n🔄 Deserializing from JSON...");
let deserialized: Vec<PiperFrame> = serde_json::from_str(&json)?;
println!("✅ Deserialized {} frames", deserialized.len());
assert_eq!(frames.len(), deserialized.len());
let output_path = "/tmp/can_frames.json";
let file = File::create(output_path)?;
let mut writer = BufWriter::new(file);
for frame in frames.iter() {
let json = serde_json::to_string(frame)?;
writeln!(writer, "{}", json)?;
}
println!("✅ Saved {} frames to {}", frames.len(), output_path);
let file = File::open(output_path)?;
let reader = BufReader::new(file);
let loaded_count = reader.lines().count();
println!("✅ Loaded {} frames from {}", loaded_count, output_path);
}
#[cfg(not(feature = "serde"))]
{
println!("⚠️ Serde feature not enabled.");
println!(" Run with:");
println!(" cargo run -p piper-sdk --example frame_dump --features serde");
println!("\n✅ Frame serde support includes:");
println!(" - PiperFrame (protocol layer)");
println!(" - GsUsbFrame (GS-USB layer)");
println!(" - All type units (Rad, Deg, etc.)");
println!(" - JointArray and CartesianPose");
}
Ok(())
}