Files
controller-wisetopdataserver/python/biopro/server/connect.py
T
2022-02-10 17:38:28 +08:00

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)