diff --git a/src/meshcore_cli/meshcore_cli.py b/src/meshcore_cli/meshcore_cli.py index 0fd61f7..58238fa 100644 --- a/src/meshcore_cli/meshcore_cli.py +++ b/src/meshcore_cli/meshcore_cli.py @@ -362,204 +362,204 @@ def make_completion_dict(contacts, pending={}, to=None, channels=None): } root_completion_list = { - "ver" : None, - "infos" : None, - "advert" : None, - "floodadv" : None, - "msg" : contact_list, - "wait_ack" : None, - "time" : None, - "clock" : {"sync" : None}, - "reboot" : None, - "card" : None, - "upload_card" : None, - "contacts": None, - "pending_contacts": None, - "add_pending": pending_list, - "flush_pending": None, - "contact_info": contact_list, - "export_contact" : contact_list, - "upload_contact" : contact_list, - "share_contact" : contact_list, - "path": contact_list, - "disc_path" : contact_list, - "trace" : None, - "reset_path" : contact_list, - "change_path" : contact_list, - "change_flags" : contact_list, - "remove_contact" : contact_list, - "import_contact" : {"meshcore://":None}, - "reload_contacts" : None, - "login" : contact_list, - "cmd" : contact_list, - "req_status" : contact_list, - "req_bstatus" : contact_list, - "logout" : contact_list, - "req_telemetry" : contact_list, - "req_binary" : contact_list, - "req_mma" : contact_list, - "self_telemetry" : None, - "get_channel": None, - "set_channel": None, - "get_channels": None, - "remove_channel": None, - "set" : { - "name" : None, - "pin" : None, - "radio" : {",,,":None, "f,bw,sf,cr":None}, - "tx" : None, - "tuning" : {",", "af,tx_d"}, - "lat" : None, - "lon" : None, - "coords" : None, - "print_snr" : {"on":None, "off": None}, - "json_msgs" : {"on":None, "off": None}, - "color" : {"on":None, "off":None}, - "print_name" : {"on":None, "off":None}, - "print_adverts" : {"on":None, "off":None}, - "print_new_contacts" : {"on": None, "off":None}, - "print_path_updates" : {"on":None,"off":None}, - "classic_prompt" : {"on" : None, "off":None}, - "manual_add_contacts" : {"on" : None, "off":None}, - "telemetry_mode_base" : {"always" : None, "device":None, "never":None}, - "telemetry_mode_loc" : {"always" : None, "device":None, "never":None}, - "telemetry_mode_env" : {"always" : None, "device":None, "never":None}, - "advert_loc_policy" : {"none" : None, "share" : None}, - "auto_update_contacts" : {"on":None, "off":None}, - "multi_acks" : {"on": None, "off":None}, - "max_attempts" : None, - "max_flood_attempts" : None, - "flood_after" : None, - }, - "get" : {"name":None, - "bat":None, - "fstats": None, - "radio":None, - "tx":None, - "coords":None, - "lat":None, - "lon":None, - "print_snr":None, - "json_msgs":None, - "color":None, - "print_name":None, - "print_adverts":None, - "print_path_updates":None, - "print_new_contacts":None, - "classic_prompt":None, - "manual_add_contacts":None, - "telemetry_mode_base":None, - "telemetry_mode_loc":None, - "telemetry_mode_env":None, - "advert_loc_policy":None, - "auto_update_contacts":None, - "multi_acks":None, - "max_attempts":None, - "max_flood_attempts":None, - "flood_after":None, - "custom":None, - }, - } + "ver" : None, + "infos" : None, + "advert" : None, + "floodadv" : None, + "msg" : contact_list, + "wait_ack" : None, + "time" : None, + "clock" : {"sync" : None}, + "reboot" : None, + "card" : None, + "upload_card" : None, + "contacts": None, + "pending_contacts": None, + "add_pending": pending_list, + "flush_pending": None, + "contact_info": contact_list, + "export_contact" : contact_list, + "upload_contact" : contact_list, + "share_contact" : contact_list, + "path": contact_list, + "disc_path" : contact_list, + "trace" : None, + "reset_path" : contact_list, + "change_path" : contact_list, + "change_flags" : contact_list, + "remove_contact" : contact_list, + "import_contact" : {"meshcore://":None}, + "reload_contacts" : None, + "login" : contact_list, + "cmd" : contact_list, + "req_status" : contact_list, + "req_bstatus" : contact_list, + "logout" : contact_list, + "req_telemetry" : contact_list, + "req_binary" : contact_list, + "req_mma" : contact_list, + "self_telemetry" : None, + "get_channel": None, + "set_channel": None, + "get_channels": None, + "remove_channel": None, + "set" : { + "name" : None, + "pin" : None, + "radio" : {",,,":None, "f,bw,sf,cr":None}, + "tx" : None, + "tuning" : {",", "af,tx_d"}, + "lat" : None, + "lon" : None, + "coords" : None, + "print_snr" : {"on":None, "off": None}, + "json_msgs" : {"on":None, "off": None}, + "color" : {"on":None, "off":None}, + "print_name" : {"on":None, "off":None}, + "print_adverts" : {"on":None, "off":None}, + "print_new_contacts" : {"on": None, "off":None}, + "print_path_updates" : {"on":None,"off":None}, + "classic_prompt" : {"on" : None, "off":None}, + "manual_add_contacts" : {"on" : None, "off":None}, + "telemetry_mode_base" : {"always" : None, "device":None, "never":None}, + "telemetry_mode_loc" : {"always" : None, "device":None, "never":None}, + "telemetry_mode_env" : {"always" : None, "device":None, "never":None}, + "advert_loc_policy" : {"none" : None, "share" : None}, + "auto_update_contacts" : {"on":None, "off":None}, + "multi_acks" : {"on": None, "off":None}, + "max_attempts" : None, + "max_flood_attempts" : None, + "flood_after" : None, + }, + "get" : {"name":None, + "bat":None, + "fstats": None, + "radio":None, + "tx":None, + "coords":None, + "lat":None, + "lon":None, + "print_snr":None, + "json_msgs":None, + "color":None, + "print_name":None, + "print_adverts":None, + "print_path_updates":None, + "print_new_contacts":None, + "classic_prompt":None, + "manual_add_contacts":None, + "telemetry_mode_base":None, + "telemetry_mode_loc":None, + "telemetry_mode_env":None, + "advert_loc_policy":None, + "auto_update_contacts":None, + "multi_acks":None, + "max_attempts":None, + "max_flood_attempts":None, + "flood_after":None, + "custom":None, + }, + } contact_completion_list = { - "contact_info": None, - "export_contact" : None, - "share_contact" : None, - "upload_contact" : None, - "path": None, - "disc_path": None, - "trace": None, - "dtrace": None, - "reset_path" : None, - "change_path" : None, - "change_flags" : None, - "req_telemetry" : None, - "req_binary" : None, - "forget_password" : None, - } + "contact_info": None, + "export_contact" : None, + "share_contact" : None, + "upload_contact" : None, + "path": None, + "disc_path": None, + "trace": None, + "dtrace": None, + "reset_path" : None, + "change_path" : None, + "change_flags" : None, + "req_telemetry" : None, + "req_binary" : None, + "forget_password" : None, + } client_completion_list = dict(contact_completion_list) client_completion_list.update({ - "get" : { "timeout":None, }, - "set" : { "timeout":None, }, + "get" : { "timeout":None, }, + "set" : { "timeout":None, }, }) repeater_completion_list = dict(contact_completion_list) repeater_completion_list.update({ - "login" : None, - "logout" : None, - "req_status" : None, - "req_bstatus" : None, - "cmd" : None, - "ver" : None, - "advert" : None, - "time" : None, - "clock" : {"sync" : None}, - "reboot" : None, - "start ota" : None, - "password" : None, - "neighbors" : None, - "req_acl":None, - "setperm":contact_list, - "gps" : {"on":None,"off":None,"sync":None,"setloc":None, - "advert" : {"none": None, "share": None, "prefs": None}, - }, - "sensor": {"list": None, "set": {"gps": None}, "get": {"gps": None}}, - "get" : {"name" : None, - "role":None, - "radio" : None, - "freq":None, - "tx":None, - "af" : None, - "repeat" : None, - "allow.read.only" : None, - "flood.advert.interval" : None, - "flood.max":None, - "advert.interval" : None, - "guest.password" : None, - "rxdelay": None, - "txdelay": None, - "direct.tx_delay":None, - "public.key":None, - "lat" : None, - "lon" : None, - "telemetry" : None, - "status" : None, - "timeout" : None, - "acl":None, - "bridge.enabled":None, - "bridge.delay":None, - "bridge.source":None, - "bridge.baud":None, - "bridge.secret":None, - "bridge.type":None, - }, - "set" : {"name" : None, - "radio" : {",,,":None, "f,bw,sf,cr": None}, - "freq" : None, - "tx" : None, - "af": None, - "repeat" : {"on": None, "off": None}, - "flood.advert.interval" : None, - "flood.max" : None, - "advert.interval" : None, - "guest.password" : None, - "allow.read.only" : {"on": None, "off": None}, - "rxdelay" : None, - "txdelay": None, - "direct.txdelay" : None, - "lat" : None, - "lon" : None, - "timeout" : None, - "perm":contact_list, - "bridge.enabled":{"on": None, "off": None}, - "bridge.delay":None, - "bridge.source":None, - "bridge.baud":None, - "bridge.secret":None, - }, - "erase": None, - "log" : {"start" : None, "stop" : None, "erase" : None} + "login" : None, + "logout" : None, + "req_status" : None, + "req_bstatus" : None, + "cmd" : None, + "ver" : None, + "advert" : None, + "time" : None, + "clock" : {"sync" : None}, + "reboot" : None, + "start ota" : None, + "password" : None, + "neighbors" : None, + "req_acl":None, + "setperm":contact_list, + "gps" : {"on":None,"off":None,"sync":None,"setloc":None, + "advert" : {"none": None, "share": None, "prefs": None}, + }, + "sensor": {"list": None, "set": {"gps": None}, "get": {"gps": None}}, + "get" : {"name" : None, + "role":None, + "radio" : None, + "freq":None, + "tx":None, + "af" : None, + "repeat" : None, + "allow.read.only" : None, + "flood.advert.interval" : None, + "flood.max":None, + "advert.interval" : None, + "guest.password" : None, + "rxdelay": None, + "txdelay": None, + "direct.tx_delay":None, + "public.key":None, + "lat" : None, + "lon" : None, + "telemetry" : None, + "status" : None, + "timeout" : None, + "acl":None, + "bridge.enabled":None, + "bridge.delay":None, + "bridge.source":None, + "bridge.baud":None, + "bridge.secret":None, + "bridge.type":None, + }, + "set" : {"name" : None, + "radio" : {",,,":None, "f,bw,sf,cr": None}, + "freq" : None, + "tx" : None, + "af": None, + "repeat" : {"on": None, "off": None}, + "flood.advert.interval" : None, + "flood.max" : None, + "advert.interval" : None, + "guest.password" : None, + "allow.read.only" : {"on": None, "off": None}, + "rxdelay" : None, + "txdelay": None, + "direct.txdelay" : None, + "lat" : None, + "lon" : None, + "timeout" : None, + "perm":contact_list, + "bridge.enabled":{"on": None, "off": None}, + "bridge.delay":None, + "bridge.source":None, + "bridge.baud":None, + "bridge.secret":None, + }, + "erase": None, + "log" : {"start" : None, "stop" : None, "erase" : None} }) sensor_completion_list = dict(repeater_completion_list) @@ -2714,7 +2714,7 @@ async def main(argv): with open(MCCLI_ADDRESS, encoding="utf-8") as f : address = f.readline().strip() - opts, args = getopt.getopt(argv, "a:d:s:ht:p:b:jDhvSlT:P") + opts, args = getopt.getopt(argv, "a:d:s:ht:p:b:fjDhvSlT:P") for opt, arg in opts : match opt: case "-d" : # name specified on cmdline @@ -2744,6 +2744,8 @@ async def main(argv): case "-v": version() return + case "-f": # connect to first encountered device + address = "" case "-l" : print("BLE devices:") try : @@ -2813,7 +2815,10 @@ async def main(argv): elif address and len(address) == 36 and len(address.split("-")) == 5: client = BleakClient(address) # mac uses uuid, we'll pass a client else: - logger.info(f"Scanning BLE for device matching {address}") + if address == "": + logger.info(f"Searching first MC BLE device") + else: + logger.info(f"Scanning BLE for device matching {address}") devices = await BleakScanner.discover(timeout=timeout) found = False for d in devices: @@ -2838,6 +2843,26 @@ async def main(argv): mc = await MeshCore.create_ble(address=address, device=device, client=client, debug=debug, only_error=json_output, pin=pin) except ConnectionError : logger.info("Error while connecting, retrying once ...") + if device is None or client is None: # Search for device + logger.info(f"Scanning BLE for device matching {address}") + devices = await BleakScanner.discover(timeout=timeout) + found = False + for d in devices: + if not d.name is None and d.name.startswith("MeshCore-") and\ + (address is None or address in d.name) : + address=d.address + device=d + logger.info(f"Found device {d.name} {d.address}") + found = True + break + elif d.address == address : # on a mac, address is an uuid + device = d + logger.info(f"Found device {d.name} {d.address}") + found = True + break + if not found : + logger.info(f"Couldn't find device {address}") + return try : mc = await MeshCore.create_ble(address=address, device=device, client=client, debug=debug, only_error=json_output, pin=pin) except ConnectionError :