package metrobotics; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollBar; import javax.swing.JTextField; import javax.swing.SwingConstants; /** * @author Pablo Mu�oz - Metrobotics * This class displays the arrows and textfields to send movement commands to the server, * Player or directly to the robots. * TODO: I disabled sending commands to Player and directly to the Robot. This needs to be * enabled and test it * Pablo. * */ public class PlayerJoy extends JPanel{ JLabel robotInUse; ArrayList<Robot> robots; JButton forward, atras, rotateLeft, rotateRight, goBut, gotoGoBut, stopBut; Grid grid; JLabel currentPower; JScrollBar powerBar; JTextField linVelUs, angVelUs, durUs; public final int FORWARD = 1; public final int BACK = 2; public final int LEFT = 3; public final int RIGHT = 4; public final int STOP = 5; public final int ADVANCED = 6; PlayerJoy(JLabel robotInUse, ArrayList<Robot> robots, Grid grid){ super(); this.robotInUse = robotInUse; this.robots = robots; this.grid = grid; setBackground(Color.gray); //Toolkit tk = Toolkit.getDefaultToolkit(); int Width = 400;//(int)(tk.getScreenSize().getWidth() * 0.15);//0.33); int Height = 350;//(int)(tk.getScreenSize().getHeight() * 0.15);//0.33); Dimension d = new Dimension(Width, Height); setPreferredSize(d); setBorder(BorderFactory.createRaisedBevelBorder()); setLayout(new FlowLayout()); JPanel basic2DPanel = new JPanel(); Dimension basicD = new Dimension(161, 155); basic2DPanel.setPreferredSize(basicD); basic2DPanel.setLayout(new BorderLayout()); ImageIcon fwd = GuiUtils.resizeJP(new ImageIcon ("resources/arrowFwd.jpg").getImage(), Width/8, Height/8); forward = new JButton(fwd); forward.setPreferredSize(new Dimension(Width/8, Height/8)); JPanel fwdPanel = new JPanel(); fwdPanel.add(forward); basic2DPanel.add(fwdPanel, BorderLayout.NORTH); ImageIcon bk = GuiUtils.resizeJP(new ImageIcon("resources/arrowBck.jpg").getImage(), Width/8, Height/8); atras = new JButton(bk); //atras.addMouseListener(new BackButt(robots, grid)); atras.setPreferredSize(new Dimension(Width/8, Height/8)); JPanel atrPanel = new JPanel(); atrPanel.add(atras); basic2DPanel.add(atrPanel, BorderLayout.SOUTH); ImageIcon lft = GuiUtils.resizeJP(new ImageIcon("resources/arrowRotLt.jpg").getImage(), Width/8, Height/8); rotateLeft = new JButton(lft); //rotateLeft.addMouseListener(new LeftButt(robots, grid)); rotateLeft.setPreferredSize(new Dimension(Width/8, Height/8)); JPanel lftPanel = new JPanel(); lftPanel.add(rotateLeft); basic2DPanel.add(lftPanel, BorderLayout.WEST); ImageIcon rt = GuiUtils.resizeJP(new ImageIcon("resources/arrowRotRt.jpg").getImage(), Width/8, Height/8); rotateRight = new JButton(rt); //rotateRight.addMouseListener(new RightButt(robots, grid)); rotateRight.setPreferredSize(new Dimension(Width/8, Height/8)); JPanel rtPanel = new JPanel(); rtPanel.add(rotateRight); basic2DPanel.add(rtPanel, BorderLayout.EAST); ImageIcon stopImg = GuiUtils.resizeJP(new ImageIcon("resources/stop.jpeg").getImage(), Width/8, Height/8); stopBut = new JButton(stopImg); //stopBut.addMouseListener(new RightButt(robots, grid)); stopBut.setPreferredSize(new Dimension(Width/8, Height/8)); JPanel stopPanel = new JPanel(); stopPanel.add(stopBut); basic2DPanel.add(stopPanel, BorderLayout.CENTER); add(basic2DPanel); JPanel powerPanel = new JPanel(); Dimension powerPD = new Dimension(50, 110); powerPanel.setPreferredSize(powerPD); powerPanel.setLayout(new FlowLayout()); powerBar = new JScrollBar(JScrollBar.VERTICAL, 1, 1, 1, 6); powerBar.setUnitIncrement(1); powerBar.setBlockIncrement(1); Dimension powerBarD = new Dimension(20, 80); powerBar.setPreferredSize(powerBarD); powerBar.addAdjustmentListener(new AdjustmentListener(){ public void adjustmentValueChanged(AdjustmentEvent ae) { int value = ae.getValue(); String st = Integer.toString(value); currentPower.setText(st); } }); powerPanel.add(powerBar); // Listeners //if(Gui.useCentralServer){ forward.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { sendMove(FORWARD); } }); atras.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sendMove(BACK); } }); rotateLeft.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sendMove(LEFT); } }); rotateRight.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sendMove(RIGHT); } }); stopBut.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sendMove(STOP); } }); //} // else{ // // THis is not in Use. It is meant to be used with the AIBO. // forward.addMouseListener(new ForwardButt(robots, grid)); // // TODO: Add MouseListeners for the rest. // } class PowerSlider extends JPanel{ String s = "Power"; int x=5; int y=25; int v; PowerSlider(){ super(); Dimension powerD = new Dimension(18, 80); setPreferredSize(powerD); //setLayout(new BorderLayout()); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setFont(new Font("SansSerif", Font.BOLD, 15)); v=g.getFontMetrics(getFont()).getHeight()-4; //+1; System.out.println(v); int j =0; int k= s.length(); while(j < k+1) { if (j == k) g.drawString(s.substring(j),x, y+(j*v)); else g.drawString(s.substring(j,j+1),x, y+(j*v)); j++; } } } currentPower = new JLabel("" + powerBar.getValue()); currentPower.setFont(new Font("SansSerif", Font.BOLD, 15)); currentPower.setHorizontalAlignment(SwingConstants.CENTER); PowerSlider powerSlider = new PowerSlider(); powerPanel.add(powerSlider); powerPanel.add(currentPower); add(powerPanel); JPanel adv2DPanel = new JPanel(); adv2DPanel.setPreferredSize(new Dimension(161, 155)); adv2DPanel.setLayout(new BorderLayout()); JLabel advTitle = new JLabel("ADVANCED CONTROL"); advTitle.setFont(new Font("SansSerif", Font.BOLD, 12)); advTitle.setHorizontalAlignment(SwingConstants.CENTER); JPanel advMainPan = new JPanel(); advMainPan.setPreferredSize(new Dimension(161, 100)); advMainPan.setLayout(new FlowLayout()); JLabel linVel = new JLabel("Linear Velocity"); linVel.setHorizontalAlignment(SwingConstants.LEFT); advMainPan.add(linVel); linVelUs = new JTextField(); linVelUs.setPreferredSize(new Dimension(65, 20)); advMainPan.add(linVelUs); JLabel angVel = new JLabel("Angular Velocity"); angVel.setHorizontalAlignment(SwingConstants.LEFT); advMainPan.add(angVel); angVelUs = new JTextField(); angVelUs.setPreferredSize(new Dimension(65, 20)); advMainPan.add(angVelUs); JLabel durL = new JLabel("Duration"); durL.setHorizontalAlignment(SwingConstants.CENTER); durL.setPreferredSize(new Dimension(125, 13)); advMainPan.add(durL); durUs = new JTextField(); durUs.setPreferredSize(new Dimension(40, 20)); advMainPan.add(durUs); ImageIcon go = new ImageIcon("resources/go.jpg"); goBut = new JButton(go); goBut.setPreferredSize(new Dimension(26, 26)); goBut.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { sendMove(6); // TODO: Start Thread for duration } }); advMainPan.add(goBut); adv2DPanel.add(advTitle, BorderLayout.NORTH); adv2DPanel.add(advMainPan); add(adv2DPanel); JPanel advGotoPanel = new JPanel(); advGotoPanel.setPreferredSize(new Dimension(161, 155)); advGotoPanel.setLayout(new BorderLayout()); JLabel advGotoTitle = new JLabel("GOTO"); advGotoTitle.setFont(new Font("SansSerif", Font.BOLD, 12)); advGotoTitle.setHorizontalAlignment(SwingConstants.CENTER); JPanel advMainGotoPan = new JPanel(); advMainGotoPan.setPreferredSize(new Dimension(161, 100)); advMainGotoPan.setLayout(new FlowLayout()); JLabel xL = new JLabel("X Coordinate"); xL.setHorizontalAlignment(SwingConstants.LEFT); advMainGotoPan.add(xL); JTextField xUs = new JTextField(); xUs.setPreferredSize(new Dimension(65, 21)); advMainGotoPan.add(xUs); JLabel yL = new JLabel("Y Coordinate"); yL.setHorizontalAlignment(SwingConstants.LEFT); advMainGotoPan.add(yL); JTextField yUs = new JTextField(); yUs.setPreferredSize(new Dimension(65, 21)); advMainGotoPan.add(yUs); JLabel thetaL = new JLabel("Theta"); thetaL.setHorizontalAlignment(SwingConstants.CENTER); thetaL.setPreferredSize(new Dimension(70, 21)); advMainGotoPan.add(thetaL); JTextField thetaUs = new JTextField(); thetaUs.setPreferredSize(new Dimension(65, 21)); advMainGotoPan.add(thetaUs); ImageIcon gotoGo = new ImageIcon("resources/go.jpg"); gotoGoBut = new JButton(gotoGo); gotoGoBut.setPreferredSize(new Dimension(26, 26)); advMainGotoPan.add(gotoGoBut); advGotoPanel.add(advGotoTitle, BorderLayout.NORTH); advGotoPanel.add(advMainGotoPan); add(advGotoPanel); // PTZ PANEL JPanel ptzPanel = new JPanel(); ptzPanel.setPreferredSize(new Dimension(161, 155)); ptzPanel.setLayout(new BorderLayout()); JLabel ptzTitle = new JLabel("PTZ Control"); ptzTitle.setFont(new Font("SansSerif", Font.BOLD, 12)); ptzTitle.setHorizontalAlignment(SwingConstants.CENTER); JPanel advMainPtzPan = new JPanel(); advMainPtzPan.setPreferredSize(new Dimension(161, 100)); advMainPtzPan.setLayout(new FlowLayout()); ptzPanel.add(ptzTitle, BorderLayout.NORTH); ptzPanel.add(advMainPtzPan); add(ptzPanel); validate(); } public void sendMove(int dir){ if(Robot.getRobotInUse() >= 0){ if(dir == FORWARD){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " " + powerBar.getValue()*Robot.powerLevel + " 0 0" ); robots.get(Robot.getRobotInUse()).p2d.setSpeed(powerBar.getValue()*Robot.powerLevel, 0); } else if(dir == BACK){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " " + -(powerBar.getValue()*Robot.powerLevel) + " 0 0" ); robots.get(Robot.getRobotInUse()).p2d.setSpeed(-powerBar.getValue()*Robot.powerLevel, 0); } else if(dir == LEFT){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " 0 0 " + powerBar.getValue()*Robot.powerLevel*10.0); robots.get(Robot.getRobotInUse()).p2d.setSpeed(0, powerBar.getValue()*Robot.powerLevel*10); } else if(dir == RIGHT){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " 0 0 " + -(powerBar.getValue()*Robot.powerLevel*10.0)); robots.get(Robot.getRobotInUse()).p2d.setSpeed(0, -powerBar.getValue()*Robot.powerLevel*10); } else if(dir == STOP){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " 0 0 0"); robots.get(Robot.getRobotInUse()).p2d.setSpeed(0, 0); } else if(dir == ADVANCED){ if(Gui.useCentralServer) Gui.serverComm.writeStream("MOVE " + robots.get(Robot.getRobotInUse()).getUniqueId() + " " + linVelUs.getText() + " 0 " + angVelUs.getText()); robots.get(Robot.getRobotInUse()).p2d.setSpeed(powerBar.getValue()*Robot.powerLevel, 0); } } } }