[update] remove available_device

This commit is contained in:
Roy
2022-02-10 17:38:28 +08:00
parent d1c4b0a29f
commit 3b60d74c47
5 changed files with 43 additions and 160 deletions
+39 -128
View File
@@ -955,9 +955,6 @@ class CC2650SingleMasterDevice(CC2650MasterDevice, Synchronized):
self._cc2650.recv_util(..., when=self._cond, timeout=timeout)
def available_device(self) -> List[int]:
return [0]
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
if self._scan_max_time != timeout:
@@ -1442,11 +1439,6 @@ class CC2650MultiMasterDevice(CC2650MasterDevice, Synchronized):
super().shutdown()
self._selector.close()
def available_device(self) -> List[int]:
return list(map(lambda it: it[0],
filter(lambda it: it[1] is not None,
enumerate(self._cc2650))))
def get_device(self, device: int) -> Optional[Device]:
return self._device[device]
@@ -1968,9 +1960,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
"""initialize cc2650 (master)"""
pass
def available_device(self) -> List[int]:
return [0]
def scan_send_ins(self):
# send scan command
try:
@@ -1994,10 +1983,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
# if self._scan_max_time != timeout:
# self.log_info('set max scan limit time', timeout)
# self._scan_max_time = timeout
self._found = found = []
self._found_with_id = []
number_of_device = 0
@@ -2013,33 +1998,8 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
# print('send_scan', bytes(scan_ins))
self._cc2650.send("bytes", bytes(scan_ins))
# for wait_scan_response in range(5):
# try:
# scan_response = self._cc2650.recv_uart(0.2)
# except RecvTimeout:
# if wait_scan_response == 4:
# self.reset_internal()
# self.reset_hardware()
# self._interface.flush()
# return True
# else:
# self.log_info("wait for scan response")
# continue
# # check if response is valid
# if scan_response is None:
# if wait_scan_response == 4:
# self.reset_internal()
# self.reset_hardware()
# self._interface.flush()
# else:
# self.log_info("wait for scan response")
# continue
# else:
# break
try:
scan_response = self._cc2650.recv_uart(0.2)
scan_response = self._cc2650.recv_uart(0.002)
except RecvTimeout:
self.reset_internal()
self.reset_hardware()
@@ -2140,6 +2100,35 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
def found(self) -> List[DeviceResponseInfo]:
return self._found
def check_mem_survive(self) -> Optional[CC2650Device]:
ack = []
ins = bytearray()
ins.append(10)
ins.append(1) #length
ins.append(0xF1)
# print('ins', list(ins))
try:
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException as e:
raise RecvTimeout('device CC2650 check_mem_survive timeout') from e
else:
try:
ack = self._cc2650.recv_uart(timeout = 0.001)
except RecvTimeout:
self.log_info("unavailable device")
# else:
# print('ack=', ack)
if ack == [3]:
return True
return False
@synchronized
def connect(self, response: DeviceResponseInfo, direct_connect: bool = False) -> Optional[CC2650Device]:
if self._handle is not None:
@@ -2555,11 +2544,10 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
if m is None:
m = CC2650SingleMasterCentralDevice(self._master, self._interface, self._options)
# m.set_log_level(self._cc2650_log_level)
self._cc2650[i] = m
self._interface.flush()
self._selector.select(i)
# self._mem_selector.select(i)
try:
self.log_info('reset device', i)
@@ -2567,10 +2555,7 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
with m:
m.reset_internal()
m.reset_hardware()
if software_reset:
m.reset_software()
self._cc2650[i] = m
m.reset_software()
except RecvTimeout:
self.log_warn('reset device', i, 'fail')
@@ -2579,83 +2564,11 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
if not software_reset:
return
# check reset result
available_device_id = list(map(lambda it: it[0],
filter(lambda it: it[1] is not None,
enumerate(self._cc2650))))
if len(available_device_id) == 0:
raise RuntimeError("reset fail, no device found")
self.log_verbose('available device', ' '.join(map(str, available_device_id)))
# initial hardware
for i in range(len(self._cc2650)):
m = self._cc2650[i]
if m is not None:
self._interface.flush()
self._selector.select(i)
# self._mem_selector.select(i)
try:
self.log_info('init device', i)
except RecvTimeout:
self.log_warn('init device', i, 'fail')
self._cc2650[i] = None
# check init result, again
available_device_id = list(map(lambda it: it[0],
filter(lambda it: it[1] is not None,
enumerate(self._cc2650))))
if len(available_device_id) == 0:
raise RuntimeError("init fail, no device success")
def reset_empty_master(self, device: Optional[List[int]] = None, software_reset=True):
self.log_verbose('reset')
# reset hardware
# print("reset device = ", device)
for i in range(len(self._cc2650)):
# print(i)
m = self._cc2650[i]
d = self._device[i]
# print(m, d)
if m is not None and d is None:
m = CC2650SingleMasterCentralDevice(self._master, self._interface, self._options)
# m.set_log_level(self._cc2650_log_level)
self._interface.flush()
self._selector.select(i)
self._mem_selector.select(i)
try:
self.log_info('reset device', i)
with m:
m.reset_internal()
m.reset_hardware()
except RecvTimeout:
self.log_warn('reset device', i, 'fail')
self._cc2650[i] = None
def available_device(self) -> List[int]:
return list(map(lambda it: it[0],
filter(lambda it: it[1] is not None,
enumerate(self._cc2650))))
def _foreach_empty_master(self) -> Iterable[int]:
for i in range(len(self._cc2650)):
m = self._cc2650[i]
for i in range(len(self._device)):
d = self._device[i]
if m is not None and d is None:
if d is None:
yield i
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
@@ -2663,22 +2576,22 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
all_result = False
for device in self._foreach_empty_master():
for device in range(len(self._cc2650)):
self.log_verbose('use', device)
m = self._cc2650[device]
d = self._device[device]
if m is not None and d is None:
if d is None:
error = None
with self:
self._interface.flush()
self._selector.select(device)
# self._mem_selector.select(device)
try:
sleep(0.0001)
if m.check_mem_survive() == False:
continue
result = m.scan_callback(callback, timeout=timeout)
except RuntimeError as e:
@@ -2692,8 +2605,7 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
if error is not None:
self.log_warn('suppressed error : ' + str(error))
# self.reset(device)
sleep(1)
return all_result
def found(self) -> List[DeviceResponseInfo]:
@@ -2746,7 +2658,6 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
with self:
self._interface.flush()
self._selector.select(master)
# self._mem_selector.select(device)
sleep(0.0001)
d = m.connect(response, direct_connect)
-3
View File
@@ -383,9 +383,6 @@ class DeviceManager(MasterDevice, Synchronized):
self._demo.clear()
self._centralMaster.reset(device, software_reset)
def available_device(self) -> List[int]:
return self._centralMaster.available_device()
@logging_info
def shutdown(self, release_resource=True):
# shutdown reset memeryboard
-7
View File
@@ -963,10 +963,6 @@ class MasterDevice(LoggerFlag, metaclass=abc.ABCMeta):
"""
pass
@abc.abstractmethod
def available_device(self) -> List[int]:
pass
def scan(self, timeout=5, all_device=False) -> List[DeviceResponseInfo]:
"""scan the nearby device.
@@ -1101,9 +1097,6 @@ class NullMasterDevice(MasterDevice):
def shutdown(self, release_resource=True):
pass
def available_device(self) -> List[int]:
return []
def scan(self, timeout=5, all_device=False) -> List[DeviceResponseInfo]:
return []
+1 -1
View File
@@ -64,7 +64,7 @@ class RoutineConnectDeviceThread(ServerThread):
self._current_times = 0
self._time = time()
if len(self._manager._device) < len(self._manager.available_device()) and not self.check_device_status('update') and not self.check_device_status('running') and self._current_times < 3:
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:
+3 -21
View File
@@ -213,8 +213,8 @@ class ControlServer(SocketServer, ControlServerAPI, CacheAPI, CacheNotifyHandler
self.led_thread.set_state(LED.POWER_ON)
# sha checking
if _RUNTIME_COMPILE or not self._controller_options.flag_disable_sha_check:
self.run_thread(_RandomCrashThread())
# if _RUNTIME_COMPILE or not self._controller_options.flag_disable_sha_check:
# self.run_thread(_RandomCrashThread())
# data server
interface = self.device_manager.interface
@@ -328,7 +328,7 @@ class ControlServer(SocketServer, ControlServerAPI, CacheAPI, CacheNotifyHandler
if available_channel is None:
self.device_manager.setup(DeviceHardwareInterface.INTERFACE_DUMMY)
else:
self._setup_device_manager(available_channel)
self.broadcast_command('state:device_available')
except ServerShutdownException as e:
self.interrupt(e)
@@ -400,24 +400,6 @@ class ControlServer(SocketServer, ControlServerAPI, CacheAPI, CacheNotifyHandler
self.log_verbose('available channel', available_channel)
return available_channel
def _setup_device_manager(self, available_channel: List[int]):
# device reset
# only reset those device has channel available
self.log_verbose('reset device')
self.device_manager.reset(available_channel)
# device checking
available_device = self.device_manager.available_device()
self.log_verbose('available device', available_device)
self.broadcast_command('state:device_available')
if len(available_device) == 0:
raise RuntimeError('empty device')
elif available_device != available_channel:
raise RuntimeError('device/channel mismatch')
def _setup_restart_device_manager(self, interface: str):
self.log_info('shutdown device manager')
self.device_manager.shutdown()