package art.servers.etdserver.controller;
import art.library.model.devices.DeviceStatus;
import art.library.model.devices.etd.Etd;
import art.library.interop.serialization.Serialization;
import art.library.model.transactions.traces.Trace;
import art.servers.etdserver.Shared;
import art.servers.etdserver.protocols.diamond.configuration.DIAMOND_SpeedBinnedData;
import static java.lang.Thread.sleep;
public class ControllerVirtualEtd extends ControllerEtd
{
private int status = DeviceStatus.STATUS_ALARM;
private boolean firstTime = true;
public ControllerVirtualEtd(Etd etd)
{
super(etd);
this.device = etd;
this.name = Shared.getMessage("Controller etd") + " " + etd.information.name;
}
public void run()
{
//
art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Starting"), art.servers.Shared.getMessage("Success")), true);
//
status = DeviceStatus.STATUS_ONLINE;
while ((isInterrupted() == false) && (exit == false))
{
long startTimestamp = System.currentTimeMillis();
try
{
if (art.servers.Shared.isServerEnabled() == true)
{
update();
}
}
catch (Exception e)
{
e.printStackTrace();
}
if (startTimestamp > System.currentTimeMillis())
{
startTimestamp = System.currentTimeMillis();
}
long stopTimestamp = startTimestamp + (device.getDeviceInformation().polling * 1000);
while ((System.currentTimeMillis() < stopTimestamp) && (exit == false))
{
try
{
sleep(50);
}
catch (Exception e)
{
}
}
if (art.servers.Shared.model.existsDevice(device.getIdentifier()) == false)
{
art.servers.Shared.println(name, art.servers.Shared.getMessage("Device no longer exists"));
exit = true;
}
}
//
art.servers.Shared.println(Trace.getTraceInformation(art.servers.Shared.getApplicationName(), name, art.servers.Shared.getMessage("Finishing"), art.servers.Shared.getMessage("Success")), true);
//
}
/*
Private controller functions
*/
private void update() throws Exception
{
Etd etdclone = (Etd)Serialization.clone(device);
try
{
String externalIdentifier = device.getDeviceInformation().associatedDevice;
Etd etdExternal = (Etd)Shared.model.getDeviceExternal(externalIdentifier);
etdclone = (Etd)Serialization.clone(etdExternal);
etdclone.information = device.information;
etdclone.getDeviceInformation().lSpeedClassification = etdExternal.getDeviceInformation().lSpeedClassification;
etdclone.configuration = device.configuration;
online(etdclone);
return;
}
catch (Exception exception)
{
if ((etdclone.alarms.alarm_offline <= 0) || (firstTime == true))
{
firstTime = false;
String message = art.servers.Shared.getMessage("Etd offline");
art.servers.Shared.println(name, exception);
}
offline(etdclone);
}
}
private boolean isError()
{
errorsNumber = errorsNumber + 1;
if (errorsNumber >= maxErrorsNumber)
{
return(true);
}
return(false);
}
private void offline(Etd etdclone)throws Exception
{
if (isError() == true)
{
if (etdclone.getAlarm("alarm_offline") <= 0)
{
etdclone.getDeviceAlarms().clear();
}
etdclone.setAlarm("alarm_offline", true);
Shared.model.updateDevice(device, etdclone);
}
}
private void online(Etd etdclone) throws Exception
{
errorsNumber = 0;
if ((etdclone.alarms.alarm_offline > 0) || (firstTime == true))
{
firstTime = false;
String message = art.servers.Shared.getMessage("Etd online");
art.servers.Shared.println(name, message);
}
etdclone.setAlarm("alarm_offline", false);
etdclone.setAlarm("alarm_invalid", false);
Shared.model.updateDevice(device, etdclone);
}
private DIAMOND_SpeedBinnedData createSpeedBinTable() throws Exception
{
if ((this.device.getIdentifier().equalsIgnoreCase("etd-wisznice-1") == false) &&
(this.device.getIdentifier().equalsIgnoreCase("etd-sławatycze-1") == false))
{
DIAMOND_SpeedBinnedData speedBinnedData = new DIAMOND_SpeedBinnedData();
speedBinnedData.numberOfBins = 17; // 16;
speedBinnedData.fileName = "POLONIA.SPD"; // "DEFAULTX.SPD";
speedBinnedData.createBins();
return speedBinnedData;
}
DIAMOND_SpeedBinnedData speedBinnedData = new DIAMOND_SpeedBinnedData();
speedBinnedData.numberOfBins = 16;
speedBinnedData.fileName = "DEFAULTX.SPD";
speedBinnedData.createBinsOld();
return speedBinnedData;
}
}