{ // 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());
hsp.setDepthShort(hrs[0].getDepthShort());
hsp.setHeartbeat(hrs[0].getHeartbeat());
}
return 0;
}
else
{
return TErrorList.invalid_structure_tag;
}
}
return TErrorList.illegal_read_write;
}
});
stockList.addProperty(TStockProperties.ADDHISTORY_STR, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
if (devAccess.isWrite())
{
short fmt = din.getFormat();
if (!TFormat.isName(fmt) && fmt != TFormat.CF_CHAR) return TErrorList.illegal_format;
NAME64[] tgt = new NAME64[1];
int cc = din.getData(tgt);
if (cc != 0) return cc;
String prp = tgt[0].getName();
TExportProperty p = getPropertyList().getFirstProperty(prp);
if (p == null) return TErrorList.invalid_property;
int hfmt = p.getOutputFormat();
int hsiz = p.getOutputSize();
int idx = gEqmFactory.getNextHistoryRecordIndex(getLocalName(),prp,devName,hfmt,hsiz);
addLocalHistoryRecord(idx, devName, prp, hsiz, hfmt);
dumpHistoryManifest();
return 0;
}
return TErrorList.illegal_read_write;
}
});
//TODO: finish these ...
stockList.addProperty(TStockProperties.METAPROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return metaprpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.METAPROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return metaprpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.METAPROPERTIES_STRUCT, metapropertiesStructHandler);
stockList.addProperty(TStockProperties.METAPROPS_STRUCT, metapropertiesStructHandler);
stockList.addProperty(TStockProperties.DEVLOCATION, 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;
char[] newLocation = new char[64];
if ((cc=din.getData(newLocation)) != 0) return cc;
tdv.setLocation(new String(newLocation));
String[] loc = new String[deviceList.getNumberOfDevices()];
for (int i=0; i<loc.length; i++) loc[i] = deviceList.getDevice(i).getLocation();
saveStockPropertyValues("DEVLOCATION",devName,new TDataType(loc));
}
String dloc = tdv.getLocation();
if (dloc == null) dloc = gEqmFactory.getFecLocation();
if (dloc != null && dloc.startsWith("<"))
{ /* redirection character */
String rdrstr = null, envstr;
dloc = dloc.substring(1); dloc.trim();
if (dloc.startsWith("$"))
{
int idx = dloc.indexOf('/');
if (idx < 0) idx = dloc.length();
envstr = dloc.substring(1, idx);
rdrstr = System.getenv(envstr);
if (rdrstr == null) MsgLog.log("TEquipmentModule:DEVLOCATION", "environment variable "+envstr+" not set",TErrorList.not_defined,null,0);
dloc = dloc.substring(idx);
}
if (rdrstr == null) rdrstr = "";
rdrstr += dloc;
if (rdrstr.indexOf('[') < 0) rdrstr += "[Location]";
return gEqmFactory.setRedirectionString(rdrstr);
}
return dout.putData(dloc == null ? "" : dloc);
}
});
stockList.addProperty(TStockProperties.DEVMASK, devMaskHandler);
stockList.addProperty(TStockProperties.SYS_MASK, devMaskHandler);
stockList.addProperty(TStockProperties.ZPOSITION, 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())
{
try
{
int cc = 0;
float[] newZPos = new float[1];
if ((cc=din.getData(newZPos)) != 0) return cc;
tdv.setZposition(newZPos[0]);
float[] zp = new float[deviceList.getNumberOfDevices()];
for (int i=0; i<zp.length; i++) zp[i] = deviceList.getDevice(i).getZposition();
saveStockPropertyValues("ZPOSITION",devName,new TDataType(zp));
}
catch (Exception x) { x.printStackTrace(); }
}
float p = tdv.getZposition();
return dout.putData(p);
}
});
stockList.addProperty(TStockProperties.DEVONLINE, 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[] newFlg = new int[1];
if ((cc=din.getData(newFlg)) != 0) return cc;
tdv.setOffline(newFlg[0] == 0 ? true : false);
boolean[] m = new boolean[deviceList.getNumberOfDevices()];
for (int i=0; i<m.length; i++) m[i] = !deviceList.getDevice(i).isOffline();
saveStockPropertyValues("DEVONLINE",devName,new TDataType(m));
}
boolean p = !tdv.isOffline();
return dout.putData(p);
}
});
stockList.addProperty(TStockProperties.PROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPERTIES_USTRING, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPERTIES_STRUCT, propertiesStructHandler);
stockList.addProperty(TStockProperties.PROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPS_USTRING, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return prpQueryCall(devName,dout,din,devAccess);
}
});
stockList.addProperty(TStockProperties.PROPS_STRUCT, propertiesStructHandler);
stockList.addProperty(TStockProperties.NPROPERTIES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData(propertyList.countUniqueProperties());
}
});
// Same as NPROPERTIES
stockList.addProperty(TStockProperties.NPROPS, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
return dout.putData(propertyList.countUniqueProperties());
}
});
stockList.addProperty(TStockProperties.NDEVICES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
//return dout.putData(deviceList.size());
return dout.putData(deviceList.getNumberOfDevices());
}
});
stockList.addProperty(TStockProperties.DEVICES, new TPropertyHandler()
{
public int call(String devName, TDataType dout, TDataType din, TAccess devAccess)
{
String[] namlst;
if (devName.compareTo("*") != 0 && devName.indexOf("*") != -1)
{ // query for a subset of device names ...
WildcardMatch wc = new WildcardMatch(devName);
TDevice dev;
LinkedList<String> nl = new LinkedList<String>();
String dn;
int n = 0, mask = 0;
if (din != null && din.dArrayLength == 1 && din.dFormat == TFormat.CF_INT32)
{
int[] msk = new int[1];
din.getData(msk);
mask = msk[0];
}
for (int i=0; i<deviceList.getNumberOfDevices(); i++)
{
if ((dev=deviceList.getDevice(i)) == null) continue;
if (dev.isOffline()) continue;
if (mask > 0 && !dev.isMaskSet(mask)) continue;
dn = dev.getName();
if (!wc.matches(dn)) continue;
nl.add(dn);
n++;
}
namlst = nl.toArray(new String[n]);
}
else
{
namlst = deviceList.getDeviceNameList();
}
int cc = dout.putData(StringToName.stringArrayToName64(namlst));
if (cc == 0)
{
if (dout.getArrayLength() > namlst.length) dout.setArrayLength(namlst.length);
if (getDeviceList().isPropertyOriented())
cc = TErrorList.has_query_function | TErrorList.CE_SENDDATA;
}
return cc;
}
});
stockList.addProperty(TStockProperties.DEVDESCRIPTION, 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;
char[] newDesc = new char[64];
if ((cc=din.getData(newDesc)) != 0) return cc;
tdv.setDescription(new String(newDesc));
String[] dsc = new String[deviceList.getNumberOfDevices()];
for (int i=0; i<dsc.length; i++) dsc[i] = deviceList.getDevice(i).getDescription();
saveStockPropertyValues("DEVDESCRIPTION",devName,new TDataType(dsc));
}
String dsc = tdv.getDescription();
return dout.putData(dsc == null ? "" : dsc);
}
});