Files
SignauxComplexes/UnitPilote.pas
f1iwq2 f2cbfc2936 V8.8
V8.8
2024-05-03 20:01:01 +02:00

484 lines
13 KiB
ObjectPascal

unit UnitPilote;
// cette unité stocke l'état du signal de pilotage dans l'index 0 du tableau EtatSignalcplx
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, UnitPrinc,
jpeg;
type
TFormPilote = class(TForm)
LabelTitrePilote: TLabel;
ImagePilote: TImage;
GroupBox1: TGroupBox;
RadioVert: TRadioButton;
RadioVertCli: TRadioButton;
RadioJaune: TRadioButton;
RadioJaunecli: TRadioButton;
RadioRouge: TRadioButton;
RadioRougeCli: TRadioButton;
RadioCarre: TRadioButton;
RadioBlanc: TRadioButton;
RadioBlancCli: TRadioButton;
RadioViolet: TRadioButton;
GroupBox2: TGroupBox;
RadioRalen30: TRadioButton;
RadioRappel30: TRadioButton;
RadioRalen60: TRadioButton;
RadioRappel60: TRadioButton;
ButtonPilote: TButton;
EditNbreFeux: TEdit;
LabelNbFeux: TLabel;
LabelDec: TLabel;
Label1: TLabel;
CheckVerrouCarre: TCheckBox;
GroupBox3: TGroupBox;
CheckChiffre: TCheckBox;
CheckChevron: TCheckBox;
CheckClignote: TCheckBox;
ImageSignaux: TImage;
procedure RadioVertClick(Sender: TObject);
procedure RadioVertCliClick(Sender: TObject);
procedure RadioJauneClick(Sender: TObject);
procedure RadioJaunecliClick(Sender: TObject);
procedure RadioRougeClick(Sender: TObject);
procedure RadioRougeCliClick(Sender: TObject);
procedure RadioCarreClick(Sender: TObject);
procedure RadioBlancClick(Sender: TObject);
procedure RadioVioletClick(Sender: TObject);
procedure RadioBlancCliClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure RadioRalen30Click(Sender: TObject);
procedure RadioRappel60Click(Sender: TObject);
procedure RadioRalen60Click(Sender: TObject);
procedure RadioRappel30Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ButtonPiloteClick(Sender: TObject);
procedure EditNbreFeuxKeyPress(Sender: TObject; var Key: Char);
procedure FormActivate(Sender: TObject);
procedure CheckVerrouCarreClick(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure CheckChiffreClick(Sender: TObject);
procedure CheckChevronClick(Sender: TObject);
procedure CheckClignoteClick(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
// code des aspects des signaux
const
carre =0 ; carre_F=1;
semaphore =1 ; semaphore_F=2;
semaphore_cli =2 ; semaphore_cli_F=4;
vert =3 ; vert_F=8;
vert_cli =4 ; vert_cli_F=16;
violet =5 ; violet_F=32;
blanc =6 ; blanc_F=64;
blanc_cli =7 ; blanc_cli_F=128;
jaune =8 ; jaune_F=256;
jaune_cli =9 ; jaune_cli_F=512;
ral_30 =10; ral_30_F=1024;
ral_60 =11; ral_60_F=2048;
rappel_30 =12; rappel_30_F=4096;
rappel_60 =13; rappel_60_F=8192;
Disque_D =14; // pour décodeur LDT
ral_60_jaune_cli =15;ral_60_jaune_cli_F=32768; // pour décodeur LDT
aspect8 =16 ;
// signal belge
// base
vert_jaune_H =0 ; vert_jaune_H_F=1; // signal belge
rouge =1 ; rouge_F=2;
vertB =2 ; vertB_F=4;
vert_jaune_V =3 ; vert_jaune_V_F=8;
rouge_blanc =4 ; rouge_blanc_F=16; // signal belge
deux_jaunes =5 ; deux_jaunes_F=32; // signal belge
// combinée
chiffre =6; chiffre_F=64;
chevron =7; chevron_F=128;
clignote =8; clignote_F=256;
Bita1 =15; Bita1_F=32768; // mise à 1 de bit signal combiné pour belge
var
FormPilote: TFormPilote;
EtatFeuPilote : word;
AdrPilote : integer;
procedure dessine_signal_pilote;
procedure couleurs_pilote;
implementation
{$R *.dfm}
procedure dessine_signal_pilote;
var i,ancienEtat : integer;
Vcanvas : Tcanvas;
begin
i:=Index_Signal(AdrPilote); // adresse du feu d'origine
if i<>0 then
//ImagePilote.Picture.Bitmap:=FormPilote.ImagePilote.picture.bitmap;
EtatFeuPilote:=Signaux[0].EtatSignal;
AncienEtat:=Signaux[0].ancienEtat;
Vcanvas:=FormPilote.ImagePilote.picture.bitmap.Canvas;
case Signaux[i].aspect of
// feux de signalisation
2 : dessine_signal2(Vcanvas,0,0,1,1,EtatFeupilote,1);
3 : dessine_signal3(Vcanvas,0,0,1,1,EtatFeupilote,1);
4 : dessine_signal4(VCanvas,0,0,1,1,EtatFeupilote,1);
5 : dessine_signal5(VCanvas,0,0,1,1,EtatFeupilote,1);
7 : dessine_signal7(VCanvas,0,0,1,1,EtatFeupilote,1);
9 : dessine_signal9(VCanvas,0,0,1,1,EtatFeupilote,1);
20 : dessine_signal20(VCanvas,0,0,1,1,EtatFeupilote,1,Signaux[i].adresse);
// indicateurs de direction
12 : dessine_dirN(VCanvas,0,0,1,1,EtatFeupilote,1,2);
13 : dessine_dirN(VCanvas,0,0,1,1,EtatFeupilote,1,3);
14 : dessine_dirN(VCanvas,0,0,1,1,EtatFeupilote,1,4);
15 : dessine_dirN(VCanvas,0,0,1,1,EtatFeupilote,1,5);
16 : dessine_dirN(VCanvas,0,0,1,1,EtatFeupilote,1,6);
end;
end;
// renvoie la nation du signal 0
function nation : integer;
var i,dec,asp : integer;
begin
i:=1;
dec:=Signaux[0].decodeur;
asp:=Signaux[0].aspect;
if asp=20 then i:=2;
// si décodeur personalisé
if (dec>=NbDecodeurdeBase) and (dec<NbDecodeurdeBase+NbreDecPers) then
begin
if decodeur_pers[dec-NbDecodeurdeBase+1].nation=2 then i:=2;
end;
result:=i;
end;
procedure TFormPilote.RadioVertClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
if nation=1 then Maj_Etat_Signal(0,vert) else Maj_Etat_Signal(0,vertB) ;
dessine_signal_pilote;
end;
procedure TFormPilote.RadioVertCliClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,vert_cli);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioJauneClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
if nation=1 then Maj_Etat_Signal(0,jaune) else Maj_Etat_Signal(0,deux_jaunes);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioJaunecliClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,jaune_cli);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioRougeClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,semaphore);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioRougeCliClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,semaphore_cli);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioCarreClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
if nation=1 then Maj_Etat_Signal(0,carre) else Maj_Etat_Signal(0,vert_jaune_H);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioBlancClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
if nation=1 then Maj_Etat_Signal(0,blanc) else Maj_Etat_Signal(0,rouge_blanc);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioVioletClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
if nation=1 then Maj_Etat_Signal(0,violet) else Maj_Etat_Signal(0,vert_jaune_V);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioBlancCliClick(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,blanc_cli);
dessine_signal_pilote;
end;
procedure TFormPilote.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Affiche('close',clyellow);
AdrPilote:=0; // pour désactiver le test des clignotements
end;
procedure TFormPilote.RadioRalen30Click(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,ral_30);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioRappel60Click(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,rappel_60);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioRalen60Click(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,ral_60);
dessine_signal_pilote;
end;
procedure TFormPilote.RadioRappel30Click(Sender: TObject);
begin
Signaux[0].AncienEtat:=Signaux[0].EtatSignal;
Maj_Etat_Signal(0,rappel_30);
dessine_signal_pilote;
end;
procedure couleurs_pilote;
var i : integer;
c : tcomponent;
begin
{$IFNDEF DELPHI11}
if sombre then with formPilote do
begin
Color:=Couleurfond;
for i:=0 to ComponentCount-1 do
begin
c:=Components[i];
composant(c,couleurFond,couleurTexte);
end;
end;
{$ENDIF}
end;
procedure TFormPilote.FormCreate(Sender: TObject);
begin
if affevt then affiche('FormPilote create',clLime);
position:=poMainFormCenter;
couleurs_pilote;
end;
procedure TFormPilote.ButtonPiloteClick(Sender: TObject);
var i,index,e : integer;
begin
index:=index_Signal(AdrPilote);
if isDirectionnel(index) then
begin
val(EditNbreFeux.Text,i,e);
Signaux[0].EtatSignal:=i;
pilote_direction(AdrPilote,i);
end;
Signaux[index].EtatSignal:=Signaux[0].EtatSignal;
envoi_signal(AdrPilote);
end;
procedure TFormPilote.EditNbreFeuxKeyPress(Sender: TObject; var Key: Char);
var i,e : integer;
begin
if ord(Key) = VK_RETURN then
begin
Key := #0; // prevent beeping
val(EditNbreFeux.text,i,e);
if e=0 then
begin
if (i>=0) and (i<=6) then
begin
Signaux[0].EtatSignal:=i;
dessine_signal_pilote;
end;
if (i<0) and (i>6) then EditNbreFeux.text:='1';
end
else EditNbreFeux.text:='1';
end;
end;
procedure TFormPilote.FormActivate(Sender: TObject);
var n,i,d : integer;
begin
// mise à jour du champ décodeur
if affevt then affiche('FormPilote activate',clLime);
i:=Index_Signal(AdrPilote);
d:=Signaux[i].decodeur;
n:=Signaux[i].aspect;
with LabelDec do
begin
Caption:=decodeur[d];
width:=114;
height:=42;
end;
Signaux[0].decodeur:=d;
Signaux[0].aspect:=n;
Signaux[0].contrevoie:=Signaux[i].contrevoie;
// signal belge
if (n=20) then
begin
Radiocarre.Caption:='Vert jaune horizontal';
Radioviolet.Caption:='Vert jaune vertical';
RadioJaune.Caption:='Deux jaunes';
RadioJauneCli.Caption:='Deux jaunes clignotants';
RadioBlanc.caption:='Rouge Blanc';
RadioBlancCli.caption:='Rouge Blanc clignotants';
RadioRouge.caption:='Rouge';
radiovertcli.visible:=false;
radioJaunecli.visible:=false;
radioRougecli.visible:=false;
radioBlanccli.visible:=false;
groupBox3.Top:=GroupBox2.Top;
groupBox3.Left:=GroupBox2.Left;
groupBox2.Visible:=false;
groupBox3.Visible:=true;
end;
if n<>20 then
begin
groupBox3.Visible:=false;
Radiocarre.Caption:='Carré';
Radioviolet.Caption:='Violet';
RadioRouge.Caption:='Sémaphore';
RadioJauneCli.Caption:='Avertissement clignotant';
RadioJaune.Caption:='Avertissement';
RadioBlanc.caption:='Blanc';
RadioBlancCli.caption:='Blanc clignotant';
radiovertcli.visible:=true;
radioJaunecli.visible:=true;
radioRougecli.visible:=true;
radioBlanccli.visible:=true;
end;
{
// checkcarré
if (n<4) or (n>10) then checkVerrouCarre.Visible:=false else
begin
checkVerrouCarre.Visible:=false; //true;
checkVerrouCarre.Checked:=Signaux[i].VerrouCarre;
end;
}
with imagePilote do
begin
Parent:=FormPilote;
Picture.Bitmap.TransparentMode:=tmAuto;
Picture.Bitmap.TransparentColor:=clblue;
Transparent:=true;
Picture.BitMap:=Signaux[i].Img.Picture.Bitmap;
//left:=groupBox1.width+50;
end;
LabelTitrePilote.Caption:='Pilotage du signal '+intToSTR(AdrPilote);
Signaux[0].EtatSignal:=Signaux[i].EtatSignal;
if isDirectionnel(i) then
begin
// signaux directionnels
GroupBox1.Visible:=false;
GroupBox2.Visible:=false;
LabelNbFeux.Visible:=true;
EditNbreFeux.Visible:=true;
EditNbreFeux.Text:='1';
end
else
begin
LabelNbFeux.Visible:=False;
EditNbreFeux.Visible:=false;
GroupBox1.Visible:=true;
if (Signaux[i].aspect<10) then GroupBox2.Visible:=true else GroupBox2.Visible:=false;
end;
radioVert.Checked:=false;
radioVertCli.Checked:=false;
radioJaune.Checked:=false;
radioJauneCli.Checked:=false;
radioRouge.Checked:=false;
radioRougeCli.Checked:=false;
radiocarre.Checked:=false;
radioBlanc.Checked:=false;
radioViolet.Checked:=false;
radioRalen30.Checked:=false;
radioRappel30.Checked:=false;
radioRalen60.Checked:=false;
radioRappel60.Checked:=false;
CheckChiffre.Checked:=false;
CheckChevron.Checked:=false;
CheckClignote.Checked:=false;
end;
procedure TFormPilote.CheckVerrouCarreClick(Sender: TObject);
var i : integer;
begin
i:=Index_Signal(AdrPilote);
if Signaux[i].VerrouCarre then
begin
//Signaux[i].EtatVerrouCarre:=checkVerrouCarre.Checked=true;
Maj_Etat_Signal(AdrPilote,carre);
envoi_signal(Adrpilote);
Maj_Etat_Signal(0,carre);
dessine_signal_pilote;
end;
end;
procedure TFormPilote.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=chr(27) then close;
end;
procedure TFormPilote.CheckChiffreClick(Sender: TObject);
begin
if checkChiffre.Checked then Maj_Etat_Signal_belge(0,chiffre_F or bita1_F) else Maj_Etat_Signal_belge(0,chiffre_F);
dessine_signal_pilote;
end;
procedure TFormPilote.CheckChevronClick(Sender: TObject);
begin
if checkChevron.Checked then Maj_Etat_Signal(0,chevron_F or bita1_F) else Maj_Etat_Signal(0,chevron_F );
dessine_signal_pilote;
end;
procedure TFormPilote.CheckClignoteClick(Sender: TObject);
begin
if checkclignote.Checked then Maj_Etat_Signal(0,clignote_F or bita1_F) else Maj_Etat_Signal(0,clignote_F );
dessine_signal_pilote;
end;
begin
end.