mirror of https://codeberg.org/topola/topola.git
router: replace RouterStatus with Poll
This commit is contained in:
parent
224dd0c3bd
commit
76537e7dfa
|
|
@ -2,14 +2,15 @@
|
||||||
//! routing steps. Provides access to navigation meshes, traces, ghost shapes,
|
//! routing steps. Provides access to navigation meshes, traces, ghost shapes,
|
||||||
//! and obstacles encountered during routing.
|
//! and obstacles encountered during routing.
|
||||||
|
|
||||||
|
use core::task::Poll;
|
||||||
use petgraph::graph::EdgeIndex;
|
use petgraph::graph::EdgeIndex;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
board::mesadata::AccessMesadata,
|
board::mesadata::AccessMesadata,
|
||||||
drawing::{band::BandTermsegIndex, graph::PrimitiveIndex},
|
drawing::{band::BandTermsegIndex, graph::PrimitiveIndex},
|
||||||
geometry::primitive::PrimitiveShape,
|
geometry::primitive::PrimitiveShape,
|
||||||
router::{navmesh::Navmesh, route::RouteStepper, trace::TraceStepper, Router, RouterStatus},
|
router::{navmesh::Navmesh, route::RouteStepper, trace::TraceStepper, Router},
|
||||||
stepper::{Step, StepError},
|
stepper::{PollStep, Step, StepError},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
|
|
@ -107,10 +108,11 @@ impl<M: AccessMesadata> Step<Autorouter<M>, AutorouteStatus> for AutorouteExecut
|
||||||
let mut router =
|
let mut router =
|
||||||
Router::new(autorouter.board.layout_mut(), self.options.router_options);
|
Router::new(autorouter.board.layout_mut(), self.options.router_options);
|
||||||
|
|
||||||
let RouterStatus::Finished(band_termseg) = route.step(&mut router)? else {
|
match route.poll_step(&mut router) {
|
||||||
return Ok(AutorouteStatus::Running);
|
Poll::Pending => return Ok(AutorouteStatus::Running),
|
||||||
};
|
Poll::Ready(Ok(band_termseg)) => band_termseg,
|
||||||
band_termseg
|
Poll::Ready(Err(err)) => return Err(err.into()),
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let band = autorouter
|
let band = autorouter
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
|
use core::task::Poll;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
drawing::{dot::FixedDotIndex, graph::PrimitiveIndex, rules::AccessRules},
|
drawing::{
|
||||||
|
band::BandTermsegIndex, dot::FixedDotIndex, graph::PrimitiveIndex, rules::AccessRules,
|
||||||
|
},
|
||||||
geometry::primitive::PrimitiveShape,
|
geometry::primitive::PrimitiveShape,
|
||||||
router::{
|
router::{
|
||||||
astar::{Astar, AstarError, AstarStatus},
|
astar::{Astar, AstarError, AstarStatus},
|
||||||
navmesh::{Navmesh, NavmeshError},
|
navmesh::{Navmesh, NavmeshError},
|
||||||
trace::TraceStepper,
|
trace::TraceStepper,
|
||||||
tracer::Tracer,
|
tracer::Tracer,
|
||||||
Router, RouterAstarStrategy, RouterStatus,
|
Router, RouterAstarStrategy,
|
||||||
},
|
},
|
||||||
stepper::{Step, StepError},
|
stepper::{PollStep, Step, StepError},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct RouteStepper {
|
pub struct RouteStepper {
|
||||||
|
|
@ -75,17 +79,15 @@ impl StepError for RouteStepper {
|
||||||
type Error = AstarError;
|
type Error = AstarError;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, R: AccessRules> Step<Router<'a, R>, RouterStatus> for RouteStepper {
|
impl<'a, R: AccessRules> PollStep<Router<'a, R>, BandTermsegIndex> for RouteStepper {
|
||||||
fn step(&mut self, router: &mut Router<R>) -> Result<RouterStatus, AstarError> {
|
fn poll_step(&mut self, router: &mut Router<R>) -> Poll<Result<BandTermsegIndex, AstarError>> {
|
||||||
let tracer = Tracer::new(router.layout_mut());
|
let tracer = Tracer::new(router.layout_mut());
|
||||||
let target = self.astar.graph.destination();
|
let target = self.astar.graph.destination();
|
||||||
let mut strategy = RouterAstarStrategy::new(tracer, &mut self.trace, target);
|
let mut strategy = RouterAstarStrategy::new(tracer, &mut self.trace, target);
|
||||||
|
|
||||||
let result = match self.astar.step(&mut strategy)? {
|
let result = match self.astar.step(&mut strategy)? {
|
||||||
AstarStatus::Probing | AstarStatus::Probed | AstarStatus::Visited => {
|
AstarStatus::Probing | AstarStatus::Probed | AstarStatus::Visited => Poll::Pending,
|
||||||
Ok(RouterStatus::Running)
|
AstarStatus::Finished(_cost, _path, band) => Poll::Ready(Ok(band)),
|
||||||
}
|
|
||||||
AstarStatus::Finished(_cost, _path, band) => Ok(RouterStatus::Finished(band)),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
self.ghosts = strategy.probe_ghosts;
|
self.ghosts = strategy.probe_ghosts;
|
||||||
|
|
|
||||||
|
|
@ -35,22 +35,6 @@ pub struct RouterOptions {
|
||||||
pub squeeze_through_under_bands: bool,
|
pub squeeze_through_under_bands: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum RouterStatus {
|
|
||||||
Running,
|
|
||||||
Finished(BandTermsegIndex),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryInto<BandTermsegIndex> for RouterStatus {
|
|
||||||
type Error = ();
|
|
||||||
fn try_into(self) -> Result<BandTermsegIndex, ()> {
|
|
||||||
match self {
|
|
||||||
RouterStatus::Running => Err(()),
|
|
||||||
RouterStatus::Finished(band_termseg) => Ok(band_termseg),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct RouterAstarStrategy<'a, R: AccessRules> {
|
pub struct RouterAstarStrategy<'a, R: AccessRules> {
|
||||||
pub tracer: Tracer<'a, R>,
|
pub tracer: Tracer<'a, R>,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue