blob: 2872b07b2f9186c03ffa17464d41989521c4358d [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use anyhow::{self, Error};
use fidl_fuchsia_recovery_ui::{ProgressRendererMarker, ProgressRendererSynchronousProxy, Status};
use fuchsia_component::client::connect_channel_to_protocol;
use fuchsia_syslog::{fx_log_debug, fx_log_err, fx_log_info};
use fuchsia_zircon as zx;
use rand::prelude::*;
#[fuchsia::main(logging = true)]
async fn main() -> Result<(), Error> {
// Need inner_main to catch top level errors for now
match inner_main().await {
Ok(_) => Ok(()),
Err(e) => {
fx_log_err!("Error occurred running progress sender: {:?}", e);
Err(e)
}
}
}
// TODO(https://fxbug.dev/42170765): Ideally we wouldn't need to have separate inner_main() and main()
// functions in order to catch and log top-level errors. Instead, the #[fuchsia::main] macro
// could catch and log the error.
async fn inner_main() -> Result<(), Error> {
fx_log_info!("Progress sender running");
let (server_end, client_end) = zx::Channel::create()?;
connect_channel_to_protocol::<ProgressRendererMarker>(server_end)?;
let renderer = ProgressRendererSynchronousProxy::new(client_end);
fx_log_info!("Sleeping for 3 seconds");
std::thread::sleep(std::time::Duration::from_secs(3));
fx_log_info!("Sleep complete, sending progress updates");
let mut rng = rand::thread_rng();
let num_updates = 200;
for i in 0..num_updates {
// Increment progress
let progress = (1.0f32 / num_updates as f32) * i as f32;
fx_log_debug!("Sending: {}", progress);
if i % 17 == 0 {
let sleep_time: f64 = rng.gen();
std::thread::sleep(std::time::Duration::from_millis((sleep_time * 800f64) as u64));
}
renderer
.render(Status::Active, progress, zx::Time::INFINITE)
.expect("Died while sending progress update");
if i > 100 && i < 150 {
// Fast update section for fun and for profit
std::thread::sleep(std::time::Duration::from_millis(10));
} else {
std::thread::sleep(std::time::Duration::from_millis(50));
}
}
// Send complete message
renderer
.render(Status::Complete, 100.0f32, zx::Time::INFINITE)
.expect("Should have sent complete message");
fx_log_info!("Sent progress complete");
Ok(())
}