| Thread Previous • Date Previous • Date Next • Thread Next |
I tought Akretion wasn't interested by the POS module when it was released in the v6... :-P It's a great news by the way ! About the customer display, I implemented it for a customer. You can find attached the class. It's a qwick and dirty implementation but it worked on their Aures device (like this : http://www.negicom.fr/afficheur-client/43-aures-afficheur-client-externe.html). The link between the device and the computer was a serial connection. In case of USB connection you could use a serial port simulator over USB. It's not clean but my customer's thermal printed worked this way. I attach also some very short doc I had found about the Concert protocol too. Note that the next step in european SEPA normalisation will be an harmonization of the credit card framework. However, I don't kown if it's just about changing banks commercial practices or developing a complete trans-european protocol for credit card readers. I think I have also some doc about check printer if you need it... My 2 cents. Aurélien. Le 29/06/2014 23:38, Alexis de Lattre a écrit : > Dear OpenERP community friends, > > Akretion France is organising a code sprint on POS for OpenERP/Odoo v8 > (i.e. trunk) from July 7th to July 10th in Lyon. This code sprint will > have 2 goals : > 1) add support for credit card readers, via the Concert protocol. We > will have an Ingenico credit card reader to carry out the tests ; we > already have the specs and some sandbox Python code. > 2) add support for traditional 2x20 POS displays. We will test it with > Samsung-Bixolon BCD-1100, but want to make it easy to add support for > other POS displays in the future. For that one too, we already have the > specs and some sandbox Python code. > > This was initially an internal code sprint at Akretion France, but we > thought other people could be interested and join the effort. We will > welcome all participants, both those who want to join us in our office > near Lyon (35B rue Montgolfier, 69100 Villeurbanne : > http://www.openstreetmap.org/?mlat=45.7720&mlon=4.8902#map=12/45.7720/4.8902&layers=N) > or those who want to join us remotely. We will have all the needed > hardware on site to work efficiently. Confirmed participants so far are > Sébastien Beau, Sylvain Le Gal and me. > > All the modules written during this code sprint will be published on > https://launchpad.net/openerp-pos (or it's github equivalent). > > Regards, >
#!/usr/bin/python
# -*- coding: utf-8 -*-
import serial
import time
class CustomerDisplayDevice():
def __init__(self, devfile="/dev/ttyS0", baudrate=9600, bytesize=8, timeout=1):
"""
@param devfile : Device file under dev filesystem
@param baudrate : Baud rate for serial transmission
@param bytesize : Serial buffer size
@param timeout : Read/Write timeout
"""
self.devfile = devfile
self.baudrate = baudrate
self.bytesize = bytesize
self.timeout = timeout
self.open()
def open(self):
""" Setup serial port and set is as escpos device """
self.device = serial.Serial(port=self.devfile, baudrate=self.baudrate, bytesize=self.bytesize, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=self.timeout, dsrdtr=True)
if self.device is not None:
print "Serial customer display enabled"
else:
print "Unable to open serial customer display on: %s" % self.devfile
def _raw(self, msg):
""" Send any command sent in raw format """
try:
self.device.write(msg)
except :
log_error_handler2(sys.exc_info())
def text(self, msg):
try:
msg = unicodedata.normalize('NFKD', unicode(msg)).encode('ascii', 'ignore')
self._raw(msg)
except :
log_error_handler2(sys.exc_info())
def command(self, msg):
""" Send any command sent in raw format """
self._raw('\x04\x01'+msg+'\x17')
def clear_display(self):
self.command('\x0C')
def set_cursor_position(self, x, y):
x = int(x)
y = int(y)
if x<1 or x>20:
return False
if y<1 or y>2:
return False
self.command('\x1F\x24'+ chr(x) + chr(y))
def __del__(self):
""" Close Serial interface """
if self.device is not None:
self.device.close()
def complete_string(self, string, length):
string = unicode(string)
if len(string) > length:
return string[:length]
elif len(string) < length:
while(len(string)<length):
string = string+' '
return string
else:
return string
def update_product_line(self, product_name, qty_str, price_unit_str):
customer_display.clear_display()
customer_display.set_cursor_position(1,1)
str_prod = customer_display.complete_string(product_name, 20 - len(qty_str) - 2 - len(price_unit_str))
customer_display.text(qty_str + 'x' + str_prod + ' ' + price_unit_str)
com_port = 7
try :
customer_display = CustomerDisplayDevice(com_port)
customer_display.clear_display()
customer_display.set_cursor_position(5,1)
customer_display.text('OUVERTURE CAISSE')
except :
logging.error('Exception in customer display device init.', exc_info=True)
raise
time.spleep(5)
customer_display.update_product_line("Baguette tradition", "5", "0.95")
Attachment:
ConcertSample.zip
Description: Zip archive
Attachment:
Fit044_Protocole connexion caisse_RevB.pdf
Description: Adobe PDF document
| Thread Previous • Date Previous • Date Next • Thread Next |