with Assert ;
with Gada.Text_IO ;
with Avion_Sol, INSA_Air ;
with Train, Tour, Pilote_Automatique, Carburant ;
with Cartographie ;
procedure Mission3 is
package Txt renames GAda.Text_IO ;
package IA renames INSA_Air ;
package AS renames Avion_Sol ;
package PA renames Pilote_Automatique ;
package Carto renames Cartographie ;
procedure Rouler_KA is
begin
Tour.Attendre_Autorisation_Roulage ;
AS.Rouler_Vers ( Dest => 'L') ;
AS.Rouler_Vers ( Dest => 'M') ;
AS.Rouler_Vers ( Dest => 'E') ;
AS.Rouler_Vers ( Dest => 'A') ;
end Rouler_KA ;
procedure Rouler_DK is
begin
AS.Rouler_Vers ( Dest => 'N') ;
AS.Rouler_Vers ( Dest => 'P') ;
AS.Rouler_Vers ( Dest => 'M') ;
AS.Rouler_Vers ( Dest => 'L') ;
AS.Rouler_Vers ( Dest => 'K') ;
AS.Freiner ;
end Rouler_DK ;
Angle_Tour : constant Float := 360.0 ;
Demi_Tour : constant Float := Angle_Tour / 2.0 ;
function Delta_Cap (Cap_Actuel : Float ; Cap_Voulu : Float) return Float is
Resultat : Float ;
begin
Resultat := Cap_Voulu - Cap_Actuel ;
if Resultat > Demi_Tour then Resultat := Resultat - Angle_Tour ;
elsif Resultat < - Demi_Tour then Resultat := Resultat + Angle_Tour ;
end if ;
return Resultat ;
end Delta_Cap ;
function Caps_Egaux (Cap1 : Float ; Cap2 : Float) return Boolean is
Tolerance : constant Float := 5.0 ;
begin
return abs (Delta_Cap ( Cap_Actuel => Cap1, Cap_Voulu => Cap2)) < Tolerance ;
end Caps_Egaux ;
procedure Orienter_En_Vol (Cible : Float) is
begin
Assert.Failif (Cond => Cible < 0.0 or Cible > Angle_Tour,
Message => "Orienter_En_Vol : cap incorrect = " & Float'Image(Cible)) ;
while not (Caps_Egaux (Cap1 => Cible, Cap2 => IA.Cap_Courant)) loop
if Delta_Cap (Cap_Actuel => IA.Cap_Courant, Cap_Voulu => Cible) < 0.0 then
INSA_Air.Positionner_Gouverne_A_Gauche ;
else
INSA_Air.Positionner_Gouverne_A_Droite ;
end if ;
end loop ;
INSA_Air.Positionner_Gouverne_A_Zero ;
end Orienter_En_Vol ;
procedure Infos_Aeroport (Code : String) is
Pos : Carto.T_Coords ;
begin
Pos := Carto.Coords_Aeroport (Code) ;
Txt.Put(Aff => "Aeroport " & Code & " = " & Carto.Nom_Aeroport(Code)) ;
Txt.Put_Line (Aff => " Lat. = " & Float'Image(Pos.Lat) & " Long. = " & Float'Image(Pos.Long)) ;
end Infos_Aeroport ;
procedure Tester_Carto is
begin
Infos_Aeroport (Code => "LFBO") ;
Infos_Aeroport (Code => "EGLL") ;
Infos_Aeroport (Code => "LFPG") ;
end Tester_Carto ;
function Dist (P1 : Carto.T_Coords ; P2 : Carto.T_Coords) return Float is
One_Degre : constant Float := 111.600 ;
Dist2 : Float ;
begin
Dist2 := (P1.Lat - P2.Lat)**2 + (P1.Long - P2.Long)**2 ;
return One_Degre * (Carto.Sqrt (Dist2)) ;
end Dist ;
procedure Tester_Dist is
begin
Txt.Put_Line (Aff => "Distance entre Blagnac et Heathrow en km : " &
Float'Image(Dist(P1 => Carto.Coords_Aeroport(Code => "LFBO"),
P2 => Carto.Coords_Aeroport(Code => "EGLL")))) ;
end Tester_Dist ;
function Cap_Cible (Code : String) return Float is
Aero : Carto.T_Coords ;
Avion : Carto.T_Coords ;
begin
Aero := Carto.Coords_Aeroport (Code) ;
Avion := Carto.Coords_Avion ;
return Carto.Cap_Vecteur (DX => Aero.Long - Avion.Long, DY => Aero.Lat - Avion.Lat) ;
end Cap_Cible ;
procedure Tester_Cap_Cible is
begin
Txt.Put_Line (Aff => "Cap_Cible vers Heathrow : " & Float'Image (Cap_Cible(Code => "EGLL"))) ;
end Tester_Cap_Cible ;
function Reperer_Plus_Proche return Integer is
Dist_Min : Float := 100000.0 ;
No_Min : Integer := 1 ;
ADist : Float ;
begin
for No in 1..Carto.Nb_Aeroports loop
ADist := Dist(P1 => Carto.Coords_Aeroport(Code => Carto.Code_Aeroport(Numero => No)),
P2 => Carto.Coords_Avion) ;
if ADist < Dist_Min and Carto.Pays_Aeroport(Code => Carto.Code_Aeroport(Numero => No)) /= "FR"
then
Dist_Min := ADist ;
No_Min := No ;
end if ;
end loop ;
return No_Min ;
end Reperer_Plus_Proche ;
procedure Naviguer_Vers (Code : String) is
Dist_Min : constant Float := 100.0 ;
Nb_Echantillons : Integer ;
Somme_Distances : Float ;
Moyenne : Float ;
Aero_Plus_Proche : Integer ;
begin
Nb_Echantillons := 0 ;
Somme_Distances := 0.0 ;
while Dist(P1 => Carto.Coords_Avion, P2 => Carto.Coords_Aeroport(Code)) > Dist_Min Loop
Orienter_En_Vol (Cible => Cap_Cible(Code)) ;
Aero_Plus_Proche := Reperer_Plus_Proche ;
Carto.Placer_Marque (Point => Carto.Coords_Aeroport(Code => Carto.Code_Aeroport(Numero => Aero_Plus_Proche))) ;
Somme_Distances :=
Somme_Distances +
Dist(P1 => Carto.Coords_Aeroport(Code => Carto.Code_Aeroport(Numero => Aero_Plus_Proche)),
P2 => Carto.Coords_Avion) ;
Nb_Echantillons := Nb_Echantillons + 1 ;
end loop ;
Moyenne := Somme_Distances / Float(Nb_Echantillons) ;
Txt.Put_Line (Aff => "La moyenne de la distance à l'aéroport le plus proche vaut " &
Float'Image(Moyenne) & " km") ;
end Naviguer_Vers ;
procedure Vol_Demo is
Reacteur_Decollage : constant Integer := 8 ;
Reacteur_Vol_Croisiere : constant Integer := 6 ;
Reacteur_Atterrissage : constant Integer := 3 ;
begin
Carburant.Faire_Le_Plein ;
IA.Donner_Nom_Compagnie(Nom => "INSA-Air") ;
Rouler_KA ;
Tour.Attendre_Autorisation_Decollage ;
IA.Regler_Reacteur (Force => Reacteur_Decollage) ;
PA.Decoller ;
Train.Deplacer_Train (Sens => False) ;
IA.Regler_Reacteur (Force => Reacteur_Vol_Croisiere) ;
Naviguer_Vers (Code => "EGLL") ;
Naviguer_Vers (Code => "LFRB") ;
Naviguer_Vers (Code => "LIPZ") ;
Naviguer_Vers (Code => "LFBO") ;
IA.Regler_Reacteur (Force => Reacteur_Atterrissage) ;
Train.Deplacer_Train (Sens => True) ;
Tour.Attendre_Autorisation_Atterrissage ;
PA.Atterrir ;
Rouler_DK ;
end Vol_Demo ;
begin
Tester_Carto ;
Tester_Dist ;
Tester_Cap_Cible ;
Vol_Demo ;
end Mission3 ;