diff --git a/Notice avancée pour les signaux complexes GL.pdf b/Notice avancée pour les signaux complexes GL.pdf index 4604a76..4150c92 100644 Binary files a/Notice avancée pour les signaux complexes GL.pdf and b/Notice avancée pour les signaux complexes GL.pdf differ diff --git a/Notice d'utilisation des signaux_complexes_GL_V10.75.pdf b/Notice d'utilisation des signaux_complexes_GL_V10.78.pdf similarity index 83% rename from Notice d'utilisation des signaux_complexes_GL_V10.75.pdf rename to Notice d'utilisation des signaux_complexes_GL_V10.78.pdf index b0db561..b83636d 100644 Binary files a/Notice d'utilisation des signaux_complexes_GL_V10.75.pdf and b/Notice d'utilisation des signaux_complexes_GL_V10.78.pdf differ diff --git a/UnitConfig.dfm b/UnitConfig.dfm index 9717e6c..9d6d37d 100644 --- a/UnitConfig.dfm +++ b/UnitConfig.dfm @@ -1573,7 +1573,7 @@ object FormConfig: TFormConfig Top = 8 Width = 633 Height = 505 - ActivePage = TabSheetCompt + ActivePage = TabSheetBouton Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -11 @@ -2097,7 +2097,7 @@ object FormConfig: TFormConfig 'S'#233'lection du style d'#39#39'affichage - Le style sera chang'#233' '#224' la ferm' + 'eture de la fen'#234'tre'#39 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 0 @@ -3303,11 +3303,11 @@ object FormConfig: TFormConfig WordWrap = True end object Label15: TLabel - Left = 56 - Top = 44 + Left = 64 + Top = 46 Width = 171 Height = 13 - Caption = 'Temporisation commandes (x100mx)' + Caption = 'Temporisation commandes (x100ms)' WordWrap = True end object MemoCarre: TMemo @@ -3332,7 +3332,7 @@ object FormConfig: TFormConfig Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 1 OnChange = ComboBoxDecChange end @@ -3463,7 +3463,7 @@ object FormConfig: TFormConfig Width = 137 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxAspChange end @@ -3779,7 +3779,7 @@ object FormConfig: TFormConfig Top = 56 Width = 193 Height = 21 - ItemHeight = 0 + ItemHeight = 13 TabOrder = 0 OnChange = ComboBoxDecodeurPersoChange end @@ -3798,7 +3798,7 @@ object FormConfig: TFormConfig Width = 145 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxNationChange end @@ -3844,7 +3844,7 @@ object FormConfig: TFormConfig Width = 193 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 6 OnChange = ComboBoxDecCdeChange end @@ -4057,7 +4057,7 @@ object FormConfig: TFormConfig Top = 96 Width = 137 Height = 21 - ItemHeight = 0 + ItemHeight = 13 TabOrder = 2 OnChange = ComboBoxOperateurChange OnDrawItem = ComboBoxOperateurDrawItem @@ -4077,7 +4077,7 @@ object FormConfig: TFormConfig Top = 96 Width = 161 Height = 21 - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 4 @@ -4189,7 +4189,7 @@ object FormConfig: TFormConfig Width = 145 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 7 OnChange = ComboBoxFLChange end @@ -4739,7 +4739,7 @@ object FormConfig: TFormConfig Height = 21 Hint = 'Nom de l'#39'accessoire d'#233'fini dans l'#39'onglet "p'#233'riph'#233'riques COM/USB"' Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 ParentShowHint = False ShowHint = True TabOrder = 10 @@ -6329,7 +6329,7 @@ object FormConfig: TFormConfig end object GroupBoxBR: TGroupBox Left = 312 - Top = 120 + Top = 128 Width = 260 Height = 121 Caption = 'Bouton rotatif' @@ -6407,11 +6407,11 @@ object FormConfig: TFormConfig Left = 312 Top = 224 Width = 260 - Height = 121 + Height = 145 Caption = 'Bouton' TabOrder = 2 object LabeledEditF: TLabeledEdit - Left = 185 + Left = 193 Top = 52 Width = 40 Height = 21 @@ -6428,7 +6428,7 @@ object FormConfig: TFormConfig OnChange = LabeledEditFChange end object LabeledEditFn: TLabeledEdit - Left = 201 + Left = 217 Top = 76 Width = 16 Height = 21 @@ -6445,7 +6445,7 @@ object FormConfig: TFormConfig OnChange = LabeledEditFnChange end object LabeledEditCT: TLabeledEdit - Left = 185 + Left = 193 Top = 20 Width = 40 Height = 21 @@ -6461,6 +6461,23 @@ object FormConfig: TFormConfig TabOrder = 2 OnChange = LabeledEditCTChange end + object LabeledEditT: TLabeledEdit + Left = 193 + Top = 108 + Width = 40 + Height = 21 + Hint = 'Temporisation de retomb'#233'e de la fonction F.' + EditLabel.Width = 173 + EditLabel.Height = 13 + EditLabel.Caption = 'Temporisation de retomb'#233'e (x100ms)' + EditLabel.Layout = tlBottom + LabelPosition = lpLeft + LabelSpacing = 10 + ParentShowHint = False + ShowHint = True + TabOrder = 3 + OnChange = LabeledEditTChange + end end object GroupBoxBloc: TGroupBox Left = 312 @@ -6482,7 +6499,7 @@ object FormConfig: TFormConfig Width = 153 Height = 21 Style = csDropDownList - ItemHeight = 0 + ItemHeight = 13 TabOrder = 0 OnChange = ComboBoxUSBTrChange end diff --git a/UnitConfig.pas b/UnitConfig.pas index c26da67..4851c28 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -513,6 +513,7 @@ type EditTempoSig: TEdit; Label15: TLabel; LabeledEditCr: TLabeledEdit; + LabeledEditT: TLabeledEdit; procedure ButtonAppliquerEtFermerClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ListBoxAigMouseDown(Sender: TObject; Button: TMouseButton; @@ -814,6 +815,7 @@ type procedure LabeledEditZoneChange(Sender: TObject); procedure EditTempoSigChange(Sender: TObject); procedure LabeledEditCrChange(Sender: TObject); + procedure LabeledEditTChange(Sender: TObject); private { Déclarations privées } @@ -972,10 +974,12 @@ EtatBoutonTCO=7; EtatMemoire=8; EtatZone=9; NomVAR='Fonction logique'; +// Opérateurs des fonctions NomOpET='Opérateur ET'; NomOpOU='Opérateur OU'; NomOpNonET='Opérateur Non ET'; NomOpNonOU='Opérateur Non OU'; +// Variables des fonctions NomEtatDCC='Etat DCC'; NomEtatDet='Etat détect./actionn.'; NomEtatBoutonTCO='Bouton TCO'; @@ -2673,16 +2677,16 @@ begin begin s:='B'+intToSTR(j)+','+blocUSB[j].afftrain+',BR'+intToSTR(blocUSB[j].rotatifM)+','+intToSTR(blocUSB[j].rotatifP)+','+intToSTR(blocUSB[j].clic)+ ','+intToSTR(blocUSB[j].increment)+ - ',B'+intToSTR(blocUSB[j].Bp1)+','+IntToSTR(blocUSB[j].Fbp1)+','+IntToSTR(blocUSB[j].Fnp1)+ - ',B'+intToSTR(blocUSB[j].Bp2)+','+IntToSTR(blocUSB[j].Fbp2)+','+IntToSTR(blocUSB[j].Fnp2)+ - ',B'+intToSTR(blocUSB[j].Bp3)+','+IntToSTR(blocUSB[j].Fbp3)+','+IntToSTR(blocUSB[j].Fnp3)+ - ',B'+intToSTR(blocUSB[j].Bp4)+','+IntToSTR(blocUSB[j].Fbp4)+','+IntToSTR(blocUSB[j].Fnp4)+ - ',B'+intToSTR(blocUSB[j].Bp5)+','+IntToSTR(blocUSB[j].Fbp5)+','+IntToSTR(blocUSB[j].Fnp5)+ - ',B'+intToSTR(blocUSB[j].Bp6)+','+IntToSTR(blocUSB[j].Fbp6)+','+IntToSTR(blocUSB[j].Fnp6)+ - ',B'+intToSTR(blocUSB[j].Bp7)+','+IntToSTR(blocUSB[j].Fbp7)+','+IntToSTR(blocUSB[j].Fnp7)+ - ',B'+intToSTR(blocUSB[j].Bp8)+','+IntToSTR(blocUSB[j].Fbp8)+','+IntToSTR(blocUSB[j].Fnp8)+ - ',B'+intToSTR(blocUSB[j].Bp9)+','+IntToSTR(blocUSB[j].Fbp9)+','+IntToSTR(blocUSB[j].Fnp9)+ - ',B'+intToSTR(blocUSB[j].Bp10)+','+IntToSTR(blocUSB[j].Fbp10)+','+IntToSTR(blocUSB[j].Fnp10); + ',B'+intToSTR(blocUSB[j].Bp1)+','+IntToSTR(blocUSB[j].Fbp1)+','+IntToSTR(blocUSB[j].Fnp1)+','+IntToSTR(blocUSB[j].Tbp1)+ + ',B'+intToSTR(blocUSB[j].Bp2)+','+IntToSTR(blocUSB[j].Fbp2)+','+IntToSTR(blocUSB[j].Fnp2)+','+IntToSTR(blocUSB[j].Tbp2)+ + ',B'+intToSTR(blocUSB[j].Bp3)+','+IntToSTR(blocUSB[j].Fbp3)+','+IntToSTR(blocUSB[j].Fnp3)+','+IntToSTR(blocUSB[j].Tbp3)+ + ',B'+intToSTR(blocUSB[j].Bp4)+','+IntToSTR(blocUSB[j].Fbp4)+','+IntToSTR(blocUSB[j].Fnp4)+','+IntToSTR(blocUSB[j].Tbp4)+ + ',B'+intToSTR(blocUSB[j].Bp5)+','+IntToSTR(blocUSB[j].Fbp5)+','+IntToSTR(blocUSB[j].Fnp5)+','+IntToSTR(blocUSB[j].Tbp5)+ + ',B'+intToSTR(blocUSB[j].Bp6)+','+IntToSTR(blocUSB[j].Fbp6)+','+IntToSTR(blocUSB[j].Fnp6)+','+IntToSTR(blocUSB[j].Tbp6)+ + ',B'+intToSTR(blocUSB[j].Bp7)+','+IntToSTR(blocUSB[j].Fbp7)+','+IntToSTR(blocUSB[j].Fnp7)+','+IntToSTR(blocUSB[j].Tbp7)+ + ',B'+intToSTR(blocUSB[j].Bp8)+','+IntToSTR(blocUSB[j].Fbp8)+','+IntToSTR(blocUSB[j].Fnp8)+','+IntToSTR(blocUSB[j].Tbp8)+ + ',B'+intToSTR(blocUSB[j].Bp9)+','+IntToSTR(blocUSB[j].Fbp9)+','+IntToSTR(blocUSB[j].Fnp9)+','+IntToSTR(blocUSB[j].Tbp9)+ + ',B'+intToSTR(blocUSB[j].Bp10)+','+IntToSTR(blocUSB[j].Fbp10)+','+IntToSTR(blocUSB[j].Fnp10)+','+IntToSTR(blocUSB[j].Tbp10); Writeln(fichierN,s); end; writeln(fichierN,'0'); @@ -3019,7 +3023,7 @@ begin end; if typ=EtatDet then begin - s:=s+fonction[fonc,i].train+' '+intToSTR(fonction[fonc,i].adresse)+' '+intToSTR(fonction[fonc,i].etat); + s:=s+intToSTR(fonction[fonc,i].adresse)+' '+intToSTR(fonction[fonc,i].etat)+' '+fonction[fonc,i].train; end; if typ=EtatBoutonTCO then begin @@ -3044,7 +3048,7 @@ begin end; if typ=EtatZone then begin - s:=s+fonction[fonc,i].train+' '+intToSTR(fonction[fonc,i].adresse)+' '+intToSTR(fonction[fonc,i].adresse2)+' '+intToSTR(fonction[fonc,i].etat); + s:=s+intToSTR(fonction[fonc,i].adresse)+' '+intToSTR(fonction[fonc,i].adresse2)+' '+intToSTR(fonction[fonc,i].etat)+' '+fonction[fonc,i].train; end; end; result:=s; @@ -5019,7 +5023,7 @@ const LessThanValue=-1; end; procedure compile_blocsUSB; - var n,id,i : integer; + var n,id,i,nv : integer; ss : string; begin n:=0; @@ -5028,6 +5032,7 @@ const LessThanValue=-1; if s<>'0' then begin s:=sOrigine; + nv:=Nbre_virgules(s); delete(s,1,1); val(s,i,erreur); // i=numéro de bloc usb de 1 à 10 if i>10 then i:=10; @@ -5050,11 +5055,16 @@ const LessThanValue=-1; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); - blocUsb[i].Bp1:=j; + blocUsb[i].Bp1:=j; // Bouton1 pour fonction F val(s,j,erreur);delete(s,1,erreur); - blocUsb[i].Fbp1:=j; + blocUsb[i].Fbp1:=j; // Fonction F val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp1:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp1:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5063,6 +5073,12 @@ const LessThanValue=-1; blocUsb[i].Fbp2:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp2:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp2:=j; // valeur de tempo + end; + delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5071,6 +5087,12 @@ const LessThanValue=-1; blocUsb[i].Fbp3:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp3:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp3:=j; // valeur de tempo + end; + delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5079,6 +5101,11 @@ const LessThanValue=-1; blocUsb[i].Fbp4:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp4:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp4:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5087,6 +5114,12 @@ const LessThanValue=-1; blocUsb[i].Fbp5:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp5:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp5:=j; // valeur de tempo + end; + delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5095,6 +5128,11 @@ const LessThanValue=-1; blocUsb[i].Fbp6:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp6:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp6:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5103,6 +5141,11 @@ const LessThanValue=-1; blocUsb[i].Fbp7:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp7:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp7:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5111,6 +5154,11 @@ const LessThanValue=-1; blocUsb[i].Fbp8:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp8:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp8:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5119,6 +5167,11 @@ const LessThanValue=-1; blocUsb[i].Fbp9:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp9:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp9:=j; // valeur de tempo + end; delete(s,1,1); // supprime B val(s,j,erreur);delete(s,1,erreur); @@ -5127,6 +5180,11 @@ const LessThanValue=-1; blocUsb[i].Fbp10:=j; val(s,j,erreur);delete(s,1,erreur); blocUsb[i].Fnp10:=j; + if nv>35 then + begin + val(s,j,erreur);delete(s,1,erreur); + blocUsb[i].tbp10:=j; // valeur de tempo + end; inc(n); end; @@ -7498,13 +7556,26 @@ begin editAdrIPCDM.Hint:='Adresse IP du PC sur lequel CDM rail s''exécute'+#13+'ou 127.0.0.1 pour indiquer ce pc'; ValueListEditor.Visible:=true; + ImageAffiche.stretch:=true; + ImageAffiche.Transparent:=true; + ImageAffiche.Picture.Bitmap.TransparentMode:=tmAuto; + ImageAffiche.Picture.Bitmap.TransparentColor:=clblue; + LabeledEditT.Hint:='Temporisation de retomnée de la fonction F'+#13+ + 'en x100 ms'+#13+ + 'Si 0 : pas de retombée'; + + ButtonAjOpEnfant.Hint:='Ajoute un opérateur'+#13+'-> ET'+#13+ + '-> OU'+#13+ + '-> NON_ET'+#13+ + '-> NON_OU'; + ButtonAjouteVar.Hint:='Ajoute une variable'+#13+'->'+NomFonc[5]+#13+'->'+NomFonc[6]+#13+'->'+NomFonc[7]+#13+'->'+NomFonc[8]+#13+'->'+NomFonc[9]; + ButtonAjouteVar.ShowHint:=true; // liste des paramètres du mode expert de la ValueListEditor // syntaxe des masques: // 0 : chiffre 9 : chiffre ou espace # : chiffre ou signe L : lettre ? : lettre ou espace // A : lettre ou chiffre a : lettre, chiffre ou espace & : tout caractère - with Liste[1] do begin Nom:='1. Seuil du nombre de détecteurs trop distants' ; @@ -8969,9 +9040,7 @@ begin croi:=pos('CROI',s)<>0 ; with formconfig do begin - ImageAffiche.Picture.Bitmap.TransparentMode:=tmAuto; - ImageAffiche.Picture.Bitmap.TransparentColor:=clblue; - ImageAffiche.Transparent:=true; + GroupBoxEtatTJD.Visible:=false; GroupBox21.Visible:=true; GroupBox10.Visible:=true; @@ -9020,6 +9089,8 @@ begin end; ImageAffiche.Picture.BitMap:=Imagetjd.Picture.Bitmap; + ImageAffiche.Picture.BitMap.Canvas.Draw(0,0,ImageTJD.Picture.Bitmap); + labelBG.Caption:='S'; Edit_HG.Visible:=true; EditAigTriple.Visible:=false; @@ -9121,7 +9192,8 @@ begin ComboBoxAig.ItemIndex:=0; if not(tri) then begin - ImageAffiche.Picture.BitMap:=Imageaig.Picture.Bitmap; + ImageAffiche.Picture.BitMap:=Imagetjd.Picture.Bitmap; + ImageAffiche.Picture.BitMap.Canvas.Draw(0,0,Imageaig.Picture.Bitmap); EditDevieS2.Visible:=false; EditAigTriple.Visible:=false; end; @@ -9167,7 +9239,10 @@ begin LabelTJD2.Visible:=false; EditPointe_BG.ReadOnly:=false; labelBG.Caption:='P'; + ImageAffiche.Picture.BitMap:=ImageTri.Picture.Bitmap; + ImageAffiche.Picture.BitMap.Canvas.Draw(0,0,ImageTri.Picture.Bitmap); + EditDevieS2.Visible:=true; Label18.Visible:=true; adr2:=aiguillage[index].AdrTriple; @@ -19333,6 +19408,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp1); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp1); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp1); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp1); end; procedure TFormConfig.ShapeB2MouseDown(Sender: TObject; @@ -19344,6 +19420,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp2); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp2); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp2); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp2); end; procedure TFormConfig.ShapeB3MouseDown(Sender: TObject; @@ -19355,6 +19432,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp3); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp3); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp3); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp3); end; procedure TFormConfig.ShapeB4MouseDown(Sender: TObject; @@ -19366,6 +19444,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp4); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp4); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp4); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp4); end; procedure TFormConfig.ShapeB5MousDown(Sender: TObject; @@ -19377,6 +19456,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp5); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp5); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp5); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp5); end; procedure TFormConfig.ShapeB6MouseDown(Sender: TObject; @@ -19388,6 +19468,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp6); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp6); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp6); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp6); end; procedure TFormConfig.ShapeB7MouseDown(Sender: TObject; @@ -19399,6 +19480,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp7); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp7); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp7); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp7); end; procedure TFormConfig.ShapeB8MouseDown(Sender: TObject; @@ -19410,6 +19492,7 @@ begin LabeledEditCT.Text:=intToSTR(blocUSB[NumBlocUSB].Bp8); LabeledEditF.Text:=intToSTR(blocUSB[NumBlocUSB].Fbp8); LabeledEditFn.Text:=intToSTR(blocUSB[NumBlocUSB].Fnp8); + LabeledEditT.Text:=intToSTR(blocUSB[NumBlocUSB].Tbp8); end; procedure TFormConfig.LabeledEditCTChange(Sender: TObject); @@ -19493,6 +19576,8 @@ begin LabeledEditClic.Text:=''; LabeledEditF.Text:=''; LabeledEditFn.Text:=''; + LabeledEditT.Text:=''; + ShapeBR.Brush.Color:=clGray; shapeB1.Brush.Color:=clGray; shapeB2.Brush.Color:=clGray; @@ -19506,6 +19591,32 @@ begin clic_BRM; end; + +procedure TFormConfig.LabeledEditTChange(Sender: TObject); +var i,erreur : integer; +begin + val(LabeledEditT.Text,i,erreur); + if (erreur<>0) or (i<0) or (i>30) then + begin + labelInfo.Caption:='Erreur : valeur de 0 à 30'; + exit; + end; + labelInfo.Caption:=''; + case boutonbloc of + 1 : blocUSB[NumBlocUSB].Tbp1:=i; + 2 : blocUSB[NumBlocUSB].Tbp2:=i; + 3 : blocUSB[NumBlocUSB].Tbp3:=i; + 4 : blocUSB[NumBlocUSB].Tbp4:=i; + 5 : blocUSB[NumBlocUSB].Tbp5:=i; + 6 : blocUSB[NumBlocUSB].Tbp6:=i; + 7 : blocUSB[NumBlocUSB].Tbp7:=i; + 8 : blocUSB[NumBlocUSB].Tbp8:=i; + 9 : blocUSB[NumBlocUSB].Tbp9:=i; + 10 : blocUSB[NumBlocUSB].Tbp10:=i; + end; +end; + + procedure TFormConfig.LabeledEditFChange(Sender: TObject); var i,erreur : integer; begin @@ -19831,6 +19942,7 @@ begin end; end; + end. diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index 5eae251..65f28aa 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -16,7 +16,6 @@ object FormPrinc: TFormPrinc Menu = MainMenu1 OldCreateOrder = False Position = poDefault - Scaled = False Visible = True OnClose = FormClose OnCreate = FormCreate diff --git a/UnitPrinc.pas b/UnitPrinc.pas index c8f87a6..4a5912e 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -1,5 +1,5 @@ unit Unitprinc; -// 11/06/2025 +// 21/11/2025 (******************************************** Programme signaux complexes Graphique Lenz Composants ClientSocket et ServeurSocket pour les connexions réseau socket @@ -1174,6 +1174,8 @@ var Bp1,bp2,bp3,bp4,bp5,bp6,bp7,bp8,bp9,bp10 : integer; Fbp1,fbp2,fbp3,Fbp4,fbp5,fbp6,Fbp7,fbp8,fbp9,Fbp10 : integer; // fonctions F des BP Fnp1,fnp2,fnp3,Fnp4,fnp5,fnp6,Fnp7,fnp8,fnp9,Fnp10 : integer; // état F des BP + Tbp1,Tbp2,Tbp3,Tbp4,Tbp5,Tbp6,Tbp7,Tbp8,Tbp9,Tbp10 : integer; // temps de retombée de la fonction F + Tcp : array[1..10] of integer; // valeur courante de la tempo de retombée end; Memoire : array[0..MaxMemoires] of integer; @@ -4995,6 +4997,21 @@ begin if Signaux[result].adresse<>adresse then result:=0; end; +// trouve l'index du signal de l'adresse d'un signal qui n'est pas sa première adresse +function index_signal_quelc(adresse : integer) : integer; +var i,adr : integer; + trouve : boolean; +begin + trouve:=false; + adr:=signaux[NbreSignaux].adresse; // adresse du dernier signal + i:=index_signal(adr); + repeat + trouve:=adresse>=signaux[i].Adresse ; + dec(i); + until trouve or (i>NbreSignaux); + if trouve then result:=i+1 else result:=0; +end; + // renvoie l'index de l'aiguillage dans le tableau aiguillages[] en fonction de son adresse // si pas trouvé renvoie 0 function Index_Aig_V1(adresse : integer) : integer; @@ -5203,6 +5220,7 @@ begin font.Style:=[fsBold]; Parent:=Formprinc.ScrollBoxSig; font.color:=clBlack; + font.size:=round(RedFonte*10); width:=100;height:=20; Top:=HtImg+((HtImg+EspY+20)*((rang-1) div NbreImagePLigne)); Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); @@ -5793,8 +5811,9 @@ begin chaine_CDM_Acc:=so+s; end; -// ajoute une tache en tableau taches[] pour le timer -// ttache=1 : pilote accessoire... +// ajoute une tache dans le tableau taches[] +// pour pilotage dans le timer. On pilotera une tache par tick timer (1/10ème de s) +// ttache=ttacheAcc (pilote acc), ttacheVit (vitesse train) , ttacheFF (fonctionF) , ttacheTempo (temporisation) // temporisation pour le timer avant action // destinataire (1=CDM 2=XpressNet 3=Dccpp) // commande : chaine de pilotage pour le destinataire @@ -5824,7 +5843,7 @@ end; // envoie une fonction F à une loco via CDM ou socket ou usb // si c'est une fonction F>12 elle peut être envoyée en XpressNet -procedure envoie_fonction(fonction,etat : integer;train : string); +procedure envoie_fonction(fonction,etat : integer;train : string); var loco : integer; s : string; begin @@ -5943,7 +5962,7 @@ end; // appellé par le hooker clavier function traite_code_blocUSB(code: integer) : integer; -var vitesse,f,n,i : integer; +var vitesse,f,n,i,t : integer; condValide,EtatValide,BlocSelec : boolean; s : string; begin @@ -6060,8 +6079,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp1; // numéro de fonction F - n:=blocUSB[1].Fnp1; + f:=blocUSB[i].Fbp1; // numéro de fonction F + n:=blocUSB[i].Fnp1; + blocUSB[i].Tcp[1]:=blocUSB[1].Tbp1; // affecter la tempo de retombée à la valeur courante s:=trains[IdTrainUSB].nom_train; Affiche('B1 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6076,8 +6096,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp2; // numéro de fonction F - n:=blocUSB[1].Fnp2; + f:=blocUSB[i].Fbp2; // numéro de fonction F + n:=blocUSB[i].Fnp2; + blocUSB[i].Tcp[i]:=blocUSB[1].Tbp2; s:=trains[IdTrainUSB].nom_train; Affiche('B2 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6092,8 +6113,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp3; // numéro de fonction F - n:=blocUSB[1].Fnp3; + f:=blocUSB[i].Fbp3; // numéro de fonction F + n:=blocUSB[i].Fnp3; + blocUSB[i].Tcp[3]:=blocUSB[i].Tbp3; s:=trains[IdTrainUSB].nom_train; Affiche('B3 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6108,8 +6130,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp4; // numéro de fonction F - n:=blocUSB[1].Fnp4; + f:=blocUSB[i].Fbp4; // numéro de fonction F + n:=blocUSB[i].Fnp4; + blocUSB[i].Tcp[4]:=blocUSB[4].Tbp4; s:=trains[IdTrainUSB].nom_train; Affiche('B4 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6124,8 +6147,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp5; // numéro de fonction F - n:=blocUSB[1].Fnp5; + f:=blocUSB[i].Fbp5; // numéro de fonction F + n:=blocUSB[i].Fnp5; + blocUSB[i].Tcp[5]:=blocUSB[i].Tbp5; s:=trains[IdTrainUSB].nom_train; Affiche('B4Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6140,8 +6164,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp6; // numéro de fonction F - n:=blocUSB[1].Fnp6; + f:=blocUSB[i].Fbp6; // numéro de fonction F + n:=blocUSB[i].Fnp6; + blocUSB[i].Tcp[6]:=blocUSB[i].Tbp6; s:=trains[IdTrainUSB].nom_train; Affiche('B6 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6156,8 +6181,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp7; // numéro de fonction F - n:=blocUSB[1].Fnp7; + f:=blocUSB[i].Fbp7; // numéro de fonction F + n:=blocUSB[i].Fnp7; + blocUSB[i].Tcp[7]:=blocUSB[i].Tbp7; s:=trains[IdTrainUSB].nom_train; Affiche('B7 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -6172,8 +6198,9 @@ begin result:=255; exit; end; - f:=blocUSB[1].Fbp8; // numéro de fonction F - n:=blocUSB[1].Fnp8; + f:=blocUSB[i].Fbp8; // numéro de fonction F + n:=blocUSB[i].Fnp8; + blocUSB[i].Tcp[8]:=blocUSB[1].Tbp8; s:=trains[IdTrainUSB].nom_train; Affiche('B8 Fonction F'+intToSTR(f)+' à '+intToSTR(n)+' train '+s,clWhite); envoie_fonction(f,n,s); @@ -7165,8 +7192,8 @@ var index,mode,code,aspect,cible,combine,offset,sortie : integer; if (testBit(selection,i)) then begin octet:=1;end else begin octet:=2 ;end; Pilote_acc(adresse+i,octet,signal); - if (Cdm_connecte or portCommOuvert or parSocketLenz) then - begin + if (Cdm_connecte or portCommOuvert or parSocketLenz) then + begin if not modetache then begin Sleep(Tempo_Signal); @@ -17076,16 +17103,17 @@ begin if af=2 then envoi_socket_periph_act(i,ida); // numéro d'actionneur end; - // 12 actionneur pour fonction train + // 12 action pour fonction train if (op=ActionFonctionF) then begin - trainDest:=Tablo_Action[i].tabloOp[ida].train; - // exécution de la fonction F vers CDM + trainDest:=Tablo_Action[i].tabloOp[ida].train ; etat:=Tablo_Action[i].tabloop[ida].etat; - - tr:=Tablo_Action[i].tabloop[ida].TempoF/10; + t:=Tablo_Action[i].tabloop[ida].TempoF; + tr:=Tablo_Action[i].tabloop[ida].TempoF; // pour affichage uniquement Affiche(st+' TrainDest='+trainDest+' F'+IntToSTR(Tablo_Action[i].tabloOp[ida].fonctionF)+':'+intToSTR(etat)+' t='+Format('%.1f', [tr])+'s',clyellow); + envoie_fonction(Tablo_Action[i].TabloOp[ida].fonctionF,etat,trainDest); + // Tempo de retombée de la fonction F Tablo_Action[i].tabloOp[ida].TrainCourant:=trainDest; // pour mémoriser le train pour la retombée de la fonction Tablo_Action[i].TabloOp[ida].TempoCourante:=Tablo_Action[i].tabloop[ida].TempoF; end; @@ -18018,35 +18046,7 @@ begin end; end; -// pilote une sortie à 0 à l'interface dont l'adresse est à 1 ou 2 (octet) -procedure Pilote_acc0_X(adresse : integer;octet : byte); -var groupe : integer ; - fonction : byte; - s : string; -begin - if (portCommOuvert or parSocketLenz) then - begin - if debug_dec_sig then AfficheDebug('Tick='+IntToSTR(Tick)+' signal '+intToSTR(adresse)+' '+intToSTR(octet)+' à 0',clorange); - if protocole=1 then - begin - groupe:=(adresse-1) div 4; - fonction:=((adresse-1) mod 4)*2 + (octet-1); - s:=#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie - s:=checksum(s); - if avecAck then envoi(s) else envoi_ss_ack(s); - end; - if protocole=2 then - begin - //la RAZ d'une sortie n'existe pas en DCC+! - end; - end; - if cdm_connecte then - begin - // remise à 0 - s:=chaine_CDM_Acc(adresse,0); - envoi_CDM(s); - end; -end; + // envoi d'une chaîne Com_IPC à CDM par socket, puis attend l'ack ou le nack function envoi_CDM(s : string) : boolean; @@ -18122,10 +18122,9 @@ begin s:=chaine_CDM_Acc(adresse,pilotageCDM); // pilotage actif de l'accessoire---------------- - //if acc<>signal then - tache(ttacheAcc,0,ttDestCDM,s); - // TypeTache,tempo,destinataire,chaine - // else tache(ttacheAcc,signaux[index].Tempo,ttDestCDM,s); + if acc<>signal then tache(ttacheAcc,0,ttDestCDM,s) // TypeTache,tempo,destinataire,chaine + else tache(ttacheAcc,signaux[index_signal_quelc(adresse)].Tempo,ttDestCDM,s); + // si l'accessoire est un signal et sans raz des signaux, sortir if (acc=signal) and not(Raz_Acc_signaux) then exit; if Acc=AigP then @@ -18147,7 +18146,7 @@ begin // pilotage par USB ou par éthernet de la centrale ------------ if (portCommOuvert or parSocketLenz) and not CDM_connecte then - begin + begin if hors_tension then begin Affiche('Voie hors tension, pas de pilotage d''accessoires',clRose); @@ -18165,9 +18164,9 @@ begin if debug_dec_sig and (acc=signal) then AfficheDebug('Tick='+IntToSTR(Tick)+' signal '+intToSTR(adresse)+' '+intToSTR(pilotage),clorange); //if avecAck then envoi(s) else envoi_ss_ack(s); // envoi de la trame avec/sans attente Ack - - //if acc<>signal then tache(ttacheAcc,0,ttDestXpressNet,s) else tache(ttacheAcc,signaux[index].Tempo,ttDestCDM,s); - tache(ttacheAcc,0,ttDestXpressNet,s); + if acc<>signal then tache(ttacheAcc,0,ttDestXpressNet,s) + else tache(ttacheAcc,signaux[index_signal_quelc(adresse)].Tempo,ttDestXpressNet,s); + //tache(ttacheAcc,0,ttDestXpressNet,s); // si l'accessoire est un signal et sans raz des signaux, sortir if (acc=signal) and not(Raz_Acc_signaux) then exit; @@ -18218,6 +18217,43 @@ begin end; + +// pilote une sortie à 0 à l'interface dont l'adresse est à 1 ou 2 (octet) +procedure Pilote_acc0_X(adresse : integer;octet : byte); +var groupe : integer ; + fonction : byte; + s : string; +begin + if (portCommOuvert or parSocketLenz) then + begin + if debug_dec_sig then AfficheDebug('Tick='+IntToSTR(Tick)+' signal '+intToSTR(adresse)+' '+intToSTR(octet)+' à 0',clorange); + if protocole=1 then + begin + groupe:=(adresse-1) div 4; + fonction:=((adresse-1) mod 4)*2 + (octet-1); + s:=#$52+Char(groupe)+char(fonction or $80); // désactiver la sortie + s:=checksum(s); + + if ModeTache then tache(ttacheAcc,0,ttDestXpressNet,s) + else + begin + if avecAck then envoi(s) else envoi_ss_ack(s); + end; + end; + if protocole=2 then + begin + //la RAZ d'une sortie n'existe pas en DCC+! + end; + end; + if cdm_connecte then + begin + // remise à 0 + s:=chaine_CDM_Acc(adresse,0); + if ModeTache then tache(ttacheAcc,0,ttDestCDM,s) + else envoi_CDM(s); + end; +end; + // pilote aiguillage sous condition (accessoire) avec condition : l'aiguillage doit être réservé par AdrTrain (adrTrain<>0) ou sans condition (adrTrain=0) // acc : AigP (aiguillage) ou signal function pilote_acc_sc(adresse : integer;octet : byte;Acc : TAccessoire;adrTrain : integer) : boolean; @@ -20972,14 +21008,18 @@ begin {$IF CompilerVersion >= 28.0} RedFonte:=Screen.DefaultPixelsPerInch/Screen.PixelsPerInch; // pour la réduction des fontes : windows mise à l'échelle du texte + FormatSettings:=tFormatSettings.Create; {$ELSE} RedFonte:=100/Screen.PixelsPerInch; // pour la réduction des fontes : windows mise à l'échelle du texte - {$IFEND} - - ButtonEssai.Visible:=not(diffusion); GetLocaleFormatSettings(0,FormatSettings); + {$IFEND} + FormatSettings.DecimalSeparator:='.'; + ButtonEssai.Visible:=not(diffusion); + + + FenRich.MaxLength:=$7FFFFFF0; NbDecodeur:=12; NbDecodeurdeBase:=NbDecodeur; @@ -21539,7 +21579,7 @@ end; {$IF CompilerVersion >= 28.0} -// évènement réception d'une trame sur le port COM USB centrale Xpressnet +// évènement réception d'une trame sur le port COM USB centrale Xpressnet avec Asyncpro procedure TFormPrinc.RecuInterface(Sender: TObject;Count : word); var i,tev,l : integer; s : string; @@ -22175,6 +22215,31 @@ begin end; end; + // tempo retombée fonction F bloc USB + for i:=1 to 10 do + begin + for j:=1 to 10 do + begin + a:=blocUSB[i].tcp[j]; // tempo courante du bouton j du bloc i + if a<>0 then + begin + dec(a); + blocUSB[i].tcp[j]:=a; + if a=0 then + begin + s:=lowercase(blocUSB[i].AffTrain); + // si bloc usb pas affecté à un train + if (s='') or (pos('pas d',s)<>0) then + begin + s:=trains[idTrainClic].nom_train; // nom du train cliqué + end; + envoie_fonction(blocUSB[i].Fbp1,0,s); + Affiche('B='+intToSTR(i)+' Fonction F'+inttoSTR(blocUSB[i].Fbp1)+' à 0 Train '+s,clyellow); + end; + end; + end; + end; + // tempo retombée actionneur for i:=1 to maxTablo_act do begin diff --git a/verif_version.pas b/verif_version.pas index 425137b..ba56a51 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -26,7 +26,7 @@ var f : textFile; Const -VersionSC = '10.77'; // sert à la comparaison de la version publiée +VersionSC = '10.78'; // sert à la comparaison de la version publiée SousVersion=' '; // A B C ... en cas d'absence de sous version mettre un espace // pour unzip SHCONTCH_NOPROGRESSBOX=4; diff --git a/versions.txt b/versions.txt index 19877ba..a9d0476 100644 --- a/versions.txt +++ b/versions.txt @@ -354,6 +354,11 @@ version 10.76 : Ajout du copier/coller des routes de trains. Correction du bug de la 10.74 sur le pilotage des signaux. version 10.77 : Amélioration diverses. Correction du non affichage de la position des aiguillages dans le TCO. +version 10.78 : Correction affichage aiguillages dans l'écran de config des versions D13. + Correction pilotage des décodeurs LEB en mode binaire. + Ajout temps de retombée fonction F trains dans les blocs claviers USB. + +