package nbtool.gui.logviews.loc;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import com.google.protobuf.Message;
import messages.*;
import nbtool.data.SExpr;
import nbtool.gui.field.*;
import nbtool.gui.logviews.misc.ViewParent;
public class LocSwarmView extends ViewParent implements ActionListener {
@Override
public void setupDisplay() {
RobotLocation naoLoc;
ParticleSwarm naoSwarm;
VBall naoBall;
CenterCircle naoCC;
Vision naoVision;
float naoX, naoY, naoH;
try {
int bi = 0;
// Get loc info from log
naoLoc = RobotLocation.parseFrom(displayedLog.blocks.get(bi++).data);
naoX = naoLoc.getX();
naoY = naoLoc.getY();
naoH = naoLoc.getH();
naoPlayer.moveTo(naoX,naoY, naoH);
naoSwarm = ParticleSwarm.parseFrom(displayedLog.blocks.get(bi++).data);
for(int i=0; i<naoSwarm.getParticleCount(); i++) {
RobotLocation currentNaoSwarm = naoSwarm.getParticle(i).getLoc();
pWeight = naoSwarm.getParticle(i).getWeight();
NaoParticle temp = new NaoParticle();
temp.moveTo(currentNaoSwarm.getX(),currentNaoSwarm.getY());
naoParticles.add(temp);
}
// Get vision info log (fild lines, ball, center circle)
naoVision = Vision.parseFrom(displayedLog.blocks.get(bi++).data);
// Fild lines
for(int i=0; i<naoVision.getLineCount(); i++) {
FieldLine curFieldLine = naoVision.getLine(i);
GeoLine temp = new GeoLine(
curFieldLine.getInner().getR(),
curFieldLine.getInner().getT(),
curFieldLine.getInner().getEp0(),
curFieldLine.getInner().getEp1(),
0.0,
0.0,
curFieldLine.getCorrespondence(),
curFieldLine.getProb());
naoLines.add(temp);
}
// Corners
for(int i=0; i<naoVision.getCornerCount(); i++) {
Corner curCorner = naoVision.getCorner(i);
GeoCorner temp = new GeoCorner(
curCorner.getX(),
curCorner.getY(),
curCorner.getId(),
curCorner.getCorrespondence(),
curCorner.getProb());
naoCorners.add(temp);
}
// Ball
naoBall = naoVision.getBall();
if (naoBall.getOn() == true) {
System.out.printf("BALL AT %d,%d\n", naoBall.getX(), naoBall.getY());
naoGeoBall = new GeoBall(
naoBall.getX(),
naoBall.getY(),
naoBall.getConfidence());
}
// Center Circle
// TODO: how to check on or off?
naoCC = naoVision.getCircle();
System.out.println(naoCC.getOn());
if (naoCC.getOn() == true) {
System.out.printf("CIRC AT %f,%f\n", naoCC.getX(), naoCC.getY());
naoGeoCenterCircle = new GeoCenterCircle(
naoCC.getX(),
naoCC.getY(),
naoCC.getProb());
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public String[] displayableTypes() {
return new String[]{"locswarm"};
}
private int numLines;
public LocSwarmView() {
super();
if(shouldFlip) {
flip = new JButton("unflip");
} else { flip = new JButton("flip"); }
flip.addActionListener(this);
flip.setPreferredSize(new Dimension(70,25));
flip.setBounds((int)FieldConstants.FIELD_WIDTH/2,10,70,25);
this.add(flip);
}
protected void useSize(Dimension s) {
sp.setBounds(0,0,s.width,s.height);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == flip) {
if(shouldFlip == true) {
shouldFlip = false;
flip.setText("flip");
repaint();
} else {
shouldFlip = true;
flip.setText("unflip");
repaint();
}
}
}
Field f = new Field();
NaoRobot naoPlayer = new NaoRobot();
Vector<NaoParticle> naoParticles = new Vector<NaoParticle>();
Vector<GeoLine> naoLines = new Vector<GeoLine>();
Vector<GeoCorner> naoCorners = new Vector<GeoCorner>();
GeoBall naoGeoBall = null;
GeoCenterCircle naoGeoCenterCircle = null;
private JButton flip;
private JScrollPane sp;
public static float pWeight;
public static boolean shouldFlip = false;
public static boolean lineColors = true;
public static final Dimension fieldDimension = new Dimension(
(int)FieldConstants.FIELD_WIDTH,
(int)FieldConstants.FIELD_HEIGHT);
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
f.drawField(g2,shouldFlip, lineColors);
naoPlayer.drawNaoLoc(g2,shouldFlip);
if(!naoParticles.isEmpty()) {
for(int i=0; i<naoParticles.size(); i++) {
naoParticles.get(i).drawParticle(g2,pWeight,shouldFlip);
}
}
if(!naoLines.isEmpty()) {
for(int i=0; i<naoLines.size(); i++) {
naoLines.get(i).draw(g2);
}
}
if(!naoCorners.isEmpty()) {
for(int i=0; i<naoCorners.size(); i++) {
naoCorners.get(i).draw(g2,shouldFlip);
}
}
if(naoGeoBall != null){
naoGeoBall.draw(g2, shouldFlip);
}
if(naoGeoCenterCircle != null) {
naoGeoCenterCircle.draw(g2, shouldFlip);
}
}
}