package com.roboclub.robobuggy.ui;
import com.roboclub.robobuggy.messages.BrakeControlMessage;
import com.roboclub.robobuggy.messages.EncoderMeasurement;
import com.roboclub.robobuggy.messages.GpsMeasurement;
import com.roboclub.robobuggy.messages.ImuMeasurement;
import com.roboclub.robobuggy.messages.SteeringMeasurement;
import com.roboclub.robobuggy.ros.Message;
import com.roboclub.robobuggy.ros.MessageListener;
import com.roboclub.robobuggy.ros.NodeChannel;
import com.roboclub.robobuggy.ros.Subscriber;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.GridLayout;
//import com.roboclub.robobuggy.ui.GpsPanel.LocTuple;
/**
* {@link RobobuggyGUIContainer} used for displaying sensor data
*
* @author Trevor Decker
* @author Kevin Brennan
* @version 0.5
* <p>
* CHANGELOG: NONE
* <p>
* DESCRIPTION: TODO
*/
public class DataPanel extends RobobuggyGUIContainer {
private static final long serialVersionUID = 3950373392222628865L;
private static final int MAX_LENGTH = 10;
/* Data Fields */
private JLabel aX, aY, aZ;
private JLabel rX, rY, rZ;
private JLabel mX, mY, mZ;
private JLabel velocity;
private JLabel distance;
private JLabel steeringAng;
private JLabel commandAng;
private JLabel bracking;
private JLabel errorNum;
private JLabel latitude, longitude;
/**
* Construct a new {@link DataPanel}
*/
public DataPanel() {
this.addComponent(createDataPanel(), 0, .8, 1, .2);
}
private JPanel createDataPanel() {
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black));
panel.setLayout(new GridLayout(5, 6));
aX = new JLabel();
JLabel label = new JLabel(" yaw: ");
panel.add(label);
panel.add(aX);
aY = new JLabel();
label = new JLabel(" pitch: ");
panel.add(label);
panel.add(aY);
aZ = new JLabel();
label = new JLabel(" roll: ");
panel.add(label);
panel.add(aZ);
rX = new JLabel();
label = new JLabel(" rX: ");
panel.add(label);
panel.add(rX);
rY = new JLabel();
label = new JLabel(" rY: ");
panel.add(label);
panel.add(rY);
rZ = new JLabel();
label = new JLabel(" rZ: ");
panel.add(label);
panel.add(rZ);
mX = new JLabel();
label = new JLabel(" mX: ");
panel.add(label);
panel.add(mX);
mY = new JLabel();
label = new JLabel(" mY: ");
panel.add(label);
panel.add(mY);
mZ = new JLabel();
label = new JLabel(" mZ: ");
panel.add(label);
panel.add(mZ);
latitude = new JLabel();
label = new JLabel(" lat: ");
panel.add(label);
panel.add(latitude);
longitude = new JLabel();
label = new JLabel(" long: ");
panel.add(label);
panel.add(longitude);
// Subscriber for Imu updates
new Subscriber("uiDataPan", NodeChannel.IMU.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
ImuMeasurement msg = (ImuMeasurement) m;
// Limit measurement values to 10 characters
String tmp = Double.toString(msg.getYaw());
if (tmp.length() > MAX_LENGTH) tmp = tmp.substring(0, MAX_LENGTH);
aX.setText(tmp);
tmp = Double.toString(msg.getPitch());
if (tmp.length() > MAX_LENGTH) tmp = tmp.substring(0, MAX_LENGTH);
aY.setText(tmp);
tmp = Double.toString(msg.getRoll());
if (tmp.length() > MAX_LENGTH) tmp = tmp.substring(0, MAX_LENGTH);
aZ.setText(tmp);
}
});
new Subscriber("uiDataPan", NodeChannel.GPS.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
double lat = ((GpsMeasurement) m).getLatitude();
double longit = ((GpsMeasurement) m).getLongitude();
latitude.setText(Double.toString(lat));
longitude.setText(Double.toString(longit));
//latitude and longitude are both needed
Gui.getInstance().fixPaint();
}
});
velocity = new JLabel();
label = new JLabel(" Velocity: ");
panel.add(label);
panel.add(velocity);
distance = new JLabel();
label = new JLabel(" Distance: ");
panel.add(label);
panel.add(distance);
// Subscriber for encoder updates
new Subscriber("uiDataPan", NodeChannel.ENCODER.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
EncoderMeasurement msg = (EncoderMeasurement) m;
String tmp = Double.toString(msg.getVelocity());
if (tmp.length() > MAX_LENGTH) tmp = tmp.substring(0, MAX_LENGTH);
velocity.setText(tmp);
tmp = Double.toString(msg.getDistance());
if (tmp.length() > MAX_LENGTH) tmp = tmp.substring(0, MAX_LENGTH);
distance.setText(tmp);
Gui.getInstance().fixPaint();
}
});
steeringAng = new JLabel();
label = new JLabel(" Angle: ");
panel.add(label);
panel.add(steeringAng);
// Subscriber for drive control updates
new Subscriber("uiDataPan", NodeChannel.STEERING.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
steeringAng.setText(Double.toString(((SteeringMeasurement) m).getAngle()));
Gui.getInstance().fixPaint();
}
});
commandAng = new JLabel();
label = new JLabel(" command: ");
panel.add(label);
panel.add(commandAng);
// Subscriber for drive control updates
new Subscriber("uiDataPan", NodeChannel.STEERING_COMMANDED.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
commandAng.setText(Double.toString(((SteeringMeasurement) m).getAngle()));
Gui.getInstance().fixPaint();
}
});
bracking = new JLabel();
label = new JLabel(" Bracking: ");
panel.add(label);
panel.add(bracking);
new Subscriber("uiDataPan", NodeChannel.BRAKE_CTRL.getMsgPath(), new MessageListener() {
@Override
public void actionPerformed(String topicName, Message m) {
bracking.setText(Boolean.toString(((BrakeControlMessage) m).isBrakeEngaged()));
}
});
errorNum = new JLabel();
label = new JLabel(" Errors: ");
panel.add(label);
panel.add(errorNum);
return panel;
}
//added by Abhinav Girish ; only temporary
/**
* Returns the values of the {@link DataPanel}
*
* @return the values of the {@link DataPanel}
*/
public String getValues() {
String values = "";
values += "aX: " + aX.getText() + " ";
values += "aY: " + aY.getText() + " ";
values += "aZ: " + aZ.getText() + " ";
values += "rX: " + rX.getText() + " ";
values += "rY: " + rY.getText() + " ";
values += "rZ: " + rZ.getText() + " ";
values += "mX: " + mX.getText() + " ";
values += "mY: " + mY.getText() + " ";
values += "mZ: " + mZ.getText() + " ";
return values;
}
}