commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gnue-pos/src Config.py POSClient.py hardware/ca...


From: Jason Cater
Subject: gnue-pos/src Config.py POSClient.py hardware/ca...
Date: Fri, 15 Aug 2003 08:11:02 -0400

CVSROOT:        /cvsroot/gnue
Module name:    gnue-pos
Branch:         
Changes by:     Jason Cater <address@hidden>    03/08/15 08:11:02

Modified files:
        src            : Config.py POSClient.py 
        src/hardware/cashdrawer: bell.py escpos.py 
        src/hardware/receiptprinter: escpos.py plain.py 
Added files:
        src            : IOProxy.py 

Log message:
        * Added common interface for hardware output via device/file/external 
command
        * Attempted to add logo support to ESC/POS receipt printers (not 
working yet)
        * More cleanup

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/IOProxy.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/Config.py.diff?tr1=1.6&tr2=1.7&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/POSClient.py.diff?tr1=1.14&tr2=1.15&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/hardware/cashdrawer/bell.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/hardware/cashdrawer/escpos.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/hardware/receiptprinter/escpos.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/gnue/gnue-pos/src/hardware/receiptprinter/plain.py.diff?tr1=1.6&tr2=1.7&r1=text&r2=text

Patches:
Index: gnue-pos/src/Config.py
diff -c gnue-pos/src/Config.py:1.6 gnue-pos/src/Config.py:1.7
*** gnue-pos/src/Config.py:1.6  Mon Jul  7 01:29:13 2003
--- gnue-pos/src/Config.py      Fri Aug 15 08:11:01 2003
***************
*** 113,117 ****
--- 113,130 ----
      'Typecast'   :  GTypecast.text,
      'Default'    : '' },
  
+   { 'Name'       : 'ReceiptHeader',
+     'Type'       : 'Setting',
+     'Comment'    : '',
+     'Description': '',
+     'Typecast'   :  GTypecast.text,
+     'Default'    : 'My Sample Store\n123 N Main St\nMy Town, MS 
38654\n800-555-1234' },
+     
+   { 'Name'       : 'ReceiptLogo',
+     'Type'       : 'Setting',
+     'Comment'    : '',
+     'Description': '',
+     'Typecast'   :  GTypecast.text,
+     'Default'    : '' },
  )
  
Index: gnue-pos/src/POSClient.py
diff -c gnue-pos/src/POSClient.py:1.14 gnue-pos/src/POSClient.py:1.15
*** gnue-pos/src/POSClient.py:1.14      Tue Jul 22 13:26:25 2003
--- gnue-pos/src/POSClient.py   Fri Aug 15 08:11:01 2003
***************
*** 165,171 ****
          mp[p2.lower()] = options[key]
  
  
!     for device, params in mapping.items():
        dr = params['driver'].lower().replace('/','.')
        try:
          module = dyn_import('gnue.pointofsale.hardware.%s' % dr)
--- 165,174 ----
          mp[p2.lower()] = options[key]
  
  
!     srt = list(mapping.items())
!     srt.sort()
! 
!     for device, params in srt:
        dr = params['driver'].lower().replace('/','.')
        try:
          module = dyn_import('gnue.pointofsale.hardware.%s' % dr)
Index: gnue-pos/src/hardware/cashdrawer/bell.py
diff -c gnue-pos/src/hardware/cashdrawer/bell.py:1.2 
gnue-pos/src/hardware/cashdrawer/bell.py:1.3
*** gnue-pos/src/hardware/cashdrawer/bell.py:1.2        Mon Jun 23 01:31:11 2003
--- gnue-pos/src/hardware/cashdrawer/bell.py    Fri Aug 15 08:11:02 2003
***************
*** 32,37 ****
--- 32,38 ----
  __all__ = ['Driver']
  
  from gnue.common.events.EventAware import EventAware
+ from gnue.pointofsale.IOProxy import simpleOpen
  
  class Driver(EventAware):
  
***************
*** 39,50 ****
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
  
      self.registerEventListeners({'EndTicket': self._open})
  
!     
    def _open(self, event):
!     p = open(self.port,'w')
      p.write('\007')
      p.close()
  
--- 40,52 ----
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
+     self.device_params = params
  
      self.registerEventListeners({'EndTicket': self._open})
  
! 
    def _open(self, event):
!     p = simpleOpen(self.device_params)
      p.write('\007')
      p.close()
  
Index: gnue-pos/src/hardware/cashdrawer/escpos.py
diff -c gnue-pos/src/hardware/cashdrawer/escpos.py:1.2 
gnue-pos/src/hardware/cashdrawer/escpos.py:1.3
*** gnue-pos/src/hardware/cashdrawer/escpos.py:1.2      Tue Jun 24 12:06:42 2003
--- gnue-pos/src/hardware/cashdrawer/escpos.py  Fri Aug 15 08:11:02 2003
***************
*** 32,37 ****
--- 32,38 ----
  __all__ = ['Driver']
  
  from gnue.common.events.EventAware import EventAware
+ from gnue.pointofsale.IOProxy import simpleOpen
  
  class Driver(EventAware):
  
***************
*** 39,50 ****
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
  
-     self.registerEventListeners({'EndTicket': self._open})
  
! 
!   def _open(self, event):
!     p = open(self.port,'w')
      p.write('\x1bp\x002\xfa')
      p.close()
  
--- 40,51 ----
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
+     self.device_params = params
+     self.registerEventListeners({'EndTicket': self.open})
  
  
!   def open(self, event):
!     p = simpleOpen(self.device_params)
      p.write('\x1bp\x002\xfa')
      p.close()
  
Index: gnue-pos/src/hardware/receiptprinter/escpos.py
diff -c gnue-pos/src/hardware/receiptprinter/escpos.py:1.2 
gnue-pos/src/hardware/receiptprinter/escpos.py:1.3
*** gnue-pos/src/hardware/receiptprinter/escpos.py:1.2  Mon Jul  7 01:29:13 2003
--- gnue-pos/src/hardware/receiptprinter/escpos.py      Fri Aug 15 08:11:02 2003
***************
*** 38,43 ****
    #
  
    def init(self):
!     self.twocolor = hasattr(self,'twocolor') and self.width or 0
  
  
--- 38,123 ----
    #
  
    def init(self):
!     self.colors = hasattr(self,'colors') and self.colors or 1
!     self.__double = 0
!     self.__underline = 0
!     self.__doubleheight = 0
!     self.__bold = 0
  
+   def reset(self):
+     return "\x1B@"
+ 
+   def formfeed(self):
+     return '\n\n\n\n\n\n'
+ 
+   def beginColor(self, color):
+     if self.colors == 1:
+       return ""
+     else:
+       return "\x1Br" + chr(color)
+ 
+   def endColor(self, color):
+     if self.colors == 1:
+       return ""
+     else:
+       return "\x1Br\x00"
+ 
+   def beginBold(self):
+     self.__bold = 1
+     return self.__setPrintMode()
+ 
+   def endBold(self):
+     self.__bold = 0
+     return self.__setPrintMode()
+ 
+   def beginDouble(self):
+     self.__double = 1
+     return self.__setPrintMode()
+ 
+   def endDouble(self):
+     self.__double = 0
+     return self.__setPrintMode()
+ 
+   def beginDoubleHeight(self):
+     self.__doubleheight = 1
+     return self.__setPrintMode()
+ 
+   def endDoubleHeight(self):
+     self.__doubleheight = 0
+     return self.__setPrintMode()
+ 
+   def beginUnderline(self):
+     self.__underline = 1
+     return self.__setPrintMode()
+ 
+   def endUnderline(self):
+     self.__underline = 0
+     return self.__setPrintMode()
+ 
+   def __setPrintMode(self):
+     return "\x1B!" + chr(self.__bold * 8 | self.__doubleheight * 16 | \
+                          self.__double * 32 | self.__underline * 128)
+ 
+   def drawImage(self, image):
+     logoOffset = 0
+ 
+     lw, lh = image.size
+     vw = min(round(lw/8.0+.5),45)
+     vh = min(round(lh/8.0+.5),24)
+     uw = vw * 8
+     uh = vh * 8
+ 
+     rs = "\x1D\x2A" + chr(vw) + chr(vh) + "\x00"
+ 
+     for y in range(vh):
+       for x in range(uw):
+         byte = 0
+         for bit in range(8):
+           try:
+             byte |= 2**bit and (image.getpixel((x, (y+1)*8 - (bit+1)*8)) > 0)
+           except IndexError:
+             pass
+         rs += chr(byte)
+ 
+     return rs + "\x1D\x2F\x00"
  
Index: gnue-pos/src/hardware/receiptprinter/plain.py
diff -c gnue-pos/src/hardware/receiptprinter/plain.py:1.6 
gnue-pos/src/hardware/receiptprinter/plain.py:1.7
*** gnue-pos/src/hardware/receiptprinter/plain.py:1.6   Thu Jul 17 01:16:44 2003
--- gnue-pos/src/hardware/receiptprinter/plain.py       Fri Aug 15 08:11:02 2003
***************
*** 30,42 ****
  __all__ = ['Driver']
  
  from gnue.common.events.EventAware import EventAware
! 
! LEFT_ALIGN=0
! CENTER_ALIGN=0
! RIGHT_ALIGN=2
  
  dollarFormat = '$%.02f'
  
  class Driver(EventAware):
  
    ##########################################################
--- 30,50 ----
  __all__ = ['Driver']
  
  from gnue.common.events.EventAware import EventAware
! from gnue.common.utils.TextUtils import *
! from gnue.pointofsale.IOProxy import simpleOpen
! from cStringIO import StringIO
! 
! try:
!   import Image
! except:
!   Image = None
  
  dollarFormat = '$%.02f'
  
+ BLACK = 0
+ RED = 1
+ 
+ 
  class Driver(EventAware):
  
    ##########################################################
***************
*** 55,62 ****
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
!     self.output = None
      self.totals = {}
      self.width = hasattr(self,'width') and self.width or 40
  
      self.totalFields = (  ('subtotal',_('Subtotal')),
--- 63,82 ----
      EventAware.__init__(self, instance)
      self.instance = instance
      self.__dict__.update(params)
!     self.device_params = params
!     self.output = ""
      self.totals = {}
+     self.newline = "\n"
+ 
+     print self.dest
+ 
+     # Get the logo
+     logo = gConfig("ReceiptLogo")
+     if logo and Image:
+       self.logo = Image.open(logo)
+     else:
+       self.logo = None
+ 
      self.width = hasattr(self,'width') and self.width or 40
  
      self.totalFields = (  ('subtotal',_('Subtotal')),
***************
*** 67,73 ****
                              ('sku',_('Code'), '%s', 0),
                              ('quantity',_('Units'), '%s', 0),
                              ('description',_('Description'), '%s', 0),
-                             ('each',_('Price/Unit'), dollarFormat, 1),
                              ('extended',_('Extended'), dollarFormat, 1),
                              ('taxable',_('T'), '%s', 1) )
  
--- 87,92 ----
***************
*** 75,106 ****
  
      self.registerEventListeners( {
        'BeginTicket': self._BeginTicket,
        'EndTicket': self._EndTicket,
        'CancelTicket': self._CancelTicket,
        'AddTicketItem': self._AddTicketItem,
        'CancelTicketItem': self._CancelTicketItem,
!       'UpdateTotal': self._UpdateTotal } )
  
      self.init()
  
!   def _BeginTicket(self, event):
!     self.output = open(self.port,'w')
!     self.totals = {}
!     self.output.write("""
  
-        Old Towne Market
-      9120 Pigeon Roost Rd
-     Olive Branch, MS 38654
-         (662) 893-5669
  
  
! Transaction # %s
! %s %s %s
  
! """ % (event.serial, '06/23/03','12:13pm','Jason'))
  
    def _CancelTicket(self, event):
!     self.output.write('\n**** CANCELED ****\n\n\n')
      self.output.close()
      self.output = None
  
--- 94,147 ----
  
      self.registerEventListeners( {
        'BeginTicket': self._BeginTicket,
+       'ReprintTicket': self.printTicket,
        'EndTicket': self._EndTicket,
        'CancelTicket': self._CancelTicket,
        'AddTicketItem': self._AddTicketItem,
        'CancelTicketItem': self._CancelTicketItem,
!       'UpdateTotal': self._UpdateTotal,
!       'ReceiptPrinter:ReceiptTorn': self._ReceiptTorn } )
  
      self.init()
  
!   #
!   #
!   #
!   def printTicket(self, event=None):
!     if not self.output:
!       return
! 
!     d = simpleOpen(self.device_params)
!     self.output.seek(0)
!     d.write(self.output.read())
!     d.close()
  
  
+   def printHeader(self):
+     if self.logo:
+       self.write(self.drawImage(self.logo))
+     self.write( gConfig("receiptHeader").replace('\\n','\n'), 
alignment=ALIGN_CENTER)
  
!   #
!   #
!   #
!   def _BeginTicket(self, event):
!     try:
!       self.output.close()
!     except:
!       pass
! 
!     self.output = StringIO()
!     self.doublespace = 0
!     self.totals = {}
! 
!     self.printHeader()
!     self.write("""Trans # %s %s %s
  
! """ % (event.serial, '06/23/03 12:13pm','100'))
  
    def _CancelTicket(self, event):
!     self.write('\n**** CANCELED ****\n', color=RED, double=1, 
alignment=ALIGN_CENTER)
      self.output.close()
      self.output = None
  
***************
*** 111,119 ****
          self.output.write(display+':  '+dollarFormat % 
self.totals[field]+'\n')
        except KeyError:
          self.output.write(display+':  '+dollarFormat % 0+'\n')
!     self.output.write('\n\n\n')
!     self.output.close()
!     self.output = None
  
    def _AddTicketItem(self, event):
      # TODO
--- 152,160 ----
          self.output.write(display+':  '+dollarFormat % 
self.totals[field]+'\n')
        except KeyError:
          self.output.write(display+':  '+dollarFormat % 0+'\n')
!     self.output.write(self.formfeed())
!     self.printTicket()
! 
  
    def _AddTicketItem(self, event):
      # TODO
***************
*** 121,127 ****
        try:
          if field == 'taxable':
            if event.taxable:
!             self.output.write('* ')
            else:
              self.output.write('  ')
          else:
--- 162,168 ----
        try:
          if field == 'taxable':
            if event.taxable:
!             self.output.write(' T')
            else:
              self.output.write('  ')
          else:
***************
*** 134,143 ****
    def _CancelTicketItem(self, event):
      pass
  
- 
    def _UpdateTotal(self, event):
      self.totals[event.field] = event.amount
  
  
!   def write(self, text, double=0, color=0, alignment=0):
!     pass
--- 175,286 ----
    def _CancelTicketItem(self, event):
      pass
  
    def _UpdateTotal(self, event):
      self.totals[event.field] = event.amount
  
+   def write(self, text, double=0, bold=0, color=BLACK, underline=0,
+             doubleheight=0, alignment=ALIGN_LEFT, eol=1, width=0):
  
!     splittext = text.split('\n')
!     i = 0
!     linehead = ""
! 
!     for line in splittext:
!       divisor = 1
! 
!       if underline:
!         self.output.write(self.beginUnderline())
!       if doubleheight:
!         self.output.write(self.beginDoubleHeight())
!       if double:
!         self.output.write(self.beginDouble())
!       if color:
!         self.output.write(self.beginColor(color))
!       if bold:
!         self.output.write(self.beginBold())
! 
!       if self.doublespace:
!         l = ""
!         for char in tuple(line):
!           l += char + ' '
!         line = l[:-1]
!       elif double:
!         divisor = 2
! 
!       self.output.write(lineWrap(line, alignment=alignment, eol=0, 
maxWidth=int((width or self.width)/divisor)))
! 
!       if bold:
!         self.output.write(self.endBold())
!       if color:
!         self.output.write(self.endColor(color))
!       if double:
!         self.output.write(self.endDouble())
!       if doubleheight:
!         self.output.write(self.endDoubleHeight())
!       if underline:
!         self.output.write(self.endUnderline())
! 
!       if i < len(splittext)-1:
!         self.output.write(self.newline)
! 
!       i += 1
! 
!     if eol:
!       self.output.write(self.newline)
! 
!   def writeTuple(self, list):
!     i = 0
!     for set in list:
!       if i != len(list) - 1:
!         list['eol'] = 0
!       self.write(**list)
! 
!   def reset(self):
!     return ""
! 
!   def formfeed(self):
!     return '\n\n\n\n\n\n'
! 
!   def beginColor(self):
!     return ""
! 
!   def endColor(self):
!     return ""
! 
!   def beginBold(self):
!     return ""
! 
!   def endBold(self):
!     return ""
! 
!   def beginDouble(self):
!     self.doublespace = 1
!     return ""
! 
!   def endDouble(self):
!     self.doublespace = 0
!     return ""
! 
!   def beginDoubleHeight(self):
!     return ""
! 
!   def endDoubleHeight(self):
!     return ""
! 
!   def beginUnderline(self):
!     return ""
! 
!   def endUnderline(self):
!     return ""
! 
!   def drawImage(self, image):
!     return ""
! 
!   def cutBetweenSheets(self):
!     self.__receiptTorn = 0
!     self.dispatchEvent('Prompt', label='Tear off receipt and press enter:', 
response='ReceiptPrinter:ReceiptTorn')
!     while not self.__receiptTorn:
!       pass
! 
!   def _ReceiptTorn(self, event):
!     self.__receiptTorn = 1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]