package br;

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.BasicStroke; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.JTextArea; 
import javax.swing.border.EtchedBorder; 
import javax.swing.border.TitledBorder; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import java.text.DecimalFormat; 

public class Grafico extends JFrame{
 
	 JPanel p; 
	 private GridBagLayout gbLayout; 
	 private GridBagConstraints gbConstraints; 
	 private GraficoPanel graficoPanel1; 
	 private GraficoPanel graficoPanel2; 
	 private GraficoPanel graficoPanel3; 
	 private GraficoPanel graficoPanel4; 
	 private JTextArea infTextArea; 
	 private String vxString = "Vx = [2,46;2,50] V"; 
	 private int taxaAmostragem = 0; 
	 int posicao = 0;// a posio ocupada pela amostra no vetor y 
	 int xPixelAmostra=1; // nmero de pixels que a amostra deve oculpar no 
	eixo x 
	 int deslocAmostra = 15; // nmero de bits da amostra a ser deslocado para 
	a direita 
	  
	 // construtor do objeto 
	 public Grafico() 
	 { 
	  super("Visualizador Grfico");  
	 
	95 
	  p = new JPanel(); 
	  p.setPreferredSize(new Dimension(1050,710)); 
	  p.setBackground(Color.BLACK); 
	  infTextArea = new JTextArea(3,12); 
	  infTextArea.setEditable(false); 
	  setInfTextArea(); 
	  gbLayout = new GridBagLayout(); 
	  p.setLayout(gbLayout); 
	  gbConstraints = new GridBagConstraints(); 
	  gbConstraints.anchor = GridBagConstraints.CENTER; 
	  gbConstraints.fill = gbConstraints.NONE; 
	  graficoPanel1 = new GraficoPanel(Color.WHITE, "Canal 1"); 
	  graficoPanel2 = new GraficoPanel(Color.WHITE, "Canal 2"); 
	  graficoPanel3 = new GraficoPanel(Color.WHITE, "Canal 3"); 
	  graficoPanel4 = new GraficoPanel(Color.WHITE, "Canal 4"); 
	  addComponent(criaAmostraSlider(),0,0,30,2); 
	  addComponent(criaAmplitudeSlider(),30,0,50,2); 
	  addComponent(infTextArea,80,0,2,2); 
	  addComponent(graficoPanel1,0,2,100,15); 
	  addComponent(graficoPanel2,0,18,100,15); 
	  addComponent(graficoPanel3,0,34,100,15); 
	  addComponent(graficoPanel4,0,50,100,15); 
	  configX(xPixelAmostra); 
	  getContentPane().add(p); 
	  setResizable(false); 
	  pack();  
	 } 
	  
	 // configura a taxa de amostragem para ser exibida no campo de informao 
	 public void setTaxaAmostragem(String freqCorte) 
	 { 
	  if (freqCorte == "36.6") 
	   taxaAmostragem =  140; 
	  else if (freqCorte == "73") 
	   taxaAmostragem = 279; 
	  else if (freqCorte == "146") 
	   taxaAmostragem = 558 ; 
	  else if (freqCorte == "292") 
	   taxaAmostragem = 1116; 
	  else if (freqCorte == "584") 
	   taxaAmostragem = 2232; 
	  setInfTextArea(); 
	 } 
	  
	 // escreve o campo de informaes sobre o sinal captado 
	 private void setInfTextArea() 
	 { 
	  infTextArea.setText(vxString + "\n"); 
	  if (taxaAmostragem != 0) 
	  { 
	   infTextArea.append(" " + taxaAmostragem + " amostras/s\n"); 
	   DecimalFormat dFormat = new DecimalFormat("0.0000"); 
	   double periodoVarredura = (double) 1000/(xPixelAmostra*taxaAmostragem); 
	   infTextArea.append(" T varredura = " + dFormat.format(periodoVarredura) 
	+ " s"); 
	  } 
	 } 
	  
	 // cria a barra de seleo do nmero de pixels ocupador por cada amostra 
	no eixo x  
	 
	96 
	 public JSlider criaAmostraSlider() 
	 { 
	  final JSlider amostraSlider = new JSlider(1,10,1); 
	  amostraSlider.setPreferredSize(new Dimension(350,60)); 
	  amostraSlider.setMajorTickSpacing(1); 
	  amostraSlider.setPaintTicks(true); 
	   amostraSlider.setPaintLabels(true); 
	  amostraSlider.setSnapToTicks(true); 
	  amostraSlider.setBorder(new TitledBorder(new EtchedBorder(), "N de 
	pixels no eixo x por amostra ")); 
	  amostraSlider.addChangeListener(new ChangeListener() 
	     { 
	      public void stateChanged(ChangeEvent e) 
	      { 
	       xPixelAmostra = amostraSlider.getValue(); 
	       configX(xPixelAmostra); 
	       setInfTextArea(); 
	      } 
	     } 
	    ); 
	  return amostraSlider; 
	   
	 } 
	  
	 /* cria a barra de seleo do nmero de bits das amostras a serem 
	deslocados 
	 para a direita */ 
	 public JSlider criaAmplitudeSlider() 
	 { 
	  final JSlider amplitudeSlider = new JSlider(0,15,15); 
	  amplitudeSlider.setPreferredSize(new Dimension(500,60)); 
	  amplitudeSlider.setMajorTickSpacing(1); 
	  amplitudeSlider.setPaintTicks(true); 
	  amplitudeSlider.setPaintLabels(true); 
	  amplitudeSlider.setSnapToTicks(true); 
	  amplitudeSlider.setBorder(new TitledBorder(new EtchedBorder(), "N de 
	bits da amostra a deslocar para direita  ")); 
	  amplitudeSlider.addChangeListener(new ChangeListener() 
	     { 
	      public void stateChanged(ChangeEvent e) 
	      { 
	       deslocAmostra = amplitudeSlider.getValue(); 
	        
	       switch (deslocAmostra) 
	       { 
	        case 15:  
	         vxString = "Vx = [2,46;2,50] V";  
	         break; 
	        case 14: 
	         vxString = "Vx = [1,22;1,24] V";  
	         break; 
	        case 13: 
	         vxString = "Vx = [607,88;617,65] mV";  
	         break; 
	        case 12: 
	         vxString = "Vx = [303,34;308,22] mV"; 
	         break; 
	        case 11: 
	         vxString = "Vx = [151,52;153,96] mV"; 
	         break;  
	 
	97 
	        case 10: 
	         vxString = "Vx = [75,72;76,94] mV"; 
	         break; 
	        case 9: 
	         vxString = "Vx = [37,85;38,46] mV"; 
	         break; 
	        case 8: 
	         vxString = "Vx = [18,92;19,23] mV"; 
	         break; 
	        case 7: 
	         vxString = "Vx = [9,46;9,61] mV"; 
	         break; 
	        case 6: 
	         vxString = "Vx = [4,73;4,81] mV"; 
	         break; 
	        case 5: 
	         vxString = "Vx = [2,37;2,40] mV"; 
	         break; 
	        case 4: 
	         vxString = "Vx = [1,18;1,20] mV"; 
	         break; 
	        case 3: 
	         vxString = "Vx = [592,57;600,82] uV"; 
	         break; 
	        case 2: 
	         vxString = "Vx = [296,83;300,41] uV"; 
	         break; 
	        case 1: 
	         vxString = "Vx = [149,01;150,20] uV"; 
	         break; 
	        case 0: 
	         vxString = "Vx = [75,10] uV"; 
	         break; 
	        default: 
	         vxString = "Erro"; 
	         break; 
	       } 
	       setInfTextArea(); 
	      } 
	     } 
	    ); 
	  return amplitudeSlider; 
	 } 
	  
	 /* configura cada um dos campos de exibio para ajustar a visualizao de  
	 acordo com o nmero de pixels por amostra selecionado pelo usurio */ 
	 public void configX(int multiplicador) 
	 { 
	  graficoPanel1.configX(multiplicador); 
	  graficoPanel2.configX(multiplicador); 
	  graficoPanel3.configX(multiplicador); 
	  graficoPanel4.configX(multiplicador); 
	 } 
	   
	 // mtodo utilizado para o envio das amostras para o visualizador grafico 
	 public void roda(int canal1, int canal2, int canal3, int canal4) 
	 { 
	  /* escreve cada amostra no vetor y na posio especifica 
	  as amostras so escritas no veto j deslocadas para a direita 
	  de acordo com o valor selecionado pelo usurio */  
	 
	98 
	  graficoPanel1.configY(canal1 >> deslocAmostra, posicao); 
	  graficoPanel2.configY(canal2 >> deslocAmostra, posicao); 
	  graficoPanel3.configY(canal3 >> deslocAmostra, posicao); 
	  graficoPanel4.configY(canal4 >> deslocAmostra, posicao); 
	  // atualiza a imagem exibida a cada 10 amostras recebidas 
	  if(posicao%10 == 0) 
	  {   
	   graficoPanel1.repaint(); 
	   graficoPanel2.repaint(); 
	   graficoPanel3.repaint(); 
	   graficoPanel4.repaint(); 
	  } 
	  /* verifica se o ultimo elemento do vetor y exibido na tela foi 
	preenchido 
	  em caso afirmativo volta ao inivio do vetor de amostras (vetor y)*/ 
	  if (posicao<(999/xPixelAmostra)) 
	   posicao++; 
	  else 
	   posicao = 0; 
	 } 
	  
	 /** 
	  Adiciona componentes no Panel ajustando o GridBagConstraints 
	  @param c o componente a ser adidionado 
	  @param linha a linha que o componente ocupar� 
	  @param coluna a coluna que o componente ocupar� 
	  @param largura o nmero de colunas que o componente ocupar� 
	  @param altura o nmero de linhas que o componente ocupar� 
	 */ 
	 public void addComponent(Component c, int coluna, int linha,  
	       int largura, int altura) 
	 { 
	  gbConstraints.gridx = coluna; 
	  gbConstraints.gridy = linha; 
	  gbConstraints.gridwidth = largura; 
	  gbConstraints.gridheight = altura; 
	  gbConstraints.weightx = 0; 
	  gbConstraints.weighty = 0; 
	  gbConstraints.insets = new Insets(5,5,5,5);  // ajusta o espeço entre 
	componentes 
	  gbLayout.setConstraints(c, gbConstraints); 
	  p.add(c); 
	 } 
	  
	 /* Classe interna que representa cada um dos canais, contendo o  
	 vetor para armazenamento das amostras que so exibidas na tela e 
	 o campo de visualizao. Essa classe apresenta o mtodo responsvel 
	 pela atualizao da imagem exibida. */ 
	 private class GraficoPanel extends JPanel  
	 { 
	  int[] x = new int[1000]; // vetor que apresenta o posio da amostra no 
	eixo x 
	  int[] y = new int[1000]; // vetor com os valores da amostras, plotados no 
	eixo y 
	  int amostrasPlotadas = 1000; // indica o nmero de amostra plotadas  do 
	vetor de 1000 elementos 
	   
	  private GraficoPanel(Color cor, String titulo) 
	  { 
	   setPreferredSize(new Dimension(1000,150));  
	 
	99 
	   setBackground(cor); 
	   setBorder(new TitledBorder(new EtchedBorder(), titulo)); 
	  } 
	   
	  // escreve as amostra no vetor de amostras 
	  public void configY(int valor, int posicao) 
	  { 
	   y[posicao] = this.getHeight()/2 - valor; 
	  } 
	   
	  // configura o vetor x de acordo com o nmero de pixels por amostra 
	  public void configX(int multiplicador) 
	  { 
	   amostrasPlotadas = 1000/multiplicador; 
	   for (int i=0; i<amostrasPlotadas; i++) 
	    x[i] = i*multiplicador; 
	  } 
	   
	  // mtodo responsvel por desenhar a tela do visualizador do canal 
	  public void paintComponent(Graphics g) 
	  { 
	   Graphics2D g2 = (Graphics2D) g; 
	   super.paintComponent(g); 
	   g2.setStroke(new BasicStroke(2)); 
	   g2.setColor(Color.BLACK); 
	   g2.drawLine(0,this.getHeight()/2, this.getWidth(), this.getHeight()/2); 
	   g2.setStroke(new BasicStroke(1)); 
	   g2.setColor(new Color(0,160,0)); 
	   g2.drawLine(0, 11, this.getWidth(), 11); 
	   g2.drawLine(0, 43, this.getWidth(), 43); 
	   g2.drawLine(0, 107, this.getWidth(), 107); 
	   g2.drawLine(0, 139, this.getWidth(), 139); 
	   g2.setStroke(new BasicStroke(0)); 
	   g2.setColor(Color.RED); 
	   g2.drawPolyline(x,y,amostrasPlotadas); 
	   g2.setStroke(new BasicStroke(2)); 
	   g2.setColor(Color.BLACK); 
	   g2.drawString("+Vx",60,20); 
	   g2.drawString("-Vx",15,139); 
	   g2.setColor(Color.BLUE); 
	   g2.setStroke(new BasicStroke(4)); 
	   g2.drawLine(x[posicao]+2, 0, x[posicao]+2, this.getHeight()); 
	  } 
	 } 
	}
	
}
