/**
* Created : Apr 13, 2012
*
* @author pquiring
*/
import java.awt.*;
import javax.swing.table.*;
import javaforce.*;
public class BlueToothDialog extends javax.swing.JFrame {
/**
* Creates new form BlueToothDialog
*/
public BlueToothDialog() {
super();
initComponents();
model = (DefaultTableModel)table.getModel();
devices.setVisible(false);
setPosition();
setAlwaysOnTop(true);
toFront();
setStatus("Status : Finding controllers...");
Dock.jbusClient.call("org.jflinux.jnetworkmgr", "getBTdevices", quote(Dock.jbusClient.pack));
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jToolBar1 = new javax.swing.JToolBar();
scan = new javax.swing.JButton();
connect = new javax.swing.JButton();
devices = new javax.swing.JComboBox();
status = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Bluetooth Setup");
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
jToolBar1.setFloatable(false);
jToolBar1.setRollover(true);
scan.setText("Scan");
scan.setEnabled(false);
scan.setFocusable(false);
scan.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
scan.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
scan.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
scanActionPerformed(evt);
}
});
jToolBar1.add(scan);
connect.setText("Connect");
connect.setEnabled(false);
connect.setFocusable(false);
connect.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
connect.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
connect.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
connectActionPerformed(evt);
}
});
jToolBar1.add(connect);
devices.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
devicesItemStateChanged(evt);
}
});
jToolBar1.add(devices);
status.setText("Status : Ready");
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Name", "MAC"
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false
};
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane2.setViewportView(table);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addComponent(status, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(status)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 265, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void scanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scanActionPerformed
scan();
}//GEN-LAST:event_scanActionPerformed
private void connectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectActionPerformed
connect();
}//GEN-LAST:event_connectActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
Dock.btDialog = null;
}//GEN-LAST:event_formWindowClosing
private void devicesItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_devicesItemStateChanged
clear();
}//GEN-LAST:event_devicesItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton connect;
private javax.swing.JComboBox devices;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JToolBar jToolBar1;
private javax.swing.JButton scan;
private javax.swing.JLabel status;
private javax.swing.JTable table;
// End of variables declaration//GEN-END:variables
private DefaultTableModel model;
private boolean enabling, scanning, connecting;
private String deviceList[];
private int deviceIdx = -1;
private void setPosition() {
Rectangle s = JF.getMaximumBounds();
Dimension d = getPreferredSize();
setSize(d.width, d.height);
setLocation(s.width/2 - d.width/2, s.height/2 - (d.height/2));
}
private void scan() {
if (enabling || scanning || connecting) return;
deviceIdx = devices.getSelectedIndex();
devices.setEnabled(false);
scanning = true;
if (!isBTEnabled()) {
enabling = true;
Dock.jbusClient.call("org.jflinux.jnetworkmgr", "enableBTdevice",
quote(Dock.jbusClient.pack) + "," + quote(deviceList[deviceIdx*2]));
setStatus("Status : Enabling controller...");
return;
}
setStatus("Scanning...");
clear();
new Thread() {
public void run() {
ShellProcess sp = new ShellProcess();
final String output = sp.run(new String[] {"hcitool", "scan"}, false);
EventQueue.invokeLater(new Runnable() {
public void run() {
String lns[] = output.split("\n");
for(int a=1;a<lns.length;a++) {
if (!lns[a].startsWith("\t")) continue;
String f[] = lns[a].substring(1).split("\t");
//0=mac 1=desc
model.addRow(new Object[] {f[1], f[0]});
}
setStatus("Status : Ready");
scanning = false;
if (model.getRowCount() > 0) {
connect.setEnabled(true);
}
}
});
}
}.start();
}
String desc, mac;
private String quote(String str) {
return '\"' + str + '\"';
}
private void connect() {
if (enabling || scanning || connecting) return;
deviceIdx = devices.getSelectedIndex();
if (!isBTEnabled()) return;
devices.setEnabled(false);
int row = table.getSelectedRow();
if (row == -1) return;
connecting = true;
mac = (String)table.getValueAt(row, 1);
desc = (String)table.getValueAt(row, 0);
Dock.jbusClient.call("org.jflinux.jnetworkmgr", "connectBT",
quote(Dock.jbusClient.pack) + "," + quote(deviceList[deviceIdx*2]) + "," + quote(mac));
setStatus("Connecting to " + desc);
}
public void success() {
if (connecting) {
setStatus("Connection successful");
Dock.BlueToothDevice dev = new Dock.BlueToothDevice();
dev.desc = desc;
dev.mac = mac;
Dock.btDevices.add(dev);
connecting = false;
} else if (enabling) {
setStatus("Status : Ready");
deviceList[deviceIdx*2+1] = "UP";
enabling = false;
devices.setEnabled(true);
if (scanning) {
scanning = false;
scan();
}
}
}
public void failed() {
if (connecting) {
setStatus("Connection failed");
connecting = false;
} else if (enabling) {
setStatus("Status : Controller failed to start");
enabling = false;
if (scanning) scanning = false;
}
}
public void setStatus(String msg) {
status.setText(msg);
}
private boolean isBTEnabled() {
return (deviceList[deviceIdx * 2 + 1].equals("UP"));
}
public void devices(String list) {
if (list.length() == 0) {
//this should NOT happen
JF.showError("Error", "No BlueTooth controllers found");
dispose();
return;
}
//list = dev | UP or DOWN | ...
deviceList = list.split("[|]");
devices.removeAllItems();
if (deviceList.length > 2) {
for(int a=0;a<deviceList.length;a += 2) {
devices.addItem(deviceList[a]);
}
deviceIdx = 0;
setStatus("Status : Ready");
} else {
devices.addItem(deviceList[0]);
devices.setVisible(false);
deviceIdx = 0;
if (!isBTEnabled()) {
enabling = true;
setStatus("Enabling controller");
Dock.jbusClient.call("org.jflinux.jnetworkmgr", "enableBTdevice",
quote(Dock.jbusClient.pack) + "," + quote(deviceList[0]));
} else {
setStatus("Status : Ready");
}
}
scan.setEnabled(true);
}
private void clear() {
while (model.getRowCount() > 0) model.removeRow(0);
}
}