2010-01-17 3 views
0

mon programme devrait essentiellement afficher une image dans laquelle un panneau dessine un point sur l'écran en fonction des données "input" (valeurs entières) provenant d'une connexion série sur mon pc.SerialPortEventListener d'une autre classe

Le problème est: comment "transférer" les valeurs du port série à la classe OTHER Frame et appeler la méthode REPAINT() ?????????? Etant donné que via la console je reçois toutes les données correctement via UART, la méthode que j'ai utilisée est via EventDriven ... Les données que je reçois sont correctes ... elles sont sorties dans la console et j'obtiens exactement la valeur que je m'attendais. Mais puisque la classe qui crée le cadre principal et un sous-panneau est une autre classe, comment appeler la méthode repaint de la routine eventdriven chaque fois que je reçois une donnée ????

Voici le code du programme principal (il affiche le cadre et créer un sous-panneau sur le côté ouest):

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JRootPane; 


public class ArtificialHorizon{ 

    /** 
    * Artificial Horizont program 
    * written in Java 1.6.12 (on Debian 5.0 Lenny) 
    * 
    * @author wilhem 
    * starting date: 15 Januar 2010 
    * 
    * last update: 18 Januar 2010 
    */ 


    /******************************** 
    * Getting the size of the screen 
    ********************************/ 
    private Dimension dimScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    private int xLocation; 
    private int yLocation; 


    /************************** 
    * Definition of the frame 
    * for the main application 
    *************************/ 
    @SuppressWarnings("static-access") 
    public void start(){ 
     JFrame mainFrame = new JFrame("Artificial Horizont"); 
     mainFrame.setUndecorated(true); 
     mainFrame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setSize(1024, 768); 
     xLocation = (dimScreenSize.width- mainFrame.getWidth())/2; 
     yLocation = (dimScreenSize.height - mainFrame.getHeight())/2; 
     mainFrame.setLocation(xLocation, yLocation); 

     mainFrame.setResizable(true); 
     mainFrame.setLayout(new BorderLayout()); 


     /******************************************** 
     * Creating the Left PANEL 
     * which contains the Left Artificial Horizon 
     * for FILTERED Outputs (Processed by Kalman) 
     ********************************************/ 

     ArtificialHorizonPanel leftPanel = new ArtificialHorizonPanel(); 
     ArtificialHorizonPanel rightPanel = new ArtificialHorizonPanel(); 

     mainFrame.getContentPane().add(BorderLayout.WEST, leftPanel); 

     mainFrame.setVisible(true); 

     /************************************************ 
     * Create the class RS232 and the Object "serial" 
     ***********************************************/ 
     SerialConnection serial = new SerialConnection("/dev/ttyUSB0", 9600); 

    } 



    public static void main(String[] args) { 

     ArtificialHorizon artificialHorizon = new ArtificialHorizon(); 
     artificialHorizon.start();  // Starting the application 

    } 

} 

Hre est la classe pour le sous-panneau (s'il vous plaît noter que le code ne soit pas encore terminée ... parce que je ne peux pas « lire » et repeindre le drwa sur le panneau lorsqu'une nouvelle donnée a été reçue):

import gnu.io.SerialPortEventListener; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JPanel; 


public class ArtificialHorizonPanel extends JPanel{ 

    /************************************ 
    * In this Class the Artificial Horizon 
    ************************************/ 

    /**************************** 
    * Defining instance variables 
    ****************************/ 
    private Color blueSky; 
    private Color orangeEarth; 
    private Dimension dimPanel; 
    private Point2D centerPoint; 
    private int side = 4; 


    /************************************ 
    * Thic constructor will create 
    * the initial panel for the Horizon 
    ************************************/ 
    public ArtificialHorizonPanel(){ 

     dimPanel = new Dimension(400, 700); 
     setPreferredSize(dimPanel); 
     setBackground(Color.black); 

     centerPoint = new Point2D.Double(dimPanel.getWidth()/2, dimPanel.getHeight()/2); // Create a point in the middle of the panel 

     blueSky = new Color(10, 112, 156); 
     orangeEarth = new Color(222, 132, 14); 

    } 

    public void paintComponent(Graphics g){ 

     super.paintComponent(g); 

     Graphics2D g2d = (Graphics2D)g; 

     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     Rectangle2D rect = new Rectangle2D.Double((centerPoint.getX() - side/2), (centerPoint.getY() - side/2), side, side); 

     g2d.setPaint(Color.orange); 
     g2d.draw(rect); 

    } 

} 

et est ici le code de la classe serialdata ... (fonctionne pefectly):

import gnu.io.CommPortIdentifier; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import java.util.TooManyListenersException; 



public class SerialConnection implements SerialPortEventListener{ 

    private Enumeration portList = null; 
    private CommPortIdentifier portId = null; 
    private String defaultPort = null; 
    private boolean portFound = false; 
    private int baudRate = 0; 
    private SerialPort serialPort = null; 
    private DataInputStream is = null; 
    private BufferedReader inStream; 



    /******************************** 
    * Constructor for the base class 
    *******************************/ 
    public SerialConnection(String defaultPort, int baudrate){ 

     this.defaultPort = defaultPort; 
     checkPorts();      // Call a method for checking ports on the System 

    } 


    /************************************ 
    * This method checks the presence of 
    * ports on the System, in affirmative 
    * case initializes and configures it 
    * to receive data on the serial port 
    ***********************************/ 

    public void checkPorts(){ 

     /*************************************** 
     * Get a list of all ports on the system 
     **************************************/ 
     portList = CommPortIdentifier.getPortIdentifiers(); 
     System.out.println("List of all serial ports on this system:"); 

     while(portList.hasMoreElements()){ 
      portId = (CommPortIdentifier)portList.nextElement(); 
      if(portId.getName().equals(defaultPort)){ 
       portFound = true; 
       System.out.println("Port found on: " + defaultPort); 

       initialize();  // If Port found then initialize the port 

      } 
     } 

     if(!portFound){ 
      System.out.println("No serial port found!!!"); 
     } 
    } 

    public void initialize(){ 
     /********************** 
     * Open the serial port 
     *********************/ 
     try{ 
      serialPort = (SerialPort)portId.open("Artificial Horizont", 2000); 
     } catch (PortInUseException ex){ 
      System.err.println("Port already in use!"); 
     } 

     // Get input stream 
     try{ 
      is = new DataInputStream(serialPort.getInputStream()); 
     } catch (IOException e){ 
      System.err.println("Cannot open Input Stream " + e); 
      is = null; 
     } 


     try{ 
      serialPort.setSerialPortParams(this.baudRate, 
              SerialPort.DATABITS_8, 
              SerialPort.STOPBITS_1, 
              SerialPort.PARITY_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Wrong settings for the serial port: " + ex.getMessage()); 
     } 


     try{ 
      serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); 
     } catch (UnsupportedCommOperationException ex){ 
      System.err.println("Check the flow control setting: " + ex.getMessage()); 
     } 

     // Add an event Listener 
     try{ 
      serialPort.addEventListener(this); 
     } catch (TooManyListenersException ev){ 
      System.err.println("Too many Listeners! " + ev); 
     } 

     // Advise if data available to be read on the port 
     serialPort.notifyOnDataAvailable(true); 
    } 


    /********************************** 
    * Method from interface definition 
    *********************************/ 
    public void serialEvent(SerialPortEvent event){ 

     inStream = new BufferedReader(new InputStreamReader(is), 5); 
     String rawInput = null; 

     switch(event.getEventType()){ 
     case SerialPortEvent.BI: 
     case SerialPortEvent.CD: 
     case SerialPortEvent.CTS: 
     case SerialPortEvent.DSR: 
     case SerialPortEvent.FE: 
     case SerialPortEvent.OE: 
     case SerialPortEvent.PE: 
     case SerialPortEvent.RI: 
     case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
      break; 

     case SerialPortEvent.DATA_AVAILABLE: 
      try { 
       while((rawInput = inStream.readLine()) != null){ 
        System.out.println(rawInput); 
/* 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!HERE I GET THE VALUE FROM THE SERIAL PORT AND THOSE MUST BE "VISIBLE" TO THE SUBPANEL CLASS IN ORDER AND RUN THE METHOD REPAINT!!!!!!!!!!!!!!!!!!!!! 
*/ 
       } 

       inStream.close(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
       System.exit(-1); 
      } 
      break; 

     default: 
      break; 

     } 
    } 

} 

Encore une fois ... Le tout fonctionne de code, mais je reçois le cadre et le sous-panneau de travail et en backgrounf les valeurs débrouillés connexion série mais INTHE console ...

Répondre

1

SwingWorker est idéal pour cela. Il existe des exemples connexes discutés here et décrit here. En aparté, assurez-vous de créer votre interface graphique sur le EDT.

Questions connexes