?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 32

Line No. Rev Author Line
1 32 kaklik /******************************************************************************
2 ESC/POS Printer Language Support
3  
4 Summary:
5 This file provides support for the ESC/POS printer language when using the
6 USB Embedded Host Printer Client Driver.
7  
8 Description:
9 This file provides support for the ESC/POS printer language when using the
10 USB Embedded Host Printer Client Driver.
11  
12 The exact implementation of ESC/POS varies across manufacturers and even
13 across different models from the same manufacturer. Some POS printers use
14 specialized Device ID strings (obtained with the GET DEVICE ID class-
15 specific request) to indicate the deviations from the strict ESC/POS
16 specification. Also, many printers indicate a custom USB Peripheral Device
17 rather than the Printer Class, and therefore do not support the
18 GET DEVICE ID device request. For example:
19 <code>
20 Printer Tested VID/PID Class Device ID Substring
21 -------------------------------------------------------------
22 Bixolon SRP-270 0x0419/0x3C01 Printer ESC
23 Epson TM-T88IV 0x04B8/0x0202 Custom Not supported
24 Seiko DPU-V445 0x0619/0x0111 Printer Not present
25 Seiko MPU-L465 0x0619/0x0109 Printer SIIMPU
26 </code>
27 Therefore, dynamic language determination is not recommended for POS
28 printers. Instead, create your application to target a either a single
29 printer model or a group of printer models with identical requirements,
30 and indicate specific VID, PID, and printer language via the USB
31 Configuration Tool, and test the application to ensure consistent behavior
32 across all supported printer models.
33  
34 The ESC/POS language support code provides several #defines that allow the
35 language support file to automatically configure itself for different
36 printer models. These #defines can be set using the USB Configuration Tool
37 (USBConfig.exe or MPLAB VDI). Note that they are determined at compile
38 time, not run time, so only one type of printer can be utilized by an
39 application. Printer models other that the ones explicitly tested may
40 require other modifications to the language support code.
41  
42 Notes:
43 Currently, only standard mode is supported.
44  
45 The black and white bit image polarity is 0=white, 1=black, which is
46 reversed from the Microchip Graphics Library polarity. This driver will
47 automatically convert the image data to the required format, as long as the
48 image data is located in ROM (USB_PRINTER_TRANSFER_FROM_ROM) or it is
49 copied from a RAM buffer (USB_PRINTER_TRANSFER_COPY_DATA). If the data is
50 to be sent directly from its original RAM location, the data must already
51 be in the format required by the printer language.
52  
53  
54 *******************************************************************************/
55 //DOM-IGNORE-BEGIN
56 /******************************************************************************
57  
58 * FileName: usb_host_printer_esc_pos.h
59 * Dependencies: None
60 * Processor: PIC24/dsPIC30/dsPIC33/PIC32MX
61 * Compiler: C30 v3.10b/C32 v1.02
62 * Company: Microchip Technology, Inc.
63  
64 Software License Agreement
65  
66 The software supplied herewith by Microchip Technology Incorporated
67 (the “Company”) for its PICmicro® Microcontroller is intended and
68 supplied to you, the Company’s customer, for use solely and
69 exclusively on Microchip PICmicro Microcontroller products. The
70 software is owned by the Company and/or its supplier, and is
71 protected under applicable copyright laws. All rights are reserved.
72 Any use in violation of the foregoing restrictions may subject the
73 user to criminal sanctions under applicable laws, as well as to
74 civil liability for the breach of the terms and conditions of this
75 license.
76  
77 THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
78 WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
79 TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
80 PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
81 IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
82 CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
83  
84 Change History:
85 Rev Description
86 ---- ----------------------------------------
87 2.6a- No change
88 2.7a
89 *******************************************************************************/
90 //DOM-IGNORE-END
91  
92  
93 // *****************************************************************************
94 // *****************************************************************************
95 // Section: Constants
96 // *****************************************************************************
97 // *****************************************************************************
98  
99 // This is the string that the printer language support determination
100 // routine will look for to determine if the printer supports this
101 // printer language. This string is case sensive. See the function
102 // USBHostPrinterLanguageESCPOSIsSupported() for more information
103 // about using or changing this string. Dynamic language determination
104 // is not recommended when using POS printers.
105 #define LANGUAGE_ID_STRING_ESCPOS "ESC"
106 // These are the support flags that are set for this language.
107 #define LANGUAGE_SUPPORT_FLAGS_ESCPOS USB_PRINTER_FUNCTION_SUPPORT_POS
108  
109  
110 /****************************************************************************
111 Function:
112 BYTE USBHostPrinterLanguageESCPOS( BYTE address,
113 USB_PRINTER_COMMAND command, USB_DATA_POINTER data, DWORD size, BYTE transferFlags )
114  
115 Summary:
116 This function executes printer commands for an ESC/POS printer.
117  
118 Description:
119 This function executes printer commands for an ESC/POS printer. When
120 the application issues a printer command, the printer client driver
121 determines what language to use to communicate with the printer, and
122 transfers the command to that language support routine. As much as
123 possible, commands are designed to produce the same output regardless
124 of what printer language is used.
125  
126 Not all printer commands support data from both RAM and ROM. Unless
127 otherwise noted, the data pointer is assumed to point to RAM, regardless of
128 the value of transferFlags. Refer to the specific command to see if ROM
129 data is supported.
130  
131 Preconditions:
132 None
133  
134 Parameters:
135 BYTE address - Device's address on the bus
136 USB_PRINTER_COMMAND command - Command to execute. See the enumeration
137 USB_PRINTER_COMMAND for the list of
138 valid commands and their requirements.
139 USB_DATA_POINTER data - Pointer to the required data. Note that
140 the caller must set transferFlags
141 appropriately to indicate if the pointer is
142 a RAM pointer or a ROM pointer.
143 DWORD size - Size of the data. For some commands, this
144 parameter is used to hold the data itself.
145 BYTE transferFlags - Flags that indicate details about the
146 transfer operation. Refer to these flags
147 * USB_PRINTER_TRANSFER_COPY_DATA
148 * USB_PRINTER_TRANSFER_STATIC_DATA
149 * USB_PRINTER_TRANSFER_NOTIFY
150 * USB_PRINTER_TRANSFER_FROM_ROM
151 * USB_PRINTER_TRANSFER_FROM_RAM
152  
153 Return Values:
154 USB_PRINTER_SUCCESS - The command was executed successfully.
155 USB_PRINTER_UNKNOWN_DEVICE - A printer with the indicated address is not
156 attached
157 USB_PRINTER_TOO_MANY_DEVICES - The printer status array does not have
158 space for another printer.
159 USB_PRINTER_OUT_OF_MEMORY - Not enough available heap space to
160 execute the command.
161 other - See possible return codes from the
162 function USBHostPrinterWrite().
163  
164 Remarks:
165 When developing new commands, keep in mind that the function
166 USBHostPrinterCommandReady() will be used before calling this function to
167 see if there is space available in the output transfer queue.
168 USBHostPrinterCommandReady() will routine TRUE if a single space is
169 available in the output queue. Therefore, each command can generate only
170 one output transfer.
171  
172 Multiple printer languages may be used in a single application. The USB
173 Embedded Host Printer Client Driver will call the routine required for the
174 attached device.
175 ***************************************************************************/
176  
177 BYTE USBHostPrinterLanguageESCPOS( BYTE address,
178 USB_PRINTER_COMMAND command, USB_DATA_POINTER data, DWORD size, BYTE transferFlags );
179  
180  
181 /****************************************************************************
182 Function:
183 BOOL USBHostPrinterLanguageESCPOSIsSupported( char *deviceID,
184 USB_PRINTER_FUNCTION_SUPPORT *support )
185  
186 Description:
187 This function determines if the printer with the given device ID string
188 supports the ESC/POS printer language.
189  
190 Preconditions:
191 None
192  
193 Parameters:
194 char *deviceID - Pointer to the "COMMAND SET:" portion of the device ID
195 string of the attached printer.
196 USB_PRINTER_FUNCTION_SUPPORT *support - Pointer to returned information
197 about what types of functions this printer supports.
198  
199 Return Values:
200 TRUE - The printer supports ESC/POS.
201 FALSE - The printer does not support ESC/POS.
202  
203 Remarks:
204 The caller must first locate the "COMMAND SET:" section of the device ID
205 string. To ensure that only the "COMMAND SET:" section of the device ID
206 string is checked, the ";" at the end of the section should be temporarily
207 replaced with a NULL. Otherwise, this function may find the printer
208 language string in the comments or other section, and incorrectly indicate
209 that the printer supports the language.
210  
211 Device ID strings are case sensitive.
212  
213 See the file header comments for this file (usb_host_printer_esc_pos.h)
214 for cautions regarding dynamic printer language selection with POS
215 printers.
216 ***************************************************************************/
217  
218 BOOL USBHostPrinterLanguageESCPOSIsSupported( char *deviceID,
219 USB_PRINTER_FUNCTION_SUPPORT *support );
220  
221  
222 /****************************************************************************
223 Function:
224 USB_DATA_POINTER USBHostPrinterPOSImageDataFormat( USB_DATA_POINTER image,
225 BYTE imageLocation, WORD imageHeight, WORD imageWidth, WORD *currentRow,
226 BYTE byteDepth, BYTE *imageData )
227  
228 Summary:
229 This function formats data for a bitmapped image into the format required
230 for sending to a POS printer.
231  
232 Description:
233 This function formats data for a bitmapped image into the format required
234 for sending to a POS printer. Bitmapped images are stored one row of pixels
235 at a time. Suppose we have an image with vertical black bars, eight pixels
236 wide and eight pixels deep. The image would appear as the following pixels,
237 where 0 indicates a black dot and 1 indicates a white dot:
238 <code>
239  
240  
241  
242  
243  
244  
245  
246  
247 </code>
248 The stored bitmap of the data would contain the data bytes, where each byte
249 is one row of data:
250 <code>
251 0x55 0x55 0x55 0x55 0x55 0x55 0x55 0x55
252 </code>
253 When printing to a full sheet printer, eight separate
254 USB_PRINTER_IMAGE_DATA_HEADER / USB_PRINTER_IMAGE_DATA command combinations
255 are required to print this image.
256  
257 POS printers, however, require image data formated either 8 dots or 24 dots
258 deep, depending on the desired (and supported) vertical print density. For
259 a POS printer performing an 8-dot vertical density print, the data needs to
260 be in this format:
261 <code>
262 0x00 0xFF 0x00 0xFF 0x00 0xFF 0x00 0xFF
263 </code>
264 When printing to a POS printer, only one
265 USB_PRINTER_IMAGE_DATA_HEADER / USB_PRINTER_IMAGE_DATA command combination
266 is required to print this image.
267  
268 This function supports 8-dot and 24-dot vertical densities by specifying
269 the byteDepth parameter as either 1 (8-dot) or 3 (24-dot).
270  
271 Precondition:
272 None
273  
274 Parameters:
275 USB_DATA_POINTER image Pointer to the image bitmap data.
276 BYTE imageLocation Location of the image bitmap data. Valid values
277 are USB_PRINTER_TRANSFER_FROM_ROM and
278 USB_PRINTER_TRANSFER_FROM_RAM.
279 WORD imageHeight Height of the image in pixels.
280 WORD imageWidth Width of the image in pixels.
281 WORD *currentRow The current pixel row. Upon return, this value is
282 updated to the next pixel row to print.
283 BYTE byteDepth The byte depth of the print. Valid values are 1
284 (8-dot vertical density) and 3 (24-dot vertical
285 density).
286 BYTE *imageData Pointer to a RAM data buffer that will receive the
287 manipulated data to send to the printer.
288  
289 Returns:
290 The function returns a pointer to the next byte of image data.
291  
292 Example:
293 The following example code will send a complete bitmapped image to a POS
294 printer.
295 <code>
296 WORD currentRow;
297 BYTE depthBytes;
298 BYTE *imageDataPOS;
299 USB_PRINTER_IMAGE_INFO imageInfo;
300 BYTE returnCode;
301 #if defined (__C30__)
302 BYTE __prog__ *ptr;
303 ptr = (BYTE __prog__ *)logoMCHP.address;
304 #elif defined (__PIC32MX__)
305 const BYTE *ptr;
306 ptr = (const BYTE *)logoMCHP.address;
307 #endif
308  
309 imageInfo.densityVertical = 24; // 24-dot density
310 imageInfo.densityHorizontal = 2; // Double density
311  
312 // Extract the image height and width
313 imageInfo.width = ((WORD)ptr[5] << 8) + ptr[4];
314 imageInfo.height = ((WORD)ptr[3] << 8) + ptr[2];
315  
316 depthBytes = imageInfo.densityVertical / 8;
317 imageDataPOS = (BYTE *)malloc( imageInfo.width *
318 depthBytes );
319  
320 if (imageDataPOS == NULL)
321 {
322 // Error - not enough heap space
323 }
324  
325 USBHostPrinterCommandWithReadyWait( &returnCode,
326 printerInfo.deviceAddress, USB_PRINTER_IMAGE_START,
327 USB_DATA_POINTER_RAM(&imageInfo),
328 sizeof(USB_PRINTER_IMAGE_INFO ),
329  
330  
331 ptr += 10; // skip the header info
332  
333 currentRow = 0;
334 while (currentRow < imageInfo.height)
335 {
336 USBHostPrinterCommandWithReadyWait( &returnCode,
337 printerInfo.deviceAddress,
338 USB_PRINTER_IMAGE_DATA_HEADER, USB_NULL,
339 imageInfo.width, 0 );
340  
341 ptr = USBHostPrinterPOSImageDataFormat(
342 USB_DATA_POINTER_ROM(ptr),
343 USB_PRINTER_TRANSFER_FROM_ROM, imageInfo.height,
344 imageInfo.width, &currentRow, depthBytes,
345 imageDataPOS ).pointerROM;
346  
347 USBHostPrinterCommandWithReadyWait( &returnCode,
348 printerInfo.deviceAddress, USB_PRINTER_IMAGE_DATA,
349 USB_DATA_POINTER_RAM(imageDataPOS), imageInfo.width,
350 USB_PRINTER_TRANSFER_COPY_DATA);
351 }
352  
353 free( imageDataPOS );
354  
355 USBHostPrinterCommandWithReadyWait( &returnCode,
356 printerInfo.deviceAddress, USB_PRINTER_IMAGE_STOP,
357 USB_NULL, 0, 0 );
358 </code>
359  
360 Remarks:
361 This routine currently does not support 36-dot density printing. Since
362 the output for 36-dot vertical density is identical to 24-dot vertical
363 density, 24-dot vertical density should be used instead.
364  
365 This routine does not yet support reading from external memory.
366 ***************************************************************************/
367  
368 USB_DATA_POINTER USBHostPrinterPOSImageDataFormat( USB_DATA_POINTER image,
369 BYTE imageLocation, WORD imageHeight, WORD imageWidth, WORD *currentRow,
370 BYTE byteDepth, BYTE *imageData );
371  
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3