#! /usr/bin/python3

import os
import sys
import xusb

def env_debug_mask(module, env_name, default_value):
	debug_mask = os.getenv(env_name, default_value)
	module.set_debug_mask(int(debug_mask, 0));

def env_verbose(module, env_name, default_value):
	verbose = os.getenv(env_name, default_value)
	module.set_verbose(int(verbose, 0));

env_debug_mask(xusb, "XTALK_DEBUG", "0x0")
env_verbose(xusb, "XTALK_VERBOSE", "0")

# List of specs to search
specs = (
	xusb.Spec(0xe4e4, 0x1183, "Power Supplies"),
	xusb.Spec(0xe4e4, 0x1162, "Astribanks-XPP"),
	xusb.Spec(0xe4e4, 0x1162, "Astribanks-MPP"),
	xusb.Spec(0xe4e4, 0x1161, "Astribanks-USB"),
	xusb.Spec(0xe4e4, 0x1193, "XPanels"),
	xusb.Spec(0xe4e4, 0xbb01, "Ncs"),
	)

# Find all devices
print("Searching for devices:")
all_devs = []
interesting_specs = dict()	# that have devices

for s in specs:
	spec_name = s.name()
	devs = s.find_all()
	if not devs:
		continue
	print("\t-> %d %s" % (len(devs), spec_name))
	interesting_specs[spec_name] = devs[0]	# representative
	all_devs += devs

# Test each device
print("Devices found:")
for d in all_devs:
	s = d.spec()	# Which spec does it belong to?
	spec_name = s.name()
	try:
		i = d.claim(0)
		d.showinfo()
		i = None
	except:
		print("Unexpected error:", sys.exc_info()[0])
		continue

# Test find_bypath()
def test_dev_bypath(msg, should_succeed, spec, devpath, interface_num):
	dev = xusb.find_bypath(devpath)
	i = None
	if dev is not None:
		i = dev.claim(interface_num)
	if i:
		if should_succeed:
			status = "GOOD: (expected success)"
		else:
			status = "BAD: (should fail)"
	else:
		if should_succeed:
			status = "BAD: (should succeed)"
		else:
			status = "GOOD: (expected fail)"
	print("\t\t%-30s %s" % (msg, status))
	return (dev, i)

existing_specs = interesting_specs.keys()
print("Test devices:")
for spec_name in existing_specs:
	d = interesting_specs[spec_name]
	s = d.spec()
	devpath = d.devpath()
	i = d.claim(0)
	inum = i.interface_num()
	serial = d.serial()
	i = None
	print("%s[%d]: %-15s (one of the %s)" % (devpath, inum, serial, spec_name))
	try:
		(d1, i1) = test_dev_bypath("Test find_bypath()", 1, s, devpath, 0)
		d1.showinfo()
		ix = d1.interface(1)
		print(ix)
		(d2, i2) = test_dev_bypath("Test find_bypath()", 0, s, devpath, 0)
		if d2 is not None:
			d2.showinfo()
		d1 = None
		i1 = None
		(d1, i1) = test_dev_bypath("Test find_bypath() [again]", 1, s, devpath, 0)
		d1 = None
		i1 = None
	except:
		raise
