// Tango connection objects.
// Splits the device name into the corresponding deviceName and attributeName.
String name = device.getName();
int separatorPos = name.lastIndexOf("/");
if (separatorPos < 0) {
throw new SalsaDeviceException("Error : invalid device name " + name + " : no \"/\".",
false);
}
String deviceName = name.substring(0, separatorPos);
String attributeName = name.substring(separatorPos + 1);
DeviceProxy proxy = getDeviceProxy(deviceName);
DeviceAttribute attribute = getDeviceAttribute(proxy, attributeName);
AttributeInfo info = getAttributeInfo(proxy, attributeName);
// Report.
// Readable / writable.
boolean readable;
boolean writeable;
switch (info.writable.value()) {
case AttrWriteType._READ:
readable = true;
writeable = false;
break;
case AttrWriteType._READ_WITH_WRITE:
case AttrWriteType._READ_WRITE:
readable = true;
writeable = true;
break;
case AttrWriteType._WRITE:
readable = false;
writeable = true;
break;
default:
// Normally impossible.
throw new SalsaDeviceException("Unknown write type for the device " + name + ".");
}
report.setReadable(readable);
report.setWriteable(writeable);
// Data and data format.
try {
TangoAttribute tangoAttribute = new TangoAttribute(name);
double[] rawData;
switch (info.data_format.value()) {
case AttrDataFormat._SCALAR:
report.setDimensionType(DimensionType.SCALAR);
rawData = AttributeHelper.extractToDoubleArray(attribute);
if (readable) {
report.setReadScalarData(rawData[0]);
}
else {
report.setReadScalarData(null);
}
if (writeable) {
Double dataWritten = tangoAttribute.readWritten(Double.class);
report.setWriteScalarData(dataWritten);
}
else {
report.setWriteScalarData(null);
}
report.setReadSpectrumData(null);
report.setWriteSpectrumData(null);
report.setReadImageData(null);
report.setWriteImageData(null);
break;
case AttrDataFormat._SPECTRUM:
report.setDimensionType(DimensionType.SPECTRUM);
rawData = AttributeHelper.extractToDoubleArray(attribute);
int spectrumLength = attribute.getDimX();
Double[] readSpectrumData = null;
Double[] writeSpectrumData = null;
if (readable) {
readSpectrumData = new Double[spectrumLength];
writeSpectrumData = null;
for (int index = 0; index < spectrumLength; ++index) {
readSpectrumData[index] = rawData[index];
}
}
if (writeable) {
writeSpectrumData = new Double[spectrumLength];
for (int index = 0; index < spectrumLength; ++index) {
writeSpectrumData = tangoAttribute.readSpecOrImage(Double.class);
}
}
report.setReadScalarData(null);
report.setWriteScalarData(null);
report.setReadSpectrumData(readSpectrumData);
report.setWriteSpectrumData(writeSpectrumData);
report.setReadImageData(null);
report.setWriteImageData(null);
break;
case AttrDataFormat._IMAGE:
report.setDimensionType(DimensionType.IMAGE);
rawData = AttributeHelper.extractToDoubleArray(attribute);
int xDim = attribute.getDimX();
int yDim = attribute.getDimY();
Double[][] readImageData;
Double[][] writeImageData;
Double[] writtenImage = tangoAttribute.readSpecOrImage(Double.class);
int yOffset;
if (readable) {
readImageData = new Double[yDim][xDim];
if (writeable) {
writeImageData = new Double[yDim][xDim];
for (int yPos = 0; yPos < yDim; ++yPos) {
yOffset = yPos * xDim;
for (int xPos = 0; xPos < xDim; ++xPos) {
readImageData[yPos][xPos] = rawData[xPos + yOffset];
writeImageData[yPos][xPos] = writtenImage[xPos + yOffset];
}
}
}
else {
writeImageData = null;
for (int yPos = 0; yPos < yDim; ++yPos) {
yOffset = yPos * xDim;
for (int xPos = 0; xPos < xDim; ++xPos) {
readImageData[yPos][xPos] = rawData[xPos + yOffset];
}
}
}
}
else {
readImageData = null;
if (writeable) {
writeImageData = new Double[yDim][xDim];
for (int yPos = 0; yPos < yDim; ++yPos) {
yOffset = yPos * xDim;
for (int xPos = 0; xPos < xDim; ++xPos) {
writeImageData[yPos][xPos] = writtenImage[xPos + yOffset];
}
}
}
else {
writeImageData = null;
}
}
report.setReadScalarData(null);
report.setWriteScalarData(null);
report.setReadSpectrumData(null);
report.setWriteSpectrumData(null);
report.setReadImageData(readImageData);
report.setWriteImageData(writeImageData);
break;
default:
// Normally impossible.
throw new SalsaDeviceException("Unknown data format for the device " + name
+ ".");
}
}
catch (DevFailed e) {
e.printStackTrace();
SalsaDeviceException salsaDeviceException = new SalsaDeviceException(
"Error while trying to read the TangORB attribute data for the device "
+ device.getName() + ".", e);
throw salsaDeviceException;
}
String quality;
try {
quality = QualityUtilities.getNameForQuality(attribute.getQuality());
}
catch (DevFailed e) {
SalsaDeviceException salsaDeviceException = new SalsaDeviceException(
"Error while trying to read the quality of the TangORB attribute value for the device "
+ device.getName() + ".", e);
throw salsaDeviceException;
}
report.setQuality(quality);
String state;
try {
state = StateUtilities.getNameForState(proxy.state());
}
catch (DevFailed e) {
SalsaDeviceException salsaDeviceException = new SalsaDeviceException(
"Error while trying to read the state of the TangORB attribute value for the device "
+ device.getName() + ".", e);
throw salsaDeviceException;
}
report.setState(state);