}
String deviceName = name.substring(0, separatorPos);
String attributeName = name.substring(separatorPos + 1);
DeviceProxy proxy = getDeviceProxy(deviceName);
TangoAttribute attribute = getTangoAttribute(proxy.get_name() + "/" + 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);
String format = null;
try {
AttributeProxy attributeProxy = tangoAttribute.getAttributeProxy();
if (attributeProxy != null) {
AttributeInfo attributeInfo = attributeProxy.get_info();
if (attributeInfo != null) {
format = attributeInfo.format;
}
}
}
catch (Exception e) {
// Ignore exception: it is not a problem if format is not recovered
format = null;
}
report.setFormat(format);
double[] rawData;
switch (info.data_format.value()) {
case AttrDataFormat._SCALAR:
report.setDimensionType(DimensionType.SCALAR);
if (readable) {
report.setReadScalarData(tangoAttribute.read(Double.class));
}
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 = (double[]) tangoAttribute.readArray(Double.TYPE);
int spectrumLength = attribute.getDeviceAttribute().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 = (double[]) tangoAttribute.readArray(Double.TYPE);
int xDim = attribute.getDeviceAttribute().getDimX();
int yDim = attribute.getDeviceAttribute().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];