OSDN Git Service

ae8a744ce9932e8df1cfb0f141dbdb7d1f301108
[nxt-jsp/lejos_nxj.git] / nxtOSEK / lejos_nxj / src / java / pccomms / lejos / pc / comm / NXTCommBluez.java
1 package lejos.pc.comm;
2
3 import java.io.*;
4
5 public class NXTCommBluez implements NXTComm {
6
7         private static final String BDADDR_ANY = "00:00:00:00:00:00";
8
9         private int sk = -1;
10
11         static {
12                 System.loadLibrary("jbluez");
13         }
14         
15         public NXTInfo[] search(String name, int protocol) {
16                 String[] btString = null;
17                 
18                 try {
19                         btString = search(name);
20                 } catch (BlueZException e) {
21                         System.err.println(e.getMessage());     
22                 }
23                 if (btString == null) return new NXTInfo[0];
24                 else {
25                         NXTInfo[] nxts = new NXTInfo[btString.length];
26                         for(int i=0;i<btString.length;i++) {
27                                 NXTInfo nxtInfo = new NXTInfo();
28                                 if (btString[i] == null) {
29                                         System.err.println("Null btString");
30                                         return new NXTInfo[0];
31                                 }
32                                 int sep = btString[i].indexOf("::");
33                                 //System.out.println("Setting address to " + btAddress);
34                                 nxtInfo.btDeviceAddress =  btString[i].substring(sep+2);
35                                 nxtInfo.name = btString[i].substring(0, sep);
36                                 nxtInfo.protocol = NXTCommFactory.BLUETOOTH;
37                                 nxtInfo.btResourceString = btString[i];
38                                 
39                                 nxts[i] = nxtInfo;                      
40                         }
41                         return nxts;
42                 }
43         }
44
45         public void close() throws IOException{
46                 try {
47                         rcSocketShutdown(sk);
48                 } catch (IOException ioe) {
49                         System.err.println("Shutdown failed");
50                 }
51                 if (sk != -1) rcSocketClose(sk);
52                 sk = -1;
53         }
54
55         public boolean open(NXTInfo nxt) {
56                 try {
57                         open(BDADDR_ANY, nxt.btDeviceAddress, 1);
58                         return true;
59                 } catch (BlueZException e) {
60                         System.err.println("Error from open: " + e.getMessage());
61                         return false;
62                 }
63                 
64         }
65
66         public byte [] sendRequest(byte[] request, int replyLen) throws IOException {
67                 
68                 // add lsb & msb
69                 byte[] lsb_msb = new byte[2];
70                 lsb_msb[0] = (byte) request.length;
71                 lsb_msb[1] = (byte) 0x00;
72                 request = concat(lsb_msb, request);
73         
74             rcSocketSend(sk, request);
75                 
76                 if (replyLen == 0) return new byte[0];
77                 
78                 byte[] data = null;
79             data = rcSocketRecv(sk);
80         
81                 // remove lsb & msb
82                 data = subArray(data, 2, data.length);
83
84                 return data;
85         }
86
87         private void open(String l_bdaddr, String r_bdaddr, int channel) throws BlueZException {
88                 boolean ok = false;
89
90                 try {
91                         //System.out.println("Creating socket");
92                         sk = rcSocketCreate();
93                         //System.out.println("Binding");
94                         rcSocketBind(sk, l_bdaddr);
95                         //System.out.println("Connecting");
96                         rcSocketConnect(sk, r_bdaddr, channel);
97
98                         ok = true;
99                 } finally {
100                         if (!ok) {
101                                 if (sk != -1) {
102                                         try {
103                                                 rcSocketClose(sk);
104                                         } catch (IOException ioe) {}
105                                         sk = -1;
106                                 }
107                         }
108                 }
109         }
110         
111         private byte[] concat(byte[] data1, byte[] data2) {
112                 int l1 = data1.length;
113                 int l2 = data2.length;
114                 
115                 byte[] data = new byte[l1 + l2];
116                 System.arraycopy(data1, 0, data, 0, l1);
117                 System.arraycopy(data2, 0, data, l1, l2);
118                 
119                 return data;
120         }
121                 
122         
123         private byte[] subArray(byte[] data, int start, int end) {      
124
125                 byte[] result = new byte[end - start];
126                 System.arraycopy(data, start, result, 0, end - start);
127
128                 return result;
129         }
130         
131         public byte [] read () throws IOException {
132                 // Currently all packets are 1-byte
133                 byte [] packet = rcSocketRecv(sk);
134                 byte [] data = new byte [packet.length/3];
135                 for(int i=0;i<packet.length/3;i++) data[i] = packet[i*3+2];
136                 return data;
137         }
138         
139         public void write(byte[] data) throws IOException {
140                 rcSocketSend(sk, data);
141         }
142         
143         public OutputStream getOutputStream() {
144                 return new NXTCommBTOutputStream(this);         
145         }
146         
147         public InputStream getInputStream() {
148                 return new NXTCommBTInputStream(this);          
149         }
150         
151         native private String[] search(String name) throws BlueZException;
152         
153         native private int rcSocketCreate() throws BlueZException;
154
155         native private void rcSocketBind(int sk, String bdaddr) throws BlueZException;
156
157         native private void rcSocketConnect(int sk, String bdaddr, int channel) throws BlueZException;
158
159         native public void rcSocketSend(int sk, byte[] data) throws IOException;
160
161         native public byte[] rcSocketRecv(int sk) throws IOException;
162
163         native private void rcSocketShutdown(int sk) throws IOException;
164
165         native private void rcSocketClose(int sk) throws IOException;
166
167 }