|
|
DataMuseum.dkPresents historical artifacts from the history of: RC3500 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC3500 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6912 (0x1b00)
Types: TextFileVerbose
Names: »tscpsk«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system
└─⟦72244f0ef⟧
└─⟦this⟧ »tscpsk«
process tsconnector(
semvector: system_vector;
var inputsem, dcsem, lamsem, timeoutsem: semaphore;
lamchannelno: integer;
owntsmacro: macroaddr);
(* function: this module establishes a connection between
two RC3502 machines in the demonstration model *)
const
tsdatasize=52 (* no of bytes in data part of buffer from tss *);
tsbufsize= 64 (* no of bytes in buffer from tss *);
lambufsize= 259 (* no of bytes in byffer to lamdriver *);
type
statetype= (idle, wd , wrtr, wt, wack);
inputtype= (enq, data, out, here, rnr, nak, ack, rtr, lto, tto, nons);
messagetype= (* message to/from tss *)
record
allabel: alarmlabel;
data: array (1..tsdatasize) of byte;
end;
tsbuftype= (* message to/from tss *)
record
data: array (1..tsbufsize) of byte;
end;
lambuftype= (* message to/from lamdriver *)
record
stxt: char;
bll, opc: byte;
rec, send: alarmnetaddr; (*8 bytes*)
error_no, mess_type: byte;
data: array (1..lambufsize-16) of byte; (*243 bytes*)
etxt: char;
crc1, crc2: byte;
end;
createchtype= (* message format in createchannel operation *)
record
controlinfo, timeout: byte;
end;
staterow= array (inputtype) of statetype;
statetabletype= array (statetype) of staterow;
actionrow= array (inputtype) of integer;
actiontabletype= array (statetype) of actionrow;
const
statetable=
statetabletype(
(* enq data out here rnr nak ack rtr lto tto nons *)
(*idle*)staterow(wd ,idle,wrtr,idle,idle,idle,idle,idle,idle,idle,idle),
(*wd *)staterow(wd ,idle,wd ,wd ,wd ,wd ,wd ,wd ,wd ,wd ,wd ),
(*wrtr*)staterow(wt ,wrtr,wrtr,wrtr,wt ,wrtr,wrtr,wack,wrtr,wrtr,wrtr),
(*wt *)staterow(wd ,wt ,wt ,wt ,wt ,wt ,wt ,wt ,wt ,wrtr,wt ),
(*wack*)staterow(wack,wack,wack,wack,wack,wack,idle,wack,wack,wack,wack));
actiontable=
actiontabletype(
(* enq data out here rnr nak ack rtr lto tto nons *)
(*idle*)actionrow( 1, 10, 2, 14, 11, 11, 11, 11, 0, 15, 11),
(*wd *)actionrow( 1, 3, 4, 14, 11, 11, 11, 11, 11, 15, 9),
(*wrtr*)actionrow( 7, 12, 4, 14, 5, 12, 12, 6, 12, 15, 12),
(*wt *)actionrow( 1, 11, 4, 14, 0, 11, 11, 11, 0, 16, 11),
(*wack*)actionrow( 13, 13, 4, 14, 13, 13, 8, 13, 13, 15, 13));
tick1= 1; (* timeoutinterval for dcts *)
tick2= 5; (* timeoutinterval for the other ts *)
(* operation codes in protocol between tsconnectors *)
enqop= 0;
dataop= 1;
rtrop= 2;
rnrop= 3;
ackop= 4;
nakop= 5;
var
(*pools*)
dcpool: pool 2 of messagetype;
lampool: pool 2 of lambuftype;
updatepool: pool 1 of updates;
timerpool: pool 1 of timers;
(*semaphores*)
listensem,
commandsem,
dcoutsem,
lamoutsem,
outsem,
timeoutanswer: semaphore;
(*references*)
commandref,
dataref,
dcref,
lamref,
listenref,
msg,
tim: reference;
(*zones*)
z: zone;
(*integers*)
tec, (* transmission error count *)
outputtec, (* transmission error count for lam output *)
i,
action: integer;
(*booleans*)
checklamlisten: boolean; (* in normal case false; becomes true
after recreation of lamchannel caused by output status error *)
(*other variables*)
state: statetype;
input: inputtype;
(*forward*)
procedure getinputbuf;
forward;
function decodeinput (var ref: reference): inputtype;
(* decodes the inputtype of the buffer pointed to by "ref" *)
begin end;
procedure getcommand;
(* gets the next commandbuffer. Listen buffers arriving in the
meantime are sent to listensem *)
(* equivalent to getlisten *)
begin end;
function getinput: inputtype;
(* gets the next buffer to handle. The buffer is taken from either
commandsem or outsem depending on the state and the semaphores *)
begin end;
procedure getinputbuf;
(* gets a buffer from the inputsem and sends it to either
commandsem or listensem *)
begin end;
procedure getlisten;
(* waits until a listenbuffer arrives. Other buffertypes arriving
in the meantime are sent to the commandsem *)
begin end;
procedure sendop (opcode: integer);
(* gets and fills in lamoutputbuffer, sends it to lamdriver *)
begin end;
procedure sendtotss;
(* copies listenbuffer from lamdriver onto listenbuffer from tss
and returns tss listenbuffer *)
begin end;
procedure sendtodc;
(* copies listenbuffer from lamdriver onto dcoutputbuffer
and signals it to dc *)
begin end;
procedure to_tss_or_dc;
(* decides where to deliver buffer from lamdriver *)
begin end;
procedure sendlocal;
(* delivers a buffer from one local module (not lamdriver) to another *)
begin end;
(****************************
* *
* main program *
* *
****************************)
begin
state:= idle;
(*< create lamchannel >*)
(*< initialise output and listen buffers for lamdriver and dc_module >*)
(*< timeout booking >*)
repeat
input:= getinput;
action:= actiontable(state, input);
case action of
0: (*no action *)
signal (commandref, lamsem);
1: (*send rtr*)
begin
sendop (rtrop);
signal (commandref, lamsem);
end;
2: (*send enq*)
begin
sendop (enqop);
dataref:=: commandref;
end;
3: (*send ack to lam and data to tss or dc*)
begin
to_tss_or_dc;
sendop (ackop);
signal (commandref, lamsem);
end;
4: (*output to outsem*)
signal (commandref, outsem);
5: (*send update to timer*)
begin
if owntsmacro= dc_ts (*i.e. this ts has dc_module *)
then timerupdate (msg, tick1)
else timerupdate (msg, tick2);
signal (commandref, lamsem);
end;
6: (*send data*)
begin
sendop (dataop);
signal (commandref, lamsem);
end;
7: (*send rnr and update timer*)
begin
sendop (rnrop);
signal (commandref, lamsem);
if owntsmacro= dc_ts
then timerupdate (msg, tick1)
else timerupdate (msg, tick2)
end;
8: (*no action*)
begin
signal (commandref, lamsem);
return (dataref);
end;
9: (*send nak*)
begin
tec:= tec + 1;
sendop (nakop);
signal (commandref, lamsem);
end;
10: (*send ack*)
begin
tec:= tec + 1;
sendop (ackop);
signal (commandref, lamsem);
end;
11: (*transmission error*)
begin
tec:= tec + 1;
signal (commandref, lamsem);
end;
12: (* transm. error - send enq *)
begin
tec:= tec + 1;
sendop (enqop);
signal (commandref, lamsem);
end;
13: (*transm. error - send data*)
begin
tec:= tec + 1;
sendop (dataop);
signal (commandref, lamsem);
end;
14: (*send data to local module*)
sendlocal;
15: timerbook (msg, tim, -1, netc_mic_addr);
16: (*timerbook and send enq*)
begin
timerbook (msg, tim, -1, netc_mic_addr);
sendop (enqop);
end;
end (* case *);
state:= statetable (state, input)
until false;
end.
«eof»