⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trainpanel.java

📁 The WLAN Traffic Visualizer is a platform independent Java program providing accurate measurement of
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -