perm filename IOV4.2[EAL,HE] blob
sn#714825 filedate 1983-06-05 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 {$NOMAIN Individual statement interpreters }
C00005 00003 procedure doPrint external
C00006 00004 procedure doPause external
C00007 00005 procedure doAbort external
C00008 00006 procedure doSetbase external
C00010 00007 procedure doWrist external
C00014 00008 procedure doRetry external
C00016 ENDMK
C⊗;
{$NOMAIN Individual statement interpreters }
const
GARMDEV = 1; (* device numbers for ARM *)
FTABLE = (*400B*) 256; (* Force trans (C) in table coordinates *)
FHAND = 0; (* " " " " hand coordinate system *)
%include ialhdr.pas;
{ Externally defined routines: }
(* From ALLOC *)
function newVector: vectorp; external;
procedure relVector(v: vectorp); external;
procedure relNode(n: nodep); external;
(* From IAUX1A *)
function pop: nodep; external;
function getELev(hdr: envheaderp): integer; external;
function gtVarn (n: nodep): enventryp; external;
function getNval(n: nodep; var b: boolean): nodep; external;
procedure sendCmd; external;
procedure sendTrans(tr: transp); external;
(* From IAUX1B *)
procedure sleep(whenV: integer); external;
procedure prntPlist(n: nodep); external;
(* From IAUX2A *)
procedure getReply(sendIt: boolean); external;
procedure killEnv; external;
(* From IAUX2B *)
function cmonCheck: boolean; external;
(* Display-related Routines *)
procedure ppLine; external;
procedure ppOutNow; external;
procedure ppChar(ch: ascii); external;
procedure pp5(ch: c5str; length: integer); external;
procedure pp10(ch: cstring; length: integer); external;
procedure pp10L(ch: cstring; length: integer); external;
procedure pp20(ch: c20str; length: integer); external;
procedure pp20L(ch: c20str; length: integer); external;
procedure ppInt(i: integer); external;
procedure ppReal(r: real); external;
procedure ppStrng(length: integer; s: strngp); external;
procedure ppDelChar; external;
(* From RSXMSG *)
procedure signalArm; external;
procedure doPrint; external;
procedure doPrint;
begin
with curInt↑ do
begin (* print everything out *)
prntplist(spc↑.plist);
mode := 0;
spc := spc↑.next;
end;
end;
procedure doPause; external;
procedure doPause;
var i: integer; n: nodep;
begin
n := pop;
i := round(n↑.s * 60); (* get pause time (in 60Hz ticks) *)
relNode(n);
curInt↑.mode := 0; (* get ready for next statement *)
curInt↑.spc := curInt↑.spc↑.next;
sleep(i); (* put us to sleep for a while *)
end;
procedure doAbort; external;
procedure doAbort;
begin
with curInt↑ do
begin (* print everything out *)
if spc↑.debugLev = 0 then
begin (* a real abort *)
msg↑.cmd := abortcmd; (* Send over ABORT command to ARM module *)
sendCmd;
prntplist(spc↑.plist);
spc := spc↑.next;
pp10L('Aborting ',8);
running := false; (* break to debugger *)
end
else if debugLevel = spc↑.debugLev then
running := false (* break if debugger process *)
else spc := spc↑.next; (* just ignore it *)
mode := 0;
end;
end;
procedure doSetbase; external;
procedure doSetbase;
var mechbits: integer; e: enventryp;
procedure complain;
begin (* yow! frame that's not affixed to a device *)
pp20L('Attempt to zero unkn',20); pp20('own wrist: assuming ',20);
pp5('GARM ',4); ppLine;
mechbits := GARMDEV;
end;
begin
with curInt↑ do
begin
if spc↑.cf = nil then complain
else
begin
e := gtVarn(spc↑.cf); (* see which wrist we're zeroing *)
with e↑.f↑ do
if ftype then (* a frame - is it affixed to a device? *)
if dev <> nil then mechbits := dev↑.mech
else complain
else (* a device *)
if not sdev then mechbits := mech
else complain; (* currently scalar devices are no good *)
end;
msg↑.cmd := zerowristcmd; (* tell ARM servo to zero wrist *)
msg↑.dev := mechbits;
sendCmd;
mode := 0;
spc := spc↑.next;
end;
end;
procedure doWrist; external;
procedure doWrist;
var e,fv,tv: enventryp; b: boolean;
t: transp; v: vectorp; i: integer; val: nodep;
procedure complain;
begin (* yow! frame that's not affixed to a device *)
pp20L('Attempt to read unkn',20); pp20('own wrist: assuming ',20);
pp5('GARM ',4); ppLine;
i := GARMDEV;
end;
begin
with curInt↑ do
begin
if spc↑.arm = nil then complain
else
begin
e := gtVarn(spc↑.arm); (* see which wrist we're zeroing *)
with e↑.f↑ do
if ftype then (* a frame - is it affixed to a device? *)
if dev <> nil then i := dev↑.mech
else complain
else (* a device *)
if not sdev then i := mech
else complain; (* currently scalar devices are no good *)
end;
if spc↑.ff <> nil then
begin
val := getNval(spc↑.ff,b); (* get force frame value *)
t := val↑.t;
end
else begin t := niltrans; b := false end;
fv := gtVarn(spc↑.fvec); (* get where to store results *)
tv := gtVarn(spc↑.tvec);
if fv↑.v <> nil then (* flush any old values *)
with fv↑.v↑ do
begin
refcnt := refcnt - 1;
if refcnt <= 0 then relVector(fv↑.v);
end;
if tv↑.v <> nil then
with tv↑.v↑ do
begin
refcnt := refcnt - 1;
if refcnt <= 0 then relVector(tv↑.v);
end;
with msg↑ do
begin
cmd := wristcmd;
dev := i;
if spc↑.csys then bits := FTABLE else bits := FHAND;
end;
sendTrans(t); (* send command & trans over *)
signalArm; (* tell ARM *)
if b then relNode(val);
getReply(false); (* have ARM servo read wrist *)
v := newVector;
for i := 1 to 3 do v↑.val[i] := msg↑.t[i];
fv↑.v := v; (* store away force vector *)
v↑.refcnt := 1;
v := newVector;
for i := 1 to 3 do v↑.val[i] := msg↑.t[i+3];
tv↑.v := v; (* store away torque vector *)
v↑.refcnt := 1;
mode := 0;
spc := spc↑.next;
end;
end;
procedure doRetry; external;
procedure doRetry;
var b: boolean;
begin
with curInt↑ do
begin
if spc↑.rparent <> nil then
begin
b := true;
while b and (spc↑.olevel < getELev(env)) do
begin (* make sure all cmon's in outer environments have finished *)
b := cmonCheck;
if b then killEnv; (* flush all environments out to move *)
end;
if b then (* no cmons now running *)
begin
(* *** might need to clean up stack some here (fornodes) *** *)
spc := spc↑.rcode; (* go redo the previous motion *)
mode := 0;
end
else sleep(30); (* give cmons time to finish *)
end
else
begin
spc := spc↑.next; (* just go on to next statement *)
mode := 0;
end;
end;
end;