📄 trainpanel.java
字号:
package view;
//Copyright (C) 2008 Harald Unander, Wang Wenjuan
//
// This file is part of WlanTV.
//
// WlanTV 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.
//
// WlanTV 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 WlanTV. If not, see <http://www.gnu.org/licenses/>.
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.LinkedBlockingQueue;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.event.MouseInputAdapter;
import view.View.MY_EVENT;
import main.Main;
import model.Packet;
import model.Transaction;
import model.Packet.FType;
import model.Transaction.OneTransaction;
import model.Transaction.Type;
@SuppressWarnings("serial")
public class TrainPanel extends JScrollPane implements ComponentListener
{
private static final int UNIT = 6;
private static final int VBARSEP = 12;
private static int PANELH;
private static final int BARH = 10;
private static final long MINIUMUM_SPAN = 20;
private static final double ZOOM_FACTOR = 1.4;
private static final Color Gray200200200 = new Color(200,200,200);
// private static final Color Gray210210210 = new Color(210,210,210);
private static final Color Gray220220220 = new Color(220,220,220);
private static final Color Gray230230230 = new Color(230,230,230);
private static final Color DARK_BROWN = new Color(101,67,33);
private static final Color PALE_BROWN = new Color(152,118,84);
private View view;
private long viewStartTime;
private long viewEndTime;
private long viewSpan;
private long firstLimit, secondLimit;
private Timer t;
private int lastPaintedIndex;
private BufferedImage buffer;
private LinkedBlockingQueue<Packet> packetQ;
private ArrayList<Packet> packets;
private Transaction transaction;
private int viewFirstTransactionNo;
private int viewLastTransactionNo;
public TrainPanel() {
DrawSupport.init(Packet.getMap());
addComponentListener(this);
setVisible(false);
}
public void init(View view,ArrayList<Packet> packets,Transaction transaction,ArrayList<Packet> addedPackets,MouseInputAdapter mouseHandler) {
this.view = view;
this.packets = packets;
this.transaction = transaction;
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHandler);
addMouseWheelListener(mouseHandler);
setVisible(true);
buffer = null;
setSize(new Dimension(1000,1000));
}
void firstPacket(LinkedBlockingQueue<Packet> packetQ) {
this.packetQ = packetQ;
viewFirstTransactionNo = 0;
viewLastTransactionNo = 0;
viewStartTime = 0;
viewEndTime = (long) (60E6);
viewSpan = viewEndTime - viewStartTime;
t = new Timer();
t.scheduleAtFixedRate(new Refresh(),0,100);
buffer = null;
}
void lastPacket() {
getNewPackets();
if (packets.size() > 0) {
view.fireMyEvent(MY_EVENT.CAPTURE_COMPLETE);
}
else {
view.fireMyEvent(MY_EVENT.CAPTURE_ABORT);
}
t.cancel();
}
void redraw() {
buffer = null;
repaint();
}
public void paintSnapshot(Graphics g, String top, String bottom) {
paint(g);
Graphics2D g2d = buffer.createGraphics();
g2d.setFont(g2d.getFont().deriveFont(9F));
int l = g2d.getFontMetrics().charsWidth(top.toCharArray(), 0, top.length());
g2d.drawString(top,Math.min(0, getWidth()-l),g2d.getFontMetrics().getAscent());
g2d.drawString(bottom,0,getHeight()-g2d.getFontMetrics().getDescent());
g.drawImage(buffer,0,0,this);
}
public void paint(Graphics g) {
getNewPackets();
if (packets.size() > 0) {
if (buffer == null) {
// System.out.print("F:");HeapMonitor.memOk(true);
// System.out.println("Full");
createFullImage();
}
else {
// System.out.println("Incremental");
createIncrementalImage();
}
}
g.drawImage(buffer,0,0,this);
}
public void updateViewSpan() {
viewSpan = transaction.getCaptureSpan();
viewStartTime = transaction.getCaptureStartTime();
viewEndTime = transaction.getCaptureEndTime();
viewFirstTransactionNo = 0;
viewLastTransactionNo = transaction.getCaptureLastTransactionNo();
}
private void getNewPackets() {
if (packetQ!=null) {
Packet r;
while ((r=packetQ.poll()) != null) {
packets.add(r);
}
view.setTotalPacketCountLabel(packets.size());
}
}
private void createIncrementalImage() {
Graphics2D g2d = buffer.createGraphics();
double w = (double) getWidth()/viewSpan;
double h = (double) getHeight()/PANELH;
g2d.scale(w,h);
g2d.translate(-viewStartTime,0);
g2d.setStroke(new BasicStroke(0));
for (int i=lastPaintedIndex; i < packets.size(); i++) {
drawPacket(g2d,packets.get(i),null,null);
}
lastPaintedIndex = packets.size() - 1;
g2d.dispose();
}
private void createFullImage() {
if (view.showTransactions())
PANELH = VBARSEP*(Packet.FType.values().length+6);
else
PANELH = VBARSEP*(Packet.FType.values().length+1);
buffer = (BufferedImage)createImage(getWidth(),getHeight());
Graphics2D g2d = buffer.createGraphics();
double w = ((double) getWidth())/viewSpan;
double h = ((double) getHeight())/PANELH;
g2d.scale(w,h);
g2d.translate(-viewStartTime,0);
g2d.setStroke(new BasicStroke(0));
AffineTransform at = new AffineTransform();
at.scale(1/w,1/h);
AffineTransform at90 = new AffineTransform();
at90.scale(at.getScaleX(),at.getScaleY());
at90.rotate(Math.PI/2);
Font font0 = Main.SMALLFONT.deriveFont(at);
Font font90 = Main.SMALLFONT.deriveFont(9f).deriveFont(at90);
g2d.setFont(font0);
drawGrid(g2d);
boolean[] tMap = new boolean[Packet.FType.values().length+1];
if (transaction.getCaptureLastTransactionNo() == 0) {
for (Packet f : packets) {
if (f.timeStamp+f.frameDur >= viewStartTime && f.timeStamp <= viewEndTime) {
drawPacket(g2d,f,font0,font90);
if (f.fType != null)
tMap[f.fType.ordinal()] = true;
}
}
}
else {
int i = 0;
for (int j=viewFirstTransactionNo; j<=viewLastTransactionNo; j++) {
OneTransaction one = transaction.list.get(j);
if (!one.hide) {
Packet r0 = null;
for (Packet r : one.packetList) {
drawPacket(g2d,r,font0,font90);
drawLine(g2d,r0,r);
// System.out.println("2-"+r.fType.ordinal());
if (r.fType != null)
tMap[r.fType.ordinal()] = true;
r0=r;
}
if (view.showTransactions())
drawTransaction(g2d,one,(i++)%3);
}
}
if (view.getAddedPackets() != null && view.showFillPackets())
for (Packet r : view.getAddedPackets()) {
if (r.timeStamp+r.frameDur >= viewStartTime && r.timeStamp <= viewEndTime) {
drawPacket(g2d,r,font0,font90);
if (r.fType != null)
tMap[r.fType.ordinal()] = true;
// System.out.println("3-"+r.fType.ordinal());
}
}
lastPaintedIndex = packets.size() - 1;
}
g2d.setPaint(Color.GRAY);
g2d.setFont(font0);
for (FType fType : Packet.FType.values()) {
// System.out.println(fType);
if (tMap[fType.ordinal()] == true) {
int lower = VBARSEP*DrawSupport.getDrawVpos(fType)+BARH;
g2d.drawString(fType.toString(),viewStartTime,lower);
}
}
g2d.dispose();
}
private void drawLine(Graphics2D g2d,Packet r0,Packet r) {
if (r0!=null && viewSpan<1E5 && view.showTransactions()) {
g2d.setPaint(Color.ORANGE);
long x0 = r0.timeStamp+r0.getPreambleDur()+r0.getPlcpDur()+r0.psduDur/2;
long x1 = r.timeStamp+r.getPreambleDur()+r.getPlcpDur()+r.psduDur/2;
int y0 = VBARSEP*DrawSupport.getDrawVpos(r0.fType)+BARH/2;
int y1 = VBARSEP*DrawSupport.getDrawVpos(r.fType)+BARH/2;
Shape line = new Line2D.Float(x0,y0,x1,y1);
g2d.draw(line);
}
}
private void drawGrid(Graphics2D g2d) {
int gridStep;
String gridStepText;
if (viewSpan < 5E2) {
gridStep = (int)1E1;
gridStepText = "10us";
}
else if (viewSpan < 5E3) {
gridStep = (int)1E2;
gridStepText = "100us";
}
else if (viewSpan < 5E4) {
gridStep = (int)1E3;
gridStepText = "1ms";
}
else if (viewSpan < 5E5) {
gridStep = (int)1E4;
gridStepText = "10ms";
}
else if (viewSpan < 5E6) {
gridStep = (int)1E5;
gridStepText = "100ms";
}
else if (viewSpan < 5E7) {
gridStep = (int)1E6;
gridStepText = "1s";
}
else {
gridStep = (int)1E7;
gridStepText = "10s";
}
for (long t=viewStartTime,t0=0; t<viewSpan+viewStartTime; t+=gridStep,t0+=gridStep) {
g2d.setColor(Gray220220220);
g2d.draw(new Line2D.Float(t, 0, t, PANELH));
// g2d.setColor(Color.BLACK);
// g2d.drawString(Long.toString(t0),t,20);
}
view.setGridLabel("Grid:"+gridStepText);
}
private void drawPacket(Graphics2D g2d,Packet f,Font f0,Font f90) {
Color fColor = DrawSupport.getDrawColor(f.fType);
if (f.wlanBadFcs==0) {
if (Transaction.DataGroupCast(f))
fColor = Color.BLACK;
else if (f.wlanRetry==1)
fColor = Color.ORANGE;
}
else { // BadFcs
if (f.wlanRetry == 0)
fColor = DARK_BROWN;
else
fColor = PALE_BROWN;
}
long preambleLeft = f.timeStamp;
long plcpLeft = f.timeStamp+f.getPreambleDur();
long left = f.timeStamp+f.getPreambleDur()+f.getPlcpDur();
long right = left+f.psduDur;
int upper = VBARSEP*DrawSupport.getDrawVpos(f.fType);
int lower = upper+BARH;
Shape sFrameSouth = new Rectangle2D.Float(
left,
PANELH-3*UNIT,
f.psduDur,
BARH);
Shape sFrame = new Rectangle2D.Float(
preambleLeft,
upper,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -