diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/hw_drivers/event_manager.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/hw_drivers/event_manager.py')
| -rw-r--r-- | addons/hw_drivers/event_manager.py | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/addons/hw_drivers/event_manager.py b/addons/hw_drivers/event_manager.py new file mode 100644 index 00000000..f76968f9 --- /dev/null +++ b/addons/hw_drivers/event_manager.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import json +from threading import Event +import time + +from odoo.http import request + +class EventManager(object): + def __init__(self): + self.events = [] + self.sessions = {} + + def _delete_expired_sessions(self, max_time=70): + ''' + Clears sessions that are no longer called. + + :param max_time: time a session can stay unused before being deleted + ''' + now = time.time() + expired_sessions = [ + session + for session in self.sessions + if now - self.sessions[session]['time_request'] > max_time + ] + for session in expired_sessions: + del self.sessions[session] + + def add_request(self, listener): + self.session = { + 'session_id': listener['session_id'], + 'devices': listener['devices'], + 'event': Event(), + 'result': {}, + 'time_request': time.time(), + } + self._delete_expired_sessions() + self.sessions[listener['session_id']] = self.session + return self.sessions[listener['session_id']] + + def device_changed(self, device): + event = { + **device.data, + 'device_identifier': device.device_identifier, + 'time': time.time(), + 'request_data': json.loads(request.params['data']) if request and 'data' in request.params else None, + } + self.events.append(event) + for session in self.sessions: + if device.device_identifier in self.sessions[session]['devices'] and not self.sessions[session]['event'].isSet(): + self.sessions[session]['result'] = event + self.sessions[session]['event'].set() + + +event_manager = EventManager() |
