odoo/addons/hw_scanner/controllers/main.py

134 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
import logging
import os
from os import listdir
from os.path import join
import openerp
import openerp.addons.hw_proxy.controllers.main as hw_proxy
from openerp.tools.translate import _
from openerp import http
from openerp.http import request
_logger = logging.getLogger(__name__)
try:
import evdev
except ImportError:
_logger.error('OpenERP module hw_scanner depends on the evdev python module')
evdev = None
from select import select
class ScannerDriver(hw_proxy.Proxy):
def __init__(self):
self.input_dir = '/dev/input/by-id/'
self.keymap = {
2: ("1","!"),
3: ("2","@"),
4: ("3","#"),
5: ("4","$"),
6: ("5","%"),
7: ("6","^"),
8: ("7","&"),
9: ("8","*"),
10:("9","("),
11:("0",")"),
12:("-","_"),
13:("=","+"),
# 14 BACKSPACE
# 15 TAB
16:("q","Q"),
17:("w","W"),
18:("e","E"),
19:("r","R"),
20:("t","T"),
21:("y","Y"),
22:("u","U"),
23:("i","I"),
24:("o","O"),
25:("p","P"),
26:("[","{"),
27:("]","}"),
# 28 ENTER
# 29 LEFT_CTRL
30:("a","A"),
31:("s","S"),
32:("d","D"),
33:("f","F"),
34:("g","G"),
35:("h","H"),
36:("j","J"),
37:("k","K"),
38:("l","L"),
39:(";",":"),
40:("'","\""),
41:("`","~"),
# 42 LEFT SHIFT
43:("\\","|"),
44:("z","Z"),
45:("x","X"),
46:("c","C"),
47:("v","V"),
48:("b","B"),
49:("n","N"),
50:("m","M"),
51:(",","<"),
52:(".",">"),
53:("/","?"),
# 54 RIGHT SHIFT
57:(" "," "),
}
def get_device(self):
if not evdev:
return None
devices = [ device for device in listdir(self.input_dir)]
keyboards = [ device for device in devices if 'kbd' in device ]
scanners = [ device for device in devices if ('barcode' in device.lower()) or ('scanner' in device.lower()) ]
if len(scanners) > 0:
return evdev.InputDevice(join(self.input_dir,scanners[0]))
elif len(keyboards) > 0:
return evdev.InputDevice(join(self.input_dir,keyboards[0]))
else:
return None
@http.route('/hw_proxy/is_scanner_connected', type='json', auth='admin')
def is_scanner_connected(self):
return self.get_device() != None
@http.route('/hw_proxy/scanner', type='json', auth='admin')
def scanner(self):
device = self.get_device()
barcode = []
shift = False
if not device:
return ''
else:
device.grab()
while True:
r,w,x = select([device],[],[],5)
if len(r) == 0: # timeout
device.ungrab()
return ''
for event in device.read():
if event.type == evdev.ecodes.EV_KEY:
#_logger.debug('Evdev Keyboard event %s',evdev.categorize(event))
if event.value == 1: # keydown events
if event.code in self.keymap:
if shift:
barcode.append(self.keymap[event.code][1])
else:
barcode.append(self.keymap[event.code][0])
elif event.code == 42 or event.code == 54: # SHIFT
shift = True
elif event.code == 28: # ENTER
device.ungrab()
barcode = ''.join(barcode)
return barcode
elif event.value == 0: #keyup events
if event.code == 42 or event.code == 54: # LEFT SHIFT
shift = False