/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* All rights reserved. This program and the accompanying materials are made available under
* the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package gov.redhawk.ide.snapshot.writer.internal;
import gov.redhawk.bulkio.util.BulkIOType;
import gov.redhawk.ide.snapshot.writer.BaseDataWriter;
import java.io.File;
import java.io.IOException;
import mil.jpeojtrs.sca.util.UnsignedUtils;
import nxm.sys.lib.Convert;
import nxm.sys.lib.Data;
import nxm.sys.lib.DataFile;
import nxm.sys.lib.Midas;
import nxm.sys.lib.NeXtMidas;
import BULKIO.PrecisionUTCTime;
import BULKIO.StreamSRI;
/**
*
*/
public class BlueDataWriter extends BaseDataWriter {
/** the Object used to write data to a Midas .BLUE file */
private DataFile df;
/** the format specification of a .BLUE file*/
private Data dataFormat;
private StreamSRI sri;
/**
* This method maps a BulkIOType to a Data
* @param t : the BulkIOType to map to the DataTypes type
* @return the equivalent Data Type
*/
private Data getMidasDataType(BulkIOType t) {
Data data = new Data();
switch (t) {
case CHAR:
data.setFormatType(Data.INT); // treat char as 16-bit integer
break;
case DOUBLE:
data.setFormatType(Data.DOUBLE);
break;
case FLOAT:
data.setFormatType(Data.FLOAT);
break;
case LONG:
data.setFormatType(Data.LONG);
break;
case LONG_LONG:
data.setFormatType(Data.XLONG);
break;
case SHORT:
data.setFormatType(Data.INT);
break;
case OCTET:
data.setFormatType(Data.INT); // upcast to next larger signed type (TODO: give option not to upcast?)
break;
case ULONG:
data.setFormatType(Data.XLONG); // upcast to next larger signed type
break;
case ULONG_LONG:
data.setFormatType(Data.XLONG); // CANNOT upcast
break;
case USHORT:
data.setFormatType(Data.LONG); // upcast to next larger signed type
break;
default:
throw new IllegalArgumentException("The BulkIOType was not a recognized Type");
}
return data;
}
@Override
public void open() throws IOException {
File file = getFileDestination();
BulkIOType type = getSettings().getType();
Midas m = NeXtMidas.getGlobalInstance().getMidasContext();
this.df = new DataFile(m, file.getAbsolutePath());
this.df.open(DataFile.OUTPUT);
this.dataFormat = this.getMidasDataType(type);
dataFormat.setFormatMode((sri.mode == 0) ? 'S' : 'C');
df.setFormat(dataFormat.getFormat());
double xdelta = (sri.xdelta == 0) ? 1.0 : sri.xdelta; // delta should NOT be zero
double ydelta = (sri.ydelta == 0) ? 1.0 : sri.ydelta; // delta should NOT be zero
df.setXStart(sri.xstart);
df.setXDelta(xdelta);
df.setXUnits(sri.xunits);
df.setYStart(sri.ystart);
df.setYDelta(ydelta);
df.setYUnits(sri.yunits);
df.setFrameSize(sri.subsize);
df.getKeywordsObject().put("hversion", sri.hversion + "");
df.getKeywordsObject().put("streamID", sri.streamID + "");
df.getKeywordsObject().put("blocking", sri.blocking + "");
setOpen(true);
}
@Override
public void pushSRI(StreamSRI sri) throws IOException {
this.sri = sri;
}
@Override
public void pushPacket(char[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
final byte type = Data.INT;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
@Override
public void pushPacket(double[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
final byte type = Data.DOUBLE;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
@Override
public void pushPacket(float[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
final byte type = Data.FLOAT;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
@Override
public void pushPacket(long[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
if (isUnsignedData()) {
throw new IOException("Can not upcast unsigned long");
// should we clip to Long.MAX_VALUE like corbareceiver?
} else {
final byte type = Data.XLONG;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
}
@Override
public void pushPacket(int[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
if (isUnsignedData()) {
final byte type = Data.XLONG; // upcast to next larger signed type
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(UnsignedUtils.toSigned(data), offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
} else {
final byte type = Data.LONG;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
}
@Override
public void pushPacket(short[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
if (isUnsignedData()) {
final byte type = Data.LONG; // upcast to next larger signed type
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(UnsignedUtils.toSigned(data), offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
} else {
final byte type = Data.INT;
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(data, offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
}
}
@Override
public void pushPacket(byte[] data, int offset, int length, PrecisionUTCTime time) throws IOException {
if (isUnsignedData()) {
final byte type = Data.INT; // upcast to next larger signed type
final int bufferSize = length * Data.getBPS(type);
byte[] byteBuffer = new byte[bufferSize];
Convert.ja2bb(UnsignedUtils.toSigned(data), offset, type, byteBuffer, 0, type, length);
df.write(byteBuffer, 0, bufferSize);
} else {
df.write(data, offset, length);
}
}
@Override
public void close() throws IOException {
if (df != null) {
setOpen(false);
df.close();
df = null;
}
}
}