diff --git a/addons/hw_blackbox_be/controllers/main.py b/addons/hw_blackbox_be/controllers/main.py index 13579ee7b9b..a21ddbc2c80 100644 --- a/addons/hw_blackbox_be/controllers/main.py +++ b/addons/hw_blackbox_be/controllers/main.py @@ -14,6 +14,8 @@ import openerp.addons.hw_proxy.controllers.main as hw_proxy _logger = logging.getLogger(__name__) +DRIVER_NAME = 'fiscal_data_module' + class Blackbox(Thread): def __init__(self): Thread.__init__(self) @@ -39,26 +41,31 @@ class Blackbox(Thread): # request. The first device to give an answer that makes sense # wins. def _find_device_path_by_probing(self): - path = "/dev/serial/by-path/" - probe_message = self._wrap_low_level_message_around("S000") + with hw_proxy.rs232_lock: + path = "/dev/serial/by-path/" + probe_message = self._wrap_low_level_message_around("S000") - try: - devices = listdir(path) - except OSError: - _logger.warning(path + " doesn't exist") - else: - for device in listdir(path): - path_to_device = path + device - _logger.debug("Probing " + device) + try: + devices = listdir(path) + except OSError: + _logger.warning(path + " doesn't exist") + self.set_status("disconnected", ["No RS-232 device (or emulated ones) found"]) + else: + for device in devices: + if device in hw_proxy.rs232_devices: + continue + path_to_device = path + device + _logger.debug("Probing " + device) - if self._send_to_blackbox(probe_message, 21, path_to_device, just_wait_for_ack=True): - _logger.info(device + " will be used as the blackbox") - self.set_status("connected", [device]) - return path_to_device + if self._send_to_blackbox(probe_message, 21, path_to_device, just_wait_for_ack=True): + _logger.info(device + " will be used as the blackbox") + self.set_status("connected", [device]) + hw_proxy.rs232_devices[device] = DRIVER_NAME + return path_to_device - _logger.warning("Blackbox could not be found") - self.set_status("error", ["Couldn't find the Fiscal Data Module"]) - return "" + _logger.warning("Blackbox could not be found") + self.set_status("disconnected", ["Couldn't find the Fiscal Data Module"]) + return "" def _lrc(self, msg): lrc = 0 @@ -152,7 +159,7 @@ class Blackbox(Thread): if isfile("/home/pi/registered_blackbox_be"): blackbox_thread = Blackbox() - hw_proxy.drivers['fiscal_data_module'] = blackbox_thread + hw_proxy.drivers[DRIVER_NAME] = blackbox_thread class BlackboxDriver(hw_proxy.Proxy): @http.route('/hw_proxy/request_blackbox/', type='json', auth='none', cors='*') diff --git a/addons/hw_proxy/controllers/main.py b/addons/hw_proxy/controllers/main.py index d377b5e9a01..e1024772500 100644 --- a/addons/hw_proxy/controllers/main.py +++ b/addons/hw_proxy/controllers/main.py @@ -11,6 +11,8 @@ import subprocess import simplejson import werkzeug import werkzeug.wrappers +from threading import Lock + _logger = logging.getLogger(__name__) @@ -30,6 +32,11 @@ BANNED_DEVICES = set([ # so that 'status' can return the status of all active drivers drivers = {} +# keep a list of RS-232 devices that have been recognized by a driver, +# so other drivers can skip them during probes +rs232_devices = {} # {'/path/to/device': 'driver'} +rs232_lock = Lock() # must be held to update `rs232_devices` + class Proxy(http.Controller): def get_status(self):