uses crt, oldlinux; type farver = (normal, red, blue, green, yellow, white, cyan, brown, magenta, invers, grey); str6 = string[6]; spsktype = record x,y,ori,bx,by,bori,kontrol,la,s83,s83b,fast:byte; end; const name = 'RFC Slagelse ver 3.0 fpc 2 - www.hjelmenet.dk'; { 20050106 ændret magasinering til togveje 20050108 opdelt Magasinering på stationer 20050403 utf eller vga-mode $define utf 20050414 utf eller vga-mode parameter -u } csi = ^['['; clreol = csi+'K'; dis_max = 7; dis_cnt : byte = 0; tgruppe_cnt = 4; cmd_p_max = 8; ntid = 30; spsk_cnt = 41; mon_file = '/dev/null';{ '/home/eh/marklin/log.txt'; } mark_path = '/home/eh/marklin/'; togvfn = mark_path+'togveje.txt'; magnet_off = 64; tog_diesel : word = 0; tog_el : word = 0; type str2 = string[2]; var mon, togvf : text; file_h : word { absolute io }; c,d : char; b, t, status_line, err,togvp : byte; s88buf: array [0..7] of byte; s88w : longword absolute s88buf; s88store : longword; s88b4 : byte; { s88 : array[0..3] of word absolute s88buf;} dis : array[0..dis_max] of text; dis_e : array[0..dis_max] of word; dis_name : array [0..dis_max] of shortstring; { '/dev/pts/0','/dev/pts/1','/dev/pts/2','/dev/pts/3','/dev/pts/4', '/dev/tty1' ,'/dev/tty2' ,'/dev/tty3' ,'/dev/tty4'} line_v,s,start,param: shortstring; cmd_line : array[0..cmd_p_max] of shortstring; cmd_p : byte; stjerne : boolean; yy,mm,dd,hh,min,ss : word; spsk : array[1..spsk_cnt] of spsktype; tios : termios; isol : array[1..$58] of farver; tgruppe : array [0..tgruppe_cnt] of byte; tgruppe_n : array[0..tgruppe_cnt] of byte; tgruppe_s : array[0..tgruppe_cnt] of byte; tgruppe_koer : array[0..tgruppe_cnt] of boolean; magasin : array[0..tgruppe_cnt] of boolean; togveje : array [0..$ff] of record navn:str6; magasin:boolean; gruppe,rh:integer; cond,stop,end1,end2:longword; sporsk : array[0..$f] of record num,sid:byte; end; isolat : array[0..$f] of byte; end; spskfile : file of spsktype; function writeio(b:byte):word; begin delay(100); if fdwrite(file_h,b,1)=1 then writeio:=0 else writeio:=-1; if linuxerror<>0 then write(^G); end; function readio(l:byte):byte; var t : byte; begin writeio(131); readio:=fdread(file_h,s88buf,l); {if s88w<>s88store then begin writeln(mon,'$',hexstr(s88w,8),^I,'$',hexstr(abs(s88w-s88store),8)); for t:=0 to 3 do write(mon,hexstr(s88[t],4),^I); writeln(mon); s88store:=s88w; end; } {writeln(mon,'$',hexstr(s88buf[4],2),^I,'$',hexstr(s88buf[5],2));} end; function skiftmagnet(nr,side:byte):byte; var ok : byte; begin if nr=$ff then begin skiftmagnet:=0; exit; end; ok:=writeio(side+33); if ok=0 then ok:=writeio(nr); skiftmagnet:=ok; delay(200); writeio(35); writeio(83); delay(5); end; procedure stopfald(const nr:byte); begin case nr of $01..$89 : skiftmagnet(81,1); { Kehl } $d6..$d8 : skiftmagnet(49,1); $d9..$de : skiftmagnet(50,1); $df : skiftmagnet(60,1); $ef..$f2 : skiftmagnet(54,1); { R D x } $f3..$f7 : skiftmagnet(56,1); { R x D } $f8..$fb : begin { H D x } skiftmagnet(53,1); skiftmagnet(54,1); end; $fc..$ff : begin { H x D } skiftmagnet(55,1); skiftmagnet(56,1); end; end; { case } tgruppe_koer[togveje[nr].gruppe]:=false; end; { stopfald } {$i m_display.pp } {$i m_ordre.pp } procedure serial_init; var t : byte; begin fillchar(isol,sizeof(isol),1); display1; display2; for t:=0 to 2 do begin err:=readio(7); if err<>6 then write(^G); end; end; begin { ============== MAIN ===================== } for cmd_p:=1 to paramcount do param:=param+lowercase(paramstr(cmd_p)); if boolean(pos('u',param)) then write(^[,'%G') else begin init_vga; write(^[,'%@') end; init_vga_spsk; init; getdatetime(yy,mm,dd,hh,min,ss); start:=tal(hh,2)+':'+tal(min,2); writeln(^J^J,'Reading ',togvfn); indlaes; write(^J^J,mark_path+'spskfile.dat '); assign(spskfile,mark_path+'spskfile.dat'); {$i-} reset(spskfile); {$i+} if boolean(ioresult) then writeln('not found or read error') else begin for b:=0 to spsk_cnt do read(spskfile,spsk[b]); close(spskfile); erase(spskfile); writeln('read into memory'); end; { signaler stop } write(^J,'Stopstiller signaler '); for t:=0 to $ff do if t in [49..50,53..56,60,81] then begin skiftmagnet(t,1); write('.'); end; clear; serial_init; while true do { eternal loop ! } begin if readio(6)<>6 then begin write(^G); serial_init; if keypressed then begin writeio(34); writeio(83); sluk(1,'Terminated by read-error'); end; readio(6); write(^G); end; {skiftmagnet(magnet_off,byte(stjerne));} writeio(34+byte(stjerne)); writeio(magnet_off); fillchar(isol,sizeof(isol),6); for b:=0 to spsk_cnt do spsk[b].fast:=0; for b:=0 to tgruppe_cnt do begin if boolean(tgruppe_s[b]) then begin err:=testtogv(tgruppe[b]); if boolean(s88w and togveje[tgruppe[b]].stop) and tgruppe_koer[b] then stopfald(tgruppe[b]); if (s88w and togveje[tgruppe[b]].end1)=togveje[tgruppe[b]].end2 then begin dec(tgruppe_s[b]); if tgruppe_s[b]=0 then begin case tgruppe[b] of $71..$79, $d9..$de : inc(tog_diesel); { diesel } $81..$89, $fc..$ff : inc(tog_el); { el } end; tgruppe[b]:=0; end; end else tgruppe_s[b]:=4; end else if boolean(testtogv(tgruppe[b])) then tgruppe_s[b]:=4; if tgruppe_n[b]>0 then begin if tgruppe_n[b]=ntid then stopfald(tgruppe[b]); if (tgruppe_n[b]>2) and (togveje[tgruppe[b]].rh<>2) then tgruppe_n[b]:=2; if tgruppe_n[b]=1 then tgruppe[b]:=0; dec(tgruppe_n[b]); end; end; display1; display2; err:=0; if (s88w and $00001000=$00000000) and (spsk[40].kontrol=2) then skift(38,2,err) else skift(38,1,err); { AM Kehl => Bern } err:=0; if (s88w and $00004000=$00000000) and (spsk[40].kontrol=1) then skift(37,2,err) else skift(37,1,err); { AM Bern => Kehl } if s88buf[4]<>s88b4 then begin err:=0; s88b4:=s88buf[4]; if tgruppe[2]=$df then case s88b4 of $02 : evaluer('O 21'); $20 : evaluer('O 22'); $04 : evaluer('O 23'); $40 : evaluer('O 24'); $08 : evaluer('O 25'); $80 : evaluer('O 26'); $10 : evaluer('-SBO'); end { case } else {tgruppe} if s88b4=$10 then evaluer('SBO'); end; { SBO } while keypressed do begin c:=upcase(readkey); case c of ^@ : case readkey of 'H' : if cmd_p=0 then cmd_p:=cmd_p_max else dec(cmd_p); 'P' : if cmd_p=cmd_p_max then cmd_p:=0 else inc(cmd_p); else write(^G); end; ^C, 'Q' : sluk(0,'Terminated by user typing ^C'); ^[ : cmd_line[cmd_p]:=''; ^H : if length(cmd_line[cmd_p])>0 then delete(cmd_line[cmd_p],length(cmd_line[cmd_p]),1) else write(^G); ^M : begin if cmd_line[cmd_p]='' then status_line:=0 else status_line:=evaluer(cmd_line[cmd_p]); if cmd_p=cmd_p_max then cmd_p:=0 else inc(cmd_p); cmd_line[cmd_p]:=''; end; else cmd_line[cmd_p]:=cmd_line[cmd_p]+c; end; { case } end; { keypressed } fillchar(magasin,sizeof(magasin),0); for togvp:=0 to $ff do if togveje[togvp].magasin then begin if settogvej(togvp)=0 then togveje[togvp].magasin:=false; magasin[togveje[togvp].gruppe]:=true; end; end; { eternal loop } end.