use obniz_rust::*;
use std::time::Duration;
use tokio::time::sleep;
#[tokio::main]
async fn main() -> ObnizResult<()> {
let device_id = "1234-5678";
println!("=== Obniz Rust Comprehensive Example ===");
let obniz = connect_async(device_id).await?;
println!("✓ Connected to obniz device: {}", obniz.id());
println!("\n--- System Information ---");
let system = obniz.system();
match system.info().await {
Ok(info) => {
println!("Hardware: {}", info.hardware);
println!("Firmware: {}", info.version);
}
Err(e) => println!("Could not get system info: {e}"),
}
system.reset_on_disconnect(true).await?;
println!("✓ Configured auto-reset on disconnect");
println!("\n--- Display Operations ---");
let display = obniz.display();
display.clear().await?;
display.text("Obniz Rust Demo").await?;
println!("✓ Displayed welcome message");
sleep(Duration::from_secs(2)).await;
display.clear().await?;
display.rect(10, 10, 40, 20, false, true).await?;
display.circle(80, 30, 10, true, true).await?;
display.line(0, 0, 127, 63, true).await?;
println!("✓ Drew geometric shapes");
sleep(Duration::from_secs(2)).await;
println!("\n--- IO Operations ---");
let io = obniz.io();
io.set_pin_as_output(0, true).await?;
println!("✓ Set pin 0 high");
sleep(Duration::from_millis(500)).await;
io.set_pin(0, false).await?;
println!("✓ Set pin 0 low");
io.set_pin_as_input(1, false).await?;
let pin1_state = io.get_pin(1).await?;
println!("✓ Pin 1 state: {pin1_state}");
println!("\n--- AD (Analog) Operations ---");
let ad = obniz.ad();
let voltage = ad.get_voltage(0).await?;
println!(
"✓ AD0 voltage: {:.2}V ({}%)",
voltage,
AdManager::voltage_to_percentage(voltage)
);
let voltages = ad.get_voltages(vec![0, 1, 2]).await?;
for reading in voltages {
println!(" AD{}: {:.2}V", reading.channel, reading.voltage);
}
println!("\n--- PWM Operations ---");
let pwm = obniz.pwm();
pwm.square_wave(0, 2, 1000).await?;
println!("✓ Started 1kHz square wave on pin 2 (PWM0)");
sleep(Duration::from_secs(1)).await;
pwm.servo(1, 3, 90.0).await?; println!("✓ Set servo to 90 degrees on pin 3 (PWM1)");
sleep(Duration::from_secs(1)).await;
pwm.set_channel_duty_cycle(0, 2000, 25.0).await?; println!("✓ Set 25% duty cycle at 2kHz on PWM0");
println!("\n--- UART Operations ---");
let uart = obniz.uart();
let uart_config = UartManager::simple_config(4, 5, 9600);
uart.init_channel(0, uart_config).await?;
println!("✓ Initialized UART0 (RX: pin4, TX: pin5, 9600 baud)");
uart.send_string(0, "Hello from Rust!").await?;
println!("✓ Sent 'Hello from Rust!' via UART");
println!("\n--- Switch Operations ---");
let switch = obniz.switch();
let switch_state = switch.get_state().await?;
println!("✓ Switch state: {switch_state}");
switch
.on_push(|| {
println!("Switch pushed!");
})
.await?;
switch
.on_left(|| {
println!("Switch moved left!");
})
.await?;
switch
.on_right(|| {
println!("Switch moved right!");
})
.await?;
println!("✓ Switch callbacks configured");
println!("\n--- Combined Demo: LED Breathing Effect ---");
display.clear().await?;
display.text("LED Breathing").await?;
pwm.configure_channel(
2,
PwmConfig {
io_pin: 6,
frequency: 1000,
pulse_width_ms: 0.0,
},
)
.await?;
println!("✓ Starting LED breathing effect on pin 6...");
for cycle in 0..3 {
for i in 0..=100 {
let duty = i as f64;
pwm.set_channel_duty_cycle(2, 1000, duty).await?;
sleep(Duration::from_millis(20)).await;
}
for i in (0..=100).rev() {
let duty = i as f64;
pwm.set_channel_duty_cycle(2, 1000, duty).await?;
sleep(Duration::from_millis(20)).await;
}
println!(" Breathing cycle {} completed", cycle + 1);
}
println!("\n--- Sensor Reading Simulation ---");
display.clear().await?;
display.text("Sensor Monitor").await?;
for i in 1..=5 {
let sensor_readings = ad.read_all().await?;
println!("Reading {i}: ");
for reading in sensor_readings.iter().take(4) {
let percentage = AdManager::voltage_to_percentage(reading.voltage);
println!(
" Sensor AD{}: {:.2}V ({:.1}%)",
reading.channel, reading.voltage, percentage
);
}
if let Some(first_reading) = sensor_readings.first() {
let percentage = AdManager::voltage_to_percentage(first_reading.voltage);
display.clear().await?;
display.text(&format!("Sensor: {percentage:.1}%")).await?;
}
sleep(Duration::from_secs(1)).await;
}
println!("\n--- Cleanup ---");
pwm.deinit_all().await?;
println!("✓ Stopped all PWM channels");
switch.remove_callback()?;
uart.remove_channel_callback(0)?;
println!("✓ Removed callbacks");
display.clear().await?;
display.text("Demo Complete!").await?;
display.brightness(100).await?;
sleep(Duration::from_secs(2)).await;
display
.qr(
"https://github.com/your-username/obniz-rust",
QrCorrectionType::Medium,
)
.await?;
println!("\n=== Demo Completed Successfully! ===");
println!("Check your obniz device for the final QR code.");
Ok(())
}