package Parking; import art.library.model.devices.Device; import art.library.model.devices.DeviceCommands; import art.library.model.devices.DeviceGraphicsRuntime; import art.library.model.devices.DeviceStatus; import com.kitfox.svg.SVGDiagram; public class Group extends DeviceGraphicsRuntime { public Group(art.library.model.devices.Device device, SVGDiagram diagram) { super(device, diagram); } public void status() { getElementsContainingField("art.signal").stream().forEach(this::processSignal); getElementsContainingField("art.signal.required").stream().forEach(this::processRequiredSignal); getElementsContainingField("art.binary.signal").stream().forEach(this::processBinaryInout); getElementsContainingField("art.gauge").stream().forEach(this::processGauge); getElementsContainingField("art.horizontalbar.signal").stream().forEach(this::processHorizontalBar); getElementsContainingField("art.verticalbar.signal").stream().forEach(this::processVerticalBar); getElementsContainingField("art.translate").stream().forEach(this::translateTexts); } private void processVerticalBar(com.kitfox.svg.SVGElement element) { try { java.util.Optional device = getDeviceOpt(); setAttribute(element, "y", 0); setAttribute(element, "height", 0); if (device.isPresent()) { art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.verticalbar.signal")); com.kitfox.svg.SVGElement topReference = getElement(getAttribute(element, "art.top.reference")); com.kitfox.svg.SVGElement bottomReference = getElement(getAttribute(element, "art.bottom.reference")); float signalValue = (float) Float.valueOf(signal.value); float maxValue = topReference.getPresAbsolute("art.value").getFloatValue(); float minValue = bottomReference.getPresAbsolute("art.value").getFloatValue(); if (minValue < 0) { signalValue += (minValue * -1); maxValue += (minValue * -1); minValue = 0; } float topYCoord = topReference.getPresAbsolute("y").getFloatValue(); float bottomYCoord = bottomReference.getPresAbsolute("y").getFloatValue(); if (signalValue >= minValue) { signalValue -= minValue; float totalSteps = Math.abs(topYCoord - bottomYCoord); float stepValue = totalSteps / maxValue; float newValue = (float) (signalValue * stepValue); float newYCoord = bottomYCoord - newValue; float newHeight = Math.abs(newYCoord - bottomYCoord); setAttribute(element, "y", newYCoord); setAttribute(element, "height", newHeight); } } update(element); } catch (Exception ex) { } } private void processHorizontalBar(com.kitfox.svg.SVGElement element) { try { java.util.Optional device = getDeviceOpt(); setAttribute(element, "width", 0); if (device.isPresent()) { art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.horizontalbar.signal")); com.kitfox.svg.SVGElement rightReference = getElement(getAttribute(element, "art.right.reference")); com.kitfox.svg.SVGElement leftReference = getElement(getAttribute(element, "art.left.reference")); int signalValue = (int) Integer.valueOf(signal.value); int maxValue = rightReference.getPresAbsolute("art.value").getIntValue(); int minValue = leftReference.getPresAbsolute("art.value").getIntValue(); int rightXCoord = rightReference.getPresAbsolute("x").getIntValue(); int leftXCoord = element.getPresAbsolute("x").getIntValue(); if (signalValue >= minValue) { signalValue -= minValue; float totalSteps = Math.abs(rightXCoord - leftXCoord); float stepValue = totalSteps / (maxValue - minValue); int newValue = (int) (signalValue * stepValue); setAttribute(element, "width", newValue); } } update(element); } catch (Exception ex) { } } private void processGauge(com.kitfox.svg.SVGElement element) { try { java.util.Optional device = getDeviceOpt(); if (!device.isPresent()) { return; } final int initAngle = 255; final int endAnggle = 520; final float maxValue = element.getPresAbsolute("art.gauge.maxvalue").getFloatValue(); final float minValue = element.getPresAbsolute("art.gauge.minvalue").getFloatValue(); final float availableRange = Math.abs(initAngle - endAnggle); art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.gauge")); float signalValue = Float.valueOf(signal.value); if (signalValue > maxValue || signalValue < minValue) { signalValue = 0; } com.kitfox.svg.SVGElement pivot_reference = getElement(getAttribute(element, "art.gauge.reference")); float newAngle = (availableRange / maxValue) * signalValue; float cy = pivot_reference.getPresAbsolute("cy").getFloatValue(); float cx = pivot_reference.getPresAbsolute("cx").getFloatValue(); String transform = "rotate(%angle,%cx,%cy)".replace("%angle", String.valueOf(initAngle + newAngle)).replace("%cx", String.valueOf(cx)).replace("%cy", String.valueOf(cy)); setAttribute(element, "transform", transform); update(element); } catch (Exception ex) { } } private void processBinaryInout(com.kitfox.svg.SVGElement element) { try { final String falseColor = "#808080"; final String trueColor = "#ff5a00"; com.kitfox.svg.SVGElement backgroundElement = element.getChild(0); com.kitfox.svg.SVGElement textElement = element.getChild(1); setAttribute(backgroundElement, "fill", falseColor); setText(textElement, "?"); java.util.Optional device = getDeviceOpt(); if (device.isPresent()) { art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.binary.signal")); setAttribute(backgroundElement, "fill", "false".equals(signal.value) ? falseColor : trueColor); setText(textElement, ""); } update(element); } catch (Exception ex) { } } private void processSignal(com.kitfox.svg.SVGElement element) { try { java.util.Optional device = getDeviceOpt(); if (!device.isPresent()) { setText(element, ""); } else { art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.signal")); String value = signal.value; if (element.hasAttribute("art.units", com.kitfox.svg.animation.AnimationElement.AT_AUTO)) { value += signal.units; } else if (element.hasAttribute("art.timestamp", com.kitfox.svg.animation.AnimationElement.AT_AUTO)) { value = getTimeddHHMMSS(Long.valueOf(value)); } setText(element, value); } update(element); } catch (Exception ex) { } } private void processRequiredSignal(com.kitfox.svg.SVGElement element) { try { java.util.Optional device = getDeviceOpt(); if (!device.isPresent()) { setText(element, ""); } else { art.library.model.devices.signalsboard.status.SignalStatus signal = device.get().getDeviceStatus().getSignal(getAttribute(element, "art.signal.required")); String value = signal.value; String requiredValue = getAttribute(element, "art.signal.required.value"); setAttribute(element, "fill", value.equals(requiredValue) ? "#34c734" : "#dddddd", 999); } update(element); } catch (Exception ex) { } } private void translateTexts(com.kitfox.svg.SVGElement element) { try { setText(element, art.client.models.Shared.getMessage(getText(element))); } catch (Exception ex) { } } private java.util.Optional getDeviceOpt() { java.util.Optional deviceOpt = java.util.Optional.empty(); try { com.kitfox.svg.SVGElement metadata = getElement("Metadata"); String deviceIdentifier = getAttribute(metadata, "art.device"); deviceOpt = java.util.Optional.of((T) art.client.models.Shared.model.modelDevices.getDevice(deviceIdentifier)); } catch (Exception ex) { } return deviceOpt; } private String getTimeddHHMMSS(long timestamp) { java.text.DecimalFormat format = new java.text.DecimalFormat("00"); timestamp = timestamp * 1000; if (timestamp < 0) { return ""; } long difference = timestamp; int dias = (int) (difference / 86400000L); int horas = (int) ((difference - (dias * 86400000L)) / 3600000L); int minutos = (int) ((difference - (dias * 86400000L) - (horas * 3600000L)) / 60000L); int segundos = (int) ((difference - (dias * 86400000L) - (horas * 3600000L) - (minutos * 60000L)) / 1000L); String result = ""; result = result + format.format(minutos) + ":"; result = result + format.format(segundos); return result.trim(); } }