checkpoint
[slipway.git] / src / edu / berkeley / obits / device / atmel / FtdiChip.java
1 package edu.berkeley.obits.device.atmel;
2 import com.ftdi.usb.*;
3 import java.io.*;
4
5 public class FtdiChip {
6
7     protected int bits = 0;
8     protected SWIGTYPE_p_ftdi_context context = example.new_ftdi_context();
9
10     public FtdiChip() {
11         example.ftdi_init(context);
12         example.ftdi_usb_open(context, 0x6666, 0x3133);
13         example.ftdi_set_baudrate(context, 750 * 1000);
14         example.ftdi_set_line_property(context, 8, 0, 0);
15     }
16
17     public synchronized int readPins() {
18         byte[] b = new byte[1];
19         example.ftdi_read_pins(context, b);
20         return b[0];
21     }
22     ByteArrayOutputStream baos = new ByteArrayOutputStream();
23     public void flush() {
24         byte[] bytes = baos.toByteArray();
25         baos = new ByteArrayOutputStream();
26         dbang(bytes, bytes.length);
27     }
28
29     public boolean buffered = false;
30     protected static int mask =
31         (1<<0) |
32         (1<<1)// |
33         //(1<<2) |
34         //(1<<3)
35         ;
36
37     protected static int dmask =
38         //(1<<0) |
39         (1<<1) |
40         (1<<2) |
41         //(1<<3) |
42         //(1<<4) |
43         (1<<5) |
44         (1<<6) |
45         (1<<7);
46
47     public synchronized void purge() {
48         example.ftdi_usb_purge_buffers(context);
49         example.ftdi_setflowctrl(context, (1 << 8));
50     }
51     public synchronized void uart() {
52         example.ftdi_set_bitmode(context, (short)0, (short)0x00);
53         example.ftdi_setflowctrl(context, (1 << 8));
54     }
55     public synchronized void dbangmode() {
56         example.ftdi_set_bitmode(context, (short)dmask, (short)0x01);
57     }
58
59     protected synchronized void cbangmode() {
60         example.ftdi_set_bitmode(context, (short)((mask << 4) | bits), (short)0x20);
61         example.ftdi_setflowctrl(context, (1 << 8));
62     }
63
64     protected int dbits = 0;
65     protected synchronized void dbang(int bit, boolean val) {
66         dbits = val ? (dbits | (1 << bit)) : (dbits & (~(1 << bit)));
67         if (buffered) {
68             baos.write((byte)dbits);
69         } else {
70             dbang((byte)dbits);
71         }
72     }
73
74     protected synchronized void dbang(byte by) {
75         byte[] b = new byte[1];
76         b[0] = by;
77         example.ftdi_write_data(context, b, 1);
78     }
79     protected synchronized void dbang(byte[] b, int len) {
80         example.ftdi_write_data(context, b, len);
81     }
82
83     private OutputStream os = new ChipOutputStream();
84     private InputStream  is = new ChipInputStream();
85     public OutputStream getOutputStream() { return os; }
86     public InputStream  getInputStream() { return is; }
87     
88     public class ChipInputStream extends InputStream {
89         public int available() throws IOException {
90             // FIXME
91             return 0;
92         }
93         public long skip(long l) throws IOException {
94             throw new RuntimeException("not supported");
95         }
96         public int read() throws IOException {
97             System.out.println("read()");
98             byte[] b = new byte[1];
99             int result = 0;
100             while(result==0)
101                 result = read(b, 0, 1);
102             return b[0] & 0xff;
103         }
104         public int read(byte[] b, int off, int len) throws IOException {
105             // FIXME: blocking reads?
106             int result = 0;
107             while(true) {
108                 if (len==0) return 0;
109                     byte[] b0 = new byte[len];
110                     synchronized(FtdiChip.this) {
111                         result = example.ftdi_read_data(context, b0, len);
112                     }
113                     if (result>0) {
114                         System.arraycopy(b0, 0, b, off, result);
115                         return result;
116                     }
117                 try { Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } 
118             }
119         }
120     }
121
122     public class ChipOutputStream extends OutputStream {
123         public void write(int b) throws IOException {
124             byte[] d = new byte[1];
125             d[0] = (byte)b;
126             write(d, 0, 1);
127         }
128         public void write(byte[] b, int off, int len) throws IOException {
129             byte[] b2 = new byte[64];
130             while(len > 0) {
131                 System.arraycopy(b, off, b2, 0, Math.min(b2.length, len));
132                 synchronized(FtdiChip.this) {
133                     int result = example.ftdi_write_data(context, b2, Math.min(b2.length, len));
134                     off += result;
135                     len -= result;
136                 }
137             }
138         }
139     }
140 }