106 lines
4.1 KiB
Python
106 lines
4.1 KiB
Python
from biopro.device.manager import DeviceManager
|
|
from biopro.util.stack import print_exception
|
|
from biopro.message import DataMessage
|
|
from biopro.impl.led import LED
|
|
from biopro.api.device import DeviceAPI
|
|
|
|
from time import time
|
|
|
|
from .socket import ServerThread
|
|
from .mqtt import MqttThread
|
|
from .led import LEDControlThread
|
|
from .api import ApiRequests
|
|
|
|
from time import sleep
|
|
|
|
class RoutineConnectDeviceThread(ServerThread):
|
|
def __init__(self,
|
|
manager: DeviceManager,
|
|
mqtt_thread: MqttThread,
|
|
led_thread: LEDControlThread,
|
|
interval_seconds: int):
|
|
super().__init__('RoutineConnect')
|
|
|
|
self._manager = manager
|
|
self._interval = interval_seconds
|
|
self._mqtt = mqtt_thread
|
|
self._led = led_thread
|
|
self._api = ApiRequests()
|
|
|
|
self._time = time()
|
|
self._maxmium_times = 3
|
|
self._current_times = 0
|
|
self._connecting = False
|
|
self._connect_err_times = 0
|
|
self.setup()
|
|
|
|
|
|
@property
|
|
def routine_interval(self) -> int:
|
|
return self._interval
|
|
|
|
@property
|
|
def state(self) -> str:
|
|
return self._state
|
|
|
|
def check_device_status(self, status:str) -> str:
|
|
return DeviceAPI.getByAttrs('connect_status', status)
|
|
|
|
def setup(self) -> None:
|
|
super().setup()
|
|
|
|
self.init_device_settings()
|
|
|
|
def init_device_settings(self) -> None:
|
|
DeviceAPI.updateAll({
|
|
'connect_status': 'idle',
|
|
'connect_id': -1,
|
|
'connect_time': 0
|
|
})
|
|
|
|
def routine(self, event = None) -> None:
|
|
try:
|
|
if time() - self._time > 60:
|
|
self._current_times = 0
|
|
self._time = time()
|
|
|
|
if not self.check_device_status('update') and not self.check_device_status('running') and self._current_times < 3:
|
|
self._current_times += 1
|
|
register_device = DeviceAPI.getAll()
|
|
if register_device is not None:
|
|
for device in register_device:
|
|
if device is not None:
|
|
if device['auto_connect'] and device['connect_status'] == 'idle':
|
|
# self._connecting = True
|
|
try:
|
|
# while self._connecting and self._connect_err_times < 3:
|
|
ret = self._manager.direct_connect(device['mac_address'], device['serial_number'])
|
|
if ret is not None:
|
|
updateInfo = {
|
|
'battery': ret.battery,
|
|
'connect_status': 'connect',
|
|
'device_version': ret.device_version,
|
|
'library': ret.library_name,
|
|
'library_version': ret.library_version,
|
|
'connect_id': ret.device_id
|
|
}
|
|
# update device status by id
|
|
DeviceAPI.updateByID(device['id'], updateInfo)
|
|
# broacast mqtt
|
|
self._led.set_state(LED.CONNECTED)
|
|
self._mqtt.broadcast_command(DataMessage.connected(ret.device_id))
|
|
# self._mqtt.broadcast_command('state:device_available')
|
|
# self._connecting = False
|
|
break
|
|
|
|
# print('error', self._connect_err_times)
|
|
except Exception as e:
|
|
print(e)
|
|
break
|
|
else:
|
|
break
|
|
except AttributeError:
|
|
print_exception(self)
|
|
finally:
|
|
event.wait(self._interval)
|