package art.client.maps; import art.client.models.Shared; import art.library.model.devices.Device; import art.library.model.devices.DeviceGraphicsRuntime; import art.library.model.devices.DeviceStatus; import art.library.model.devices.vms.asf.Asf; import art.library.model.devices.vms.pvv.Pvv; import art.library.model.devices.vms.pvv.PvvAlarms; import art.library.model.devices.vms.pvv.PvvStatus; import com.kitfox.svg.*; import java.lang.reflect.Method; import java.util.*; import java.util.stream.Collectors; public class VigicatCUC extends DeviceGraphicsRuntime { private Set deviceClasses = null; private final HashMap mapRunnableElements = new HashMap(); public VigicatCUC (SVGDiagram diagram) { super(diagram); } public void status() { if (deviceClasses == null) { deviceClasses = Shared.model.modelDevices.getDevicesListRead().stream().map(Device::getClass).collect(Collectors.toSet()); } getElementsContainingField("art.device").parallelStream().forEach(this::refreshElement); } private void refreshElement(SVGElement element) { try { if (mapRunnableElements.containsKey(element)) { mapRunnableElements.get(element).run(); } else { for (Class deviceClass : deviceClasses) { if (Shared.model.modelDevices.getDevice(getAttribute(element, "art.device")).getClassName().equals(deviceClass.getName())) { Method method = this.getClass().getMethod("status", deviceClass, SVGElement.class); Device device = Shared.model.modelDevices.getDevice(getAttribute(element, "art.device")); mapRunnableElements.put(element, () -> { try{ method.invoke(this, device, element);} catch (Exception ex){} }); mapRunnableElements.get(element).run(); break; } } } } catch (Exception e) { } } // public void status(Asf svgDevice, SVGElement element) { System.out.println("Painting ASF -> " + svgDevice.getIdentifier()); DeviceStatus status = svgDevice.getDeviceStatus(); SVGElement background = getChildContainingField(element, "art.id", "Background"); SVGElement border = getChildContainingField(element, "art.id", "Border"); setAttribute(background, "fill", getGenericDualStatusColor(status.status)[0]); setAttribute(border, "stroke", getGenericDualStatusColor(status.status)[1]); System.out.println("Finished painting ASF -> " + svgDevice.getIdentifier()); } // // public void status(Pvv svgDevice, SVGElement element) { if (getChildContainingField(element, "art.id", "Alarm") != null) paintBigPvvElement(svgDevice, element); else paintSmallPvvElement(svgDevice, element); } private void paintSmallPvvElement(Pvv svgDevice, SVGElement element) { DeviceStatus status = svgDevice.getDeviceStatus(); SVGElement background = getChildContainingField(element,"art.id","Background"); SVGElement border = getChildContainingField(element,"art.id","Border"); setAttribute(background, "fill", getGenericDualStatusColor(status.status)[0]); setAttribute(border, "stroke", getGenericDualStatusColor(status.status)[1]); } private void paintBigPvvElement(Pvv svgDevice, SVGElement element) { PvvStatus status = svgDevice.getDeviceStatus(); PvvAlarms alarms = svgDevice.getDeviceAlarms(); SVGElement background = getChildContainingField(element, "art.id", "Background"); SVGElement border = getChildContainingField(element, "art.id", "Border"); SVGElement alarm = getChildContainingField(element, "art.id", "Alarm"); SVGElement textUnder100 = getChildContainingField(element, "art.id", "Text1"); SVGElement textOver100 = getChildContainingField(element, "art.id", "Text2"); setAttribute(textUnder100, "display", "none", 999); setAttribute(textOver100, "display", "none", 999); setAttribute(alarm, "display", "inline", 999); setAttribute(alarm, "stroke", "#FF0000", 999); setAttribute(background, "fill", "#FF00FF"); setAttribute(border, "stroke", "#800080"); setAttribute(alarm, "stroke-width", alarms.getServerityAlarm()); setAttribute(background, "fill", getGenericDualStatusColor(status.status)[0]); setAttribute(border, "stroke", getGenericDualStatusColor(status.status)[1]); if(status.state != PvvStatus.STATE_OFF) { SVGElement textObject = status.speed >= 100 ? textOver100 : textUnder100; setText(textObject, String.valueOf(status.speed) ); setAttribute(textObject, "display", "inline", 999); } switch (status.status) { case PvvStatus.STATUS_OFFLINE: case PvvStatus.STATUS_UNKNOWN: setAttribute(alarm, "display", "none",999); setAttribute(textOver100, "display", "none",999); setAttribute(textUnder100, "display", "none",999); break; } } // private static String[] getGenericDualStatusColor(int status) { String color1 = "#FF00FF"; String color2 = "#7C007C"; switch (status) { case DeviceStatus.STATUS_ONLINE: color1 = "#00FF00"; color2 = "#007C00"; break; case DeviceStatus.STATUS_WARNING: color1 = "#FFFF00"; color2 = "#7C7C00"; break; case DeviceStatus.STATUS_ALARM: color1 = "#FF0000"; color2 = "#7C0000"; break; case DeviceStatus.STATUS_INVALID: color1 = "#B97A57"; color2 = "#5A3B2A"; break; case DeviceStatus.STATUS_DISABLE: color1 = "#7C7C7C"; color2 = "#3E3E3E"; break; case DeviceStatus.STATUS_SIMULATION: color1 = "#0000FF"; color2 = "#00007C"; break; case DeviceStatus.STATUS_OFFLINE: color1 = "#FF00FF"; color2 = "#7C007C"; break; case DeviceStatus.STATUS_UNKNOWN: color1 = "#FF00FF"; color2 = "#7C007C"; break; } return new String[] {color1, color2}; } }