1
# -*- coding: iso-8859-1 -*-
3
#* OEOG Clase que permite enviar comandos a impresoras fiscales
7
#* @author Andres Hocevar
9
#* @since Agosto 10 del 2010
11
#/***************************************************************************
13
#* Este programa es software libre: usted puede redistribuirlo y / o modificar
14
#* bajo los t�rminos de la GNU General Public License publicada por
15
#* la Free Software Foundation, bien de la versi�n 3 de la Licencia, o
16
#* (A su elecci�n) cualquier versi�n posterior.
18
#* Este programa se distribuye con la esperanza de que sea �til,
19
#* pero SIN NINGUNA GARANT�A, incluso sin la garant�a impl�cita de
20
#* COMERCIALIZACI�N o IDONEIDAD PARA UN PROP�SITO PARTICULAR. Ver la
21
#* Licencia P�blica General GNU para m�s detalles.
23
#* Deber�a haber recibido una copia de la GNU General Public License
24
#* junto con este programa. Si no, v�ase <http://www.gnu.org/licenses/>.
26
#***************************************************************************/
43
def __init__(self,p='auto'):
45
posibles=['COM0','COM1','COM2','COM3','COM4','COM5','COM6','COM7']+\
46
glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*')
47
for self.puerto in posibles:
49
if self.ManipulaCTS_RTS():
50
self._write(chr(0x05))
52
t=self.ser.inWaiting()
54
self.ser.setRTS(False)
65
self.ser = serial.Serial(
68
bytesize=serial.EIGHTBITS,
69
parity =serial.PARITY_EVEN,
70
stopbits=serial.STOPBITS_ONE,
77
except serial.SerialException:
79
self.envio = "Impresora no conectada o error accediendo al puerto"
82
def CloseFpctrl(self):
87
def ManipulaCTS_RTS(self):
91
while not self.ser.getCTS():
95
self.ser.setRTS(False)
98
except serial.SerialException:
101
def SimpleCmd(self,cmd):
103
self.ser.flushInput()
104
self.ser.flushOutput()
105
if self.ManipulaCTS_RTS():
106
msj=self.qenviar(cmd)
110
self.envio = "Status: 00 Error: 00"
113
self.envio = "Status: 00 Error: 89"
116
self.DarStatus_Error(0, 128);
117
self.envio = "Error... CTS in False"
119
self.ser.setRTS(False)
120
except serial.SerialException:
124
def QueryCmd(self,cmd):
126
self.ser.flushInput()
127
self.ser.flushOutput()
128
if self.ManipulaCTS_RTS():
129
msj=self.qenviar(cmd)
133
self.DarStatus_Error(0, 128);
134
self.envio = "Error... CTS in False"
136
self.ser.setRTS(False)
137
except serial.SerialException:
144
bytes = self.ser.inWaiting()
146
msj=self._read(bytes)
148
lrc=chr(self.lrc(linea))
150
self.ser.flushInput()
151
self.ser.flushOutput()
152
self._write(chr(0x06))
155
self._write(chr(0x15))
161
def ReadFpStatus(self):
162
if self.ManipulaCTS_RTS():
166
#bytes = self.ser.inWaiting()
169
if ord(r[1])^ord(r[2])^0x03 == ord(r[4]):
170
return self.DarStatus_Error(ord(r[1]), ord(r[2]))
172
return self.DarStatus_Error(0, 144)
174
self.estado = "Impresora ocupada";
175
return self.DarStatus_Error(0, 114)
177
return self.DarStatus_Error(0, 128);
178
self.estado = "Error... CTS in False";
180
def _write(self,msj):
182
# print '<<< '+self.depura(msj)
185
def _read(self,bytes):
186
msj = self.ser.read(bytes)
188
# print '>>> '+self.depura(msj)
191
def qenviar(self,linea):
192
lrc = self.lrc(linea+chr(0x03))
193
previo=chr(0x02)+linea+chr(0x03)+chr(lrc)
197
return reduce(operator.xor, map(ord, linea))
199
def depura(self,linea):
206
adic=' LRC('+str(ord(lrc))+')'
209
linea=linea.replace(chr(0x02),'STX',1)
210
linea=linea.replace(chr(0x05),'ENQ',1)
211
linea=linea.replace(chr(0x03),'ETX',1)
212
linea=linea.replace(chr(0x04),'EOT',1)
213
linea=linea.replace(chr(0x06),'ACK',1)
214
linea=linea.replace(chr(0x15),'NAK',1)
215
linea=linea.replace(chr(0x17),'ETB',1)
220
if self.QueryCmd('S1'):
232
def DarStatus_Error(self,st,er):
236
if (st & 0x6A) == 0x6A: #En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos no fiscales
237
self.status='En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos no fiscales'
239
elif (st & 0x69) == 0x69: #En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos fiscales
240
self.status='En modo fiscal, carga completa de la memoria fiscal y emisi�n de documentos fiscales'
242
elif (st & 0x68) == 0x68: #En modo fiscal, carga completa de la memoria fiscal y en espera
243
self.status='En modo fiscal, carga completa de la memoria fiscal y en espera'
245
elif (st & 0x72) == 0x72: #En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales
246
self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales'
248
elif (st & 0x71) == 0x71: #En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales
249
self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en emisi�n de documentos no fiscales'
251
elif (st & 0x70) == 0x70: #En modo fiscal, cercana carga completa de la memoria fiscal y en espera
252
self.status='En modo fiscal, cercana carga completa de la memoria fiscal y en espera'
254
elif (st & 0x62) == 0x62: #En modo fiscal y en emisi�n de documentos no fiscales
255
self.status='En modo fiscal y en emisi�n de documentos no fiscales'
257
elif (st & 0x61) == 0x61: #En modo fiscal y en emisi�n de documentos fiscales
258
self.status='En modo fiscal y en emisi�n de documentos fiscales'
260
elif (st & 0x60) == 0x60: #En modo fiscal y en espera
261
self.status='En modo fiscal y en espera'
263
elif (st & 0x42) == 0x42: #En modo prueba y en emisi�n de documentos no fiscales
264
self.status='En modo prueba y en emisi�n de documentos no fiscales'
266
elif (st & 0x41) == 0x41: #En modo prueba y en emisi�n de documentos fiscales
267
self.status='En modo prueba y en emisi�n de documentos fiscales'
269
elif (st & 0x40) == 0x40: #En modo prueba y en espera
270
self.status='En modo prueba y en espera'
272
elif (st & 0x00) == 0x00: #Status Desconocido
273
self.status='Status Desconocido'
276
if (er & 0x6C) == 0x6C: #Memoria Fiscal llena
277
self.error = 'Memoria Fiscal llena'
279
elif (er & 0x64) == 0x64: #Error en memoria fiscal
280
self.error = 'Error en memoria fiscal'
282
elif (er & 0x60) == 0x60: #Error Fiscal
283
self.error = 'Error Fiscal'
285
elif (er & 0x5C) == 0x5C: #Comando Invalido
286
self.error = 'Comando Invalido'
288
elif (er & 0x58) == 0x58: # No hay asignadas directivas
289
self.error = 'No hay asignadas directivas'
291
elif (er & 0x54) == 0x54: #Tasa Invalida
292
self.error = 'Tasa Invalida'
294
elif (er & 0x50) == 0x50: #Comando Invalido/Valor Invalido
295
self.error = 'Comando Invalido/Valor Invalido'
297
elif (er & 0x43) == 0x43: #Fin en la entrega de papel y error mec�nico
298
self.error = 'Fin en la entrega de papel y error mec�nico'
300
elif (er & 0x42) == 0x42: #Error de indole mecanico en la entrega de papel
301
self.error = 'Error de indole mecanico en la entrega de papel'
303
elif (er & 0x41) == 0x41: #Fin en la entrega de papel
304
self.error = 'Fin en la entrega de papel'
306
elif (er & 0x40) == 0x40: #Sin error
307
self.error = 'Sin error'
310
if (st_aux & 0x04) == 0x04: #Buffer Completo
313
elif er == 128: # Error en la comunicacion
314
self.error = 'CTS en falso'
316
elif er == 137: # No hay respuesta
317
self.error = 'No hay respuesta'
319
elif er == 144: # Error LRC
320
self.error = 'Error LRC'
323
self.error = 'Impresora no responde o ocupada'
327
return status+" "+error