Add debug info when motors or sensor not connected
This commit is contained in:
parent
ab775e32de
commit
a5dcd818b4
@ -21,6 +21,30 @@ pub enum Parameter {
|
|||||||
Speed,
|
Speed,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::similar_names)]
|
||||||
|
pub fn draw_debug<'a>(screen: &mut Screen, text: impl IntoIterator<Item = &'a str>, font: &Font) {
|
||||||
|
#[allow(clippy::cast_precision_loss)]
|
||||||
|
let scale = Scale {
|
||||||
|
x: screen.xres() as f32 / 10.0,
|
||||||
|
y: screen.yres() as f32 / 4.0 - 8.0,
|
||||||
|
};
|
||||||
|
let xres = i32::try_from(screen.xres()).expect("range checked");
|
||||||
|
let yres = i32::try_from(screen.yres()).expect("range checked");
|
||||||
|
let center = xres / 2;
|
||||||
|
clear(screen);
|
||||||
|
for (i, line) in text.into_iter().enumerate().take(4) {
|
||||||
|
draw_centered_text(
|
||||||
|
screen,
|
||||||
|
center,
|
||||||
|
yres * i32::try_from(i).expect("there is only place for 4 lines") / 4 + 4,
|
||||||
|
scale,
|
||||||
|
font,
|
||||||
|
line,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
screen.update();
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::similar_names)]
|
#[allow(clippy::similar_names)]
|
||||||
pub fn draw_calibration(screen: &mut Screen, parameter: &str, value: impl Display, font: &Font) {
|
pub fn draw_calibration(screen: &mut Screen, parameter: &str, value: impl Display, font: &Font) {
|
||||||
#[allow(clippy::cast_precision_loss)]
|
#[allow(clippy::cast_precision_loss)]
|
||||||
|
34
src/main.rs
34
src/main.rs
@ -2,25 +2,43 @@ mod buttons;
|
|||||||
mod display;
|
mod display;
|
||||||
|
|
||||||
use buttons::SmartEv3Buttons;
|
use buttons::SmartEv3Buttons;
|
||||||
use display::{draw_calibration, draw_driving, draw_finished, draw_settings, font, Parameter};
|
use display::{
|
||||||
use ev3dev_lang_rust::{motors::LargeMotor, sensors::ColorSensor, Ev3Error, Ev3Result, Screen};
|
draw_calibration, draw_debug, draw_driving, draw_finished, draw_settings, font, Parameter,
|
||||||
|
};
|
||||||
|
use ev3dev_lang_rust::{
|
||||||
|
motors::LargeMotor, sensors::ColorSensor, Device, Ev3Error, Ev3Result, Screen,
|
||||||
|
};
|
||||||
use pid::Pid;
|
use pid::Pid;
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
use rusttype::Font;
|
use rusttype::Font;
|
||||||
use std::{
|
use std::{
|
||||||
error::Error,
|
error::Error,
|
||||||
|
iter,
|
||||||
thread::sleep,
|
thread::sleep,
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() {
|
||||||
let motors = LargeMotor::list()?;
|
while try_main().is_err() {
|
||||||
let [right_motor, left_motor] = &motors[..] else {println!("motors: {motors:?}"); Err("need two motors")?};
|
sleep(Duration::from_millis(10));
|
||||||
let sensor = ColorSensor::find()?;
|
}
|
||||||
let mut buttons = SmartEv3Buttons::new()?;
|
}
|
||||||
let mut screen = Screen::new()?;
|
|
||||||
|
fn try_main() -> Result<(), Box<dyn Error>> {
|
||||||
let font = font();
|
let font = font();
|
||||||
|
let mut screen = Screen::new()?;
|
||||||
|
let motors = LargeMotor::list()?;
|
||||||
|
let [right_motor, left_motor] = &motors[..] else {
|
||||||
|
let motor_texts: Vec<_> = motors.iter().map(|motor| format!("{:?}", motor.get_driver_name())).collect();
|
||||||
|
draw_debug(&mut screen, iter::once("motors:").chain(motor_texts.iter().map(String::as_str)), &font);
|
||||||
|
Err("need two motors")?
|
||||||
|
};
|
||||||
|
let sensor = ColorSensor::find().map_err(|e| {
|
||||||
|
draw_debug(&mut screen, ["no color sensor"], &font);
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
let mut buttons = SmartEv3Buttons::new()?;
|
||||||
|
|
||||||
left_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
left_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
||||||
right_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
right_motor.set_polarity(LargeMotor::POLARITY_INVERSED)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user