From 5d5412ba73ea3fe89ebf477d0832b06ab999cbcf Mon Sep 17 00:00:00 2001 From: Patrick Kanzler Date: Thu, 3 Mar 2016 04:21:35 +0100 Subject: [PATCH] REFACTOR use bytes in constants-section adds six for cross-version int/byte-conversion --- escpos/constants.py | 234 ++++++++++++++++++++++---------------------- escpos/escpos.py | 6 +- setup.py | 1 + 3 files changed, 123 insertions(+), 118 deletions(-) diff --git a/escpos/constants.py b/escpos/constants.py index 704f167..c4bddd3 100644 --- a/escpos/constants.py +++ b/escpos/constants.py @@ -13,53 +13,55 @@ moved to `capabilities` as in `escpos-php by @mike42 ) -_CASH_DRAWER = lambda m, t1='', t2='': ESC + 'p' + m + chr(t1) + chr(t2) -CD_KICK_2 = _CASH_DRAWER('\x00', 50, 50) # Sends a pulse to pin 2 [] -CD_KICK_5 = _CASH_DRAWER('\x01', 50, 50) # Sends a pulse to pin 5 [] +_CASH_DRAWER = lambda m, t1='', t2='': ESC + b'p' + m + six.int2byte(t1) + six.int2byte(t2) +CD_KICK_2 = _CASH_DRAWER(b'\x00', 50, 50) # Sends a pulse to pin 2 [] +CD_KICK_5 = _CASH_DRAWER(b'\x01', 50, 50) # Sends a pulse to pin 5 [] # Paper Cutter -_CUT_PAPER = lambda m: GS + 'V' + m -PAPER_FULL_CUT = _CUT_PAPER('\x00') # Full cut paper -PAPER_PART_CUT = _CUT_PAPER('\x01') # Partial cut paper +_CUT_PAPER = lambda m: GS + b'V' + m +PAPER_FULL_CUT = _CUT_PAPER(b'\x00') # Full cut paper +PAPER_PART_CUT = _CUT_PAPER(b'\x01') # Partial cut paper # Text format # TODO: Acquire the "ESC/POS Application Programming Guide for Paper Roll # Printers" and tidy up this stuff too. -TXT_FLIP_ON = ESC + '\x7b\x01' -TXT_FLIP_OFF = ESC + '\x7b\x00' -TXT_SMOOTH_ON = GS + '\x62\x01' -TXT_SMOOTH_OFF = GS + '\x62\x00' -TXT_SIZE = GS + '!' +TXT_FLIP_ON = ESC + b'\x7b\x01' +TXT_FLIP_OFF = ESC + b'\x7b\x00' +TXT_SMOOTH_ON = GS + b'\x62\x01' +TXT_SMOOTH_OFF = GS + b'\x62\x00' +TXT_SIZE = GS + b'!' TXT_WIDTH = {1: 0x00, 2: 0x10, 3: 0x20, @@ -76,99 +78,99 @@ TXT_HEIGHT = {1: 0x00, 6: 0x05, 7: 0x06, 8: 0x07} -TXT_NORMAL = ESC + '!\x00' # Normal text -TXT_2HEIGHT = ESC + '!\x10' # Double height text -TXT_2WIDTH = ESC + '!\x20' # Double width text -TXT_4SQUARE = ESC + '!\x30' # Quad area text -TXT_UNDERL_OFF = ESC + '\x2d\x00' # Underline font OFF -TXT_UNDERL_ON = ESC + '\x2d\x01' # Underline font 1-dot ON -TXT_UNDERL2_ON = ESC + '\x2d\x02' # Underline font 2-dot ON -TXT_BOLD_OFF = ESC + '\x45\x00' # Bold font OFF -TXT_BOLD_ON = ESC + '\x45\x01' # Bold font ON -TXT_FONT_A = ESC + '\x4d\x00' # Font type A -TXT_FONT_B = ESC + '\x4d\x01' # Font type B -TXT_ALIGN_LT = ESC + '\x61\x00' # Left justification -TXT_ALIGN_CT = ESC + '\x61\x01' # Centering -TXT_ALIGN_RT = ESC + '\x61\x02' # Right justification -TXT_INVERT_ON = GS + '\x42\x01' # Inverse Printing ON -TXT_INVERT_OFF = GS + '\x42\x00' # Inverse Printing OFF +TXT_NORMAL = ESC + b'!\x00' # Normal text +TXT_2HEIGHT = ESC + b'!\x10' # Double height text +TXT_2WIDTH = ESC + b'!\x20' # Double width text +TXT_4SQUARE = ESC + b'!\x30' # Quad area text +TXT_UNDERL_OFF = ESC + b'\x2d\x00' # Underline font OFF +TXT_UNDERL_ON = ESC + b'\x2d\x01' # Underline font 1-dot ON +TXT_UNDERL2_ON = ESC + b'\x2d\x02' # Underline font 2-dot ON +TXT_BOLD_OFF = ESC + b'\x45\x00' # Bold font OFF +TXT_BOLD_ON = ESC + b'\x45\x01' # Bold font ON +TXT_FONT_A = ESC + b'\x4d\x00' # Font type A +TXT_FONT_B = ESC + b'\x4d\x01' # Font type B +TXT_ALIGN_LT = ESC + b'\x61\x00' # Left justification +TXT_ALIGN_CT = ESC + b'\x61\x01' # Centering +TXT_ALIGN_RT = ESC + b'\x61\x02' # Right justification +TXT_INVERT_ON = GS + b'\x42\x01' # Inverse Printing ON +TXT_INVERT_OFF = GS + b'\x42\x00' # Inverse Printing OFF # Char code table -CHARCODE_PC437 = ESC + '\x74\x00' # USA: Standard Europe -CHARCODE_JIS = ESC + '\x74\x01' # Japanese Katakana -CHARCODE_PC850 = ESC + '\x74\x02' # Multilingual -CHARCODE_PC860 = ESC + '\x74\x03' # Portuguese -CHARCODE_PC863 = ESC + '\x74\x04' # Canadian-French -CHARCODE_PC865 = ESC + '\x74\x05' # Nordic -CHARCODE_WEU = ESC + '\x74\x06' # Simplified Kanji, Hirakana -CHARCODE_GREEK = ESC + '\x74\x07' # Simplified Kanji -CHARCODE_HEBREW = ESC + '\x74\x08' # Simplified Kanji -CHARCODE_PC1252 = ESC + '\x74\x11' # Western European Windows Code Set -CHARCODE_PC866 = ESC + '\x74\x12' # Cirillic #2 -CHARCODE_PC852 = ESC + '\x74\x13' # Latin 2 -CHARCODE_PC858 = ESC + '\x74\x14' # Euro -CHARCODE_THAI42 = ESC + '\x74\x15' # Thai character code 42 -CHARCODE_THAI11 = ESC + '\x74\x16' # Thai character code 11 -CHARCODE_THAI13 = ESC + '\x74\x17' # Thai character code 13 -CHARCODE_THAI14 = ESC + '\x74\x18' # Thai character code 14 -CHARCODE_THAI16 = ESC + '\x74\x19' # Thai character code 16 -CHARCODE_THAI17 = ESC + '\x74\x1a' # Thai character code 17 -CHARCODE_THAI18 = ESC + '\x74\x1b' # Thai character code 18 +CHARCODE_PC437 = ESC + b'\x74\x00' # USA: Standard Europe +CHARCODE_JIS = ESC + b'\x74\x01' # Japanese Katakana +CHARCODE_PC850 = ESC + b'\x74\x02' # Multilingual +CHARCODE_PC860 = ESC + b'\x74\x03' # Portuguese +CHARCODE_PC863 = ESC + b'\x74\x04' # Canadian-French +CHARCODE_PC865 = ESC + b'\x74\x05' # Nordic +CHARCODE_WEU = ESC + b'\x74\x06' # Simplified Kanji, Hirakana +CHARCODE_GREEK = ESC + b'\x74\x07' # Simplified Kanji +CHARCODE_HEBREW = ESC + b'\x74\x08' # Simplified Kanji +CHARCODE_PC1252 = ESC + b'\x74\x11' # Western European Windows Code Set +CHARCODE_PC866 = ESC + b'\x74\x12' # Cirillic #2 +CHARCODE_PC852 = ESC + b'\x74\x13' # Latin 2 +CHARCODE_PC858 = ESC + b'\x74\x14' # Euro +CHARCODE_THAI42 = ESC + b'\x74\x15' # Thai character code 42 +CHARCODE_THAI11 = ESC + b'\x74\x16' # Thai character code 11 +CHARCODE_THAI13 = ESC + b'\x74\x17' # Thai character code 13 +CHARCODE_THAI14 = ESC + b'\x74\x18' # Thai character code 14 +CHARCODE_THAI16 = ESC + b'\x74\x19' # Thai character code 16 +CHARCODE_THAI17 = ESC + b'\x74\x1a' # Thai character code 17 +CHARCODE_THAI18 = ESC + b'\x74\x1b' # Thai character code 18 # Barcode format -_SET_BARCODE_TXT_POS = lambda n: GS + 'H' + n -BARCODE_TXT_OFF = _SET_BARCODE_TXT_POS('\x00') # HRI barcode chars OFF -BARCODE_TXT_ABV = _SET_BARCODE_TXT_POS('\x01') # HRI barcode chars above -BARCODE_TXT_BLW = _SET_BARCODE_TXT_POS('\x02') # HRI barcode chars below -BARCODE_TXT_BTH = _SET_BARCODE_TXT_POS('\x03') # HRI both above and below +_SET_BARCODE_TXT_POS = lambda n: GS + b'H' + n +BARCODE_TXT_OFF = _SET_BARCODE_TXT_POS(b'\x00') # HRI barcode chars OFF +BARCODE_TXT_ABV = _SET_BARCODE_TXT_POS(b'\x01') # HRI barcode chars above +BARCODE_TXT_BLW = _SET_BARCODE_TXT_POS(b'\x02') # HRI barcode chars below +BARCODE_TXT_BTH = _SET_BARCODE_TXT_POS(b'\x03') # HRI both above and below -_SET_HRI_FONT = lambda n: GS + 'f' + n -BARCODE_FONT_A = _SET_HRI_FONT('\x00') # Font type A for HRI barcode chars -BARCODE_FONT_B = _SET_HRI_FONT('\x01') # Font type B for HRI barcode chars +_SET_HRI_FONT = lambda n: GS + b'f' + n +BARCODE_FONT_A = _SET_HRI_FONT(b'\x00') # Font type A for HRI barcode chars +BARCODE_FONT_B = _SET_HRI_FONT(b'\x01') # Font type B for HRI barcode chars -BARCODE_HEIGHT = GS + 'h' # Barcode Height [1-255] -BARCODE_WIDTH = GS + 'w' # Barcode Width [2-6] +BARCODE_HEIGHT = GS + b'h' # Barcode Height [1-255] +BARCODE_WIDTH = GS + b'w' # Barcode Width [2-6] #NOTE: This isn't actually an ESC/POS command. It's the common prefix to the # two "print bar code" commands: # - Type A: "GS k NUL" # - TYPE B: "GS k " # The latter command supports more barcode types -_SET_BARCODE_TYPE = lambda m: GS + 'k' + m +_SET_BARCODE_TYPE = lambda m: GS + b'k' + six.int2byte(m) # Barcodes for printing function type A BARCODE_TYPE_A = { - 'UPC-A': _SET_BARCODE_TYPE(chr(0)), - 'UPC-E': _SET_BARCODE_TYPE(chr(1)), - 'EAN13': _SET_BARCODE_TYPE(chr(2)), - 'EAN8': _SET_BARCODE_TYPE(chr(3)), - 'CODE39': _SET_BARCODE_TYPE(chr(4)), - 'ITF': _SET_BARCODE_TYPE(chr(5)), - 'NW7': _SET_BARCODE_TYPE(chr(6)), - 'CODABAR': _SET_BARCODE_TYPE(chr(6)), # Same as NW7 + 'UPC-A': _SET_BARCODE_TYPE(0), + 'UPC-E': _SET_BARCODE_TYPE(1), + 'EAN13': _SET_BARCODE_TYPE(2), + 'EAN8': _SET_BARCODE_TYPE(3), + 'CODE39': _SET_BARCODE_TYPE(4), + 'ITF': _SET_BARCODE_TYPE(5), + 'NW7': _SET_BARCODE_TYPE(6), + 'CODABAR': _SET_BARCODE_TYPE(6), # Same as NW7 } # Barcodes for printing function type B # The first 8 are the same barcodes as type A BARCODE_TYPE_B = { - 'UPC-A': _SET_BARCODE_TYPE(chr(65)), - 'UPC-E': _SET_BARCODE_TYPE(chr(66)), - 'EAN13': _SET_BARCODE_TYPE(chr(67)), - 'EAN8': _SET_BARCODE_TYPE(chr(68)), - 'CODE39': _SET_BARCODE_TYPE(chr(69)), - 'ITF': _SET_BARCODE_TYPE(chr(70)), - 'NW7': _SET_BARCODE_TYPE(chr(71)), - 'CODABAR': _SET_BARCODE_TYPE(chr(71)), # Same as NW7 - 'CODE93': _SET_BARCODE_TYPE(chr(72)), + 'UPC-A': _SET_BARCODE_TYPE(65), + 'UPC-E': _SET_BARCODE_TYPE(66), + 'EAN13': _SET_BARCODE_TYPE(67), + 'EAN8': _SET_BARCODE_TYPE(68), + 'CODE39': _SET_BARCODE_TYPE(69), + 'ITF': _SET_BARCODE_TYPE(70), + 'NW7': _SET_BARCODE_TYPE(71), + 'CODABAR': _SET_BARCODE_TYPE(71), # Same as NW7 + 'CODE93': _SET_BARCODE_TYPE(72), # These are all the same barcode, but using different charcter sets - 'CODE128A': _SET_BARCODE_TYPE(chr(73) + '{A'), # CODE128 character set A - 'CODE128B': _SET_BARCODE_TYPE(chr(73) + '{B'), # CODE128 character set B - 'CODE128C': _SET_BARCODE_TYPE(chr(73) + '{C'), # CODE128 character set C - 'GS1-128': _SET_BARCODE_TYPE(chr(74)), - 'GS1 DATABAR OMNIDIRECTIONAL': _SET_BARCODE_TYPE(chr(75)), - 'GS1 DATABAR TRUNCATED': _SET_BARCODE_TYPE(chr(76)), - 'GS1 DATABAR LIMITED': _SET_BARCODE_TYPE(chr(77)), - 'GS1 DATABAR EXPANDED': _SET_BARCODE_TYPE(chr(78)), + 'CODE128A': _SET_BARCODE_TYPE(73) + b'{A', # CODE128 character set A + 'CODE128B': _SET_BARCODE_TYPE(73) + b'{B', # CODE128 character set B + 'CODE128C': _SET_BARCODE_TYPE(73) + b'{C', # CODE128 character set C + 'GS1-128': _SET_BARCODE_TYPE(74), + 'GS1 DATABAR OMNIDIRECTIONAL': _SET_BARCODE_TYPE(75), + 'GS1 DATABAR TRUNCATED': _SET_BARCODE_TYPE(76), + 'GS1 DATABAR LIMITED': _SET_BARCODE_TYPE(77), + 'GS1 DATABAR EXPANDED': _SET_BARCODE_TYPE(78), } BARCODE_TYPES = { @@ -180,19 +182,19 @@ BARCODE_TYPES = { # Image format # NOTE: _PRINT_RASTER_IMG is the obsolete ESC/POS "print raster bit image" # command. The constants include a fragment of the data's header. -_PRINT_RASTER_IMG = lambda data: GS + 'v0' + data -S_RASTER_N = _PRINT_RASTER_IMG('\x00') # Set raster image normal size -S_RASTER_2W = _PRINT_RASTER_IMG('\x01') # Set raster image double width -S_RASTER_2H = _PRINT_RASTER_IMG('\x02') # Set raster image double height -S_RASTER_Q = _PRINT_RASTER_IMG('\x03') # Set raster image quadruple +_PRINT_RASTER_IMG = lambda data: GS + b'v0' + data +S_RASTER_N = _PRINT_RASTER_IMG(b'\x00') # Set raster image normal size +S_RASTER_2W = _PRINT_RASTER_IMG(b'\x01') # Set raster image double width +S_RASTER_2H = _PRINT_RASTER_IMG(b'\x02') # Set raster image double height +S_RASTER_Q = _PRINT_RASTER_IMG(b'\x03') # Set raster image quadruple # Printing Density -PD_N50 = GS + '\x7c\x00' # Printing Density -50% -PD_N37 = GS + '\x7c\x01' # Printing Density -37.5% -PD_N25 = GS + '\x7c\x02' # Printing Density -25% -PD_N12 = GS + '\x7c\x03' # Printing Density -12.5% -PD_0 = GS + '\x7c\x04' # Printing Density 0% -PD_P50 = GS + '\x7c\x08' # Printing Density +50% -PD_P37 = GS + '\x7c\x07' # Printing Density +37.5% -PD_P25 = GS + '\x7c\x06' # Printing Density +25% -PD_P12 = GS + '\x7c\x05' # Printing Density +12.5% +PD_N50 = GS + b'\x7c\x00' # Printing Density -50% +PD_N37 = GS + b'\x7c\x01' # Printing Density -37.5% +PD_N25 = GS + b'\x7c\x02' # Printing Density -25% +PD_N12 = GS + b'\x7c\x03' # Printing Density -12.5% +PD_0 = GS + b'\x7c\x04' # Printing Density 0% +PD_P50 = GS + b'\x7c\x08' # Printing Density +50% +PD_P37 = GS + b'\x7c\x07' # Printing Density +37.5% +PD_P25 = GS + b'\x7c\x06' # Printing Density +25% +PD_P12 = GS + b'\x7c\x05' # Printing Density +12.5% diff --git a/escpos/escpos.py b/escpos/escpos.py index 531ebbb..fe9ca41 100644 --- a/escpos/escpos.py +++ b/escpos/escpos.py @@ -12,7 +12,9 @@ This module contains the abstract base class :py:class:`Escpos`. from __future__ import absolute_import from __future__ import division from __future__ import print_function -#from __future__ import unicode_literals +from __future__ import unicode_literals + +import six try: import Image @@ -517,7 +519,7 @@ class Escpos(object): elif width == 1 and height == 1: self._raw(TXT_NORMAL) elif 1 <= width <= 8 and 1 <= height <= 8 and isinstance(width, int) and isinstance(height, int): - self._raw(TXT_SIZE + chr(TXT_WIDTH[width] + TXT_HEIGHT[height])) + self._raw(TXT_SIZE + six.int2byte(TXT_WIDTH[width] + TXT_HEIGHT[height])) else: raise SetVariableError() # Upside down diff --git a/setup.py b/setup.py index ca26552..de7cfac 100755 --- a/setup.py +++ b/setup.py @@ -70,6 +70,7 @@ setup( 'Pillow>=2.0', 'qrcode>=4.0', 'pyserial', + 'six', ], tests_require=['tox', 'nose'], cmdclass={'test': Tox},