RailwaySignal
est la classe principale qui gère l'état et le comportement d'un signal ferroviaire.
enum class Aspect {
RED, ///< Signal fermé
GREEN, ///< Signal ouvert
YELLOW ///< Signal à vitesse limitée
}
explicit RailwaySignal(const std::string& id)
- Paramètres
id
: Identifiant unique du signal
- Description: Initialise un nouveau signal avec l'état initial RED (sûr).
std::expected<void, std::string> setAspect(Aspect aspect)
- Paramètres
aspect
: Nouvel aspect à appliquer
- Retour:
std::expected
contenant succès ou message d'erreur - Safety Level: SIL4
- Description: Change l'aspect du signal après validation des règles de sécurité.
Aspect getAspect() const
- Retour: L'aspect actuel du signal
- Safety Level: SIL4
- Description: Retourne l'état actuel du signal.
void executeCommand(std::unique_ptr<SignalCommand> command)
- Paramètres
command
: Commande à exécuter
- Safety Level: SIL4
- Description: Exécute une commande et l'ajoute à l'historique.
void undoLastCommand()
void redoCommand()
- Safety Level: SIL4
- Description: Gère l'annulation et la réexécution des commandes.
boost::signals2::signal<void(Aspect)> aspectChanged
- Description: Notifie les observateurs des changements d'aspect.
Interface abstraite pour le pattern Command.
virtual void execute() = 0
virtual void undo() = 0
class ChangeAspectCommand : public SignalCommand
- Description: Implémente une commande de changement d'aspect.
- Safety Level: SIL4
Interface abstraite pour le pattern State.
virtual void update() = 0
virtual bool canTransitionTo(Aspect aspect) = 0
- Transitions Autorisées: Vers YELLOW uniquement
- Safety Level: SIL4
- Transitions Autorisées: Vers RED ou GREEN
- Safety Level: SIL4
- Transitions Autorisées: Vers YELLOW ou RED (urgence)
- Safety Level: SIL4
Classe utilitaire pour la validation des transitions.
static bool validateTransition(Aspect from, Aspect to)
- Description: Valide les transitions selon la matrice de sécurité.
- Safety Level: SIL4
Classe utilitaire pour la gestion des timeouts de sécurité.
explicit SafetyTimer(std::chrono::milliseconds timeout)
bool hasExpired() const
void reset()
classDiagram
class RailwaySignal {
-string id_
-Aspect currentAspect_
-vector~unique_ptr~SignalCommand~~ commandHistory_
+setAspect(Aspect) std::expected~void,string~
+getAspect() Aspect
+executeCommand(unique_ptr~SignalCommand~)
+undoLastCommand()
+redoCommand()
}
class SignalCommand {
<<interface>>
+execute()*
+undo()*
}
class SignalState {
<<interface>>
+update()*
+canTransitionTo(Aspect)*
}
RailwaySignal --> SignalState
RailwaySignal --> SignalCommand
ChangeAspectCommand --|> SignalCommand
RedState --|> SignalState
YellowState --|> SignalState
GreenState --|> SignalState