use brlapi::{Connection, Result, raw::RawMode};
fn main() -> Result<()> {
println!("BrlAPI Raw Mode Demonstration");
println!("============================");
println!("WARNING: Raw mode can damage devices if misused!");
println!("This demo uses safe, non-destructive operations only.\n");
println!("1. Connecting to BrlAPI and checking device...");
let connection = match Connection::open() {
Ok(conn) => {
println!(" [SUCCESS] Connected to BrlAPI successfully");
conn
}
Err(e) => {
println!(" [ERROR] Failed to connect: {}", e);
println!(" Make sure BRLTTY is running with a braille device");
return Err(e);
}
};
let driver = connection.display_driver()?;
let (width, height) = connection.display_size()?;
println!(" Device: {} driver, {}x{} cells", driver, width, height);
println!("\n2. Checking raw mode support...");
if !RawMode::is_driver_supported(&driver) {
println!(" [ERROR] Driver '{}' does not support raw mode", driver);
println!(" Raw mode requires hardware drivers like alva, baum, hims, etc.");
println!(" Dummy/virtual drivers typically don't support raw mode.");
return Ok(());
}
println!(" [SUCCESS] Driver '{}' supports raw mode", driver);
println!("\n3. Entering raw mode (this may fail if device doesn't support it)...");
let raw_mode = match RawMode::enter(&connection, &driver) {
Ok(raw_mode) => {
println!(" [SUCCESS] Entered raw mode successfully");
raw_mode
}
Err(e) => {
println!(" [ERROR] Failed to enter raw mode: {}", e);
println!(" This is normal for virtual/testing devices");
println!(" Real hardware may support raw mode");
return Ok(());
}
};
println!("\n4. Demonstrating safe raw mode operations...");
println!(" Sending safe test data...");
let test_data = b"\x00\x01\x02"; match raw_mode.send_data(test_data) {
Ok(bytes_sent) => {
println!(" [SUCCESS] Sent {} bytes: {:?}", bytes_sent, test_data);
}
Err(e) => {
println!(" WARNING: Send failed (this is normal): {}", e);
}
}
println!(" Note: receive_data() blocks indefinitely - skipping for safety");
println!(" In real applications, implement external timeout handling as needed");
println!("\n5. Raw mode session information...");
println!(" Driver: {}", raw_mode.driver_name());
println!(" Connection: active");
println!("\n6. Exiting raw mode...");
drop(raw_mode); println!(" [SUCCESS] Raw mode exited automatically (RAII cleanup)");
println!("\n7. Safety Summary");
println!(" ================");
println!(" [SUCCESS] Always check driver support before entering raw mode");
println!(" [SUCCESS] Use timeouts for receive operations");
println!(" [SUCCESS] Let RAII handle cleanup automatically");
println!(" [SUCCESS] Test with safe, non-destructive commands first");
println!(" WARNING: Real firmware updates require device-specific protocols");
println!(" WARNING: Always have recovery procedures ready");
println!(" WARNING: Consider using development/backup devices for testing");
println!("\n[SUCCESS] Raw mode demonstration completed safely!");
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_raw_mode_demo_structure() {
assert!(true);
println!("[SUCCESS] Raw mode demo structure test passed");
}
}