Reservation

Gère l’état de réservation des zones

Description

Les zones (ou TVDSection / DetectionSection) sont des partitions physiques des voies :

  • capables de détecter la présence d’un train
  • qui fournissent un service de réservation à l’usage des routes

Chaque zone a un certain nombre de configurations différentes. Par exemple, une zone sans aiguille aura deux configurations :

  • sens pair
  • sens impair

Une zone avec une aiguille aura 4 configurations possibles :

  • sens pair voie principale
  • sens impair voie principale
  • sens pair voie déviation
  • sens impair voie déviation

Chaque zone ne peut être réservée que pour une configuration donnée à la fois, mais peut être réservée simultanément par plusieurs routes. Une zone ne peut changer de configuration que lorsqu’elle n’est pas réservée.

État dynamique d’une zone

enum ZoneState { /// A list of active reservations. /// Each reservation requires a particular configuration to be upheld. reservations: VecDeque<ZoneReservation>, } struct ZoneReservation { /// The train which requires this reservation train: TrainHandle, // The configuration required for this reservation requirements: ZoneRequirements, /// The state of this reservation status: ZoneReservationStatus, } enum ZoneReservationStatus { /// In the process of being reserved, but not yet ready PRE_RESERVED, /// The train can arrive anytime RESERVED, /// The train is inside the zone OCCUPIED, /// The zone is pending release PENDING_RELEASE, } struct ZoneRequirements { entry: Option<DirDetector>, exit: Option<DirDetector>, movable_elements: Map<MovableElement, MovableElementConfig>, } impl ZoneState { /// Get the combined requirements for all the currently active reservations fn get_combined_requirements(&self) -> Option<ZoneRequirements> { return self.reservations .map(|res| &res.requirements) .reduce(|a, b| ZoneRequirements::combine(a, b)) } }

Exigences de conception

  • Les zones doivent pouvoir être verrouillées dans une configuration particulière.
  • Il doit être possible pour plusieurs routes de partager une réservation de configuration.
  • Il doit être possible d’observer l’évolution de statut d’une réservation.
  • Il doit être possible de faire évoluer le statut d’une réservation.

Dépendances

  • statique les détecteurs qui délimitent chaque zone
  • statique les aiguilles dans chaque zone
  • dynamique capacité d’observer l’occupation des zones
  • dynamique capacité d’actionner les éléments mobiles

Opérations

  • espacement: Observer l’état d’une zone
  • routage: Verrouiller et déverrouiller la zone : permet d’obtenir un droit d’action. Toutes les opérations en écriture nécessitent d’avoir acquis le verrou.
  • routage: Attendre que toutes les réservations d’une zone expirent
  • routage: Pré-réserver une configuration de zone
  • routage: Confirmer la réservation d’une zone
  • routage: Attendre que la réservation de la zone soit occupée par son train
  • routage: Relacher une réservation de zone