Source file: /~heha/mb-iwp/RTD-RTX-Konverter.zip/RtdImporter (Java-jBEAM)/src/rtdImporter/RtdImporter.java

/* jBEAM-Erweiterung zum Einlesen von Renishaw „dynamischen“ Messdaten (*.RTD)
 * Henrik Haftmann, 4/08
 */
package rtdImporter;

import java.io.*;
import java.nio.*;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;

import org.asam.cea.Cea2Exceptions.*;
import org.asam.cea.Cea2Items.*;
import org.asam.cea.Cea2Services.*;
import org.asam.cea.Cea2Types.*;

public class RtdImporter extends BasicCea2Producer {

 private File importFile = null;

 @Override
 public boolean cea2ShouldSerializeItems() {
  return true;
 }

 @Override
 public boolean cea2AcceptData(Object data, boolean append) {
  return false;
 }

 @Override
 public void cea2Customize() throws Cea2CustomizerNotAvailable {
  try {
   JFileChooser fileChooser = new JFileChooser(getImportFile() != null ? getImportFile().getParentFile() : null);
   fileChooser.setFileFilter(new FileFilter(){
    @Override
    public boolean accept(File file) {
     return file != null && (file.isDirectory() || file.getPath().toLowerCase().endsWith(".rtd"));
    }
    @Override
    public String getDescription() {
     return "Renishaw „dynamische“ Messdaten (*.RTD)";	// müsste eigentlich lokalisiert werden!
    }
   });
   fileChooser.setSelectedFile(getImportFile());
   int status = fileChooser.showOpenDialog(JOptionPane.getRootFrame());
   switch (status) {
    case JFileChooser.APPROVE_OPTION:
     setImportFile(fileChooser.getSelectedFile());
     break;
   }
   getCea2Bus().cea2ValidateCurrentApplication();
  } catch (Cea2InvalidApplication e) {
   e.printStackTrace();
  }
 }

 private void setImportFile(File selectedFile) {
  importFile = selectedFile;
  setInputValid(false);
 }

 private File getImportFile() {
  return importFile ;
 }

 @Override
 public void cea2Execute() throws Cea2Exception {
  try {
   if (isInputValid()) return;
   Cea2LogTraceServiceIF traceService = getTraceService();
   if (importFile == null) {
    if (traceService != null
    && traceService.cea2IsLogging(Cea2LogArea.ComponentExecution, Cea2LogLevel.Error))
      traceService.cea2WriteMessage(Cea2LogArea.ComponentExecution,
      Cea2LogLevel.Error,
      cea2GetName() + ": no import file was defined. Cannot load!");
    clearResultItems();
   }else{
    InputStream fin = new BufferedInputStream(new FileInputStream(importFile));
    FloatBuffer databuffer = null;
    String channelName = "Achse";
    double xInterval = 1d;
    int numData = 0;
    String userName = null;
    while (true) {
     String line;
     try{
      line = readLine(fin).trim();
     }catch (EOFException e) { break; }		// bei EOF Schleife beenden
     if (line.isEmpty()) continue;		// Leerzeilen ignorieren
     if (line.endsWith("::")) continue;		// Kopfzeilen ignorieren
     String[] splitted = line.split(":",2);	// übrige Zeilen haben den Aufbau "key : value"
     String key = splitted[0].trim();
     String value = splitted[1].trim();
     if (key.equalsIgnoreCase("TITEL")) channelName = value;
     else if (key.equalsIgnoreCase("Trigger interval")) xInterval = Double.parseDouble(value);
     else if (key.equalsIgnoreCase("name")) userName = value;
     else if (key.equalsIgnoreCase("sample no")) numData = (int)Double.parseDouble(value);
     else if (key.equalsIgnoreCase("Run Target Data")) {
      byte[] bytes = new byte[numData*4];
      fin.read(bytes);
      ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);	// Puffer "casten"
      byteBuffer.order(ByteOrder.LITTLE_ENDIAN);	// für nächste Operation Bytedrehung anzeigen
      databuffer = byteBuffer.asFloatBuffer();
      break;						// Endlosschleife beenden
     }
    }
    fin.close();
    if (resultDataItems == null) resultDataItems = new Cea2NumericChannelIF[1];
    if (resultDataItems[0] == null) {
     resultDataItems[0] = (Cea2NumericItemIF) getItemFactoryService().cea2CreateItem(Cea2DataType.DoubleChannel);
     getCea2Bus().cea2AddItem(resultDataItems[0]);
    }
    Cea2DoubleChannelIF resultChannel = (Cea2DoubleChannelIF) resultDataItems[0];
    resultChannel.cea2SetName(channelName);
    resultChannel.cea2SetUnit("mm");
    resultChannel.cea2SetXUnit("mm");
    resultChannel.cea2SetProducer(this);
    resultChannel.cea2SetXIncrement(xInterval);
    if (userName != null) resultChannel.cea2AddProperty(new Cea2Property("userName", userName));
    while (databuffer.hasRemaining()) {
     int i = databuffer.position();
     resultChannel.cea2AppendValue(databuffer.get()-xInterval*i);	// Differenzen speichern
    }
   }/*importFile!=null*/
   sendComponentEvent(new Cea2ComponentEvent(Cea2EventKind.ComponentResultItemsChanged));
   setInputValid(true);
  } catch (IOException e) {e.printStackTrace();}
 }

/**
 * Liest eine Zeile (bis \r\n) aus (ungepuffertem) Stream
 * @param fin = InputStream
 * @return Zeile (ohne \r\n)
 * @throws IOException (auch EOFException)
 */
 private String readLine(InputStream fin) throws IOException {
  String result = "";
  while (true) {
   int c = fin.read();
   if (c == -1)	throw new EOFException();
   if (c == '\r') break;
   result = result + (char) c;
  }
  fin.read(); // sollte '\n' lesen (schmutzig!)
  return result;
 }

 @Override
 public String cea2GetConfig() {
  // XML-Daten speichern
  return null;
 }

 @Override
 public void cea2SetConfig(String theConfiguration) {
  // XML-Daten einlesen
 }

 @Override
 public void cea2SetData(Object data, boolean append) {
 }
}
Detected encoding: ASCII (7 bit)8