package br;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;

import java.awt.List;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;

public class Principal SerialPortEventListener {

	//configuraes de comunicacao com a placa
	private SerialPort serialPort = null;
	private int baudRate = 19200;  //velocidade de comunicacao
	private String porta = "COM1";  //porta de comunicacao
	private InputStream in = null;  //entrada de dados
	private OutputStream out = null;  //saida de dados
	/////////////////////////////////////
	
	
	//variaveis de armazenamento dos dados recebidos
	ArrayList<String> dados = new ArrayList();
	
	
	
	
	//faz porta de comuicacao
    public void conecta ()
    {
    	try{
	        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(porta);
	        
	        if ( portIdentifier.isCurrentlyOwned() )
	        {
	            System.out.println("Erro: Porta esta em uso!");
	        }
	        
	        else
	        {
	            serialPort = (SerialPort) portIdentifier.open("Serial" , 20);
	            
	            
	        	in = serialPort.getInputStream();
	            out = serialPort.getOutputStream();
	            
	            serialPort.addEventListener(this);
	            serialPort.notifyOnDataAvailable(true);
	            
	            serialPort.setSerialPortParams(baudRate, SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
	 
	        }   
    	}catch (Exception e){
    		System.out.print("Erro Conecta!");
    		e.printStackTrace();
    	}
    }
    
    //fecha porta de comunicacao
    public void desconecta(){ 
    	try { 
    		out.write('p'); //envia 'p' para avisar o microcontrolador para parar envio e conversao
    		
    		if (in != null) in.close(); 
			if (out !=null) out.close(); 
			if (serialPort != null) serialPort.close(); 
			
			in = null; 
			out = null; 
			serialPort = null; 
	    }catch(Exception e){ 
	    	System.out.println("Erro ao desconectar"); 
	    }
    }
 
    //envia dados para a placa
    public void enviaDado(int dado){
    	try{
    		out.write(dado);
    	}catch (Exception e){
    		e.printStackTrace();
    	}
    }

	//recebe dados da placa
	public void serialEvent(SerialPortEvent evento){
		if (evento.getEventType() == SerialPortEvent.DATA_AVAILABLE){
			byte[] buffer = new byte[1024];
			int len = 0, countLen = 0;
			int ADRESH = 0, ADRESL = 0;
			float valor = 0f;
			int qtdDados = 2;
			
			try {
				len = in.read(buffer);
				while (countLen < len){
					//desloca 8 bits para esquerda, pois  o non e decimo bit da conversao
					ADRESH = (buffer[countLen]) << 8; 
					ADRESL = (buffer[countLen+1]);
					if (ADRESH < 0) ADRESH = ADRESH + 256;  
					if (ADRESL < 0) ADRESL = ADRESL + 256;
					valor = (float) (ADRESH + ADRESL);
					valor = (valor-317); //diminui valor somado pelo lm358
					valor = valor * 5f; //multiplica para achar os milivolts
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
    
	public long getQtdDadosRecebidos(){
		return this.qtdDadosRecebidos;
	}
	
	public void setQtdDadosRecebidos(long l){
		this.qtdDadosRecebidos = l;
	}
	
	public void atualizaGrafico(float valor){
		if (at == null){
			at = new AutoVetores("Anlise");
		}

		at.addValueXYseries(valor);
		at.mostrarTela();
	}
	
	
	
	
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
