use ri::device::{RiDeviceControlModule, RiDeviceControlConfig, RiDevice, RiDeviceType, RiDeviceStatus, RiDeviceCapabilities, RiResourcePoolStatus};
use ri::core::RiResult;
fn main() -> RiResult<()> {
println!("=== Ri Device Management Module Example ===\n");
let rt = tokio::runtime::Runtime::new().unwrap();
rt.block_on(async {
let config = RiDeviceControlConfig::new()
.with_scan_interval_secs(60)
.with_max_concurrent_operations(10)
.with_connection_timeout_secs(30)
.build();
println!("1. Creating device control module...");
let device_module = RiDeviceControlModule::new(config).await?;
println!(" Device control module initialized\n");
println!("2. Registering sensors...");
let sensor_caps = RiDeviceCapabilities::new()
.with_operations(vec!["read_temperature", "read_humidity", "calibrate"])
.with_max_sampling_rate(100.0)
.with_supports_batching(true)
.build();
for i in 1..=3 {
let device = RiDevice::new(
format!("sensor-{:03}", i),
RiDeviceType::Sensor,
RiDeviceStatus::Online,
Some(sensor_caps.clone()),
);
device_module.register_device(device).await?;
println!(" Registered sensor-{:03}", i);
}
println!();
println!("3. Registering cameras...");
let camera_caps = RiDeviceCapabilities::new()
.with_operations(vec!["capture", "stream", "record", "pan_tilt"])
.with_supports_streaming(true)
.with_max_resolution("4K")
.build();
for i in 1..=2 {
let device = RiDevice::new(
format!("camera-{:02}", i),
RiDeviceType::Camera,
RiDeviceStatus::Online,
Some(camera_caps.clone()),
);
device_module.register_device(device).await?;
println!(" Registered camera-{:02}", i);
}
println!();
println!("4. Registering actuators...");
let actuator_caps = RiDeviceCapabilities::new()
.with_operations(vec!["activate", "deactivate", "set_position", "get_status"])
.with_supports_feedback(true)
.build();
let actuator = RiDevice::new(
"actuator-01".to_string(),
RiDeviceType::Actuator,
RiDeviceStatus::Online,
Some(actuator_caps),
);
device_module.register_device(actuator).await?;
println!(" Registered actuator-01\n");
println!("5. Listing all devices...");
let devices = device_module.list_devices().await?;
println!(" Total devices: {}", devices.len());
for device in &devices {
println!(" - {}: type={:?}, status={:?}, caps={}",
device.id(),
device.device_type(),
device.status(),
device.capabilities().map(|c| c.operations().len()).unwrap_or(0)
);
}
println!();
println!("6. Filtering devices by type...");
let sensors = device_module.get_devices_by_type(RiDeviceType::Sensor).await?;
println!(" Found {} sensor(s):", sensors.len());
for sensor in &sensors {
println!(" - {}\n", sensor.id());
}
println!("7. Getting device by ID...");
if let Some(device) = device_module.get_device("sensor-001").await? {
println!(" Found device: {} (type: {:?})", device.id(), device.device_type());
} else {
println!(" Device not found");
}
println!();
println!("8. Updating device status...");
device_module.update_device_status("camera-01", RiDeviceStatus::Maintenance).await?;
println!(" Set camera-01 to Maintenance status\n");
println!("9. Device discovery simulation...");
let discovery_result = device_module.discover_devices().await?;
println!(" Discovery completed:");
println!(" - New devices found: {}", discovery_result.new_devices().len());
println!(" - Updated devices: {}", discovery_result.updated_devices().len());
println!(" - Removed devices: {}\n", discovery_result.removed_devices().len());
println!("10. Getting device statistics...");
let stats = device_module.get_statistics().await?;
println!(" Device statistics:");
println!(" - Total devices: {}", stats.total_devices());
println!(" - Online devices: {}", stats.online_devices());
println!(" - Offline devices: {}", stats.offline_devices());
println!(" - Maintenance devices: {}", stats.maintenance_devices());
println!();
println!("11. Creating resource request...");
let request = device_module.create_resource_request(
"high-performance-sensor",
RiDeviceType::Sensor,
4,
vec!["high_precision", "fast_sampling"],
).await?;
println!(" Resource request created: {}\n", request.request_id());
println!("12. Resource pool status management...");
let pool_status = RiResourcePoolStatus::new(
100, 75, 25, 5, 0.25, );
println!(" Resource pool status:");
println!(" - Total capacity: {}", pool_status.total_capacity());
println!(" - Available capacity: {}", pool_status.available_capacity());
println!(" - Allocated capacity: {}", pool_status.allocated_capacity());
println!(" - Pending requests: {}", pool_status.pending_requests());
println!(" - Utilization rate: {:.2}%\n", pool_status.utilization_rate() * 100.0);
println!("13. Deregistering test device...");
device_module.deregister_device("actuator-01").await?;
println!(" Deregistered actuator-01\n");
println!("14. Final device count...");
let devices = device_module.list_devices().await?;
println!(" Remaining devices: {}\n", devices.len());
println!("=== Device Management Example Completed ===");
Ok::<(), ri::RiError>(())
})?
}