Called by parent program:
vc-send.setl (Section A.38 [vc-send.setl])
Calls child programs:
vc-comdev.setl (Section A.7 [vc-comdev.setl])
vc-comport.setl (Section A.8 [vc-comport.setl])
Source code: *
const yhwh = `vc-autoinit.setl';
-- Try to provoke the Canon into auto-initializing
printa (stderr, yhwh, `begins');
com_dev := filter (`exec setl vc-comdev.setl');
com_port := val filter (`exec setl vc-comport.setl');
msr := 6; -- modem status register (MSR)
cts_bit := 2**4; -- ``clear to send'' (CTS) bit
fd := fileno open (`/dev/port', `direct');
-- Obtain initial CTS value
seek (fd, com_port + msr);
msr_val := abs getc (fd);
cts_val := sign (msr_val bit_and cts_bit);
printa (stderr, `CTS at entry to', yhwh, `:', cts_val);
-- Try to provoke an auto-init by sending a bad length byte
putfile (com_dev, `\xff');
start_clock := clock;
-- Delay 300 ms to give it plenty of chance to take effect
select (om, 300);
seek (fd, com_port + msr);
msr_val := abs getc (fd);
cts_val := sign (msr_val bit_and cts_bit);
printa (stderr, `CTS after 300 ms :', cts_val);
-- Watch for CTS to come back up.
loop doing
delta := clock - start_clock;
while delta < 7500 do
select (om, 100); -- delay 100 ms
seek (fd, com_port + msr);
msr_val := abs getc (fd);
if sign (msr_val bit_and cts_bit) = 1 then
printa (stderr, `CTS up after', delta, `ms');
goto done;
end if;
end loop;
printa (stderr, `CTS not up after', delta, `ms');
done:
printa (stderr, yhwh, `ends');