/**
* 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 nxm.redhawk.prim.data;
import gov.redhawk.bulkio.util.AbstractUberBulkIOPort;
import gov.redhawk.bulkio.util.BulkIOType;
import mil.jpeojtrs.sca.util.UnsignedUtils;
import nxm.redhawk.prim.IMidasDataWriter;
import nxm.sys.inc.DataTypes;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import BULKIO.PrecisionUTCTime;
import BULKIO.StreamSRI;
/**
* uber BULKIO Port (CORBA) data receiver
* @noreference This class is not intended to be referenced by clients.
*/
public class BulkIOReceiver extends AbstractUberBulkIOPort {
private final IMidasDataWriter receiver;
private final char midasType;
private final boolean signed;
private String filterStreamId = null;
public BulkIOReceiver(@NonNull final IMidasDataWriter receiver, @NonNull BulkIOType type) {
this(receiver, type, false, null);
}
/**
* @since 10.1
*/
public BulkIOReceiver(@NonNull final IMidasDataWriter receiver, @NonNull BulkIOType type, boolean treatOctetAsUnsigned, String streamId) {
super(type);
this.receiver = receiver;
if (treatOctetAsUnsigned && (BulkIOType.OCTET == type)) {
this.signed = false;
this.midasType = 'I'; // need to upcast to signed 16-bit integer to represent unsigned 8-bit
} else {
this.signed = !type.isUnsigned();
this.midasType = type.getMidasType();
}
this.filterStreamId = streamId;
}
public char getMidasType() {
return this.midasType;
}
@Override
protected void handleStreamSRIChanged(@NonNull String streamID, @Nullable StreamSRI oldSri, @NonNull StreamSRI newSri) {
receiver.setStreamSri(streamID, oldSri, newSri);
}
/**
* {@inheritDoc}
*/
@Override
public void pushPacket(final char[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
receiver.write(dataArray, dataArray.length, DataTypes.INT, endOfStream, time, streamId);
}
@Override
public void pushPacket(final double[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
receiver.write(dataArray, dataArray.length, DataTypes.DOUBLE, endOfStream, time, streamId);
}
@Override
public void pushPacket(final float[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
receiver.write(dataArray, dataArray.length, DataTypes.FLOAT, endOfStream, time, streamId);
}
@Override
public void pushPacket(final long[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
if (signed) {
receiver.write(dataArray, dataArray.length, DataTypes.XLONG, endOfStream, time, streamId);
} else {
for (int i = 0; i < dataArray.length; i++) {
if (dataArray[i] < 0) {
// NextMidas does not accept integer precision values outside of Long.MAX_VALUE, therefore clip.
dataArray[i] = Long.MAX_VALUE;
} // else no change necessary
}
receiver.write(dataArray, dataArray.length, DataTypes.XLONG, endOfStream, time, streamId);
}
}
@Override
public void pushPacket(final int[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
if (signed) {
receiver.write(dataArray, dataArray.length, DataTypes.LONG, endOfStream, time, streamId);
} else {
final long[] newDataArray = UnsignedUtils.toSigned(dataArray);
receiver.write(newDataArray, newDataArray.length, DataTypes.XLONG, endOfStream, time, streamId);
}
}
@Override
public void pushPacket(final short[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
if (signed) {
receiver.write(dataArray, dataArray.length, DataTypes.INT, endOfStream, time, streamId);
} else {
final int[] newDataArray = UnsignedUtils.toSigned(dataArray);
receiver.write(newDataArray, newDataArray.length, DataTypes.LONG, endOfStream, time, streamId);
}
}
@Override
public void pushPacket(final byte[] dataArray, final PrecisionUTCTime time, final boolean endOfStream, final String streamId) {
if (!super.pushPacket(dataArray.length, time, endOfStream, streamId)) {
return;
} else if (this.filterStreamId != null && !this.filterStreamId.equals(streamId)) {
return; // ignore streams that we are not interested in
}
if (signed) {
receiver.write(dataArray, dataArray.length, DataTypes.BYTE, endOfStream, time, streamId);
} else {
final short[] newDataArray = UnsignedUtils.toSigned(dataArray);
receiver.write(newDataArray, newDataArray.length, DataTypes.INT, endOfStream, time, streamId);
}
}
}