package RobotCode;
/*
* This file is part of frcjcss.
*
* frcjcss is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* frcjcss is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with frcjcss. If not, see <http://www.gnu.org/licenses/>.
*/
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.KeyListener;
/**
* Joystick emulation for FRC.
* @author Nick DiRienzo, Patrick Jameson
* @version 11.11.2010.7
*/
public class Joystick implements KeyListener {
//TODO: Add Joystick button support using KeyListener
// -The above is done for one button at a time. Detecting many buttons being pressed at the same
// time is apparently not a trivial task for at least linux.
//TODO: Implement offsets and noise.
private final int JSHEIGHT = 500;//joy stick area height
private final int JSWIDTH = 500;//joy stick area width
private double x, y, z;//-1 to 1
private int xpos, ypos, zpos;//pixel position. z is 0-460.
private double xOffset, yOffset;
private double drift;
private int button;
private String buttonStr;
private long keyTime;
private boolean isTestingTime;
private boolean mouseClicked = false;
private boolean trigger = false;
private JFrame frame;
private Grid grid;
/**
* Creates a new Joystick window based on the Cartesian coordinate system.
* @param port The port the Joystick is connected to on the Driver Station.
*/
public Joystick(int port) {
frame = new JFrame("Joystick Emulator: " + port);
frame.setLayout(new BorderLayout());
frame.setPreferredSize(new Dimension(JSWIDTH, JSHEIGHT+100));
frame.setResizable(false);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
grid = new Grid();
frame.add(grid, BorderLayout.CENTER);
frame.addKeyListener(this);
zpos = 230; //starting pixel position of z axis(out of 460)
button = -1;//-1 == no button being pressed.
frame.pack();
frame.setVisible(true);
}
/**
* The X value of the Joystick.
* @return The X value of the Joystick, ranges from -1.0 to +1.0.
*/
public double getX() {
return x;
}
/**
* The Y value of the Joystick.
* @return The Y value of the Joystick, ranges from -1.0 to +1.0.
*/
public double getY() {
return y;
}
/**
* The Z value of the Joystick.
* @return The Z value of the Joystick, ranges from -1.0 to +1.0.
*/
public double getZ() {
return z;
}
public double getRawAxis(int axis) {
switch (axis) {
case 1: return getX();
case 2: return getY();
case 3: return getZ();
default: return 0;
}
}
/**
* The current state of the trigger on the Joystick.
* @return True if the trigger is being pressed down, false if not.
*/
public boolean getTrigger() {
return trigger;
}
/**
* Get the button value for buttons 1 through 10, with 0 being 10.
* @return True if the provided button is being pressed, false if not.
*/
public boolean getRawButton(int but) {
return (but == button);
}
public void keyPressed(KeyEvent e) {
int key = (int)e.getKeyChar()-48;
if (key >= 0 && key <= 9) {
if(key == 0) {
button = 10;
}
else {
button = key;
}
}
grid.repaint();
}
public void keyReleased(KeyEvent e) {
button = -1;
grid.repaint();
}
public void keyTyped(KeyEvent e) {}
@SuppressWarnings("serial")
class Grid extends JPanel implements MouseListener, MouseMotionListener, MouseWheelListener {
Grid() {
addMouseListener(this);
addMouseMotionListener(this);
addMouseWheelListener(this);
}
public void paintComponent(Graphics g) {
g.setFont(new Font("Helvetica", Font.BOLD, 14));
//clears graph.
g.setColor(Color.white);
g.fillRect(0, 0, grid.getWidth(), grid.getHeight());
g.setColor(Color.black);
//checks if trigger is set and draws a red filled rectangle if it is.
if (trigger) {
g.setColor(Color.red);
g.fillRect(xpos-20, ypos-20, 40, 40);
g.setColor(Color.black);
}
//draws x and y axis and bottom border of grid.
g.drawLine(0, JSHEIGHT/2, getWidth(), JSHEIGHT/2);
g.drawLine(getWidth()/2, 0, getWidth()/2, JSHEIGHT);
g.drawLine(0, JSHEIGHT, getWidth(), JSHEIGHT);
//draws z axis
g.drawLine(20, JSHEIGHT+50, 480, JSHEIGHT+50);
g.drawLine(20, JSHEIGHT+25, 20, JSHEIGHT+75);
g.drawLine(480, JSHEIGHT+25, 480, JSHEIGHT+75);
//draws zpos
g.setColor(Color.red);
g.drawLine(20+(int)zpos, JSHEIGHT+25, 20+(int)zpos, JSHEIGHT+75);
g.setColor(Color.black);
g.drawString("z = " + round(z, 3), 225, JSHEIGHT+25);
//drawing joystick and mouse positions
g.drawString("Mouse: (" + xpos + ", " + ypos + ")", 5, 40);
g.drawString("Joystick: (" + round(x,3) + ", " + round(y, 3) + ")", 5, 20);
g.drawString("Trigger is " + (trigger?"on.":"off."), 5, 60);
g.drawString("Joystick is " + (mouseClicked?"":"not ") + "locked", 5, 80);
g.drawString("Button being pressed: " + ((button != -1) ? button : "None"), 5, 100);
//box around cursor
g.drawRect(xpos-20, ypos-20, 40, 40);
//crosshair
g.drawLine(xpos, ypos-20, xpos, ypos+20);
g.drawLine(xpos-20, ypos, xpos+20, ypos);
}
public void determineMousePos(MouseEvent e) {
if(!mouseClicked) {
xpos = e.getX();
ypos = e.getY();
if (ypos > JSHEIGHT)
ypos = JSHEIGHT;
x = (double)(xpos-JSHEIGHT/2.0)/(JSHEIGHT/2.0);
y = (double)((getWidth()/2.0)-ypos)/(getWidth()/2.0);
}
repaint();
}
public double round(double preNum, int decPlaces) {
return (double)Math.round((preNum*Math.pow(10, decPlaces)))/Math.pow(10, decPlaces);
}
public void mouseMoved(MouseEvent e) {
determineMousePos(e);
}
public void mouseDragged(MouseEvent e) {
determineMousePos(e);
}
public void mousePressed(MouseEvent e) {
if (e.getButton() == 1)
mouseClicked = !mouseClicked;
else if (e.getButton() == 3)
trigger = true;
repaint();
}
public void mouseReleased(MouseEvent e) {
if (e.getButton() == 3) {
trigger = false;
repaint();
}
}
public void mouseWheelMoved(MouseWheelEvent e) {
zpos-=e.getWheelRotation()*10;
if (zpos < 0)
zpos = 0;
else if (zpos > 460)
zpos = 460;
z = ((double)zpos/460*2)-1;
repaint();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
}
}