Setting up a VISTA Printer
Back to Programming VistA Issues
A new simpler way of doing GT.M pipes for printing
The old way of doing GT.M pipes for printing requires you to use pre-open execute and post-close execute. This is a way to do it with just the open parameters.
NAME: PHAR-IP-DM $I: PHAR-IP-DM LOCATION OF TERMINAL: Inpatient Pharmacy Dot-Matrix OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -l -P PHAR-IP-DM 2>/dev/null":WRITEONLY)::"pipe" SUBTYPE: P-EPSON-DM-P15-5L TYPE: TERMINAL NAME: PHAR-IP-LS $I: PHAR-IP LOCATION OF TERMINAL: Inpatient Pharmacy Landscape OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe" SUBTYPE: P-HPLJ4SI-P13-LS TYPE: TERMINAL NAME: PHAR-IP-POR-P12 $I: PHAR-IP LOCATION OF TERMINAL: Inpatient Pharmacy Portrait (PL) OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe" MNEMONIC: PL SUBTYPE: P-HPLJ4SI-P12 TYPE: TERMINAL NAME: PHAR-IP-POR-P16 $I: PHAR-IP LOCATION OF TERMINAL: Inpatient Pharmacy Portrait (MAR) OPEN PARAMETERS: (shell="/bin/sh":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe" MNEMONIC: MAR SUBTYPE: P-HPLJ2-P16 TYPE: TERMINAL
How does this work? The way this works is that $I becomes the IO variable. The open parameters tells VISTA how to open the device.
Vista does this:
S IO=[$I] S param=[OPEN PARAMETERS] O IO:param U IO Send Open Execute from Subtype U IO(0) Interact with user; open another job, etc... U IO write write write Send Close Execute from Subtype C IO etc.
No need to do pre-open and post-close executes on the device which dynamically change IOs.
GT.M pipe for print DEVICE (older way):
With the introduction of the pipe device to GT.M (version V5.3-003) this simple, secure, and elegant method can be used:
- To begin, Update the Devices file. To create a new DEVICE, enter an unused NAME of your choice.
NAME: HP-PHOTOSMART
$I: <pipe>
PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr"")::""pipe"" s IO=""p"""
POST-CLOSE EXECUTE: X "c ""p"""
SUBTYPE: P-OTHER80
TYPE: OTHER
Note: We use TYPE:OTHER rather than Host File Server. No host file needed; output will be "piped" to the default CUPS printer. Also the fancy stuff is in the PRE-OPEN EXECUTE. For example, one can write:
PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr -P Photosmart_@192.168.5.103 -o cpi=12 -o lpi=8 -o page-left=72"")::""pipe"" s IO=""p"""
In human (ok in geekspeak), this last PRE-OPEN EXECUTE says, "Open a pipe device named "p" with the command to print to the CUPS printer named "Photosmart_@192.168.5.103". Set it to give us 12 characters/inch, 8 lines/inch and a 1 inch left margin). And then set IO to that device."
FileMan will then send his output to that IO device, the just-defined pipe.
Finally, the POST-CLOSE EXECUTE simply closes the pipe. And it's gone. No Linux /tmp/print.txt file to clean up. No fuss, no muss.
Another option is to define the device with option raw:
PRE-OPEN EXECUTE: X "o ""p"":(command=""lpr -P 1100A -o raw"")::""pipe"" s IO=""p"""
And then the SUBTYPE can manage the details of formating... Portrait vs Landscape and fonts, etc.
pipe to identify CUPS printers
--JL.Z Aug 2009
VistA output to a temporary Linux file (Calling ^TMGPRNTR) (older)
Below is an older way of setting up a Linux printer.
Here is the DEVICE file entry:
NAME: S121-LAUGHLIN-LASER
$I: <TO BE SET IN PRE-OPEN EX.>
LOCATION OF TERMINAL: Laughlin_Office
SUPPRESS FORM FEED AT CLOSE: YES
PAGE LENGTH: 70
PRE-OPEN EXECUTE: SET IO=$$GETJOBNM^TMGPRNTR()
POST-CLOSE EXECUTE: DO FINISH^TMGPRNTR("laughlin_laser")
SUBTYPE: P-OTHER80
TYPE: HOST FILE SERVER
Here are the supporting calls to routine ^TMGPRNTR that create a file for writing, and then send the output file to the Linux lpr system
GETJOBNM()
;"Purpose: To create a unique printer job name.
;" This will be used during a printing process
;" that writes the printer file to the host file system,
;" then passes file to Linux
;" printing system.
;"Output: Returns name of file to put output into
;"UNIQUE will generate a filename based on time and job number
;" i.e. 'Print-Job-628233034.tmp
;"write !,"here in GETJOBNM^TMGPRNTR",!
new cJobs set cJobs="PRINT JOBS"
new Filename set Filename=$$UNIQUE^%ZISUTL("/tmp/Print-Job.tmp")
;"Now store Filename for later transfer to Linux lpr
new index set index=$order(^TMP("TMG",cJobs,$J,""))
if index="" set index=1
set ^TMP("TMG",cJobs,$J,index)=Filename
;"write !,"Print job name will be:",Filename,!
quit Filename ;"result returned by altering Filename
FINISH(Printer)
;"Purpose: to complete the printing process by sending the now-created file
;" to Linux CUPS (the printing system).
;"Note: The lpr system itself will delete this print file when
;" done (option -r)
;"Input: Printer OPTIONAL -- the name of the linux printer to send the job to.
new cJobs set cJobs="PRINT JOBS"
new index set index=$order(^TMP("TMG",cJobs,$J,""))
new Filename set Filename=$get(^TMP("TMG",cJobs,$J,index))
close IO
kill IO(1,IO)
kill ^TMP("TMG",cJobs,$J,index)
if Filename'="" do
. new CmdStr
. set CmdStr="lpr "
. if $get(Printer)'="" set CmdStr=CmdStr_"-P "_Printer
. ;"option -r --> lpr deletes file after printing done.
. set CmdStr=CmdStr_" -r "_Filename_" &"
. ;"write !,"Here is where I call:",!,"ZSYSTEM "_CmdStr,!
. zsystem CmdStr
. ;"write "Back from zsystem. Returning to Fileman.",!
quit
--Kdtop 10:34, 18 Sep 2005)
Linux /tmp/file (With ZSYSTEM call) (older)
On a Linux system with CUPS.
NAME: PRINTSERVER
$I: /tmp/vistaprint.txt
LOCATION OF TERMINAL: lpr
OPEN COUNT: 1
POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -r /tmp/vistaprint.txt"""
SUBTYPE: P-OTHER80
TYPE: HOST FILE SERVER
And for an elaboration of this method
NAME: HP-PHOTOSMART
$I: <TO BE SET IN PRE-OPEN EXECUTE>
PRE-OPEN EXECUTE: S IO="/tmp/"_$J_"print.txt"
POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -P Photosmart_@192.168.5.103 -r /tmp/""_$J_""print.txt"""
SUBTYPE: P-OTHER80
TYPE: HOST FILE SERVER
Note: This DEVICE does not require the calls to ^TMGPRNTR. And, by exposing the lpr call in the POST-CLOSE EXECUTE, it allows more flexibility. For example, this relatively simple change will direct output to the default CUPS printer with 12 characters/inch, 8 lines/inch and a 1 inch left margin. :
POST-CLOSE EXECUTE: X "ZSYSTEM ""lpr -o cpi=12 -o lpi=8 -o page-left=72 -r /tmp/""_$J_""print.txt"""
Avoiding the Staircase effect when printing from GT.M on *Nix
For an explanation of the Staircase effect, see this: http://www.digitalissues.co.uk/html/os/unix/stair.html
Basically, the new line doesn't do a carriage return with it, so our output just flows off the page. So when you print a 10 line document, you may only see one line, as the rest was printed outside of the margin.
If you are sending raw output (lpr with the -l option) from VISTA to any PCL compatible printer (and VISTA by and large uses PCL for formatting plain text output), you need to add this to your open execute:
W $C(27),"&k2G"
This tells the PCL compatible printer to append a CR to each LF or FF.
On the other hand, if you are asking cups to handle the formatting (lpr without the -l option), cups properly formats the line returns through a cups filter, so you don't have to do anything.