Difference between revisions of "Setting up a VISTA Printer"
(→A new simpler way of doing GT.M pipes for printing) |
|||
Line 55: | Line 55: | ||
No need to do pre-open and post-close executes on the device which dynamically change IOs. | No need to do pre-open and post-close executes on the device which dynamically change IOs. | ||
+ | |||
+ | === Cache/Linux printing === | ||
+ | You can use Pipes in Cache as well to print on Linux/Unix. Here's an operative example. | ||
+ | |||
+ | <pre> | ||
+ | NAME: SAM'S PHARMACY PRINTER $I: /usr/bin/lpr -PSAN_FL6 -l | ||
+ | OPEN PARAMETERS: "QW" SUBTYPE: P-HPLJ4SI-P12 | ||
+ | TYPE: TERMINAL | ||
+ | </pre> | ||
=== GT.M pipe for print DEVICE (older way): === | === GT.M pipe for print DEVICE (older way): === | ||
Line 185: | Line 194: | ||
---- | ---- | ||
− | === Avoiding the Staircase effect when printing from GT.M on *Nix === | + | === Avoiding the Staircase effect when printing from GT.M/Cache on *Nix === |
For an explanation of the Staircase effect, see this: | For an explanation of the Staircase effect, see this: | ||
http://www.digitalissues.co.uk/html/os/unix/stair.html | http://www.digitalissues.co.uk/html/os/unix/stair.html |
Revision as of 23:21, 21 February 2014
Back to Programming VistA Issues
Contents
- 1 A new simpler way of doing GT.M pipes for printing
- 2 Cache/Linux printing
- 3 GT.M pipe for print DEVICE (older way):
- 4 VistA output to a temporary Linux file (Calling ^TMGPRNTR) (older)
- 5 Linux /tmp/file (With ZSYSTEM call) (older)
- 6 Avoiding the Staircase effect when printing from GT.M/Cache on *Nix
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.
Cache/Linux printing
You can use Pipes in Cache as well to print on Linux/Unix. Here's an operative example.
NAME: SAM'S PHARMACY PRINTER $I: /usr/bin/lpr -PSAN_FL6 -l OPEN PARAMETERS: "QW" SUBTYPE: P-HPLJ4SI-P12 TYPE: TERMINAL
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/Cache 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.