propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getEqualProperties(propertyName);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
THistoryRecord lhr = null;
TPropertyQuery[] prpq = new TPropertyQuery[propInstances.size()];
byte[] tba = new byte[prpq.length * TPropertyQuery.sizeInBytes];
Iterator<TExportProperty> it = propInstances.iterator();
for (int i = 0; (it.hasNext()) && (i < prpq.length); i++)
{
prpq[i] = new TPropertyQuery((TExportProperty) it.next(), propInstances.size() - 1);
if ((lhr=getLocalHistoryRecord(prpq[i].prpName,"#0")) != null)
{
prpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
prpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
}
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
TPropertyQuery[] prpq = new TPropertyQuery[slst.length];
if (slst.length == 0) break;
byte[] tba = new byte[slst.length * TPropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
prp = propertyList.getFirstProperty(slst[i]);
prpq[i] = new TPropertyQuery(prp,1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
}
else if (dout.getTag().compareTo("XPQS") == 0 || (dout.getArrayLength() % XPropertyQuery.sizeInBytes) == 0)
{
if (din != null)
{ // looking for a specific property ...
LinkedList<TExportProperty> propInstances;
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getEqualProperties(propertyName);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
THistoryRecord lhr = null;
XPropertyQuery[] xpq = new XPropertyQuery[propInstances.size()];
byte[] tba = new byte[xpq.length * XPropertyQuery.sizeInBytes];
Iterator<TExportProperty> it = propInstances.iterator();
for (int i = 0; (it.hasNext()) && (i < xpq.length); i++)
{
xpq[i] = new XPropertyQuery((TExportProperty) it.next(), propInstances.size() - 1);
if ((lhr=getLocalHistoryRecord(xpq[i].prpName,"#0")) != null)
{
xpq[i].prpHistoryDepthLong = (short)lhr.getHspec().getDepthLong();
xpq[i].prpHistoryDepthShort = (short)lhr.getHspec().getDepthShort();
}
System.arraycopy(xpq[i].toByteArray(), 0, tba, i * XPropertyQuery.sizeInBytes,
XPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "XPQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
XPropertyQuery[] xpq = new XPropertyQuery[slst.length];
if (slst.length == 0) break;
byte[] tba = new byte[slst.length * XPropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
prp = propertyList.getFirstProperty(slst[i]);
xpq[i] = new XPropertyQuery(prp,1);
System.arraycopy(xpq[i].toByteArray(), 0, tba, i * XPropertyQuery.sizeInBytes,
XPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "XPQS");
}
}
else if (dout.getTag().compareTo("PQS") == 0 || (dout.getArrayLength() % PropertyQuery.sizeInBytes) == 0)
{ // legacy request ...
if (din != null)
{ // looking for a specific property ...
LinkedList<TExportProperty> propInstances;
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getEqualProperties(propertyName);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
PropertyQuery[] pqs = new PropertyQuery[1];
TExportProperty prp = propertyList.getFirstProperty(propertyName);
byte[] tba = new byte[PropertyQuery.sizeInBytes];
pqs[0] = new PropertyQuery();
pqs[0].name = propertyName;
pqs[0].prpDesc = prp.getDescription().getText();
pqs[0].prpAccess = (byte)prp.getAccessMode();
pqs[0].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[0].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[0].toByteArray(), 0, tba, 0, PropertyQuery.sizeInBytes);
return dout.putData(tba, "PQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
PropertyQuery[] pqs = new PropertyQuery[slst.length];
byte[] tba = new byte[slst.length * PropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<slst.length; i++)
{
pqs[i] = new PropertyQuery();
pqs[i].name = slst[i];
prp = propertyList.getFirstProperty(slst[i]);
pqs[i].prpDesc = prp.getDescription().getText();
pqs[i].prpAccess = (byte)prp.getAccessMode();
pqs[i].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[i].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[i].toByteArray(), 0, tba, i * PropertyQuery.sizeInBytes,
PropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PQS");
}
}
}
}
/**/
return TErrorList.illegal_format;
}
};
TPropertyHandler metapropertiesStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (dout != null)
{
int filter = getMetaPrpsCallFilter(din);
switch (dout.dFormat)
{ // TODO: tidy this copy-and-past job up !
case TFormat.CF_STRUCT:
LinkedList<TExportProperty> propInstances;
if (dout.getTag().compareTo("PRPQSr4") == 0 || (dout.getArrayLength() % TPropertyQuery.sizeInBytes) == 0)
{
if (din != null && filter != 0x7fffffff)
{ // looking for a specific property ...
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getFilledMetaProperties(propertyName,filter);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
TPropertyQuery[] prpq = new TPropertyQuery[propInstances.size()];
byte[] tba = new byte[prpq.length * TPropertyQuery.sizeInBytes];
Iterator<TExportProperty> it = propInstances.iterator();
for (int i = 0; (it.hasNext()) && (i < prpq.length); i++)
{
prpq[i] = new TPropertyQuery((TExportProperty) it.next(), propInstances.size() - 1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
propInstances = new LinkedList<TExportProperty>();
LinkedList<TExportProperty> theseInstances;
for (int i=0; i<slst.length; i++)
{
theseInstances = propertyList.getFilledMetaProperties(slst[i],filter);
if (theseInstances.size() > 0) propInstances.addAll(theseInstances);
}
int size = propInstances.size();
TExportProperty prp;
TPropertyQuery[] prpq = new TPropertyQuery[size];
byte[] tba = new byte[size * TPropertyQuery.sizeInBytes];
for (int i=0; i<size; i++)
{
prp = propInstances.get(i);
prpq[i] = new TPropertyQuery(prp,1);
System.arraycopy(prpq[i].toByteArray(), 0, tba, i * TPropertyQuery.sizeInBytes,
TPropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PRPQSr4");
}
}
else if (dout.getTag().compareTo("PQS") == 0 || (dout.getArrayLength() % PropertyQuery.sizeInBytes) == 0)
{ // legacy request ...
if (din != null && filter != 0x7fffffff)
{ // looking for a specific property ...
String propertyName = din.toString();
propertyName = propertyName.replace('\n', (char) 0).trim();
propInstances = propertyList.getFilledMetaProperties(propertyName,filter);
if ((propInstances == null) || (propInstances.size() == 0))
return TErrorList.not_exported;
// fill in the targeted property info
PropertyQuery[] pqs = new PropertyQuery[1];
TExportProperty prp = propertyList.getFirstProperty(propertyName);
byte[] tba = new byte[PropertyQuery.sizeInBytes];
pqs[0] = new PropertyQuery();
pqs[0].name = propertyName;
pqs[0].prpDesc = prp.getDescription().getText();
pqs[0].prpAccess = (byte)prp.getAccessMode();
pqs[0].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[0].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[0].toByteArray(), 0, tba, 0, PropertyQuery.sizeInBytes);
return dout.putData(tba, "PQS");
}
else
{ // want the whole list ...
String[] slst = new String[propertyList.countUniqueProperties()];
propertyList.getPropertyNames().toArray(slst);
if (slst.length == 0) break;
propInstances = new LinkedList<TExportProperty>();
LinkedList<TExportProperty> theseInstances;
for (int i=0; i<slst.length; i++)
{
theseInstances = propertyList.getFilledMetaProperties(slst[i],filter);
if (theseInstances.size() > 0) propInstances.addAll(theseInstances);
}
int size = propInstances.size();
PropertyQuery[] pqs = new PropertyQuery[size];
byte[] tba = new byte[size * PropertyQuery.sizeInBytes];
TExportProperty prp;
for (int i=0; i<size; i++)
{
prp = propInstances.get(i);
pqs[i] = new PropertyQuery();
pqs[i].name = prp.getName();
pqs[i].prpDesc = prp.getDescription().getText();
pqs[i].prpAccess = (byte)prp.getAccessMode();
pqs[i].prpFormat = (byte)(prp.getOutputFormat()%512);
pqs[i].prpSize = (short)prp.getOutputSize();
System.arraycopy(pqs[i].toByteArray(), 0, tba, i * PropertyQuery.sizeInBytes,
PropertyQuery.sizeInBytes);
}
return dout.putData(tba, "PQS");
}
}
}
}
/**/
return TErrorList.illegal_format;
}
};
TPropertyHandler alarmsStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (dout == null) return TErrorList.dimension_error;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
int[] amrb = new int[4];
if (din != null)
{
switch (din.dFormat)
{
case TFormat.CF_STRUCT:
if (din.dArrayLength != 16) return TErrorList.illegal_format;
byte[] bdata = din.getDataBuffer();
byte[] ival = new byte[4];
for (int i=0; i<3; i++)
{
System.arraycopy(bdata,i*4,ival,0,4);
amrb[i] = Swap.Long(ival);
}
break;
case TFormat.CF_LONG:
din.getData(amrb);
break;
default:
return TErrorList.illegal_format;
}
}
else
{
amrb[0] = 0; // start time
amrb[1] = (int)(System.currentTimeMillis()/1000); // stop time
amrb[2] = 0; // minimum severity
amrb[3] = 0; // as yet unused ...
}
boolean collapse = false;
int dstart, dstop;
int astart = amrb[0];
int astop = amrb[1];
int asev = amrb[2];
if (devName == null || devName.length() == 0 || devName.startsWith("#") || devName.contains("*"))
{ // currently any of these is a signal that the caller want's ALL alarms
int nalms = deviceList.getNumberOfAlarms();
if (nalms > TAlarm.getAlmCollapseWindow()) collapse = true;
dstart = 0; dstop = deviceList.getNumberOfDevices();
}
else
{
dstart = deviceList.getDeviceNumber(devName);
dstop = dstart + 1;
}
TAlarm[] alms = null;
TAlarmMessage[] ams = null;
int buflength = 0;
//byte[] tba = null;
int code = TErrorList.max_alarms_exceeded, na = 0;
if (collapse)
{ // collapse to a single message
na = buflength = 1;
ams = new TAlarmMessage[buflength];
String atag = "more than "+TAlarm.getAlmCollapseWindow()+" total alarms";
short[] tna = new short[32];
int itna = 1;
tna[0] = (short)deviceList.getNumberOfAlarms();
TDevice[] tdevs = deviceList.getDeviceList();
TAlarm[] as;
int n = 0;
for (TDevice td : tdevs)
{ // scan thru the device list
if ((as=td.getAlarmList()) == null ||
as.length == 0 || as[0] == null) continue;
for (int i=0; i<as.length; i++)
if (isCasInClientList()) as[i].allowRemoval();
if (code == TErrorList.max_alarms_exceeded) code = as[0].getCode();
if (itna < 32 && code != tna[itna]) tna[itna] = (short)code;
if (code != as[0].getCode()) break;
n++;
}
if (n > TAlarm.getAlmCollapseWindow())
{ // at least this many with the same code
code = TAlarm.isDiskSpaceAlarm(code) ? (code & 0xff) : TAlarm.getBaseCode(code);
TAlarmDefinition ad = getAlarmDefinition(code);
atag = ""+n+" alarms: "+ ad != null ? ad.getAlarmTag() : "<no defined alarm tag>";
}
TDataType dt = new TDataType(tna);
ams[0] = new TAlarmMessage(thisEqm.getExportName(),thisEqm.getExportName(),atag,code,
deviceList.getHighestAlarmSeverity(null,0),almDynSet,dt);
//tba = new byte[buflength * TAlarmMessage.sizeInBytes];
}
else
{
int ts = 0;
buflength = deviceList.getNumberOfAlarms();
ams = new TAlarmMessage[buflength];
//tba = new byte[buflength * TAlarmMessage.sizeInBytes];
TDevice[] dlst = deviceList.getDeviceList();
String dnam = null, atag = null;
for (int i=dstart; i<dstop; i++)
{
alms = dlst[i].getAlarmList();
if ((alms == null) || (alms.length == 0)) continue;
for (int n=0; n<alms.length && na<buflength; n++)
{
if ((ts=alms[n].getTimeStamp()) < astart || ts > astop) continue;
if (alms[n].getSeverity() < asev) continue;
dnam = dlst[i].getName();
code = alms[n].getCode();
atag = null;
if (TAlarm.isLinkErrorAlarm(code))
{
dnam = thisEqm.getExportName();
int lid = TAlarm.decodeLinkErrorAlarm(code);
TLink lnk = TLinkFactory.getInstance().getLinkFromTable(lid);
if (lnk != null) atag = "link error: "+lnk.getDeviceServer();
}
// TODO: if (TAlarm.isDiskSpaceAlarm(code)) dnam = getDiskName();
ams[na] = new TAlarmMessage(thisEqm,dnam,atag,alms[n]);
if (TAlarm.isHiddenAlarm(alms[n].getCode()))
{ // flagged as hidden
ams[na].setAlarmSystem(TAlarm.hideAlarmSystem(ams[na].getAlarmSystem()));
}
//System.arraycopy(ams[na].toByteArray(), 0, tba, (na)*TAlarmMessage.sizeInBytes, TAlarmMessage.sizeInBytes);
// CAS is configured and has now read the alarm => can remove it !
if (casReadRequired && isCasInClientList()) alms[n].allowRemoval();
na++;
}
}
}
byte[] tba = new byte[buflength * TAlarmMessage.sizeInBytes];
if (dout.getTag().compareTo("AMSr4") == 0)
{ // modern
for (int i=0; i<buflength && i<na; i++)
{
System.arraycopy(ams[i].toByteArray(), 0, tba, i*TAlarmMessage.sizeInBytes, TAlarmMessage.sizeInBytes);
}
if (na < dout.getArrayLength()) dout.setArrayLength(na);
return dout.putData(tba, "AMSr4");
}
else
{ // is legacy support necessary ?
}
return TErrorList.invalid_structure_tag;
}
};
TPropertyHandler alarmDefsStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TAlarmDefinition[] adef = (TAlarmDefinition[])alarmDefinitionList.values().toArray(new TAlarmDefinition[0]);
int almdefsize = alarmDefinitionList.size();
if (devAccess.isWrite())
{
if (din == null) return TErrorList.dimension_error;
if (din.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("ADSr4") != 0) return TErrorList.invalid_structure_tag;
TAlarmDefinition[] inpt = new TAlarmDefinition[1];
inpt[0] = new TAlarmDefinition();
din.getData(inpt);
boolean found = false;
for (int i=0; i<almdefsize; i++)
{
if (adef[i].getAlarmCode() == inpt[0].getAlarmCode())
{ // got it
adef[i].setFields(inpt[0]);
found = true;
break;
}
}
if (!found) return TErrorList.un_allocated;
if (dout == null || dout.getArrayLength() == 0) return 0;
}
if (dout == null) return TErrorList.dimension_error;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
int adssize = TStructRegistry.getSizeInBytes("ADSr4");
byte[] tba = new byte[almdefsize * adssize];
if (dout.getTag().compareTo("ADSr4") == 0)
{ // modern
for (int i=0; i<almdefsize; i++)
{
System.arraycopy(adef[i].toByteArray(), 0, tba, i*adssize, adssize);
}
if (almdefsize < dout.getArrayLength()) dout.setArrayLength(almdefsize);
return dout.putData(tba, "ADSr4");
}
else
{ // is legacy support necessary ?
}
return TErrorList.invalid_structure_tag;
}
};
TPropertyHandler devMaskHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
int[] newMask = new int[1];
if ((cc=din.getData(newMask)) != 0) return cc;
tdv.setMask(newMask[0]);
int[] m = new int[deviceList.getNumberOfDevices()];
for (int i=0; i<m.length; i++) m[i] = deviceList.getDevice(i).getMask();
saveStockPropertyValues("DEVMASK",devName,new TDataType(m));
}
int mask = tdv.getMask();
return dout.putData(mask);
}
};
TPropertyHandler devRegionHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
TDevice tdv = deviceList.getDevice(devName);
if (tdv == null) return TErrorList.illegal_device;
if (din != null && devAccess.isWrite())
{
int cc = 0;
String[] newrg = new String[1];
switch (din.dFormat)
{
case TFormat.CF_INT32:
int[] irg = new int[1];
if ((cc=din.getData(irg)) != 0) return cc;
newrg[0] = TRegion.getRegion(irg[0]);
break;
default:
if ((cc=din.getData(newrg)) != 0) return cc;
break;
}
tdv.setRegion(newrg[0]);
int[] rg = new int[deviceList.getNumberOfDevices()];
for (int i=0; i<rg.length; i++) rg[i] = deviceList.getDevice(i).getRegionCode();
saveStockPropertyValues("DEVREGION",devName,new TDataType(rg));
}
switch (dout.dFormat)
{
case TFormat.CF_INT32:
return dout.putData(tdv.getRegionCode());
default:
return dout.putData(tdv.getRegion());
}
}
};
stockList.addProperty(TStockProperties.SRVSUBSYSTEM, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
String subs = getSubsystem();
return dout.putData(subs == null ? "" : subs);
}
});
TPropertyHandler alarmWatchStructHandler = new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
synchronized (gAlarmWatchList)
{
int almwtblsize = gAlarmWatchList.size();
int awssize = TStructRegistry.getSizeInBytes("AWSr4");
byte[] tba = new byte[almwtblsize * awssize];
TAlarmWatchEntry[] aws = (TAlarmWatchEntry[])gAlarmWatchList.toArray(new TAlarmWatchEntry[0]);
if (devAccess.isWrite())
{
if (din.getFormat() != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("AWSr4") == 0)
{
TAlarmWatchEntry[] awe = new TAlarmWatchEntry[1];
awe[0] = new TAlarmWatchEntry();
din.getData(awe);
awe[0].setEquipmentModule(getLocalName());
boolean isNew = true;
for (int i=0; i<aws.length; i++)
{
if (aws[i].equals(awe[0]))
{
aws[i].adjustFrom(awe[0]);
isNew = false;
break;
}
}
if (isNew)
{ // wasn't in list
TExportProperty p = propertyList.getFirstProperty(awe[0].getPrp());
if (p == null) return TErrorList.illegal_property;
if (awe[0].getSiz() <= 0 || awe[0].getSiz() > p.getOutputSize())
{
awe[0].setSiz(p.getOutputSize());
}
awe[0].setFmt(p.getOutputFormat());
gAlarmWatchList.add(awe[0]);
}
}
else
{
return TErrorList.invalid_structure_tag;
}
}
if (dout == null || dout.dArrayLength == 0) return 0;
if (dout.dFormat != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (dout.getTag().compareTo("AWSr4") == 0)
{ // modern
for (int i=0; i<almwtblsize; i++)
{
System.arraycopy(aws[i].toByteArray(), 0, tba, i*awssize, awssize);
}
if (almwtblsize < dout.getArrayLength()) dout.setArrayLength(almwtblsize);
return dout.putData(tba, "AWSr4");
}
else
{
return TErrorList.invalid_structure_tag;
}
}
}
};
stockList.addProperty(TStockProperties.NALARMS, new TPropertyHandler()
{
int nalmdefs = alarmDefinitionList.size();
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
int devnr = -1;
if (!devName.contains("*") && !devName.startsWith("#"))
{
devnr = deviceList.getDeviceNumber(devName);
}
if (casName != null && !hasCasAttached) isCasInClientList();
int[] nalms = new int[6];
if (devnr < 0)
{ // all of them
nalms[0] = deviceList.getNumberOfAlarms();
nalms[1] = deviceList.getMostRecentAlarmTimestamp(nalms,3);
nalms[2] = deviceList.getHighestAlarmSeverity(nalms,4);
nalms[5] = nalmdefs;
if (nalms[0] > TAlarm.getAlmCollapseWindow())
{
nalms[1] = almDynSet.timestamp;
nalms[4] = nalms[3] = nalms[0] = 1;
}
}
else
{ // just the device given ...
int mrts = 0, ts, hsv = 0, sv, nts = 0, nsv = 0;
TDevice[] dlst = deviceList.getDeviceList();
if (devnr >= dlst.length) return TErrorList.device_not_connected;
TAlarm[] alms = dlst[devnr].getAlarmList();
nalms[0] = alms.length;
for (int i=0; i<alms.length; i++)
{
if ((ts=alms[i].getTimeStamp()) > mrts)
{
mrts = ts;
nts = 0;
}
if (ts == mrts) nts++;
if ((sv=alms[i].getSeverity()) > hsv)
{
hsv = sv;
nsv = 0;
}
if (sv == hsv) nsv++;
}
nalms[1] = mrts;
nalms[2] = hsv;
nalms[3] = nts;
nalms[4] = nsv;
nalms[5] = nalmdefs;
}
if (dout.dArrayLength > 5) nalms[5] = getAlarmDefinitionList().size();
return dout.putData(nalms);
}
});
stockList.addProperty(TStockProperties.NALARMDEFS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)alarmDefinitionList.size());
}
});
stockList.addProperty(TStockProperties.NALMWATCH, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)gAlarmWatchList.size());
}
});
stockList.addProperty(TStockProperties.ALARMS, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMSEXT, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMSEXT_STRUCTIN, alarmsStructHandler);
stockList.addProperty(TStockProperties.ALARMDEFS, alarmDefsStructHandler);
stockList.addProperty(TStockProperties.ALMWATCHTBL, alarmWatchStructHandler);
stockList.addProperty(TStockProperties.NHISTORIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData((short)gLclHstList.size());
}
});
stockList.addProperty(TStockProperties.HISTORIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return hstCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.HISTORIES_STRUCT, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return hstCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.ADDHISTORY, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (devAccess.isWrite())
{
if (din.getFormat() != TFormat.CF_STRUCT) return TErrorList.illegal_format;
if (din.getTag().compareTo("HRSr4") == 0)
{
THistoryRecordStruct[] hrs = new THistoryRecordStruct[1];
hrs[0] = new THistoryRecordStruct();
din.getData(hrs);
String prp = hrs[0].getProperty();
String dev = hrs[0].getDevice();
THistoryRecord hr = getLocalHistoryRecord(prp,dev);
if (hr == null)
{ // wasn't in list
TExportProperty p = getPropertyList().getFirstProperty(prp);
TPropertyDescription pd = p.getDescription();
int at = pd != null ? pd.getArrayType() : TArrayType.AT_UNKNOWN;
int idx = TEquipmentModuleFactory.getInstance().getNextHistoryRecordIndex();
THistorySpecification hspec = new THistorySpecification(hrs[0].getPollingRate(), hrs[0].getArchiveRate(), hrs[0].getDepthShort(), hrs[0].getDepthLong(), hrs[0].getHeartbeat(), hrs[0].getPercentTolerance(), hrs[0].getAbsoluteTolerance(), null);
addLocalHistoryRecord(idx, dev, prp, hrs[0].getSize(), hrs[0].getFormat(),at,hspec);
dumpHistoryManifest();
}
else
{ // just an edit ...
THistorySpecification hsp = hr.getHspec();
hsp.setAbsoluteTolerance(hrs[0].getAbsoluteTolerance());
hsp.setPercentTolerance(hrs[0].getPercentTolerance());
hsp.setArchiveRate(hrs[0].getArchiveRate());
hsp.setPollngRate(hrs[0].getPollingRate());
hsp.setDepthLong(hrs[0].getDepthLong());