package org.yamcs.alarms;
import java.util.ArrayList;
import org.yamcs.protobuf.Yamcs.NamedObjectId;
import org.yamcs.security.Privilege;
import org.yamcs.tctm.ParameterDataLinkInitialiser;
import org.yamcs.yarch.DataType;
import org.yamcs.yarch.Stream;
import org.yamcs.yarch.Tuple;
import org.yamcs.yarch.TupleDefinition;
public class AlarmStreamer implements AlarmListener {
enum AlarmEvent {
TRIGGERED, UPDATED, SEVERITY_INCREASED, ACKNOWLEDGED, CLEARED;
}
static public final DataType PARAMETER_DATA_TYPE = DataType.protobuf(org.yamcs.protobuf.Pvalue.ParameterValue.class.getName());
Stream stream;
public AlarmStreamer(Stream s) {
this.stream = s;
}
private ArrayList<Object> getTupleKey(ActiveAlarm activeAlarm, AlarmEvent e) {
ArrayList<Object> al=new ArrayList<>(7);
//triggerTime
al.add(activeAlarm.triggerValue.getGenerationTime());
//parameter
al.add(activeAlarm.triggerValue.getParameter().getQualifiedName());
//seqNum
al.add(activeAlarm.id);
//event
al.add(e.name());
return al;
}
@Override
public void notifyTriggered(ActiveAlarm activeAlarm) {
TupleDefinition tdef = AlarmServer.ALARM_TUPLE_DEFINITION.copy();
ArrayList<Object> al = getTupleKey(activeAlarm, AlarmEvent.TRIGGERED);
tdef.addColumn("triggerPV", PARAMETER_DATA_TYPE);
NamedObjectId id = NamedObjectId.newBuilder().setName(activeAlarm.triggerValue.getParameter().getQualifiedName()).build();
al.add(activeAlarm.triggerValue.toGpb(id));
Tuple t = new Tuple(tdef, al);
stream.emitTuple(t);
}
@Override
public void notifySeverityIncrease(ActiveAlarm activeAlarm) {
TupleDefinition tdef = AlarmServer.ALARM_TUPLE_DEFINITION.copy();
ArrayList<Object> al = getTupleKey(activeAlarm, AlarmEvent.SEVERITY_INCREASED);
tdef.addColumn("severityIncreasedPV", PARAMETER_DATA_TYPE);
NamedObjectId id = NamedObjectId.newBuilder().setName(activeAlarm.mostSevereValue.getParameter().getQualifiedName()).build();
al.add(activeAlarm.mostSevereValue.toGpb(id));
Tuple t = new Tuple(tdef, al);
stream.emitTuple(t);
}
@Override
public void notifyParameterValueUpdate(ActiveAlarm activeAlarm) {
TupleDefinition tdef = AlarmServer.ALARM_TUPLE_DEFINITION.copy();
ArrayList<Object> al = getTupleKey(activeAlarm, AlarmEvent.UPDATED);
tdef.addColumn("updatedPV", PARAMETER_DATA_TYPE);
NamedObjectId id = NamedObjectId.newBuilder().setName(activeAlarm.currentValue.getParameter().getQualifiedName()).build();
al.add(activeAlarm.currentValue.toGpb(id));
Tuple t = new Tuple(tdef, al);
stream.emitTuple(t);
}
@Override
public void notifyAcknowledged(ActiveAlarm activeAlarm) {
TupleDefinition tdef = AlarmServer.ALARM_TUPLE_DEFINITION.copy();
ArrayList<Object> al = getTupleKey(activeAlarm, AlarmEvent.ACKNOWLEDGED);
tdef.addColumn("acknowledgedBy", DataType.STRING);
String username = activeAlarm.usernameThatAcknowledged;
if (username == null) {
username = (activeAlarm.autoAcknowledge) ? "autoAcknowledged" : Privilege.getDefaultUser();
}
al.add(username);
if (activeAlarm.message != null) {
tdef.addColumn("acknowledgeMessage", DataType.STRING);
al.add(activeAlarm.message);
}
tdef.addColumn("acknowledgeTime", DataType.TIMESTAMP);
al.add(activeAlarm.acknowledgeTime);
Tuple t = new Tuple(tdef, al);
stream.emitTuple(t);
}
@Override
public void notifyCleared(ActiveAlarm activeAlarm) {
TupleDefinition tdef = AlarmServer.ALARM_TUPLE_DEFINITION.copy();
ArrayList<Object> al = getTupleKey(activeAlarm, AlarmEvent.CLEARED);
tdef.addColumn("clearedPV", PARAMETER_DATA_TYPE);
NamedObjectId id = NamedObjectId.newBuilder().setName(activeAlarm.currentValue.getParameter().getQualifiedName()).build();
al.add(activeAlarm.currentValue.toGpb(id));
Tuple t = new Tuple(tdef, al);
stream.emitTuple(t);
}
}