Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public VType next() {
*
* @param dataMessage source of data
* @return the appropriate VType data object
* @throws IOException
* @throws UnsupportedOperationException
*/
protected VType extractData(EpicsMessage dataMessage) {
PayloadType type = mainStream.getPayLoadInfo().getType();
Expand All @@ -166,7 +166,7 @@ protected VType extractData(EpicsMessage dataMessage) {
type == PayloadType.SCALAR_FLOAT ||
type == PayloadType.SCALAR_INT ||
type == PayloadType.SCALAR_SHORT) {
if (display==null) display = getDisplay(mainStream.getPayLoadInfo());
if (display==null) display = getDisplay(dataMessage);
return VNumber.of(dataMessage.getNumberValue(),
alarm, time, display);
} else if (type == PayloadType.SCALAR_ENUM) {
Expand Down Expand Up @@ -271,7 +271,7 @@ public void close() {
}

/**
* Extract the display properties (min, max, alarm limits) from the given payloadinfo.
* Extract the display properties (min, max, alarm limits) from the given {@link PayloadInfo}.
*
* @param info the info to extract the limits from
* @return the display
Expand All @@ -284,30 +284,11 @@ protected Display getDisplay(PayloadInfo info) {
}
}

String lopr = headers.get(ApplianceArchiveReaderConstants.LOPR);
String low = headers.get(ApplianceArchiveReaderConstants.LOW);
String lolo = headers.get(ApplianceArchiveReaderConstants.LOLO);
String egu = headers.get(ApplianceArchiveReaderConstants.EGU);
String prec = headers.get(ApplianceArchiveReaderConstants.PREC);
String high = headers.get(ApplianceArchiveReaderConstants.HIGH);
String hihi = headers.get(ApplianceArchiveReaderConstants.HIHI);
String hopr = headers.get(ApplianceArchiveReaderConstants.HOPR);

final Range range = Range.of((lopr != null) ? Double.parseDouble(lopr) : Double.NaN,
(hopr != null) ? Double.parseDouble(hopr) : Double.NaN);
return Display.of(range,
Range.of((lolo != null) ? Double.parseDouble(lolo) : Double.NaN,
(hihi != null) ? Double.parseDouble(hihi) : Double.NaN),
Range.of((low != null) ? Double.parseDouble(low) : Double.NaN,
(high != null) ? Double.parseDouble(high) : Double.NaN),
range,
(egu != null) ? egu : "",
(prec != null) ? NumberFormats.precisionFormat((int) Math.round(Double.parseDouble(prec)))
: NumberFormats.toStringFormat());
return getDisplay(headers);
}

/**
* Extract the labels from the given payloadinfo when processing Enum Values.
* Extract the labels from the given payloadinfo when processing Enum Values.
* EnumLabels list empty if payloadinfo from request without "fetchLatestMetadata" set to true
*
* @param info the info to extract the labels
Expand Down Expand Up @@ -363,4 +344,52 @@ protected static AlarmSeverity getSeverity(int severity) {
protected static String getStatus(int status) {
return ChannelAccessStatusUtil.idToName(status);
}

/**
* Determines the {@link Display} for the sample. For optimized requests, this falls back to getting it
* from the payload info. For raw requests, it is expected to be present in the field values, i.e.
* each sample may define {@link Display} differently.
* @param message the info to extract the limits from
* @return A {@link Display} object.
*/
protected Display getDisplay(EpicsMessage message) {
Map<String, String> fieldValues = message.getFieldValues();
if (fieldValues == null) {
fieldValues = new HashMap<>();
}
if (fieldValues.isEmpty()) {
for (FieldValue fieldValue : mainStream.getPayLoadInfo().getHeadersList()) {
if (!fieldValues.containsKey(fieldValue.getName())) {
fieldValues.put(fieldValue.getName(), fieldValue.getVal());
}
}
}

return getDisplay(fieldValues);
}

private Display getDisplay(Map<String, String> fieldValues) {

String low = fieldValues.get(ApplianceArchiveReaderConstants.LOW);
String lolo = fieldValues.get(ApplianceArchiveReaderConstants.LOLO);
String high = fieldValues.get(ApplianceArchiveReaderConstants.HIGH);
String hihi = fieldValues.get(ApplianceArchiveReaderConstants.HIHI);

String egu = fieldValues.get(ApplianceArchiveReaderConstants.EGU);
String prec = fieldValues.get(ApplianceArchiveReaderConstants.PREC);
String lopr = fieldValues.get(ApplianceArchiveReaderConstants.LOPR);
String hopr = fieldValues.get(ApplianceArchiveReaderConstants.HOPR);

final Range range = Range.of((lopr != null) ? Double.parseDouble(lopr) : Double.NaN,
(hopr != null) ? Double.parseDouble(hopr) : Double.NaN);
return Display.of(range,
Range.of((lolo != null) ? Double.parseDouble(lolo) : Double.NaN,
(hihi != null) ? Double.parseDouble(hihi) : Double.NaN),
Range.of((low != null) ? Double.parseDouble(low) : Double.NaN,
(high != null) ? Double.parseDouble(high) : Double.NaN),
range,
(egu != null) ? egu : "",
(prec != null) ? NumberFormats.precisionFormat((int) Math.round(Double.parseDouble(prec)))
: NumberFormats.toStringFormat());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,14 @@
import edu.stanford.slac.archiverappliance.PB.EPICSEvent.PayloadType;
import org.epics.archiverappliance.retrieval.client.EpicsMessage;
import org.epics.archiverappliance.retrieval.client.GenMsgIterator;
import org.epics.vtype.AlarmSeverity;
import org.epics.vtype.VByteArray;
import org.epics.vtype.VDoubleArray;
import org.epics.vtype.VEnum;
import org.epics.vtype.VIntArray;
import org.epics.vtype.VNumber;
import org.epics.vtype.VString;
import org.epics.vtype.VType;
import org.epics.vtype.*;
import org.junit.jupiter.api.Test;

import java.sql.Timestamp;
import java.time.Instant;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
Expand Down Expand Up @@ -240,4 +235,104 @@ void waveformByteYieldsVByteArray() {
assertEquals((byte) 2, vba.getData().getByte(1));
assertEquals((byte) 3, vba.getData().getByte(2));
}

@Test
void testExtractDisplayFromPayloadInfo() throws Exception {
GenMsgIterator iter = mock(GenMsgIterator.class);
FakeDataRetrieval fakeDataRetrieval = new FakeDataRetrieval(iter);
FakeApplianceArchiveReader fakeApplianceArchiveReader = new FakeApplianceArchiveReader(fakeDataRetrieval);
ApplianceValueIterator applianceValueIterator = new ApplianceRawValueIterator(fakeApplianceArchiveReader, "PV:NAME", Instant.EPOCH, Instant.now());

PayloadInfo payloadInfo = PayloadInfo.newBuilder()
.setType(PayloadType.SCALAR_DOUBLE)
.setPvname("PV:NAME")
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOLO).setVal("-100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOW).setVal("-50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIGH).setVal("50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIHI).setVal("100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOPR).setVal("-200").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HOPR).setVal("200").build())
.setYear(2000).build();

Display display = applianceValueIterator.getDisplay(payloadInfo);

assertEquals(-100, display.getAlarmRange().getMinimum());
assertEquals(100, display.getAlarmRange().getMaximum());
assertEquals(-50, display.getWarningRange().getMinimum());
assertEquals(50, display.getWarningRange().getMaximum());
assertEquals(-200, display.getControlRange().getMinimum());
assertEquals(200, display.getControlRange().getMaximum());
}

@Test
void testExtractDisplayFromEpicsMessage() throws Exception {

GenMsgIterator iter = mock(GenMsgIterator.class);
FakeDataRetrieval fakeDataRetrieval = new FakeDataRetrieval(iter);
FakeApplianceArchiveReader fakeApplianceArchiveReader = new FakeApplianceArchiveReader(fakeDataRetrieval);
ApplianceValueIterator applianceValueIterator = new ApplianceRawValueIterator(fakeApplianceArchiveReader, "PV:NAME", Instant.EPOCH, Instant.now());

PayloadInfo payloadInfo = PayloadInfo.newBuilder()
.setType(PayloadType.SCALAR_DOUBLE)
.setPvname("PV:NAME")
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOLO).setVal("-100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOW).setVal("-50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIGH).setVal("50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIHI).setVal("100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOPR).setVal("-200").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HOPR).setVal("200").build())
.setYear(2000).build();
when(iter.getPayLoadInfo()).thenReturn(payloadInfo);
EpicsMessage epicsMessage = mock(EpicsMessage.class);
when(epicsMessage.getTimestamp()).thenReturn(new Timestamp(1000000L));
Map<String, String> fieldValues = new HashMap();
fieldValues.put(ApplianceArchiveReaderConstants.LOLO, "-10");
fieldValues.put(ApplianceArchiveReaderConstants.LOW, "-5");
fieldValues.put(ApplianceArchiveReaderConstants.HIGH, "5");
fieldValues.put(ApplianceArchiveReaderConstants.HIHI, "10");
fieldValues.put(ApplianceArchiveReaderConstants.LOPR, "-20");
fieldValues.put(ApplianceArchiveReaderConstants.HOPR, "20");
when(epicsMessage.getFieldValues()).thenReturn(fieldValues);
when(epicsMessage.getNumberValue()).thenReturn(771);
VType vType = applianceValueIterator.extractData(epicsMessage);
assertEquals(-10, Display.displayOf(vType).getAlarmRange().getMinimum());
assertEquals(-5, Display.displayOf(vType).getWarningRange().getMinimum());
assertEquals(5, Display.displayOf(vType).getWarningRange().getMaximum());
assertEquals(10, Display.displayOf(vType).getAlarmRange().getMaximum());
assertEquals(-20, Display.displayOf(vType).getControlRange().getMinimum());
assertEquals(20, Display.displayOf(vType).getControlRange().getMaximum());
}

@Test
void testExtractDisplayFromEpicsMessageWithNullFieldValues() throws Exception {

GenMsgIterator iter = mock(GenMsgIterator.class);
FakeDataRetrieval fakeDataRetrieval = new FakeDataRetrieval(iter);
FakeApplianceArchiveReader fakeApplianceArchiveReader = new FakeApplianceArchiveReader(fakeDataRetrieval);
ApplianceValueIterator applianceValueIterator = new ApplianceRawValueIterator(fakeApplianceArchiveReader, "PV:NAME", Instant.EPOCH, Instant.now());

PayloadInfo payloadInfo = PayloadInfo.newBuilder()
.setType(PayloadType.SCALAR_DOUBLE)
.setPvname("PV:NAME")
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOLO).setVal("-100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOW).setVal("-50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIGH).setVal("50").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HIHI).setVal("100").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.LOPR).setVal("-200").build())
.addHeaders(FieldValue.newBuilder().setName(ApplianceArchiveReaderConstants.HOPR).setVal("200").build())
.setYear(2000).build();
when(iter.getPayLoadInfo()).thenReturn(payloadInfo);
EpicsMessage epicsMessage = mock(EpicsMessage.class);
when(epicsMessage.getTimestamp()).thenReturn(new Timestamp(1000000L));
when(epicsMessage.getFieldValues()).thenReturn(null);
when(epicsMessage.getNumberValue()).thenReturn(771);
VType vType = applianceValueIterator.extractData(epicsMessage);
assertEquals(-100, Display.displayOf(vType).getAlarmRange().getMinimum());
assertEquals(-50, Display.displayOf(vType).getWarningRange().getMinimum());
assertEquals(50, Display.displayOf(vType).getWarningRange().getMaximum());
assertEquals(100, Display.displayOf(vType).getAlarmRange().getMaximum());
assertEquals(-200, Display.displayOf(vType).getControlRange().getMinimum());
assertEquals(200, Display.displayOf(vType).getControlRange().getMaximum());
}

}
Loading