| | |
| | | import art.library.model.devices.signalsboard.SignalsBoard; |
| | | import art.library.model.devices.signalsboard.status.SignalStatus; |
| | | import art.library.model.devices.vms.asf.Asf; |
| | | import art.library.model.devices.vms.asf.AsfStatus; |
| | | 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.math.BigDecimal; |
| | | import java.util.*; |
| | | import java.util.stream.Stream; |
| | | |
| | | public class VigicatCUC extends DeviceGraphicsRuntime |
| | | { |
| | | private static final double rowWidth = 6; |
| | | |
| | | private double rowHeightBetweenLines = 20; |
| | | |
| | | private final HashMap<SVGElement,Runnable> mapRunnableElements = new HashMap(); |
| | | private final HashMap<SVGElement, double[]> mapTopCoordinates = new HashMap(); |
| | |
| | | super(diagram); |
| | | } |
| | | |
| | | public void status() |
| | | { |
| | | public void status(){ |
| | | |
| | | getElementsContainingField("art.loadglobalinfo").stream().forEach(this::loadGlobalInfo); |
| | | getElementsContainingField("art.device").stream().forEach(this::refreshElement); |
| | | getElementsContainingField("art.signal").stream().forEach(this::refreshElement); |
| | | getElementsContainingField("art.signal.etd").stream().forEach(this::updateEtdNode); |
| | |
| | | } catch (Exception e){} |
| | | } |
| | | |
| | | //<editor-fold defaultstate="collapsed" desc="ASF"> |
| | | public void status(Asf svgDevice, SVGElement element) |
| | | { |
| | | DeviceStatus status = svgDevice.getDeviceStatus(); |
| | | public void status(Asf svgDevice, SVGElement element) { |
| | | AsfStatus status = svgDevice.getDeviceStatus(); |
| | | |
| | | SVGElement background = getChildContainingField(element, "art.id", "Background"); |
| | | SVGElement border = getChildContainingField(element, "art.id", "Border"); |
| | | SVGElement alarm = getChildContainingField(element, "art.id", "Alarm"); |
| | | SVGElement arrow = getChildContainingField(element, "art.id", "Arrow"); |
| | | SVGElement cross = getChildContainingField(element, "art.id", "Cross"); |
| | | SVGElement right = getChildContainingField(element, "art.id", "Right"); |
| | | SVGElement left = getChildContainingField(element, "art.id", "Left"); |
| | | SVGElement textBUS = getChildContainingField(element, "art.id", "textBUS"); |
| | | SVGElement left_lane_closed = getChildContainingField(element, "art.id", "left-lane-closed"); |
| | | |
| | | setAttribute(background, "fill", getGenericDualStatusColor(status.status)[0]); |
| | | setAttribute(border, "stroke", getGenericDualStatusColor(status.status)[1]); |
| | | |
| | | setAttribute(alarm, "display", "none", 999); |
| | | setAttribute(arrow, "display", "none", 999); |
| | | setAttribute(cross, "display", "none", 999); |
| | | setAttribute(right, "display", "none", 999); |
| | | setAttribute(left, "display", "none", 999); |
| | | setAttribute(textBUS, "display", "none", 999); |
| | | |
| | | if (left_lane_closed != null) |
| | | setAttribute(left_lane_closed, "display", "none", 999); |
| | | |
| | | boolean knownStatus = status.status != DeviceStatus.STATUS_OFFLINE && status.status != DeviceStatus.STATUS_UNKNOWN; |
| | | |
| | | if (knownStatus) { |
| | | setAttribute(arrow, "display", status.state == AsfStatus.STATE_ARROW ? "inline" : "none", 999); |
| | | setAttribute(cross, "display", status.state == AsfStatus.STATE_CROSS ? "inline" : "none", 999); |
| | | setAttribute(right, "display", status.state == AsfStatus.STATE_RIGHT ? "inline" : "none", 999); |
| | | setAttribute(left, "display", status.state == AsfStatus.STATE_LEFT ? "inline" : "none", 999); |
| | | setAttribute(textBUS, "display", status.state == AsfStatus.STATE_BUS ? "inline" : "none", 999); |
| | | |
| | | if(status.state == AsfStatus.STATE_S52_LEFT && left_lane_closed != null) |
| | | setAttribute(left_lane_closed, "display", "inline", 999); |
| | | } |
| | | |
| | | String colorBackground = "#000000"; |
| | | String colorAlarm = "#000000"; |
| | | |
| | | switch (status.status){ |
| | | case DeviceStatus.STATUS_ALARM: |
| | | colorAlarm = "#FF0000"; |
| | | break; |
| | | case DeviceStatus.STATUS_OFFLINE: |
| | | case DeviceStatus.STATUS_UNKNOWN: |
| | | colorBackground = "#FF00FF"; |
| | | colorAlarm = "#800080"; |
| | | break; |
| | | } |
| | | |
| | | setAttribute(border, "stroke", colorAlarm, 999); |
| | | setAttribute(background, "fill", colorBackground, 999); |
| | | |
| | | } |
| | | //</editor-fold> |
| | | |
| | | //<editor-fold defaultstate="collapsed" desc="ASF"> |
| | | /* public void status(Asf svgDevice, SVGElement element) throws Exception{ |
| | | AsfStatus status = svgDevice.getDeviceStatus(); |
| | | |
| | | SVGElement alarm = getChildContainingField(element, "art.id", "Alarm"); |
| | | SVGElement border = getChildContainingField(element, "art.id", "Border"); |
| | | SVGElement background = getChildContainingField(element, "art.id", "Background"); |
| | | SVGElement arrow = getChildContainingField(element, "art.id", "Arrow"); |
| | | SVGElement cross = getChildContainingField(element, "art.id", "Cross"); |
| | | SVGElement right = getChildContainingField(element, "art.id", "Right"); |
| | | SVGElement left = getChildContainingField(element, "art.id", "Left"); |
| | | SVGElement textBUS = getChildContainingField(element, "art.id", "textBUS"); |
| | | SVGElement left_lane_closed = getChildContainingField(element, "art.id", "left-lane-closed"); |
| | | |
| | | setAttribute(alarm, "display", "none", 999); |
| | | setAttribute(arrow, "display", "none", 999); |
| | | setAttribute(cross, "display", "none", 999); |
| | | setAttribute(right, "display", "none", 999); |
| | | setAttribute(left, "display", "none", 999); |
| | | setAttribute(textBUS, "display", "none", 999); |
| | | |
| | | if(left_lane_closed != null) |
| | | setAttribute(left_lane_closed, "display", "none", 999); |
| | | |
| | | boolean knownStatus = status.status != DeviceStatus.STATUS_OFFLINE && status.status != DeviceStatus.STATUS_UNKNOWN; |
| | | |
| | | if (knownStatus) { |
| | | setAttribute(arrow, "display", status.state == AsfStatus.STATE_ARROW ? "inline" : "none", 999); |
| | | setAttribute(cross, "display", status.state == AsfStatus.STATE_CROSS ? "inline" : "none", 999); |
| | | setAttribute(right, "display", status.state == AsfStatus.STATE_RIGHT ? "inline" : "none", 999); |
| | | setAttribute(left, "display", status.state == AsfStatus.STATE_LEFT ? "inline" : "none", 999); |
| | | setAttribute(textBUS, "display", status.state == AsfStatus.STATE_BUS ? "inline" : "none", 999); |
| | | |
| | | if(status.state == AsfStatus.STATE_S52_LEFT && left_lane_closed != null) |
| | | setAttribute(left_lane_closed, "display", "inline", 999); |
| | | } |
| | | |
| | | String colorBackground = "#000000"; |
| | | String colorAlarm = "#000000"; |
| | | |
| | | switch (status.status){ |
| | | case DeviceStatus.STATUS_ALARM: |
| | | colorAlarm = "#FF0000"; |
| | | break; |
| | | case DeviceStatus.STATUS_OFFLINE: |
| | | case DeviceStatus.STATUS_UNKNOWN: |
| | | colorBackground = "#FFFFFF"; |
| | | colorAlarm = "#800080"; |
| | | break; |
| | | } |
| | | |
| | | setAttribute(border, "stroke", colorAlarm, 999); |
| | | setAttribute(background, "fill", colorBackground, 999); |
| | | |
| | | }*/ |
| | | //</editor-fold> |
| | | |
| | | //<editor-fold defaultstate="collapsed" desc="SignalBoard"> |
| | |
| | | boolean hasAlarm = svgDevice.getAlarm(signal.name) > 0; |
| | | |
| | | setText(element, signalValueNumber.intValue() + ""); |
| | | setAttribute(element, "fill", hasAlarm ? "#db3939" : "#78e678", 999); |
| | | setAttribute(element, "fill", hasAlarm ? "#db3939" : "#000000", 999); |
| | | setAttribute(element, "fill-opacity", 1, 999); |
| | | } |
| | | //</editor-fold> |
| | |
| | | { |
| | | try |
| | | { |
| | | |
| | | Pvv svgDevice = (Pvv) Shared.model.modelDevices.getDevice(getAttribute(element, "art.device")); |
| | | SignalsBoard signalsBoard = (SignalsBoard) Shared.model.modelDevices.getDevice(getAttribute(element, "art.algorithm")); |
| | | |
| | | if (signalsBoard != null) |
| | | { |
| | | SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(element, "art.signal")); |
| | | SignalStatus signalAlgorithmState = signalsBoard.getDeviceStatus().getSignalInput("state-algorithm-dynamic"); |
| | | if (signalAlgorithmState.value == null) signalAlgorithmState.value = "false"; |
| | | boolean algorithmState = Boolean.parseBoolean(signalAlgorithmState.value); |
| | | if (signal != null) |
| | | { |
| | | boolean automatico = Boolean.parseBoolean(signal.value); |
| | | setAttribute(element, "fill", (automatico && algorithmState) ? "#e6d69040" : "#e0893351"); //si se fija la velocidad |
| | | } |
| | | } |
| | | |
| | | if (!mapTopCoordinates.containsKey(element)) |
| | | { |
| | | mapTopCoordinates.put(element, new double[]{element.getPresAbsolute("y").getDoubleValue() + rowWidth, element.getPresAbsolute("height").getDoubleValue()}); |
| | | mapTopCoordinates.put(element, new double[]{element.getPresAbsolute("y").getDoubleValue() + rowHeightBetweenLines, element.getPresAbsolute("height").getDoubleValue()}); |
| | | } |
| | | |
| | | double baseY = mapTopCoordinates.get(element)[0]; |
| | |
| | | final int speed = svgDevice.getDeviceStatus().speed; |
| | | final double verticalOffset = getVerticalOffset(element, speed); |
| | | |
| | | |
| | | Optional<SVGElement> lineElement1 = getElementsContainingField("art.speed.line").stream() |
| | | .filter(val -> getAttribute(val, "art.signal").replace("-maximum-speed", "").equalsIgnoreCase(svgDevice.getIdentifier())) |
| | | .findAny(); |
| | | |
| | | String nominalSpeed = ""; |
| | | |
| | | if(lineElement1.isPresent()) |
| | | { |
| | | SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(lineElement1.get(), "art.signal")); |
| | | nominalSpeed = signal.value; |
| | | if (signal != null) |
| | | { |
| | | try |
| | | { |
| | | setAttribute(lineElement1.get(), "y1", getVerticalOffset(element, Integer.parseInt(signal.value))); |
| | | setAttribute(lineElement1.get(), "y2", getVerticalOffset(element, Integer.parseInt(signal.value))); |
| | | setAttribute(lineElement1.get(), "stroke", "#646a73"); |
| | | |
| | | update(lineElement1.get()); |
| | | } |
| | | catch (Exception ex){} |
| | | } |
| | | } |
| | | |
| | | Optional<SVGElement> lineElement2 = getElementsContainingField("art.speed.line").stream() |
| | | .filter(val -> getAttribute(val, "art.signal").replace("-nominal-speed", "").equalsIgnoreCase(svgDevice.getIdentifier())) |
| | | .findAny(); |
| | | |
| | | if(lineElement2.isPresent()) |
| | | { |
| | | SignalStatus signal = signalsBoard.getDeviceStatus().getSignal(getAttribute(lineElement2.get(), "art.signal")); |
| | | |
| | | if (signal != null) |
| | | { |
| | | try |
| | | { |
| | | setAttribute(lineElement2.get(), "y1", getVerticalOffset(element, Integer.parseInt(signal.value))); |
| | | setAttribute(lineElement2.get(), "y2", getVerticalOffset(element, Integer.parseInt(signal.value))); |
| | | setAttribute(lineElement2.get(), "stroke", "#646a73"); |
| | | |
| | | if(signal.value != null && signal.value.equals(nominalSpeed) == false) |
| | | { |
| | | setAttribute(lineElement1.get(), "stroke", "#fa0000"); |
| | | } |
| | | |
| | | update(lineElement2.get()); |
| | | } |
| | | catch (Exception ex){} |
| | | } |
| | | } |
| | | |
| | | setAttribute(element, "height", Math.abs(baseY - verticalOffset)); |
| | | setAttribute(element, "y", verticalOffset); |
| | | update(element); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | |
| | | } |
| | | |
| | | private void loadGlobalInfo(SVGElement element) |
| | | { |
| | | try |
| | | { |
| | | |
| | | if("LineSpeedInfo".equals(getAttribute(element, "art.loadglobalinfo"))) |
| | | { |
| | | rowHeightBetweenLines = Double.parseDouble(getAttribute(element, "art.heightbetweenlines")); |
| | | } |
| | | |
| | | } catch (Exception ex) |
| | | { |
| | | } |
| | |
| | | } |
| | | //</editor-fold> |
| | | |
| | | |
| | | |
| | | //<editor-fold defaultstate="collapsed" desc="Etd's"> |
| | | private void updateEtdNode(SVGElement element) |
| | | { |
| | |
| | | { |
| | | final double baseValue = mapTopCoordinates.get(element)[0]; |
| | | |
| | | return baseValue - (rowWidth * (value / 10)); |
| | | return baseValue - (rowHeightBetweenLines * (value / 10)); |
| | | } |
| | | |
| | | private void updateNodeLinePosition(SVGElement element) |