/** * GUI application for remote control of a NXT running RCNavigator<br> * Distance in meters <br> * uses RCNavComms class for bluetooth communications * used Command enum in this project * @author Roger Glassey */ public class RCNavigationControl extends javax.swing.JFrame { private static final long serialVersionUID = 1L; /** Creates new form RCNavigationControl */ public RCNavigationControl() { initComponents(); } /** * calls constructor for this class */ public static void main(String args[]) { new RCNavigationControl().setVisible(true); } /** 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() { connectButton = new javax.swing.JButton(); nameText = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); robotPanel = new javax.swing.JPanel(); jLabel7 = new javax.swing.JLabel(); robotX = new javax.swing.JTextField(); jLabel8 = new javax.swing.JLabel(); robotY = new javax.swing.JTextField(); jLabel9 = new javax.swing.JLabel(); robotHeading = new javax.swing.JTextField(); commandPanel = new javax.swing.JPanel(); rotateButton = new javax.swing.JButton(); jLabel5 = new javax.swing.JLabel(); angleField = new javax.swing.JTextField(); travelButton = new javax.swing.JButton(); jLabel4 = new javax.swing.JLabel(); distanceField = new javax.swing.JTextField(); goButton = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); XField = new javax.swing.JTextField(); YField = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); addressText = new javax.swing.JTextField(); jLabel10 = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel(); statusField = new javax.swing.JTextField(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("RC Navigator Control"); connectButton.setText("Connect"); connectButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { connectButtonMouseClicked(evt); } }); jLabel1.setText("Name"); robotPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Robot Position and Heading")); jLabel7.setText("X "); robotX.setText(" "); jLabel8.setText("Y"); jLabel9.setText("Heading"); javax.swing.GroupLayout robotPanelLayout = new javax.swing.GroupLayout(robotPanel); robotPanel.setLayout(robotPanelLayout); robotPanelLayout.setHorizontalGroup( robotPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(robotPanelLayout.createSequentialGroup() .addGap(20, 20, 20) .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(robotX, javax.swing.GroupLayout.PREFERRED_SIZE, 86, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) .addComponent(jLabel8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(robotY, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel9) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(robotHeading, javax.swing.GroupLayout.PREFERRED_SIZE, 81, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(109, 109, 109)) ); robotPanelLayout.setVerticalGroup( robotPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(robotPanelLayout.createSequentialGroup() .addGroup(robotPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(robotPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(robotX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel7)) .addGroup(robotPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel8) .addComponent(robotY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel9) .addComponent(robotHeading, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(20, Short.MAX_VALUE)) ); commandPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Commands")); rotateButton.setText("Rotate"); rotateButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { rotateButtonMouseClicked(evt); } }); jLabel5.setText("Angle"); travelButton.setText("Travel"); travelButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { travelButtonMouseClicked(evt); } }); jLabel4.setText("Distance "); goButton.setText("GoTo XY"); goButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { goButtonMouseClicked(evt); } }); jLabel2.setText("X"); jLabel3.setText("Y"); javax.swing.GroupLayout commandPanelLayout = new javax.swing.GroupLayout(commandPanel); commandPanel.setLayout(commandPanelLayout); commandPanelLayout.setHorizontalGroup( commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(commandPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(travelButton, javax.swing.GroupLayout.DEFAULT_SIZE, 75, Short.MAX_VALUE) .addComponent(goButton) .addComponent(rotateButton, javax.swing.GroupLayout.DEFAULT_SIZE, 75, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jLabel2) .addComponent(jLabel4) .addComponent(jLabel5)) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(commandPanelLayout.createSequentialGroup() .addGap(9, 9, 9) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(XField, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE) .addComponent(distanceField, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE))) .addGroup(commandPanelLayout.createSequentialGroup() .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(angleField, javax.swing.GroupLayout.DEFAULT_SIZE, 78, Short.MAX_VALUE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(12, 12, 12) .addComponent(YField, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(140, 140, 140)) ); commandPanelLayout.setVerticalGroup( commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, commandPanelLayout.createSequentialGroup() .addContainerGap() .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(goButton) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(XField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel3) .addComponent(YField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(travelButton) .addComponent(jLabel4) .addComponent(distanceField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(7, 7, 7) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(commandPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(rotateButton) .addComponent(jLabel5)) .addComponent(angleField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); jLabel10.setText("Address"); jLabel11.setText("Status:"); statusField.setText("waiting to connect"); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(commandPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(40, 40, 40) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addGroup(layout.createSequentialGroup() .addComponent(jLabel11) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(statusField)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(nameText, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel10) .addGap(27, 27, 27) .addComponent(addressText, javax.swing.GroupLayout.PREFERRED_SIZE, 92, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(connectButton, javax.swing.GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE) .addGap(23, 23, 23))) .addContainerGap()) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(robotPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGap(14, 14, 14)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(connectButton) .addComponent(nameText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(addressText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel10)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGap(83, 83, 83) .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 129, Short.MAX_VALUE)) .addGroup(layout.createSequentialGroup() .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel11) .addComponent(statusField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(32, 32, 32) .addComponent(commandPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18))) .addComponent(robotPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void connectButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_connectButtonMouseClicked String name = nameText.getText(); String address = addressText.getText(); statusField.setText("Connecting to "+ name); if (!communicator.connect(name,address)) { statusField.setText("Connection Failed"); connected = false; } else { statusField.setText("Connected to " + name ); connected = true; } }//GEN-LAST:event_connectButtonMouseClicked private void goButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_goButtonMouseClicked if (!connected) return; statusField.setText("GoTo " +XField.getText()+" "+YField.getText()); float x; float y; try { x = Float.parseFloat(XField.getText()); y = Float.parseFloat(YField.getText()); System.out.println("Sent "+Command.GOTO+" x "+x+" y "+y); communicator.send(Command.GOTO,x,y); statusField.setText("waiting for data"); } catch (NumberFormatException e) { statusField.setText("Invalid x, y values"); } }//GEN-LAST:event_goButtonMouseClicked private void travelButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_travelButtonMouseClicked if (!connected) return; statusField.setText("Travel "+distanceField.getText()); float distance; try { distance = Float.parseFloat(distanceField.getText()); System.out.println("Sent "+Command.TRAVEL+" "+distance); communicator.send(Command.TRAVEL,distance); statusField.setText("waiting for data"); } catch (NumberFormatException e) { statusField.setText("Invalid distance value"); } }//GEN-LAST:event_travelButtonMouseClicked private void rotateButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rotateButtonMouseClicked if (!connected) return; statusField.setText("Rotate "+angleField.getText()); float angle; try { angle = Float.parseFloat(angleField.getText()); System.out.println("Sent "+Command.ROTATE+" "+angle); communicator.send(Command.ROTATE,angle); statusField.setText("waiting for data"); } catch (NumberFormatException e) { statusField.setText("Invalid angle value"); } }//GEN-LAST:event_rotateButtonMouseClicked public void showtRobotPosition(float x, float y, float heading) { robotX.setText(""+x); robotY.setText(""+y); robotHeading.setText(""+heading); statusField.setText("waiting for command"); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField XField; private javax.swing.JTextField YField; private javax.swing.JTextField addressText; private javax.swing.JTextField angleField; private javax.swing.JPanel commandPanel; private javax.swing.JButton connectButton; private javax.swing.JTextField distanceField; private javax.swing.JButton goButton; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel9; private javax.swing.JTextField nameText; private javax.swing.JTextField robotHeading; private javax.swing.JPanel robotPanel; private javax.swing.JTextField robotX; private javax.swing.JTextField robotY; private javax.swing.JButton rotateButton; private javax.swing.JTextField statusField; private javax.swing.JButton travelButton; // End of variables declaration//GEN-END:variables private boolean connected = false; private RCNavComms communicator = new RCNavComms(this); }