checkpoint
[slipway.git] / src / com / ftdi / usb / FtdiUart.java
1 package com.ftdi.usb;
2 import java.io.*;
3
4 public class FtdiUart {
5
6     protected int bits = 0;
7     protected SWIGTYPE_p_ftdi_context context = example.new_ftdi_context();
8
9     public OutputStream getOutputStream() { return out; }
10     public InputStream  getInputStream() { return in; }
11
12     public FtdiUart(int vendor, int product) {
13         example.ftdi_init(context);
14         example.ftdi_usb_open(context, vendor, product);
15         example.ftdi_usb_reset(context);
16         example.ftdi_set_baudrate(context, 1500 * 1000);
17         example.ftdi_set_line_property(context, 8, 0, 0);
18         purge();
19     }
20
21     public synchronized int readPins() {
22         flush();
23         byte[] b = new byte[1];
24         example.ftdi_read_pins(context, b);
25         return b[0];
26     }
27
28     public void flush() {
29         try {
30             getOutputStream().flush();
31         } catch (Exception e) { throw new RuntimeException(e); }
32     }
33
34     protected static int mask =
35         (1<<0) |
36         (1<<1)// |
37         //(1<<2) |
38         //(1<<3)
39         ;
40
41     public synchronized void purge() {
42         example.ftdi_usb_purge_buffers(context);
43     }
44     public synchronized void uart() { uart(mask, bits); }
45     public synchronized void uart(int mask, int bits) {
46         example.ftdi_set_bitmode(context, (short)((mask << 4) | bits), (short)0x20);
47         //example.ftdi_setflowctrl(context, (1 << 8));
48     }
49     public synchronized void dbangmode(int dmask) {
50         example.ftdi_set_bitmode(context, (short)dmask, (short)0x01);
51     }
52
53     protected int dbits = 0;
54
55     protected synchronized void dbang(int bit, boolean val) {
56         dbits = val ? (dbits | (1 << bit)) : (dbits & (~(1 << bit)));
57         try {
58             out.write((byte)dbits);
59         } catch (IOException e) { throw new RuntimeException(e); }
60     }
61
62  
63     private final InputStream in = new InputStream() {
64             public int available() throws IOException {
65                 // FIXME
66                 return 0;
67             }
68             public int read() throws IOException {
69                 byte[] b = new byte[1];
70                 int result = 0;
71                 while(result==0) result = read(b, 0, 1);
72                 return b[0] & 0xff;
73             }
74             public int read(byte[] b, int off, int len) throws IOException {
75                 // FIXME: blocking reads?
76                 int result = 0;
77                 while(true) {
78                     if (len==0) return 0;
79                     byte[] b0 = new byte[len];
80                     synchronized(FtdiUart.this) {
81                         result = example.ftdi_read_data(context, b0, len);
82                     }
83                     if (result>0) {
84                         System.arraycopy(b0, 0, b, off, result);
85                         return result;
86                     }
87                     try { Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } 
88                 }
89             }
90         };
91
92     private final OutputStream out = new BufferedOutputStream(new OutputStream() {
93             public void write(int b) throws IOException {
94                 byte[] d = new byte[1];
95                 d[0] = (byte)b;
96                 write(d, 0, 1);
97             }
98             public void write(byte[] b, int off, int len) throws IOException {
99                 byte[] b2 = new byte[64];
100                 while(len > 0) {
101                     System.arraycopy(b, off, b2, 0, Math.min(b2.length, len));
102                     int result;
103                     synchronized(FtdiUart.this) {
104                         result = example.ftdi_write_data(context, b2, Math.min(b2.length, len));
105                     }
106                     off += result;
107                     len -= result;
108                 }
109             }
110         });
111 }