⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 showtree.java

📁 JAVA 访问USB JAVA 访问USB JAVA 访问USB JAVA 访问USB JAVA 访问USB JAVA 访问USB
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

	// FIXME:  can print interface class details

	indentLine (indent, "</" + intf.getInterfaceClassName () + ">");
    }

    private static void printEndpoint (int indent, Endpoint e)
    {
	if (e == null) {
	    indentLine (indent, "<!-- endpoint not available -->");
	    return;
	}

	indentLine (indent, "<endpoint addr='"
	    + e.getEndpointAddress ()
	    + "' direction='"
	    + (e.isInput () ? "in" : "out")
	    + "' type='"
	    + e.getType ()
	    + "'");
	indentLine (indent + 4, "attributes='"
	    + Integer.toHexString (e.getAttributes ())
	    + "' maxpacket='"
	    + e.getMaxPacketSize ()
	    + "' interval='"
	    + e.getInterval ()
	    // XXX two "extra" bytes in audio endpoints ...
	    + "'/>");
	maybePrintDescriptors (indent, e.nextDescriptor ());
    }

    // call this to print anything between one descriptor and
    // the next interface or endpoint (or end of configuration)
    private static void maybePrintDescriptors (int indent, Descriptor d)
    {
	while (d != null) {
	    switch (d.getDescriptorType ()) {
		case Descriptor.TYPE_INTERFACE:
		case Descriptor.TYPE_ENDPOINT:
		    return;
		default:
		    indentLine (indent, "<descriptor type='"
			    + d.getDescriptorType ()
			    + "' length='"
			    + d.getLength ()
			    + "'/>");
		    // dumping contents could be useful too
		    d = d.nextDescriptor ();
	    }
	}
    }

    // let's try some intelligence with some devices
    private static void maybePrintDeviceDetails (
	int indent,
	DeviceDescriptor info
    )
    {
	indent += 8;

	// FIXME: use external config data; XML format

	if (info.getDeviceClass () == Descriptor.CLASS_HUB)
	    printHubDetails (indent, info.getDevice ());
	else if (info.getVendorId () == 0x040a)
	    printKodakDetails (indent, info);
	else if (info.getVendorId () == 0x0841)
	    printDiamondDetails (indent, info);
    }

    private static void printHubDetails (int indent, Device dev)
    {
	try {
	    Hub		h = new Hub (dev);
	    int		ports = h.getNumPorts ();

	    indentLine (indent,
		(h.isRootHub () ? "Root " : "")
		+ "Hub, "
		+ ports
		+ " ports"
		);
	    indentLine (indent,
		"overcurrent protection: "
		+ h.getOverCurrentMode ()
		);
	    indentLine (indent,
		"power switching: "
		+ h.getPowerSwitchingMode ()
		);
	    if (h.isCompound ())
		indentLine (indent, "Part of a compound device");

	    // not showing POTPGT, or hub's own current draw

	    indent -= 4;
	    indentLine (indent, "");
	    for (int i = 1; i <= ports; i++) {
		Device child = dev.getChild (i);

		if (child == null)
		    continue;

		indentLine (indent, "<!-- Port "
			+ i
			+ (h.isRemovable (i) ? "" : " is built-in.")
			+ " -->");
		printDevice (indent, child);
	    }

	} catch (IOException e) {
	    e.printStackTrace (System.out);
	}
    }


    private static void printKodakDetails (int indent, DeviceDescriptor info)
    {
	String	type;

	switch (info.getProductId ()) {
	    //
	    // "Taka" serial/usb protocol, dating back to DC-50
	    //
	    case 0x0120:	type = "dc240"; break;
	    case 0x0130:	type = "dc280"; break;
	    case 0x0131:	type = "dc5000"; break;
	    case 0x0132:	type = "dc3400"; break;

	    //
	    // DigitaOS serial/usb protocol isn't Kodak-proprietary.
	    // Also used by HP PhotoSmart C500
	    //
	    case 0x0100:	// dc220
	    case 0x0110:	// dc260
	    case 0x0111:	// dc265
	    case 0x0112:	// dc290
		indentLine (indent, "http://ods.sourceforge.net/");
		return;

	    //
	    // There are many other old serial protocols that have been
	    // brought forward into USB.  One hopes that vendor-neutral
	    // standards will start to really catch on.
	    //


	    //
	    // PTP protocol -- based on an ISO draft, intended to
	    // be neutral with respect to vendor and protocol.  New.
	    //
	    // Doesn't have serial line legacy features.
	    //
	    case 0x0121:	// dc240 with PTP prototype firmware
	    case 0x0160:	// dc4800
		indentLine (indent, "http://jphoto.sourceforge.net/");

		    // FIXME:  if jPhoto is available it should
		    // be able to plug itself in ...

		return;
	    
	    default:
		indentLine (indent, "I don't know about this product.");
		return;
	}
	indentLine (indent, "I can talk to a " + type + " ...");

	try {
	    Kodak	camera = new Kodak (info.getDevice ());

	    indentLine (indent, "Current camera status: ");
	    camera.printSomeStatus (indent);

	} catch (IOException e) {
	    indentLine (indent, "... but I can't do it just now.");
	    indentLine (indent, e.getMessage ());

	} catch (Exception e) {
	    e.printStackTrace (System.out);
	}
    }

    private static void showStorage (int indent, Rio500 rio, boolean external)
    throws IOException
    {
	Rio500.MemoryStatus	mem;
	int			temp;

	indentLine (indent, external ? "SmartMedia" : "Built-in Memory");
	indent += 2;

	temp = rio.getFreeMemory (external);
	indentLine (indent, "Available Memory in bytes:  "
		+ (temp / (1024 * 1024))
		+ "."
		+ ((10 * (temp % (1024 * 1024))) / (1024 * 1024))
		+ " MB, "
		);
	mem = rio.getMemoryStatus (external);
	temp = mem.getBlockCount ();
	if (temp != 0)
	    temp = ((temp - mem.getNumUnusedBlocks ()) * 100) / temp;
	else
	    temp = 1000;

	indentLine (indent, "Memory status: "
	    + mem.getBlockCount () + " Blocks, "
	    + mem.getBlockSize () + " bytes each, "
	    + mem.getNumUnusedBlocks () + " blocks unused "
	    + temp + "% full "
	    );
	indentLine (indent, "First free block at 0x"
		+ Integer.toHexString (mem.getFirstFreeBlock ())
		);

	// dump folders and their contents
	Rio500.FolderEntry	folders [] = rio.getFolders (external);

	for (int i = 0; i < folders.length; i++) {
	    Rio500.FolderEntry	f = folders [i];

	    indentLine (indent, "Folder # "
		    + i
		    + ", offset = 0x"
		    + Integer.toHexString (f.getOffset ())
		    + ", name1 = "
		    + f.getName1 ()
		    // + ", name2 = "
		    // + f.getName2 ()
		    + ", entries = "
		    + f.getSongCount ()
		    );
	    indent += 2;
	    try {
		Rio500.SongEntry	songs [] = f.getSongs ();

		for (int j = 0; j < songs.length; j++) {
		    Rio500.SongEntry	s = songs [j];
		    indentLine (indent, "Song # "
			+ j
			+ ", offset = 0x"
			+ Integer.toHexString (s.getOffset ())
			+ ", kbytes = "
			+ (s.getLength () / 1024)
			);
		    indentLine (indent + 4, "name1 = "
			+ s.getName1 ()
			// + ", name2 = "
			// + s.getName2 ()
			);
		}
	    } catch (Exception e) {
		e.printStackTrace ();
	    }
	    indent -= 2;
	}
    }


    private static void printDiamondDetails (int indent, DeviceDescriptor info)
    {
	Device	dev = info.getDevice ();

	if (info.getProductId () != 0x0001) {
	    indentLine (indent, "That's not a Rio 500 ...");
	    return;
	}
	Rio500			rio = null;

	try {
	    indentLine (indent, "Rio 500 Status: ");
	    indent += 2;

	    rio = new Rio500 (dev);
	    rio.start ();

	    // basic memory statistics
	    showStorage (indent, rio, false);
	    if (rio.hasExternalMemory ())
		showStorage (indent, rio, true);

	} catch (Exception e) {
	    e.printStackTrace (System.out);
	    return;
	} finally {
	    if (rio != null)
		rio.finish ();
	}
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -