/** Wraps access to the specified camera. */ public Kodak(Device dev) throws IOException { try { // can we use usbdevfs? socket = new USBSocket(dev); in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { if ("Linux".equals(System.getProperty("os.name"))) { // assume this is the LOCAL implementation // semantics are like a half duplex packet stream socket // assume just one camera (kernel handles up to 16) // single open, per the driver's exclusion policy random = new RandomAccessFile("/dev/usb/dc2xx0", "rw"); in = new InputHack(random); out = new OutputHack(random); } else { throw e; } // NOTE: GCJ 2.96 bug on this path ... putting this // call here evidently prevented the constructor from // returning a null object. Strange. System.err.print(""); } getCameraStatus(); getCameraType(); // ensures it's a supported camera type }
/** * Updates the local copy of the camera status table, and returns a copy of it. The format of this * data is in section 3.1 of the DC-280 specification; that is a superset of previous models * including the dc240. Note that this table snapshots the camera's notion of the current time. */ public byte[] getCameraStatus() throws IOException { // this is how NOT to do it! // no error handling, no framework for other calls. byte temp[] = new byte[8]; byte response[] = new byte[258]; int len; temp[0] = 0x7F; // send camera status table temp[7] = 0x1A; // write command, receive ack out.write(temp, 0, temp.length); len = in.read(temp, 0, 1); if (len != 1 || temp[0] != KODAK_ACK) throw new IOException("needed ACK"); // get, check, and ack response (ignoring packet checksum!) len = in.read(response); if (len != 258 || temp[0] != KODAK_ACK) throw new IOException("needed status packet"); response[0] = KODAK_CORRECT; out.write(response, 0, 1); // copy and save the table temp = new byte[256]; System.arraycopy(response, 1, temp, 0, 256); statusTable = temp; // also copy a return value temp = new byte[256]; System.arraycopy(response, 1, temp, 0, 256); // get and check ACK len = in.read(temp, 0, 1); if (len != 1 || temp[0] != KODAK_COMPLETED) throw new IOException("needed ACK2"); return temp; }
public static void main(String argv[]) { Bus busses[] = null; Host host; try { // FIXME: option flag for rmi (iiop?) host:port spec. host = HostFactory.getHost(); if (host == null) { System.err.println("USB is unavailable, can't run."); return; } System.out.println("<!-- " + host + " -->"); busses = host.getBusses(); indentLine(0, "<host busses='" + busses.length + "'>"); for (int busno = 0; busno < busses.length; busno++) { indentLine(2, "<!-- Bus #" + (busno + 1) + " -->"); // show tree from root hub if (busses[busno] != null) { try { printDevice(2, busses[busno].getRootHub()); } catch (IOException e) { e.printStackTrace(); } } } indentLine(0, "</host>"); } catch (SecurityException e) { System.err.println("USB permissions problem:"); System.err.println(e.getMessage()); System.exit(1); } catch (Exception e) { e.printStackTrace(); } }