diff --git a/Notice avancée pour les signaux complexes GL.pdf b/Notice avancée pour les signaux complexes GL.pdf index f3a9605..1243a70 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_V4.5.pdf b/Notice d'utilisation des signaux_complexes_GL_V4.5.pdf index 4a00898..9783c1b 100644 Binary files a/Notice d'utilisation des signaux_complexes_GL_V4.5.pdf and b/Notice d'utilisation des signaux_complexes_GL_V4.5.pdf differ diff --git a/UnitConfig.pas b/UnitConfig.pas index 7337887..be422f7 100644 --- a/UnitConfig.pas +++ b/UnitConfig.pas @@ -2319,11 +2319,12 @@ begin Aiguillage[i].PosInit:=const_inconnu; // position inconnue Aiguillage[i].temps:=5 ; Aiguillage[i].inversionCDM:=0; + Aiguillage[i].EtatTJD:=4; end; for i:=1 to 1024 do begin Detecteur[i].etat:=false; - Detecteur[i].train:='0'; + //Detecteur[i].train:='0'; Ancien_detecteur[i]:=false; end; @@ -2905,15 +2906,18 @@ begin RadioButtonTJD2.Checked:=true;RadioButtonTJD4.Checked:=false; EditP1.Visible:=false;EditP2.Visible:=false;EditP3.Visible:=false;EditP4.Visible:=false; LabelTJD1.Visible:=false;LabelTJD2.Visible:=false; - end; - if aiguillage[ind].EtatTJD=4 then - begin + LabelInfo.Caption:=''; + end + else if aiguillage[ind].EtatTJD=4 then + begin RadioButtonTJD2.Checked:=false;RadioButtonTJD4.Checked:=true; EditP1.Visible:=true;EditP2.Visible:=true;EditP3.Visible:=true;EditP4.Visible:=true; LabelTJD1.Visible:=true;LabelTJD2.Visible:=true; - end; + LabelInfo.Caption:=''; + end + else LabelInfo.Caption:='Nombre d''états de la TJD/S inconnu'; end; - + if tjs then begin ComboBoxAig.ItemIndex:=2; @@ -3276,7 +3280,7 @@ begin Label17.Width:=228; LabelDetAss.visible:=true; LabelElSuiv.visible:=true; - + label43.Visible:=true; EditDet1.Visible:=true;EditDet2.Visible:=true;EditDet3.Visible:=true;EditDet4.Visible:=true; EditSuiv1.Visible:=true;EditSuiv2.Visible:=true;EditSuiv3.Visible:=true;EditSuiv4.Visible:=true; @@ -3329,6 +3333,7 @@ begin else begin // directionnel Label17.Caption:='Conditions d''affichage du feu directionnel :'; + label43.Visible:=false; LabelDetAss.visible:=false; LabelElSuiv.visible:=false; EditDet1.Visible:=false;EditDet2.Visible:=false;EditDet3.Visible:=false;EditDet4.Visible:=false; @@ -3509,7 +3514,7 @@ end; // affiche les champs de l'actionneur PN en fonction du tableau en fonction de l'index du richedit procedure aff_champs_PN(i : integer); -var adresse,erreur,v : integer; +var adresse,erreur,j,v : integer; trouve : boolean; s : string; begin @@ -3567,32 +3572,35 @@ begin begin // par zone de détecteurs v:=Tablo_PN[i].nbvoies; - EditZdet1V1F.text:=intToSTR(Tablo_PN[i].voie[1].detZ1F); - EditZdet2V1F.text:=intToSTR(Tablo_PN[i].voie[1].detZ2F); - EditZdet1V1O.text:=intToSTR(Tablo_PN[i].voie[1].detZ1O); - EditZdet2V1O.text:=intToSTR(Tablo_PN[i].voie[1].detZ2O); - if v>=2 then - begin - EditZdet1V2F.text:=intToSTR(Tablo_PN[i].voie[2].detZ1F); - EditZdet2V2F.text:=intToSTR(Tablo_PN[i].voie[2].detZ2F); - EditZdet1V2O.text:=intToSTR(Tablo_PN[i].voie[2].detZ1O); - EditZdet2V2O.text:=intToSTR(Tablo_PN[i].voie[2].detZ2O); + j:=Tablo_PN[i].voie[1].detZ1F;if j<>0 then + begin + EditZdet1V1F.text:=intToSTR(j); + EditZdet2V1F.text:=intToSTR(Tablo_PN[i].voie[1].detZ2F); + EditZdet1V1O.text:=intToSTR(Tablo_PN[i].voie[1].detZ1O); + EditZdet2V1O.text:=intToSTR(Tablo_PN[i].voie[1].detZ2O); + if v>=2 then + begin + EditZdet1V2F.text:=intToSTR(Tablo_PN[i].voie[2].detZ1F); + EditZdet2V2F.text:=intToSTR(Tablo_PN[i].voie[2].detZ2F); + EditZdet1V2O.text:=intToSTR(Tablo_PN[i].voie[2].detZ1O); + EditZdet2V2O.text:=intToSTR(Tablo_PN[i].voie[2].detZ2O); + end; + if v>=3 then + begin + EditZdet1V3F.text:=intToSTR(Tablo_PN[i].voie[3].detZ1F); + EditZdet2V3F.text:=intToSTR(Tablo_PN[i].voie[3].detZ2F); + EditZdet1V3O.text:=intToSTR(Tablo_PN[i].voie[3].detZ1O); + EditZdet2V3O.text:=intToSTR(Tablo_PN[i].voie[3].detZ2O); + end; + if v>=4 then + begin + EditZdet1V4F.text:=intToSTR(Tablo_PN[i].voie[4].detZ1F); + EditZdet2V4F.text:=intToSTR(Tablo_PN[i].voie[4].detZ2F); + EditZdet1V4O.text:=intToSTR(Tablo_PN[i].voie[4].detZ1O); + EditZdet2V4O.text:=intToSTR(Tablo_PN[i].voie[4].detZ2O); + end; end; - if v>=3 then - begin - EditZdet1V3F.text:=intToSTR(Tablo_PN[i].voie[3].detZ1F); - EditZdet2V3F.text:=intToSTR(Tablo_PN[i].voie[3].detZ2F); - EditZdet1V3O.text:=intToSTR(Tablo_PN[i].voie[3].detZ1O); - EditZdet2V3O.text:=intToSTR(Tablo_PN[i].voie[3].detZ2O); - end; - if v>=4 then - begin - EditZdet1V4F.text:=intToSTR(Tablo_PN[i].voie[4].detZ1F); - EditZdet2V4F.text:=intToSTR(Tablo_PN[i].voie[4].detZ2F); - EditZdet1V4O.text:=intToSTR(Tablo_PN[i].voie[4].detZ1O); - EditZdet2V4O.text:=intToSTR(Tablo_PN[i].voie[4].detZ2O); - end; - end; + end; end; end end; @@ -4058,7 +4066,10 @@ begin adr2:=aiguillage[index].Ddroit; // adresse homologue index:=Index_Aig(Adr2); - aiguillage[index].etatTJD:=2; + if index<>0 then + begin + aiguillage[index].etatTJD:=2; + end; s:=encode_aig(index); formconfig.RichAig.Lines[index-1]:=s; end; @@ -4085,8 +4096,11 @@ begin adr2:=aiguillage[index].Ddroit; // adresse homologue index:=Index_Aig(Adr2); - aiguillage[index].etatTJD:=4; - aiguillage[index].modifie:=true; + if index<>0 then + begin + aiguillage[index].etatTJD:=4; + aiguillage[index].modifie:=true; + end; s:=encode_aig(index); formconfig.RichAig.Lines[index-1]:=s; end; @@ -4101,8 +4115,11 @@ begin Val(s,adrAig,erreur); if AdrAig=0 then exit; index:=Index_Aig(AdrAig); - aiguillage[index].vitesse:=30; - aiguillage[index].modifie:=true; + if index<>0 then + begin + aiguillage[index].vitesse:=30; + aiguillage[index].modifie:=true; + end; s:=encode_aig(index); formconfig.RichAig.Lines[ligneclicAig]:=s; end; @@ -4117,8 +4134,11 @@ begin Val(s,adrAig,erreur); if AdrAig=0 then exit; index:=Index_Aig(AdrAig); - aiguillage[Index].vitesse:=60; - aiguillage[Index].modifie:=true; + if index<>0 then + begin + aiguillage[Index].vitesse:=60; + aiguillage[Index].modifie:=true; + end; s:=encode_aig(index); formconfig.RichAig.Lines[ligneclicAig]:=s; end; @@ -4143,7 +4163,6 @@ begin end; - // cliqué sur liste feux procedure TFormConfig.RichSigMouseDown(Sender: TObject;Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var lc,i : integer; @@ -4564,6 +4583,11 @@ begin clicliste:=true; LabelInfo.caption:=''; raz_champs_act; + + // désactiver la ligne PN + RE_ColorLine(Formconfig.RichPN,LigneCliqueePN,ClAqua); + lignecliqueePN:=-1; + with RichAct do begin i:=Selstart; @@ -4619,18 +4643,15 @@ begin if FormConfig.PageControl.ActivePage=FormConfig.TabSheetAct then with Formconfig do begin - if radioButtonLoc.Checked or RadioButtonAccess.Checked then + train:=EditTrainDecl.Text; + if train='' then begin - train:=EditTrainDecl.Text; - if train='' then - begin - LabelInfo.caption:='Erreur train';exit - end else LabelInfo.caption:=' '; + LabelInfo.caption:='Erreur train';exit + end else LabelInfo.caption:=' '; - tablo_actionneur[ligneClicAct+1].trainDecl:=train; - s:=encode_act_loc_son(ligneClicAct+1); - RichAct.Lines[ligneClicAct]:=s; - end; + tablo_actionneur[ligneClicAct+1].trainDecl:=train; + s:=encode_act_loc_son(ligneClicAct+1); + RichAct.Lines[ligneClicAct]:=s; end; end; @@ -5091,6 +5112,11 @@ begin editAdrFerme.Text:='';EditCmdFerme.text:=''; editAdrOuvre.Text:='';EditCdeOuvre.text:=''; + + // désactive la sélection des actionneurs + RE_ColorLine(Formconfig.RichAct,ligneclicAct,ClAqua); + ligneclicAct:=-1; + with RichPN do begin i:=Selstart; @@ -5214,7 +5240,9 @@ begin Val(s,act,erreur); if (erreur<>0) then begin - LabelInfo.caption:='Erreur adresse actionneur voie 1 ferme';exit + LabelInfo.caption:='Erreur adresse actionneur voie 1 ferme'; + tablo_PN[lignecliqueePN+1].voie[1].ActFerme:=0; + exit end else LabelInfo.caption:=' '; tablo_PN[lignecliqueePN+1].voie[1].ActFerme:=act; s:=encode_act_PN(lignecliqueePN+1); @@ -5362,6 +5390,10 @@ begin inc(maxTablo_act); i:=MaxTablo_act; + // désactiver la ligne PN + RE_ColorLine(Formconfig.RichPN,LigneCliqueePN,ClAqua); + lignecliqueePN:=-1; + radioButtonLoc.Checked:=true; Tablo_actionneur[maxtablo_act].act:=false; Tablo_actionneur[maxtablo_act].loco:=true; @@ -5397,6 +5429,10 @@ begin inc(nbrePN); i:=nbrePN; + // désactive la sélection des actionneurs + RE_ColorLine(Formconfig.RichAct,ligneclicAct,ClAqua); + ligneclicAct:=-1; + Tablo_PN[i].NbVoies:=1; s:=encode_act_pn(i); @@ -5410,7 +5446,20 @@ begin Selstart:=RichPN.GetTextLen-1; Perform(EM_SCROLLCARET,0,0); end; - + + editV1F.Text:='';editV1O.Text:=''; + editV2F.Text:='';editV2O.Text:=''; + editV3F.Text:='';editV3O.Text:=''; + editV4F.Text:='';editV4O.Text:=''; + EditZdet1V1F.text:='';EditZdet2V1F.text:=''; + EditZdet1V1O.text:='';EditZdet2V1O.text:=''; + EditZdet1V2F.text:='';EditZdet2V2F.text:=''; + EditZdet1V2O.text:='';EditZdet2V2O.text:=''; + EditZdet1V3F.text:='';EditZdet2V3F.text:=''; + EditZdet1V3O.text:='';EditZdet2V3O.text:=''; + EditZdet1V4F.text:='';EditZdet2V4F.text:=''; + EditZdet1V4O.text:='';EditZdet2V4O.text:=''; + GroupBoxRadio.Visible:=false; LabelInfo.caption:=''; LigneCliqueePN:=i-1; @@ -5463,6 +5512,7 @@ end; procedure TFormConfig.ButtonSupPNClick(Sender: TObject); var i,index,adr : integer; + ac,pn : boolean; s: string; begin if affevt then affiche('Evt bouton Sup PN',clyellow); @@ -5470,8 +5520,17 @@ begin if (i=-1) then exit; index:=i+1; // passe en index tableau + pn:=false; adr:=tablo_PN[index].voie[1].ActFerme; - s:='Voulez-vous supprimer l''actionneur '+IntToSTR(adr)+'?'; + ac:=adr<>0 ; // type actionneur + if adr=0 then + begin + adr:=tablo_PN[index].voie[1].DetZ1F; + pn:=adr<>0; + end; + + if ac then s:='Voulez-vous supprimer l''actionneur '+IntToSTR(adr)+'?'; + if pn then s:='Voulez-vous supprimer l''actionneur de zone '+IntToSTR(adr)+'-'+inttostr(tablo_PN[index].voie[1].DetZ1O)+'?'; if Application.MessageBox(pchar(s),pchar('confirm'), MB_YESNO or MB_DEFBUTTON2 or MB_ICONQUESTION)=idNo then exit; Affiche('Suppression de l''actionneur index='+IntToSTR(index)+' adresse='+IntToSTR(adr),clOrange); @@ -7619,7 +7678,7 @@ begin val(EditAct2.Text,Adr2,erreur); if erreur=0 then begin - Event_act(adr,adr2,etat,'X'); + Event_act(adr,adr2,etat,''); end; end; diff --git a/UnitDebug.dcu b/UnitDebug.dcu index 111ed16..a31ad89 100644 Binary files a/UnitDebug.dcu and b/UnitDebug.dcu differ diff --git a/UnitPrinc.dcu b/UnitPrinc.dcu index b5e2a58..7a4db3b 100644 Binary files a/UnitPrinc.dcu and b/UnitPrinc.dcu differ diff --git a/UnitPrinc.dfm b/UnitPrinc.dfm index a5012c2..8460877 100644 --- a/UnitPrinc.dfm +++ b/UnitPrinc.dfm @@ -1613,9 +1613,9 @@ object FormPrinc: TFormPrinc Caption = 'Codification des aiguillages' OnClick = Codificationdesaiguillages1Click end - object Codificationdesfeux1: TMenuItem - Caption = 'Codification des feux' - OnClick = Codificationdesfeux1Click + object Codificationdessignaux: TMenuItem + Caption = 'Codification des signaux' + OnClick = CodificationdessignauxClick end object Codificationdesactionneurs1: TMenuItem Caption = 'Codification des actionneurs' @@ -1678,6 +1678,10 @@ object FormPrinc: TFormPrinc object N7: TMenuItem Caption = '-' end + object LancerCDMrail1: TMenuItem + Caption = 'Lancer et connecter CDM rail' + OnClick = LancerCDMrail1Click + end object ConnecterCDMrail: TMenuItem Caption = 'Connecter CDM rail' OnClick = ConnecterCDMrailClick @@ -1691,7 +1695,7 @@ object FormPrinc: TFormPrinc Caption = 'Divers' object Config: TMenuItem Caption = 'Configuration' - Hint = 'Modifie les variables de configuration sans sauvegarde' + Hint = 'Modifie les variables de configuration' OnClick = ConfigClick end object Vrifierlacohrence: TMenuItem @@ -1711,6 +1715,7 @@ object FormPrinc: TFormPrinc end object OuvrirunfichiertramesCDM1: TMenuItem Caption = 'Ouvrir un fichier trames CDM' + Hint = 'Ouvre un fichier trames CDM (protocole COM IP)' OnClick = OuvrirunfichiertramesCDM1Click end object Affichefentredebug1: TMenuItem diff --git a/UnitPrinc.pas b/UnitPrinc.pas index 944dea6..d632d97 100644 --- a/UnitPrinc.pas +++ b/UnitPrinc.pas @@ -10,7 +10,14 @@ Unit UnitPrinc; - 1 = aiguillage dévié = sortie 1 de l'adresse d'accessoire *) -// en mode simulation run, CDM ne renvoie pas les détecteurs au départ du RUN. +// en mode simulation run: +// CDM ne renvoie pas les détecteurs au départ du RUN. +// il ne renvoie pas non plus le nom des trains sur les actionneurs +// les noms des trains sont bien renvoyés sur les détecteurs à 1 +// +// En mode RUN: +// CDM renvoie le nom des trains sur les actionneurs à 1, jamais à 0 +// et quelquefois (pas toujours!) sur les détecteurs à 1, jamais à 0 interface @@ -56,7 +63,7 @@ type Image4Dir: TImage; Image5Dir: TImage; Image6Dir: TImage; - Codificationdesfeux1: TMenuItem; + Codificationdessignaux: TMenuItem; Divers1: TMenuItem; ClientSocketCDM: TClientSocket; FichierSimu: TMenuItem; @@ -119,6 +126,7 @@ type RepriseDCC1: TMenuItem; BoutonRazTrains: TButton; Demandetataccessoires1: TMenuItem; + LancerCDMrail1: TMenuItem; procedure FormCreate(Sender: TObject); procedure MSCommUSBLenzComm(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); @@ -150,7 +158,7 @@ type procedure DeconnecterCDMRailClick(Sender: TObject); procedure ClientSocketCDMDisconnect(Sender: TObject; Socket: TCustomWinSocket); - procedure Codificationdesfeux1Click(Sender: TObject); + procedure CodificationdessignauxClick(Sender: TObject); procedure ClientSocketLenzDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure FichierSimuClick(Sender: TObject); @@ -183,6 +191,7 @@ type procedure RepriseDCC1Click(Sender: TObject); procedure BoutonRazTrainsClick(Sender: TObject); procedure Demandetataccessoires1Click(Sender: TObject); + procedure LancerCDMrail1Click(Sender: TObject); private { Déclarations privées } procedure DoHint(Sender : Tobject); @@ -338,7 +347,8 @@ var tablo : array of byte; // tableau rx usb - Enregistrement,chaine_Envoi,chaine_recue,Id_CDM,Af,version_Interface,entete,suffixe,LAY : string; + Enregistrement,chaine_Envoi,chaine_recue,Id_CDM,Af,version_Interface,entete,suffixe,LAY + : string; Ancien_detecteur : array[0..NbMemZone] of boolean; // anciens état des détecteurs et adresses des détecteurs et leur état detecteur : array[0..NbMemZone] of @@ -594,10 +604,6 @@ end; // dessine un cercle plein dans le feu procedure cercle(ACanvas : Tcanvas;x,y,rayon : integer;couleur : Tcolor); -var Pen : Hpen; - Brush : HBrush; - ps : TpaintStruct; - hd : hdc; begin with Acanvas do begin @@ -605,17 +611,6 @@ begin Pen.Color:=clBlack; Ellipse(x-rayon,y-rayon,x+rayon,y+rayon); end; - -{ hd:=BeginPaint(Acanvas.Handle,ps); - //hd:=Acanvas.Handle; - Pen:=CreatePen(PS_Solid, 1, ClBlack); - Brush:=CreateSolidBrush(couleur); - SelectObject(hd,Pen); - SelectObject(hd,Brush); - Ellipse(hd,x-rayon,y-rayon,x+rayon,y+rayon); - Deleteobject(Pen); - Deleteobject(Brush); - EndPaint(Acanvas.Handle,ps);} end; // dessine les feux sur une cible à 2 feux dans le canvas spécifié @@ -1406,6 +1401,7 @@ end; procedure cree_image(rang : integer); var adresse,TypeFeu : integer; s : string; + T_BP : TBitMap; begin TypeFeu:=feux[rang].aspect; if typeFeu<=0 then exit; @@ -1419,9 +1415,9 @@ begin Name:='ImageFeu'+IntToSTR(adresse); // nom de l'image - sert à identifier le composant si on fait clic droit. Top:=(HtImg+espY+20)*((rang-1) div NbreImagePLigne); // détermine les points d'origine 20 Left:=10+ (LargImg+5)*((rang-1) mod (NbreImagePLigne)); //5 - width:=LargImg; - Height:=HtImg; - + //width:=LargImg; + //Height:=HtImg; + s:='Index='+IntToSTR(rang)+' @='+inttostr(Adresse)+' Décodeur='+intToSTR(feux[rang].Decodeur)+ ' Adresse détecteur associé='+intToSTR(feux[rang].Adr_det1)+ ' Adresse élement suivant='+intToSTR(feux[rang].Adr_el_suiv1); @@ -1432,8 +1428,11 @@ begin PopUpMenu:=Formprinc.PopupMenuFeu; // affectation popupmenu sur clic droit // affecter le type d'image de feu dans l'image créée - picture.Bitmap:=Select_dessin_feu(TypeFeu); - + T_BP:=Select_dessin_feu(TypeFeu); + picture.Bitmap:=T_Bp; + Width:=T_Bp.width; + Height:=T_Bp.Height; + picture.BitMap.TransparentMode:=tmfixed; // tmauto (la couleur transparente est déterminée par pixel le plus en haut à gauche du bitmap) // tmfixed (la couleur transparente est explicitement assignée et stockée dans le bitmap) Picture.Bitmap.TransparentColor:=clblue; @@ -2948,8 +2947,8 @@ begin begin detecteur[det].tempo:=20; // armer la tempo à 2s // arreter le train - s:=detecteur[det].train; - detecteur[det].train:=s; + //s:=detecteur[det].train; + //detecteur[det].train:=s; //Affiche('et son détecteur '+IntToSTR(det)+'=1 tempo démarrage ; train '+s,clYellow); s:=chaine_CDM_vitesseST(0,s); // 0% envoi_cdm(s); @@ -4163,7 +4162,7 @@ begin end; -// renvoie l'élément avant det2 si det1 et det2 sont contigus ou séparés que par des aiguillages +// renvoie l'élément avant det2 si det1 et det2 sont contigus ou ne sont séparés que par des aiguillages // si det1 et det2 sont contigus sans aiguillages entre eux, çà renvoie det1 // det_contigu(527,520: renvoie 7 dans suivant // det_contigu(514,522: renvoie 514 dans suivant @@ -4176,6 +4175,7 @@ var suiv1,indexBranche_det1,indexBranche_det2,branche_det2,branche_det1, // donne le suivant au point de connection de l'aiguillage // prec=det ou aig ; suiv=aig + // aig_suiv(527,7) : renvoie 520 dans suiv_2 // procédure récursive procedure aig_suiv(prec,suiv : integer) ; var adr2,index : integer; @@ -4363,7 +4363,7 @@ var suiv1,indexBranche_det1,indexBranche_det2,branche_det2,branche_det1, end; end; end; - end; + end; // fin de la procédure aig_suiv begin @@ -5831,6 +5831,7 @@ begin end; envoi_signauxCplx; if signalDebug=AdrFeu then begin AffSignal:=false;nivDebug:=0;end; + application.ProcessMessages; // évite le clignotement end; Procedure Maj_feux; @@ -5901,10 +5902,11 @@ var AdrFeu,AdrDetFeu,Nbre,i,j,n,det1,det2,det3,det4,AdrSuiv,AdrPrec,Prev,det_sui TypeSuiv : tEquipement; s : string; begin - det3:=event_det[N_event_det]; // c'est le nouveau détecteur + det3:=event_det[N_event_det]; // c'est le nouveau détecteur if det3=0 then exit; // pas de nouveau détecteur - FormDebug.MemoEvtDet.lines.add('Le nouveau détecteur est '+IntToSTR(det3)) ; - if TraceListe or dupliqueEvt then AfficheDebug('Le nouveau détecteur est '+IntToSTR(det3),clyellow) ; + s:='Le nouveau détecteur est '+IntToSTR(det3); + FormDebug.MemoEvtDet.lines.add(s) ; + if TraceListe or dupliqueEvt then AfficheDebug(s,clyellow) ; for i:=1 to N_trains do @@ -6210,6 +6212,7 @@ end; // traitement des évènements actionneurs (detecteurs aussi) +// adr adr2 : pour mémoire de zone procedure Event_act(adr,adr2,etat : integer;trainDecl : string); var i,v,va,etatAct,Af,Ao,Access,sortie,dZ1F,dZ2F,dZ1O,dZ2O : integer; s,st,trainDest : string; @@ -6217,7 +6220,7 @@ var i,v,va,etatAct,Af,Ao,Access,sortie,dZ1F,dZ2F,dZ1O,dZ2O : integer; Ts : TAccessoire; begin // vérifier si l'actionneur en évènement a été déclaré pour réagir - if AffAigDet then AfficheDebug('Tick='+IntToSTR(tick)+' Evt Act '+intToSTR(Adr)+' '+intToSTR(Adr2)+'='+intToSTR(etat),clyellow); + if AffAigDet then AfficheDebug('Tick='+IntToSTR(tick)+' Evt Act '+intToSTR(Adr)+'/'+intToSTR(Adr2)+'='+intToSTR(etat),clyellow); //Affiche(intToSTR(adr)+'/'+intToSTR(adr2)+' '+intToSTR(etat),clyellow); for i:=1 to maxTablo_act do begin @@ -6242,7 +6245,7 @@ begin end; // actionneur pour fonction train - if adresseOk and (Tablo_actionneur[i].loco) and ((s=trainDecl) or (s='X') or (trainDecl='X')) and (etatAct=etat) then + if adresseOk and (Tablo_actionneur[i].loco) and ((s=trainDecl) or (s='X') or (trainDecl='X') or (trainDecl='')) and (etatAct=etat) then begin trainDest:=Tablo_actionneur[i].trainDest; // exécution de la fonction F vers CDM @@ -6255,7 +6258,7 @@ begin end; // actionneur pour accessoire - if adresseOk and (Tablo_actionneur[i].act) and ((s=trainDecl) or (s='X') or (trainDecl='X')) and (etatAct=etat) then + if adresseOk and (Tablo_actionneur[i].act) and ((s=trainDecl) or (s='X') or (trainDecl='X') or (trainDecl='')) and (etatAct=etat) then begin access:=Tablo_actionneur[i].accessoire; sortie:=Tablo_actionneur[i].sortie; @@ -6267,7 +6270,7 @@ begin end; // actionneur pour son - if adresseOk and (Tablo_actionneur[i].Son) and ((s=trainDecl) or (s='X') or (trainDecl='X')) and (etatAct=etat) + if adresseOk and (Tablo_actionneur[i].Son) and ((s=trainDecl) or (s='X') or (trainDecl='X') or (trainDecl='')) and (etatAct=etat) then begin Affiche(st+' Train='+trainDecl+' son '+Tablo_actionneur[i].FichierSon,clyellow); @@ -6363,7 +6366,6 @@ procedure evalue; begin if not(configNulle) then begin - //if CDM_connecte // and (length(recuCDM)<1000) then Maj_feux; // on ne traite pas les calculs si CDM en envoie plusieurs end; end; @@ -6375,7 +6377,6 @@ var i,AdrSuiv,AdrFeu,AdrDetfeu,index,Etat01,AdrPrec : integer; s : string; begin if Etat then Etat01:=1 else Etat01:=0; - if train='' then train:='X'; // vérifier si l'état du détecteur est déja stocké, car on peut reçevoir plusieurs évènements pour le même détecteur dans le même état // on reçoit un doublon dans deux index consécutifs. (* @@ -6442,9 +6443,9 @@ begin end; end; - // gérer l'évènement detecteur pour action + // gérer l'évènement actionneur pour action if etat then i:=1 else i:=0; - event_act(Adresse,0,i,train); + event_act(Adresse,0,i,''); end; // détection fronts descendants @@ -6476,7 +6477,7 @@ begin // gérer l'évènement detecteur pour action if etat then i:=1 else i:=0; - event_act(Adresse,0,i,train); + event_act(Adresse,0,i,train); if not(confignulle) then calcul_zones; end; end; @@ -6507,9 +6508,8 @@ var s: string; faire_event,inv : boolean; prov,index : integer; begin - // vérifier que l'évènement accessoire vient bien d'un aiguillage et pas d'un feu qu'on pilote (et que cdm renvoie) index:=index_aig(adresse); - if index=0 then exit; // non ce n'est pas un aiguillage ou alors aiguillage non déclaré, on sort + if index=0 then exit; // si l'aiguillage est inversé dans CDM et qu'on est en mode autonome ou CDM, inverser sa position inv:=false; @@ -7097,17 +7097,13 @@ begin inc(port); end; end; - end - else inc(port); Application.processMessages; until (port=10) or trouve; end; - - - + // initialisation de la comm USB pour l'interface Xpressnet procedure connecte_USB; var i,j : integer; @@ -7476,6 +7472,7 @@ end; procedure TFormPrinc.FormCreate(Sender: TObject); var i : integer; s : string; + t : tequipement; begin TraceSign:=True; PremierFD:=false; @@ -7521,7 +7518,6 @@ begin ferme:=false; CDM_connecte:=false; pasreponse:=0; - recuCDM:=''; residuCDM:=''; Nbre_recu_cdm:=0; AffMem:=true; @@ -7633,14 +7629,7 @@ begin aiguillage[index_aig(31)].position:=const_devie; aiguillage[index_aig(25)].position:=const_droit; aiguillage[index_aig(9)].position:=const_droit; - - nivDebug:=3; - FormDebug.Show; - Test_croisement(523,518,1); - if ncrois<>0 then Affiche('Croisement détecté '+intToSTR(croisement[1].adresse),clyellow); - } -// CreateFile('\\?\COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); - +} end; @@ -7702,16 +7691,11 @@ begin if MessageDlg('Le TCO a été modifié. Voulez vous le sauvegarder ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin sauve_fichier_tco; - ancienFormatTCO:=false; end; if config_modifie then if MessageDlg('La configuration a été modifiée. Voulez vous la sauvegarder ?',mtConfirmation,[mbYes,mbNo],0)=mrYes then sauve_config; if confasauver then sauve_config; - if avecTCO then - begin - if ancienFormatTCO then sauve_fichier_tco; - end; Application.ProcessMessages; end; @@ -7943,7 +7927,7 @@ begin dec(detecteur[i].tempo); if detecteur[i].tempo=0 then begin - s:=detecteur[i].train; + //s:=detecteur[i].train; //Affiche('Tempo 0 timer train '+s+' det '+intToSTR(i),clOrange); s:=chaine_CDM_vitesseST(100,s); // 100% envoi_cdm(s); @@ -8133,14 +8117,7 @@ procedure TFormPrinc.MenuDeconnecterEthernetClick(Sender: TObject); begin ClientSocketLenz.Close; end; - -function cde_cdm(s : string) : string; -var i : integer; -begin - i:=length(s)-1; - cde_cdm:='0'+IntToSTR(i)+s; -end; - + procedure TFormPrinc.AffEtatDetecteurs(Sender: TObject); var j,adr : integer; s : string; @@ -8150,7 +8127,7 @@ begin begin adr:=Adresse_detecteur[j]; s:='Dét '+intToSTR(adr)+'='; - if Detecteur[adr].etat then s:=s+'1 '+Detecteur[Adr].train else s:=s+'0'; + if Detecteur[adr].etat then s:=s+'1 ' else s:=s+'0'; Affiche(s,clYellow); end; end; @@ -8270,10 +8247,10 @@ end; // décodage d'une trame CDM au protocole IPC // la trame_CDM peut contenir 2000 caractères à l'initialisation du RUN. procedure Interprete_trameCDM(trame_CDM:string); -var i,j,objet,posST,posAC,posDT,posSG,posXY,k,l,erreur,posErr, adr,adr2,etat,etataig, +var i,j,objet,k,l,erreur,posErr,adr,adr2,etat,etataig, vitesse,etatAig2,name,prv,nbre,nbreVir,long,index,posDes,AncNumTrameCDM : integer ; x,y,x2,y2 : longint ; - s,ss,train,commandeCDM : string; + nom,s,ss,train,commandeCDM : string; traite,sort : boolean; label reprise; begin @@ -8426,46 +8403,85 @@ begin begin inc(ntrains); delete(commandeCDM,1,posDES+12); - i:=posEx('NAME=',commandeCDM,posST);delete(commandeCDM,1,i+4); - i:=pos(';',commandeCDM); - trains[ntrains].nom_train:=copy(commandeCDM,1,i-1); - delete(commandeCDM,1,i); - i:=pos('AD=',commandeCDM);Delete(commandeCDM,1,i+2); - val(commandeCDM,trains[ntrains].adresse,erreur); - i:=pos(';',commandeCDM); - delete(commandeCDM,1,i); + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + trains[ntrains].nom_train:=ss; + val(ss,adr,erreur); + //s:='NAME='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,trains[ntrains].adresse,erreur); + //s:='AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; - i:=pos('TMAX=',commandeCDM);Delete(commandeCDM,1,i+4); - val(commandeCDM,trains[ntrains].vitmax,erreur); - i:=pos(';',commandeCDM); - delete(commandeCDM,1,i); - Formprinc.ComboTrains.Items.Add(trains[ntrains].nom_train); + i:=posEx('TMAX=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + val(ss,trains[ntrains].vitmax,erreur); + //s:='AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + Formprinc.ComboTrains.Items.Add(trains[ntrains].nom_train); + end; end; // évènement aiguillage. Le champ AD2 n'est pas forcément présent - posST:=pos('CMDACC-ST_TO',commandeCDM); - if posST<>0 then + i:=pos('CMDACC-ST_TO',commandeCDM); + if i<>0 then begin - delete(commandeCDM,posST,12); - objet:=0; - i:=posEx('OBJ=',commandeCDM,posST);ss:=copy(commandeCDM,i+4,10); - if i<>0 then begin val(ss,objet,erreur);delete(commandeCDM,i,6);end else Affiche('Erreur 95 : pas d''objet ',clred); + delete(commandeCDM,i,12); - i:=posEx('AD=',commandeCDM,posST);ss:=copy(commandeCDM,i+3,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); - if i=0 then begin Affiche('Erreur 96 : absence AD aig '+intToSTR(adr),clred);Affiche(commandeCDM,clyellow);end; - val(ss,adr,erreur);Delete(commandeCDM,i,4); + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + nom:=ss; + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,objet,erreur); + Delete(commandeCDM,i,l-i+1); + end; - //Affiche(copy(recuCDM,j,i+80),clOrange); - i:=posEx('AD2=',commandeCDM,i);ss:=copy(commandeCDM,i+4,10); // Affiche('i='+intToSTR(i),clOrange); - if i=0 then begin Affiche('Erreur 97 : absence AD2 aig '+intToSTR(adr),clred);Affiche(commandeCDM,clyellow);end; - val(ss,adr2,erreur); //Affiche('adr2='+intToSTR(adr2),clyellow); - Delete(commandeCDM,i,5); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + //s:='AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; - i:=posEx('STATE=',commandeCDM,i);ss:=copy(commandeCDM,i+6,10); //Affiche('j='+IntToSTR(j)+' i='+intToSTR(i),clred); - if i=0 then begin Affiche('Erreur 98 : absence STATE aig '+intToSTR(adr),clred);Affiche(commandeCDM,clyellow);end; - val(ss,etat,erreur); - Delete(commandeCDM,i,7); + i:=posEx('AD2=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,adr2,erreur); + //s:='AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('STATE=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,etat,erreur); + //s:='AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; //Affiche('Aig '+inttostr(adr)+' pos='+IntToSTR(etat),clyellow); //Affiche(commandeCDM,clyellow); @@ -8558,42 +8574,99 @@ begin // évènement détecteur. Si det=1, Le nom du train est souvent _NONE // si det=0 le nom du train est toujours _NONE - posDT:=pos('CMDACC-ST_DT',commandeCDM); - if posDT<>0 then + i:=pos('CMDACC-ST_DT',commandeCDM); + if i<>0 then begin - Delete(commandeCDM,posDT,12); - i:=posEx('AD=',commandeCDM,posDT); - if i<>0 then - begin - ss:=copy(commandeCDM,i+3,10);Delete(commandeCDM,i,4); - val(ss,adr,erreur); - end; - i:=posEx('TRAIN=',commandeCDM,posDT); - j:=PosEx(';',commandeCDM,i); - train:=copy(commandeCDM,i+6,j-i-6); - delete(commandeCDM,i,7); - - //Affiche('Train='+Train,clOrange); - i:=posEx('STATE=',commandeCDM,posDT);ss:=copy(commandeCDM,i+6,10); - val(ss,etat,erreur); Delete(commandeCDM,i,7); - - if (train='_NONE') then train:=detecteur[Adr].train; + Delete(commandeCDM,i,12); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('TRAIN=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + train:=copy(commandeCDM,i+6,l-i-6); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('STATE=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,etat,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + nom:=copy(commandeCDM,i+6,l-i-6); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,objet,erreur); + Delete(commandeCDM,i,l-i+1); + end; + Event_detecteur(Adr,etat=1,train); //Affiche(train,clYellow); //Affiche(IntToSTR(adr)+' '+IntToSTR(etat)+' '+train,clyellow); end ; // évènement signal - non stocké ni interprété - posSG:=pos('CMDACC-ST_SG',commandeCDM); - if posSG<>0 then + // S-E-01-0021-CMDACC-ST_SG|039|05|NAME=150;OBJ=150;AD=0;AD2=0;STATE=0; + i:=pos('CMDACC-ST_SG',commandeCDM); + if i<>0 then begin - Delete(commandeCDM,posSG,12); - i:=posEx('AD=',commandeCDM,posDT);ss:=copy(commandeCDM,i+3,10); - val(ss,adr,erreur); - i:=posEx('STATE=',commandeCDM,posSG);ss:=copy(commandeCDM,i+6,10); - Delete(commandeCDM,posSG,i+5-posSG); - val(ss,etat,erreur); + Delete(commandeCDM,i,12); + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + nom:=copy(commandeCDM,i+5,l-i-5); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,objet,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('AD2=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,adr2,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('STATE=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,etat,erreur); + Delete(commandeCDM,i,l-i+1); + end; + s:='SignalCDM '+intToSTR(adr)+'='+IntToStr(etat); if afftiers then AfficheDebug(s,ClSkyBlue); end; @@ -8601,76 +8674,262 @@ begin // évènement actionneur // attention un actionneur qui repasse à 0 ne contient pas de nom de train //S-E-03-0157-CMDACC-ST_AC|049|05|NAME=0;OBJ=7101;AD=815;TRAIN=CC406526;STATE=1; - posAC:=pos('CMDACC-ST_AC',commandeCDM); - if posAC<>0 then + i:=pos('CMDACC-ST_AC',commandeCDM); + if i<>0 then begin - Delete(commandeCDM,posAC,12); - i:=posEx('AD=',commandeCDM,posAC);ss:=copy(commandeCDM,i+3,10); - val(ss,adr,erreur); - i:=posEx('NAME=',commandeCDM,posAC);ss:=copy(commandeCDM,i+5,10); - val(ss,name,erreur); - i:=posEx('TRAIN=',commandeCDM,posAC);l:=PosEx(';',commandeCDM,i); - train:=copy(commandeCDM,i+6,l-i-6); - i:=posEx('STATE=',commandeCDM,posAC);ss:=copy(commandeCDM,i+6,10); - val(ss,etat,erreur); - Delete(commandeCDM,posAC,i-posAC); - i:=pos(';',commandeCDM); - if i<>0 then Delete(commandeCDM,1,i); + Delete(commandeCDM,i,12); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if i<>0 then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,adr,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('OBJ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if i<>0 then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,objet,erreur); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if i<>0 then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + nom:=ss; + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('TRAIN=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if i<>0 then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + train:=ss; + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('STATE=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if i<>0 then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,etat,erreur); + Delete(commandeCDM,i,l-i+1); + end; + if AffAigDet then AfficheDebug('Actionneur AD='+intToSTR(adr)+' Nom='+intToSTR(name)+' Train='+train+' Etat='+IntToSTR(etat),clyellow); Event_act(adr,0,etat,train); // déclenche évent actionneur end; // évènement position des trains - non stocké ni interprété - posXY:=pos('CMDTRN-SPDXY',commandeCDM); - if posXY<>0 then + // S-E-01-0039-CDMTRN-SPDXY|063|07|NAME=TRAIN_3;AD=0;SPEED=3;X=24735;Y=19630;X2=16874;Y2=19630; + i:=pos('CDMTRN-SPDXY',commandeCDM); + if i<>0 then begin - Delete(commandeCDM,posXY,12); - i:=posEx('AD=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+3,10); - val(ss,adr,erreur); - s:='Train AD='+IntToSTR(adr); - Delete(commandeCDM,i,l-i+1); + Delete(commandeCDM,i,12); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + s:='Train AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; - i:=posEx('NAME=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - train:=copy(commandeCDM,i+5,l-i-5); - s:=s+' '+train; - Delete(commandeCDM,i,l-i+1); + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + train:=copy(commandeCDM,i+5,l-i-5); + s:=s+' '+train; + Delete(commandeCDM,i,l-i+1); + end; - i:=posEx('SPEED=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+6,10); - val(ss,vitesse,erreur); - s:=s+' '+IntToSTR(vitesse); - Delete(commandeCDM,i,l-i+1); + i:=posEx('SPEED=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,vitesse,erreur); + s:=s+' SPEED='+IntToSTR(vitesse); + Delete(commandeCDM,i,l-i+1); + end; - i:=posEx('X=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+2,10); - val(ss,x,erreur); - s:=s+' X='+IntTostr(x); - Delete(commandeCDM,i,l-i+1); + i:=posEx('X=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+2,l-i-2); + val(ss,x,erreur); + s:=s+' X='+IntTostr(x); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('Y=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+2,l-i-2); + val(ss,y,erreur); + s:=s+' Y='+IntTostr(y); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('X2=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,x2,erreur); + s:=s+' X2='+IntTostr(x2); + Delete(commandeCDM,i,l-i+1); + end; + + if (i<>0) and (l<>0) then + begin + i:=posEx('Y2=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,y2,erreur); + s:=s+' Y2='+IntTostr(y2); + Delete(commandeCDM,i,l-i+1); + end; - i:=posEx('Y=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+2,10); - val(ss,y,erreur); - s:=s+' Y='+IntTostr(y); - Delete(commandeCDM,i,l-i+1); - - i:=posEx('X2=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+3,10); - val(ss,x2,erreur); - s:=s+' X2='+IntTostr(x2); - Delete(commandeCDM,i,l-i+1); - - i:=posEx('Y2=',commandeCDM,posXY);l:=posEx(';',commandeCDM,i); - ss:=copy(commandeCDM,i+3,10); - val(ss,y2,erreur); - s:=s+' Y2='+IntTostr(y2); - Delete(commandeCDM,i,l-i+1); if afftiers then afficheDebug(s,clAqua); - - Delete(commandeCDM,posXY,12); end; + // évènement vitesse des trains - non stocké ni interprété + //S-E-01-0189-CDMTRN-SPEED|054|06|NAME=TRAIN_3;AD=0;SPEED=99;RMAX=120;CMAX=120;REQ=8; + i:=pos('CDMTRN-SPEED',commandeCDM); + if i<>0 then + begin + Delete(commandeCDM,i,12); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + s:='Train AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + train:=copy(commandeCDM,i+5,l-i-5); + s:=s+' '+train; + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('SPEED=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,vitesse,erreur); + s:=s+' SPEED='+IntToSTR(vitesse); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('RMAX=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + val(ss,x,erreur); + s:=s+' RMAX='+IntTostr(x); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('CMAX=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + val(ss,y,erreur); + s:=s+' CMAX='+IntTostr(y); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('REQ=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,x2,erreur); + s:=s+' REQ='+IntTostr(x2); + Delete(commandeCDM,i,l-i+1); + end; + + if afftiers then afficheDebug(s,clAqua); + + end; + + // évènement port CDM - non stocké ni interprété + // S-E-01-0188-CDMTRN-P_CDM|060|07|NAME=TRAIN_3;AD=0;SPEED=99;SEG=38;PORT=1;X=35565;Y=12364; + i:=pos('CDMTRN-P_CDM',commandeCDM); + if i<>0 then + begin + Delete(commandeCDM,i,12); + i:=posEx('AD=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+3,l-i-3); + val(ss,adr,erreur); + s:='Train AD='+IntToSTR(adr); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('NAME=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + train:=copy(commandeCDM,i+5,l-i-5); + s:=s+' '+train; + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('SPEED=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+6,l-i-6); + val(ss,vitesse,erreur); + s:=s+' SPEED='+IntToSTR(vitesse); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('SEG=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+4,l-i-4); + val(ss,x,erreur); + s:=s+' SEG='+IntTostr(x); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('PORT=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+5,l-i-5); + val(ss,y,erreur); + s:=s+' PORT='+IntTostr(y); + Delete(commandeCDM,i,l-i+1); + end; + + i:=posEx('X=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+2,l-i-2); + val(ss,x2,erreur); + s:=s+' X='+IntTostr(x2); + Delete(commandeCDM,i,l-i+1); + end; + + if afftiers then afficheDebug(s,clAqua); + + i:=posEx('Y=',commandeCDM,1);l:=posEx(';',commandeCDM,i); + if (i<>0) and (l<>0) then + begin + ss:=copy(commandeCDM,i+2,l-i-2); + val(ss,x2,erreur); + s:=s+' Y='+IntTostr(x2); + Delete(commandeCDM,i,l-i+1); + end; + + if afftiers then afficheDebug(s,clAqua); + end; + inc(k); //Affiche('k='+intToSTR(k),clyellow); end; @@ -8721,7 +8980,7 @@ begin deconnecte_cdm; end; -procedure TFormPrinc.Codificationdesfeux1Click(Sender: TObject); +procedure TFormPrinc.CodificationdessignauxClick(Sender: TObject); var i,j,k,l,NfeuxDir,nc : integer; s,s2 : string; begin @@ -8770,7 +9029,6 @@ begin if l<8 then s:=s+'/' else s:=s+')'; end; end; - end else @@ -9059,8 +9317,8 @@ begin begin readln(fte,s); Affiche(s,clLime); - RecuCDM:=s; Interprete_trameCDM(s); + application.processmessages; end; closeFile(fte); end; @@ -9074,7 +9332,7 @@ end; procedure TFormPrinc.ButtonLanceCDMClick(Sender: TObject); begin - Lance_CDM ; + Lance_CDM; end; procedure TFormPrinc.Affichefentredebug1Click(Sender: TObject); @@ -9322,12 +9580,15 @@ begin Raz_tout; end; - - procedure TFormPrinc.Demandetataccessoires1Click(Sender: TObject); begin if portCommOuvert or parSocketLenz then demande_etat_acc else Affiche('L''interface XpressNet n''est pas connectée par USB ou par Ethernet',clorange); end; +procedure TFormPrinc.LancerCDMrail1Click(Sender: TObject); +begin + Lance_CDM ; +end; + end. diff --git a/UnitSimule.dcu b/UnitSimule.dcu index 6395b58..c2b21bd 100644 Binary files a/UnitSimule.dcu and b/UnitSimule.dcu differ diff --git a/UnitSimule.pas b/UnitSimule.pas index b7b664d..a01bea1 100644 --- a/UnitSimule.pas +++ b/UnitSimule.pas @@ -116,6 +116,7 @@ begin end; end; end; + Application.ProcessMessages; sortie:=eof(fte) or (index_simule>Max_Simule); until sortie ; if index_simule>Max_Simule then Affiche('Tableau maximal atteint',clred); diff --git a/UnitTCO.dcu b/UnitTCO.dcu index 866a415..a165650 100644 Binary files a/UnitTCO.dcu and b/UnitTCO.dcu differ diff --git a/UnitTCO.pas b/UnitTCO.pas index 749768f..4e7dbb0 100644 --- a/UnitTCO.pas +++ b/UnitTCO.pas @@ -327,7 +327,7 @@ var clAllume,clVoies,Fond,couleurAdresse,clGrille,cltexte,clQuai,CoulFonte,ClCanton : Tcolor; FormTCO: TFormTCO; Forminit,sourisclic,SelectionAffichee,TamponAffecte,entoure,Diffusion,TCO_modifie, - piloteAig,AncienFormatTCO,BandeauMasque,eval_format : boolean; + piloteAig,BandeauMasque,eval_format : boolean; HtImageTCO,LargImageTCO,XclicCell,YclicCell,XminiSel,YminiSel,XCoupe,Ycoupe,Temposouris, XmaxiSel,YmaxiSel,AncienXMiniSel,AncienXMaxiSel ,AncienYMiniSel,AncienYMaxiSel, Xclic,Yclic,XClicCellInserer,YClicCellInserer,Xentoure,Yentoure,RatioC,ModeCouleurCanton, @@ -402,7 +402,6 @@ begin trouve_clCanton:=false; trouve_ModeCanton:=false; trouve_AvecGrille:=false; - ancienFormatTCO:=false; eval_format:=false; ModeCouleurCanton:=1; clCanton:=ClYellow; @@ -420,19 +419,10 @@ begin delete(s,i,length(sa)); val('$'+s,i,erreur); fond:=i; - eval_format:=true; - end - else - begin - if eval_format=false then - begin - val('$'+s,Fond,erreur); - ancienformatTCO:=true; - eval_format:=true; - end; - end; + // eval_format:=true; + end ; + - if ancienformatTCO then begin s:=lit_ligne; val('$'+s,clVoies,erreur);end; sa:=uppercase(clVoies_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -444,7 +434,6 @@ begin clVoies:=i; end; - if ancienformatTCO then begin s:=lit_ligne; val('$'+s,clAllume,erreur);end; sa:=uppercase(clAllume_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -456,7 +445,6 @@ begin clAllume:=i; end; - if ancienformatTCO then begin s:=lit_ligne;val('$'+s,clGrille,erreur);end; sa:=uppercase(clGrille_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -468,7 +456,6 @@ begin clGrille:=i; end; - if ancienformatTCO then begin s:=lit_ligne; val('$'+s,clTexte,erreur);end; sa:=uppercase(clTexte_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -480,7 +467,6 @@ begin clTexte:=i; end; - if ancienformatTCO then begin s:=lit_ligne; val('$'+s,clQuai,erreur);end; sa:=uppercase(clQuai_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -528,7 +514,6 @@ begin //---------------------------------------------------------------- // taille de la matrice - if ancienformatTCO then begin s:=lit_ligne;val(s,NbreCellX,erreur);i:=pos(',',s);delete(s,1,i);Val(s,NbreCellY,erreur);end; sa:=uppercase(Matrice_ch)+'='; i:=pos(sa,s); if i<>0 then @@ -542,22 +527,6 @@ begin Val(s,NbreCellY,erreur) end; - // Ancien largeur et hauteur des cellules - if ancienformatTCO then begin s:=lit_ligne;val(s,LargeurCell,erreur);i:=pos(',',s);delete(s,1,i);Val(s,HauteurCell,erreur);end; - { - sa:=uppercase(Cellule_ch)+'='; - i:=pos(sa,s); - if i<>0 then - begin - inc(nv); - trouve_cellule:=true; - delete(s,i,length(sa)); - val(s,i,erreur); - LargeurCell:=i; - i:=pos(',',s);delete(s,1,i); - Val(s,HauteurCell,erreur) - end; - } // ratio sa:=uppercase(Ratio_ch)+'='; @@ -571,7 +540,7 @@ begin RatioC:=i; end; - until (pos('[MATRICE]',uppercase(s))<>0) or (eof(fichier) or AncienFormatTCO); + until (pos('[MATRICE]',uppercase(s))<>0) or (eof(fichier)); NbCellulesTCO:=NbreCellX*NbreCellY; @@ -688,15 +657,6 @@ begin i:=pos(',',s); val('$'+s,coulFonte,erreur); - if ancienFormatTCO then - begin - m:=tco[x,y].BImage; - case m of - 1 : coulFonte:=ClYellow; - 2,3,4,5,12,13,14,15,21,22 : coulfonte:=ClLime; - 30 : coulFonte:=clLime; - end; - end; tco[x,y].coulFonte:=coulFonte; delete(s,1,i); if s[1]<>')' then @@ -721,7 +681,6 @@ begin end; closefile(fichier); - if not(trouve_AvecGrille) then ancienFormatTCO:=true; // provoque la sauvegarde e:=sizeof(Tco) div 1024; Affiche('Dimensions du tco : '+intToSTR(NbreCellX)+'x'+intToSTR(NbreCellY)+' / '+IntToSTR(e)+'Ko',clyellow); end; diff --git a/verif_version.dcu b/verif_version.dcu index f61a5d8..3023ceb 100644 Binary files a/verif_version.dcu and b/verif_version.dcu differ diff --git a/verif_version.pas b/verif_version.pas index 8b6c17b..1c6d9a7 100644 --- a/verif_version.pas +++ b/verif_version.pas @@ -23,7 +23,7 @@ var Lance_verif : integer; verifVersion,notificationVersion : boolean; -Const Version='4.4'; // sert à la comparaison de la version publiée +Const Version='4.6'; // sert à la comparaison de la version publiée SousVersion=' '; // en cas d'absence de sous version mettre un espace implementation diff --git a/versions.txt b/versions.txt index 603f027..757a803 100644 --- a/versions.txt +++ b/versions.txt @@ -115,7 +115,8 @@ version 4.4 : Possibilit problèmes d'ouverture avec W10 et W11. Les passages à niveaux peut être commandés par des zones de détection. Code source modifié pour être compilable avec Rad Studio 11. -version 4.5 : Correction champ "déclencheur" pour son +version 4.5 : Correction champ "déclencheur" pour son. +version 4.6 : Correction TJD 2/4 états dans le changement de sélection.