Difference between revisions of "Setting up a VISTA Printer"

From VistApedia
Jump to: navigation, search
m (GT.M pipe for print DEVICE:)
Line 1: Line 1:
 
Back to [[Programming VistA Issues]]
 
Back to [[Programming VistA Issues]]
 
__TOC__
 
__TOC__
 +
 +
=== Sam's 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. Here are examples from a production system.
 +
 +
<pre style="padding:1em;border:1px dashed #2f6fab;color:black;background-color:#f9f9f9;line-height:1.1em">
 +
NAME: PHAR-IP-DM                        $I: PHAR-IP-DM
 +
  LOCATION OF TERMINAL: Inpatient Pharmacy Dot-Matrix
 +
  OPEN PARAMETERS: (shell="/bin/bash":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/bash":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/bash":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/bash":comm="lpr -P PHAR-IP -l":WRITEONLY)::"pipe"
 +
MNEMONIC: MAR
 +
  SUBTYPE: P-HPLJ2-P16                  TYPE: TERMINAL
 +
</pre>
 +
 +
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:
 +
<pre style="padding:1em;border:1px dashed #2f6fab;color:black;background-color:#f9f9f9;line-height:1.1em">
 +
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.
 +
</pre>
 +
 +
No need to do pre-open and post-close executes on the device which dynamically change IOs.
 +
 
=== GT.M pipe for print DEVICE: ===
 
=== GT.M pipe for print DEVICE: ===
  

Revision as of 16:26, 28 August 2011

Back to Programming VistA Issues

Sam's 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. Here are examples from a production system.

NAME: PHAR-IP-DM                        $I: PHAR-IP-DM
  LOCATION OF TERMINAL: Inpatient Pharmacy Dot-Matrix
  OPEN PARAMETERS: (shell="/bin/bash":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/bash":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/bash":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/bash":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:

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)

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)

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"""