* Note: blocking reads are currently implemented by busy-waiting.
* This is really ugly. Check the linux kernel source to see how to
* get libftdi to do it properly.
- *
- * Flow control is also not properly supported.
*/
public class FtdiUart {
- private SWIGTYPE_p_ftdi_context context = example.new_ftdi_context();
+ static {
+ try {
+ File f = new File("build/"+System.mapLibraryName("FtdiUartNative"));
+ if (f.exists()) System.load(f.getAbsolutePath());
+ else System.loadLibrary("FtdiUartNative");
+ } catch (Exception e) {
+ throw new RuntimeException();
+ }
+ }
- public OutputStream getOutputStream() { return out; }
- public InputStream getInputStream() { return in; }
+ private SWIGTYPE_p_ftdi_context context = FtdiUartNative.new_ftdi_context();
- public FtdiUart(int vendor, int product, int baud) throws IOException {
- example.ftdi_init(context);
- example.ftdi_usb_open(context, vendor, product);
- example.ftdi_usb_reset(context);
- example.ftdi_set_baudrate(context, baud);
- example.ftdi_set_line_property(context, 8, 0, 0);
+ public FtdiUart(int vendorId, int productId, int baud) throws IOException {
+ FtdiUartNative.ftdi_init(context);
+ FtdiUartNative.ftdi_usb_open(context, vendorId, productId);
+ FtdiUartNative.ftdi_usb_reset(context);
+ FtdiUartNative.ftdi_set_baudrate(context, baud);
+ FtdiUartNative.ftdi_set_line_property(context, 8, 0, 0);
+ FtdiUartNative.ftdi_setflowctrl(context, (1<<8));
purge();
}
+ /** the output stream to the uart or dbus pins (depending on mode) */
+ public OutputStream getOutputStream() { return out; }
+
+ /** the input stream from the uart or dbus pins (depending on mode) */
+ public InputStream getInputStream() { return in; }
+
/**
* Switch to uart mode, with read/write access to four CBUS lines.
* This function is used to write to the CBUS lines (re-invoke it to change their state).
* @param cbus_bits a four-bit mask; the bits to assert on the write-enabled CBUS lines
*/
public synchronized void uart_and_cbus_mode(int cbus_mask, int cbus_bits) throws IOException {
- example.ftdi_set_bitmode(context, (short)((cbus_mask << 4) | cbus_bits), (short)0x20);
+ FtdiUartNative.ftdi_set_bitmode(context, (short)((cbus_mask << 4) | cbus_bits), (short)0x20);
+ FtdiUartNative.ftdi_setflowctrl(context, (1<<8));
}
/**
* @param dbus_mask an eight-bit mask; set bit=1 to write to a DBUS line, bit=0 to read from it
*/
public synchronized void dbus_mode(int dbus_mask) throws IOException {
- example.ftdi_set_bitmode(context, (short)dbus_mask, (short)0x01);
+ FtdiUartNative.ftdi_set_bitmode(context, (short)dbus_mask, (short)0x01);
+ }
+
+ public synchronized void setBitRate(int bitRate) throws IOException {
+ FtdiUartNative.ftdi_set_baudrate(context, bitRate);
}
/** returns the instantaneous value present on the DBUS pins */
public synchronized int readPins() throws IOException {
getOutputStream().flush();
byte[] b = new byte[1];
- example.ftdi_read_pins(context, b);
+ FtdiUartNative.ftdi_read_pins(context, b);
return b[0];
}
/** purge the on-chip buffers */
public synchronized void purge() throws IOException {
- example.ftdi_usb_purge_buffers(context);
+ FtdiUartNative.ftdi_usb_purge_buffers(context);
}
private final InputStream in = new InputStream() {
if (len==0) return 0;
byte[] b0 = new byte[len];
synchronized(FtdiUart.this) {
- result = example.ftdi_read_data(context, b0, len);
+ result = FtdiUartNative.ftdi_read_data(context, b0, len);
}
if (result>0) {
System.arraycopy(b0, 0, b, off, result);
System.arraycopy(b, off, b2, 0, Math.min(b2.length, len));
int result;
synchronized(FtdiUart.this) {
- result = example.ftdi_write_data(context, b2, Math.min(b2.length, len));
+ result = FtdiUartNative.ftdi_write_data(context, b2, Math.min(b2.length, len));
}
off += result;
len -= result;