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