diff --git a/piker/brokers/ib/_util.py b/piker/brokers/ib/_util.py index 4adb32ea..f23aa99b 100644 --- a/piker/brokers/ib/_util.py +++ b/piker/brokers/ib/_util.py @@ -81,9 +81,20 @@ async def data_reset_hack( that need to be wrangle. ''' + ib_client: IB = client.ib + + # look up any user defined vnc socket address mapped from + # a particular API socket port. + api_port: str = str(ib_client.client.port) + vnc_host: str + vnc_port: int + vnc_host, vnc_port = client.conf['vnc_addrs'].get( + api_port, + ('localhost', 3003) + ) no_setup_msg:str = ( - 'No data reset hack test setup for {vnc_host}!\n' + f'No data reset hack test setup for {vnc_host}!\n' 'See setup @\n' 'https://github.com/pikers/piker/tree/master/piker/brokers/ib' ) @@ -96,6 +107,7 @@ async def data_reset_hack( partial( vnc_click_hack, host=vnc_host, + port=vnc_port, ) ) except OSError: @@ -104,7 +116,7 @@ async def data_reset_hack( return False try: - import i3ipc + import i3ipc # noqa (since a deps dynamic check) except ModuleNotFoundError: log.warning(no_setup_msg) return False @@ -128,7 +140,8 @@ async def data_reset_hack( async def vnc_click_hack( - host: str = 'localhost', + host: str, + port: int, reset_type: str = 'data' ) -> None: ''' @@ -154,8 +167,12 @@ async def vnc_click_hack( async with asyncvnc.connect( host, - port=3003, + port=port, + + # TODO: doesn't work see: + # https://github.com/barneygale/asyncvnc/issues/7 # password='ibcansmbz', + ) as client: # move to middle of screen @@ -169,6 +186,11 @@ async def vnc_click_hack( def i3ipc_xdotool_manual_click_hack() -> None: + ''' + Do the data reset hack but expecting a local X-window using `xdotool`. + + ''' + import i3ipc i3 = i3ipc.Connection() # TODO: might be worth offering some kinda api for grabbing diff --git a/piker/brokers/ib/api.py b/piker/brokers/ib/api.py index c6ad0b50..171578aa 100644 --- a/piker/brokers/ib/api.py +++ b/piker/brokers/ib/api.py @@ -385,8 +385,14 @@ class Client: self, ib: IB, + config: dict[str, Any], ) -> None: + + # stash `brokers.toml` config on client for user settings + # as needed throughout this backend (eg. vnc sockaddr). + self.conf = config + self.ib = ib self.ib.RaiseRequestErrors = True @@ -1267,7 +1273,7 @@ async def load_aio_clients( ''' global _accounts2clients, _client_cache, _scan_ignore - conf = get_config() + conf: dict[str, Any] = get_config() ib = None client = None @@ -1333,7 +1339,7 @@ async def load_aio_clients( timeout=connect_timeout, ) # create and cache client - client = Client(ib) + client = Client(ib=ib, config=conf) # update all actor-global caches log.info(f"Caching client for {sockaddr}") @@ -1466,7 +1472,7 @@ def get_preferred_data_client( ''' conf = get_config() - data_accounts = conf['prefer_data_account'] + data_accounts: list[str] = conf['prefer_data_account'] for name in data_accounts: client = clients.get(f'ib.{name}') diff --git a/piker/brokers/ib/feed.py b/piker/brokers/ib/feed.py index f2a00825..2ceb8acb 100644 --- a/piker/brokers/ib/feed.py +++ b/piker/brokers/ib/feed.py @@ -278,7 +278,6 @@ async def wait_on_data_reset( # try to wait on the reset event(s) to arrive, a timeout # will trigger a retry up to 6 times (for now). client: Client = proxy._aio_ns - ib_client: ibis.IB = client.ib done = trio.Event() with trio.move_on_after(timeout) as cs: @@ -287,11 +286,10 @@ async def wait_on_data_reset( log.warning( 'Sending DATA RESET request:\n' - f'{ib_client.client}' + f'{client.ib.client}' ) res = await data_reset_hack( - # vnc_host=client.host, - ib_client=ib_client, + client=client, reset_type=reset_type, )