|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6912 (0x1b00)
Types: TextFile
Names: »tstmojob«
└─⟦a41ae585a⟧ Bits:30001842 SW-save af projekt 1000, Alarm-system
└─⟦72244f0ef⟧
└─⟦this⟧ »tstmojob«
job hj 2 200 time 11 0 area 10 size 100000
( mode list.yes
source = copy 25.1 ; all text after finis
tstmolst = set 1 disc1
tstmolst = indent source mark lc
liste = cross tstmolst
o errors
message timeout
pascal80 spacing.3000 codesize.3000 alarmenv source
o c
lookup pass6code
if ok.yes
( tstmobin = set 1 disc1
tstmobin = move pass6code
scope user tstmobin
message tstmobin ok
)
tstmolst = copy liste errors
scope user tstmolst
convert errors
finis
)
\f
process timeout (
opsem : ^semaphore; (* operator sem *)
var main_sem : !ts_pointer; (* main semaphore *)
(* var simtim : semaphore; (*** only when using sim timer prog ***)
ticklength, (* # msec per tick *)
max: integer); (* max # bookings simultan *)
(* the process receives bookings with moduletimeouts *)
(* and updates of tickcount. *)
(* tickcount is decreased by 1 for each tick of ticklength *)
(* m sec. when tickcount reaches zero the corresponding module- *)
(* timeout is returned. *)
(* date version init changes *)
(* 80.04.18 0 hej first edition *)
(* 80.06.02 1.2 hej new message formats, one sem. *)
(* 80.07.18 1.9 hej save function *)
(* 80.07.23 2.1 hej read function ( for demo ) *)
(* 80.08.06 2.4 hej object from book *)
(* 80.08.11 2.5 hej sender ident from book update *)
(* 80.08.25 2.6 hej date and version *)
(* 80.09.03 1.10 hej new lambda *)
(* 80.10.28 2.00 hej mainsem -> sempointer *)
(* 80.11.11 2.02 hej u3 = dummy_route (= 0 ) *)
const (* constant section *)
version = "vers 2.02 /" ;
(**sim sim= false; (* run with timer sim **)
first= 1;
cmax= timeout_l; (* max number of simultanious bookings, should be process param *)
(* other constants *)
inactive= -2; (* value in unused tickcounters *)
result_ok = 1;
result_full = 2;
result_wrong= 3;
result_obj = 4;
result_index= 5;
result_unknw= 6;
read= 2; (**demo **)
readstatus= 3;
write= 4;
writecontrol= 5;
readwrite= 6;
rwcontrol= 7;
forever= false;
dummy = dummy_route;
type (* type section *)
modules= first..cmax; (* should be first..max *)
params= record index, count, object: integer end;
identdata = record object: integer end;
savedata = record count: integer end;
var (* variables section *)
console: zone;
hour, min, sec : integer := 0; (**demo **)
delay: integer; (* # msec. in a tick *)
delay1, delay2: byte:= 0;
index, used: modules:= first;
tickcount,
objects : array(modules) of integer;
saved: array(modules) of reference;
msg, timer_msg: reference;
tickmess: pool 1; (* of header only *)
(* end of datasection *)\f
begin (* program section *)
testopen ( console, own.incname, opsem );
testout ( console, version, al_env_version );
delay:= ticklength;
while delay > 255 do
begin
delay:= delay div 2;
delay2:= delay2+1
end;
delay1:= delay;
alloc ( msg, tickmess, main_sem.s^);
msg^.u1:= readwrite;
msg^.u3:= delay1;
msg^.u4:= delay2;
(* if sim then signal ( msg, simtim ) else (**sim only with sim timer **)
sendtimer ( msg);
(* main loop *)
repeat
wait ( msg, main_sem.w^); (* answer from timer, save, booking, or update *)
if ownertest ( tickmess, msg ) then (* tick *)
begin
msg^.u3:= delay1;
msg^.u4:= delay2;
(* if sim then signal ( msg, simtim ) else (**sim **)
sendtimer ( msg);
(**demo only update hour, min, sec **)
sec:= sec+1;
if sec = 60 then
begin
sec:= 0;
min:= min+1;
if min = 60 then
begin
min:= 0;
hour:= hour+1;
if hour=24 then hour:= 0
end
end;
for index:= first to used do (* decrease tickcounters *)
begin
if tickcount(index) > 0 then
tickcount(index):= tickcount(index)-1 else
if tickcount(index) = 0 then
begin
if not nil ( saved(index)) then return ( saved(index));
tickcount(index):= inactive
end
end
end (* tick *)
else
if msg^.u3 = dummy then return ( msg)
else
case msg^.u1 of
read: (**demo only **)
begin
lock msg as buf: record hh, mm: integer end do
begin
buf.hh:= hour;
buf.mm:= min*100 + sec
end;
msg^.u2:= result_ok;
return ( msg)
end;
writecontrol: (**demo only **)
begin
lock msg as buf: record hh, mm: integer end do
begin
hour:= buf.hh;
min:= buf.mm div 100;
sec:= buf.mm mod 100
end;
msg^.u2:= result_ok;
return ( msg)
end;
readstatus: (* save *)
begin
index:= first;
while not nil ( saved(index) ) do index:= index+1;
if index = cmax then
begin
msg^.u2:= result_full;
return ( msg)
end else
begin
msg^.u2:= result_ok;
lock msg as buf: savedata do
begin
if buf.count < 1 then buf.count:= 1;
tickcount(index):= buf.count;
end;
objects(index):= index;
saved(index) :=: msg;
if index > used then used:= index
end
end; (* save *)
rwcontrol: (* booking *)
begin
pop ( timer_msg, msg );
timer_msg^.u3:= msg^.u3;
index:= first;
while not nil( saved(index)) do index:= index+1;
if index = cmax then
begin
timer_msg^.u2:= result_full;
return ( timer_msg);
msg^.u2:= result_full
end else
begin
timer_msg^.u2:= result_ok;
msg^.u2:= result_ok;
lock msg as buf: params do
begin
tickcount(index):= buf.count;
objects(index):= buf.object;
buf.index:= index;
end;
lock timer_msg as data:identdata do data.object:= objects(index);
saved(index) :=: timer_msg;
if index > used then used:= index
end;
return ( msg)
end; (* booking *)
write: (* update tickcount *)
begin
lock msg as buf:params do
begin
if ( first<=buf.index ) and ( buf.index<=cmax ) then
if nil( saved(buf.index)) then msg^.u2:= result_wrong else
if buf.object = objects(buf.index) then
begin
saved(buf.index)^.u3:= msg^.u3;
if buf.count = 0 then return ( saved(buf.index)) else
tickcount(buf.index):= buf.count;
msg^.u2:= result_ok
end else msg^.u2:= result_obj
else msg^.u2:= result_index
end;
return ( msg)
end;
otherwise (* all unknown functions *)
begin
msg^.u2:= result_unknw;
return ( msg )
end;
end; (* case *)
until forever
end . (* of time out process *)
▶EOF◀