supper/src/control_loop.rs

60 lines
1.9 KiB
Rust
Raw Normal View History

2022-05-21 18:12:10 +00:00
use std::{collections::HashMap, time::Duration};
use anyhow::Result;
use egui_extras::RetainedImage;
use scrap::{Capturer, Display};
use crate::{
capture,
image_processing::{self, Region},
ocr,
state::{ParsedFrame, SharedAppState},
};
async fn run_loop_once(state: &SharedAppState, regions: &[Region]) -> Result<()> {
let frame = capture::get_frame()?;
let ocr_results = ocr::ocr_all_regions(&frame, &regions).await;
let mut saved_frames = HashMap::new();
if state.lock().unwrap().debug_frames {
for region in regions {
let mut extracted = image_processing::extract_region(&frame, region);
image_processing::filter_to_white(&mut extracted, 0.95, 0.05);
let retained = RetainedImage::from_image_bytes(
&region.name,
&image_processing::to_png_bytes(&extracted),
)
.unwrap();
saved_frames.insert(region.name.clone(), retained);
}
}
{
let mut state = state.lock().unwrap();
let parsed = ParsedFrame::parse(&ocr_results);
if parsed.lap_time.is_some() {
state.last_frame = Some(parsed);
}
state.raw_data = ocr_results;
state.saved_frames = saved_frames;
}
Ok(())
}
pub async fn run_control_loop(state: SharedAppState) -> Result<()> {
let regions = vec![
Region::parse("health 91 1364 52 24").unwrap(),
Region::parse("gas 208 1364 52 24").unwrap(),
Region::parse("tyres 325 1364 52 24").unwrap(),
Region::parse("lap 2295 46 140 87").unwrap(),
Region::parse("best 2325 169 183 43").unwrap(),
Region::parse("lap_time 2325 222 183 43").unwrap(),
];
loop {
if let Err(e) = run_loop_once(&state, &regions).await {
eprintln!("Error in control loop: {:?}", e)
}
tokio::time::sleep(Duration::from_millis(500)).await;
}
}