From b80e27340c541c8d6750a0f0e56e0a42d35be96e Mon Sep 17 00:00:00 2001 From: massifben <105049157+massifben@users.noreply.github.com> Date: Mon, 16 Dec 2024 16:47:21 +0100 Subject: [PATCH] WIP --- .../sct/commons/LNodeStatusService.java | 91 ++++++++++++ .../compas/sct/commons/LnService.java | 86 +++++------ .../sct/commons/LNodeStatusServiceTest.java | 41 +++++ .../compas/sct/commons/LnServiceTest.java | 38 ++--- .../resources/scl-lnodestatus/lnodestatus.scd | 140 ++++++++++++++++++ 5 files changed, 328 insertions(+), 68 deletions(-) create mode 100644 sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java create mode 100644 sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java create mode 100644 sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java new file mode 100644 index 000000000..b53cecb05 --- /dev/null +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LNodeStatusService.java @@ -0,0 +1,91 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.apache.commons.lang3.StringUtils; +import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.scl2007b4.model.TAnyLN; +import org.lfenergy.compas.scl2007b4.model.TBaseElement; +import org.lfenergy.compas.scl2007b4.model.TPredefinedBasicTypeEnum; +import org.lfenergy.compas.sct.commons.domain.DataAttribute; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDa; +import org.lfenergy.compas.sct.commons.domain.DoLinkedToDaFilter; +import org.lfenergy.compas.sct.commons.dto.SclReportItem; +import org.lfenergy.compas.sct.commons.util.CommonConstants; + +import java.util.List; +import java.util.Optional; + +public class LNodeStatusService { + + private final LnService lnService = new LnService(); + private final DataTypeTemplatesService dataTypeTemplatesService = new DataTypeTemplatesService(); + + public List updateLnModStValBasedOnLNodeStatus(SCL scl) { + scl.getSubstation().stream() + .flatMap(tSubstation -> tSubstation.getVoltageLevel().stream()) + .flatMap(tVoltageLevel -> tVoltageLevel.getBay().stream()) + .flatMap(tBay -> tBay.getFunction().stream()) + .flatMap(tFunction -> tFunction.getLNode().stream()) + .map(tlNode -> { + String lNodeLnodeStatus = extractStringPrivate(tlNode, "COMPAS-LNodeStatus") + .orElseThrow(); // FIXME + TAnyLN tAnyLN = findLn(scl, tlNode.getIedName(), tlNode.getLdInst(), tlNode.getLnClass().getFirst(), tlNode.getLnInst(), tlNode.getPrefix()) + .orElseThrow();// FIXME + String lnLNodeStatus = extractStringPrivate(tAnyLN, "COMPAS-LNodeStatus") + .orElseThrow(); + switch (lNodeLnodeStatus) { + case "on" -> { + if (lnLNodeStatus.contains("on")) { + // Met à jour Mod stVal s'il existe + lnService.getDaiModStVal(tAnyLN) + .ifPresent(tdai -> { + + dataTypeTemplatesService.findDoLinkedToDa(scl.getDataTypeTemplates(), tAnyLN.getLnType(), DoLinkedToDaFilter.from(CommonConstants.MOD_DO_NAME, CommonConstants.STVAL_DA_NAME)) + .map(DoLinkedToDa::dataAttribute) + .filter(dataAttribute -> TPredefinedBasicTypeEnum.ENUM.equals(dataAttribute.getBType())) + .map(DataAttribute::getType); + }); + } else { + // erreur // FIXME + } + } + case "of" -> { + if (lnLNodeStatus.contains("off")) { + // Met à jour Mod stVal s'il existe + } else { + // erreur // FIXME + } + } + default -> { + // erreur // FIXME + } + } + return null; + } + ); + + return List.of(); + } + + private static Optional extractStringPrivate(TBaseElement tBaseElement, String privateType) { + return tBaseElement.getPrivate().stream() + .filter(tPrivate -> privateType.equals(tPrivate.getType())) + .flatMap(tPrivate -> tPrivate.getContent().stream()) + .filter(String.class::isInstance) + .map(String.class::cast) + .filter(StringUtils::isNotBlank) + .findFirst(); + } + + private Optional findLn(SCL scl, String iedName, String ldInst, String lnClass, String lnInst, String prefix) { + return scl.getIED().stream() + .filter(tied -> iedName.equals(tied.getName())) + .findFirst() + .flatMap(tied -> new LdeviceService().findLdevice(tied, tlDevice -> ldInst.equals(tlDevice.getInst()))) + .flatMap(tlDevice -> lnService.findAnyLn(tlDevice, tAnyLN -> lnService.matchesLn(tAnyLN, lnInst, lnClass, prefix))); + + } +} diff --git a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java index 2ccad6508..50d55c585 100644 --- a/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java +++ b/sct-commons/src/main/java/org/lfenergy/compas/sct/commons/LnService.java @@ -12,7 +12,6 @@ import org.lfenergy.compas.sct.commons.util.ActiveStatus; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.function.Predicate; @@ -60,33 +59,37 @@ public Optional findLn(TLDevice tlDevice, Predicate lnPredicate) { * @return the Lnode Status */ public ActiveStatus getLnStatus(TAnyLN tAnyLN, LN0 ln0) { - Optional ln0Status = getDaiModStval(ln0); - return getDaiModStval(tAnyLN).filter(ActiveStatus.OFF::equals).orElseGet(() -> ln0Status.orElse(ActiveStatus.OFF)); + Optional ln0Status = getDaiModStValValue(ln0); + return getDaiModStValValue(tAnyLN).filter(ActiveStatus.OFF::equals).orElseGet(() -> ln0Status.orElse(ActiveStatus.OFF)); } - public Optional getDaiModStval(TAnyLN tAnyLN) { + public Optional getDaiModStValValue(TAnyLN tAnyLN) { + return getDaiModStVal(tAnyLN) + .stream() + .flatMap(tdai -> tdai.getVal().stream()) + .map(TVal::getValue) + .findFirst() + .map(ActiveStatus::fromValue); + } + + public Optional getDaiModStVal(TAnyLN tAnyLN) { return tAnyLN .getDOI() .stream() .filter(tdoi -> MOD_DO_NAME.equals(tdoi.getName())) - .findFirst() - .flatMap(tdoi -> tdoi.getSDIOrDAI() - .stream() - .filter(dai -> dai.getClass().equals(TDAI.class)) - .map(TDAI.class::cast) - .filter(tdai -> STVAL_DA_NAME.equals(tdai.getName())) - .map(TDAI::getVal) - .flatMap(Collection::stream) - .findFirst() - .map(TVal::getValue)) - .map(ActiveStatus::fromValue); + .flatMap(tdoi -> tdoi.getSDIOrDAI().stream()) + .filter(TDAI.class::isInstance) + .map(TDAI.class::cast) + .filter(tdai -> STVAL_DA_NAME.equals(tdai.getName())) + .findFirst(); } + public Stream getActiveLns(TLDevice tlDevice) { LN0 ln0 = tlDevice.getLN0(); Stream tlnStream = tlDevice.getLN() .stream() .filter(tln -> ActiveStatus.ON.equals(getLnStatus(tln, ln0))); - Stream ln0Stream = Stream.of(ln0).filter(ln02 -> getDaiModStval(ln02).map(ActiveStatus.ON::equals).orElse(false)); + Stream ln0Stream = Stream.of(ln0).filter(ln02 -> getDaiModStValValue(ln02).map(ActiveStatus.ON::equals).orElse(false)); return Stream.concat(ln0Stream, tlnStream); } @@ -99,7 +102,7 @@ public Optional getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi return tAnyLN.getDOI().stream().filter(doi -> doi.getName().equals(doLinkedToDaFilter.doName())) .findFirst() .flatMap(doi -> { - if(structNamesList.size() > 1) { + if (structNamesList.size() > 1) { String firstSDIName = structNamesList.removeFirst(); return this.getSdiByName(doi, firstSDIName) .map(intermediateSdi -> findSDIByStructName(intermediateSdi, structNamesList)) @@ -116,7 +119,7 @@ public Optional getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi return Optional.empty(); }) .stream().findFirst(); - } else if(structNamesList.size() == 1){ + } else if (structNamesList.size() == 1) { return doi.getSDIOrDAI().stream() .filter(unNaming -> unNaming.getClass().equals(TDAI.class)) .map(TDAI.class::cast) @@ -129,16 +132,16 @@ public Optional getDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDaFilter doLi @Override public void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedToDa) { - createDoiSdiDaiChainIfNotExists(tAnyLN, doLinkedToDa.getDataObject(), doLinkedToDa.getDataAttribute()) + createDoiSdiDaiChainIfNotExists(tAnyLN, doLinkedToDa.dataObject(), doLinkedToDa.dataAttribute()) .ifPresent(tdai -> { - List daiVals = doLinkedToDa.getDataAttribute().getDaiValues(); - if(!hasSettingGroup(tdai) && daiVals.size() == 1 && daiVals.getFirst().settingGroup() == null) { + List daiVals = doLinkedToDa.dataAttribute().getDaiValues(); + if (!hasSettingGroup(tdai) && daiVals.size() == 1 && daiVals.getFirst().settingGroup() == null) { String value = daiVals.getFirst().val(); tdai.getVal().stream().findFirst() .ifPresentOrElse(tVal -> tVal.setValue(value), () -> tdai.getVal().add(newVal(value))); } else { - for (DaVal daVal: daiVals) { + for (DaVal daVal : daiVals) { tdai.getVal().stream() .filter(tValElem -> tValElem.isSetSGroup() && tValElem.getSGroup() == daVal.settingGroup()) .findFirst() @@ -152,11 +155,11 @@ public void updateOrCreateDOAndDAInstances(TAnyLN tAnyLN, DoLinkedToDa doLinkedT public void completeFromDAInstance(TIED tied, String ldInst, TAnyLN anyLN, DoLinkedToDa doLinkedToDa) { getDOAndDAInstances(anyLN, doLinkedToDa.toFilter()) .ifPresent(tdai -> { - if(tdai.isSetVal()) { - doLinkedToDa.getDataAttribute().addDaVal(tdai.getVal()); + if (tdai.isSetVal()) { + doLinkedToDa.dataAttribute().addDaVal(tdai.getVal()); } - if(doLinkedToDa.getDataAttribute().getFc() == TFCEnum.SG || doLinkedToDa.getDataAttribute().getFc() == TFCEnum.SE) { - if(hasSettingGroup(tdai)) { + if (doLinkedToDa.dataAttribute().getFc() == TFCEnum.SG || doLinkedToDa.dataAttribute().getFc() == TFCEnum.SE) { + if (hasSettingGroup(tdai)) { boolean isIedHasConfSG = tied.isSetAccessPoint() && tied.getAccessPoint().stream() .filter(tAccessPoint -> tAccessPoint.getServer() != null @@ -166,13 +169,13 @@ public void completeFromDAInstance(TIED tied, String ldInst, TAnyLN anyLN, DoLin && tAccessPoint.getServices() != null && tAccessPoint.getServices().getSettingGroups() != null && tAccessPoint.getServices().getSettingGroups().getConfSG() != null); - doLinkedToDa.getDataAttribute().setValImport((!tdai.isSetValImport() || tdai.isValImport()) && isIedHasConfSG); + doLinkedToDa.dataAttribute().setValImport((!tdai.isSetValImport() || tdai.isValImport()) && isIedHasConfSG); } else { - log.warn(String.format("Inconsistency in the SCD file - DAI= %s with fc= %s must have a sGroup attribute", tdai.getName(), doLinkedToDa.getDataAttribute().getFc())); - doLinkedToDa.getDataAttribute().setValImport(false); - } - } else if(tdai.isSetValImport()) { - doLinkedToDa.getDataAttribute().setValImport(tdai.isValImport()); + log.warn(String.format("Inconsistency in the SCD file - DAI= %s with fc= %s must have a sGroup attribute", tdai.getName(), doLinkedToDa.dataAttribute().getFc())); + doLinkedToDa.dataAttribute().setValImport(false); + } + } else if (tdai.isSetValImport()) { + doLinkedToDa.dataAttribute().setValImport(tdai.isValImport()); } }); } @@ -198,22 +201,22 @@ private Optional createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject TDOI doi = tAnyLN.getDOI().stream().filter(doi1 -> doi1.getName().equals(dataObject.getDoName())) .findFirst() - .orElseGet(()-> { + .orElseGet(() -> { TDOI newDOI = new TDOI(); newDOI.setName(dataObject.getDoName()); tAnyLN.getDOI().add(newDOI); return newDOI; }); - if(structInstances.size() > 1){ + if (structInstances.size() > 1) { TSDI firstSDI = findOrCreateSDIFromDOI(doi, structInstances.getFirst()); TSDI lastSDI = findOrCreateSDIByStructName(firstSDI, structInstances); - if(structInstances.size() == 1){ + if (structInstances.size() == 1) { return lastSDI.getSDIOrDAI().stream() .filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class)) .map(TDAI.class::cast) .filter(tdai -> tdai.getName().equals(structInstances.getFirst())) .map(tdai -> { - if(tdai.isSetValImport()) { + if (tdai.isSetValImport()) { tdai.setValImport(dataAttribute.isValImport()); } return tdai; @@ -226,13 +229,13 @@ private Optional createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject return Optional.of(newDAI); }); } - } else if(structInstances.size() == 1){ + } else if (structInstances.size() == 1) { return doi.getSDIOrDAI().stream() .filter(tUnNaming -> tUnNaming.getClass().equals(TDAI.class)) .map(TDAI.class::cast) .filter(tdai -> tdai.getName().equals(structInstances.getFirst())) .map(tdai -> { - if(tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport()); + if (tdai.isSetValImport()) tdai.setValImport(dataAttribute.isValImport()); return tdai; }) .findFirst() @@ -247,7 +250,7 @@ private Optional createDoiSdiDaiChainIfNotExists(TAnyLN tAnyLN, DataObject } private TSDI findSDIByStructName(TSDI tsdi, List sdiNames) { - if(sdiNames.isEmpty()) return tsdi; + if (sdiNames.isEmpty()) return tsdi; return this.getSdiByName(tsdi, sdiNames.getFirst()) .map(sdi1 -> { sdiNames.removeFirst(); @@ -294,14 +297,13 @@ private Optional getSdiByName(TSDI sdi, String sdiName) { } /** - * - * @param sdi TSDI + * @param sdi TSDI * @param structName list start with sdi name * @return already existing TSDI or newly created TSDI from given TSDI */ private TSDI findOrCreateSDIByStructName(TSDI sdi, List structName) { structName.removeFirst(); - if(structName.isEmpty() || structName.size() == 1) return sdi; + if (structName.isEmpty() || structName.size() == 1) return sdi; return findOrCreateSDIByStructName(findOrCreateSDIFromSDI(sdi, structName.getFirst()), structName); } diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java new file mode 100644 index 000000000..42ba782ca --- /dev/null +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LNodeStatusServiceTest.java @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2024 RTE FRANCE +// +// SPDX-License-Identifier: Apache-2.0 + +package org.lfenergy.compas.sct.commons; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.lfenergy.compas.scl2007b4.model.SCL; +import org.lfenergy.compas.sct.commons.dto.SclReportItem; +import org.lfenergy.compas.sct.commons.testhelpers.SclTestMarshaller; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.lfenergy.compas.sct.commons.testhelpers.SclHelper.*; + +class LNodeStatusServiceTest { + + private LNodeStatusService lNodeStatusService; + + @BeforeEach + void setUp() throws Exception { + lNodeStatusService = new LNodeStatusService(); + } + + @Test + void updateLnStatusBasedOnPrivateLNodeStatus_should_succeed() { + // Given + SCL scl = SclTestMarshaller.getSCLFromFile("/scl-lnodestatus/lnodestatus.scd"); + // When + List sclReportItems = lNodeStatusService.updateLnModStValBasedOnLNodeStatus(scl); + // Then + assertThat(sclReportItems).isEmpty(); + assertThat(getValue(findDai(findLn(scl, "IED_NAME_1", "LDEVICE_1", "PDIS", "1", ""), "Mod.stVal"))) + .isEqualTo("on"); + } + + +} diff --git a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java index 8daa222d7..38260e960 100644 --- a/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java +++ b/sct-commons/src/test/java/org/lfenergy/compas/sct/commons/LnServiceTest.java @@ -121,13 +121,13 @@ void getFilteredAnyLns_should_return_lns() { } @Test - void getDaiModStval_should_return_status() { + void getDaiModStValValue_should_return_status() { //Given SCL std = SclTestMarshaller.getSCLFromFile("/std/std_sample.std"); TLDevice tlDevice = std.getIED().getFirst().getAccessPoint().getFirst().getServer().getLDevice().getFirst(); //When - Optional daiModStval = lnService.getDaiModStval(tlDevice.getLN0()); + Optional daiModStval = lnService.getDaiModStValValue(tlDevice.getLN0()); //Then assertThat(daiModStval).contains(ActiveStatus.ON); @@ -212,9 +212,7 @@ void completeFromDataAttributeInstance_should_complete_when_valImport_set_or_not dataObject.setDoName("Do"); DataAttribute dataAttribute = new DataAttribute(); dataAttribute.setDaName("Da"); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); lnService.completeFromDAInstance(tied, "ldInst", tAnyLN, doLinkedToDa); @@ -272,15 +270,13 @@ void completeFromDataAttributeInstance_should_complete_when_settingGroup_set_or_ dataAttribute.setDaName("Da"); dataAttribute.setFc(givenFc); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); lnService.completeFromDAInstance(tied, "ldInst", tAnyLN, doLinkedToDa); //Then - assertThat(doLinkedToDa.getDataAttribute().isValImport()).isEqualTo(expectedValImport); + assertThat(doLinkedToDa.dataAttribute().isValImport()).isEqualTo(expectedValImport); } @@ -294,14 +290,12 @@ void completeFromDataAttributeInstance__should_not_complete_when_not_found() { DataAttribute dataAttribute = new DataAttribute(); dataAttribute.setDaName("Da"); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); lnService.completeFromDAInstance(tied, "ldInst", tAnyLN, doLinkedToDa); //Then - assertThat(doLinkedToDa.getDataAttribute().isValImport()).isFalse();//initialValue + assertThat(doLinkedToDa.dataAttribute().isValImport()).isFalse();//initialValue } @ParameterizedTest @@ -321,15 +315,13 @@ void completeFromDataAttributeInstance_should_complete_when_struct(Boolean input dataAttribute.setDaName("antRef"); dataAttribute.setBdaNames(List.of("bda1","bda2","bda3")); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); lnService.completeFromDAInstance(tied, "ldInst", tAnyLN, doLinkedToDa); //Then - assertThat(doLinkedToDa.getDataAttribute().isValImport()).isEqualTo(expected); + assertThat(doLinkedToDa.dataAttribute().isValImport()).isEqualTo(expected); } @Test @@ -343,9 +335,7 @@ void updateOrCreateDOAndDAInstance_should_create_given_DO_and_DA_instances_when_ dataAttribute.setDaName("stVal"); dataAttribute.getDaiValues().add(new DaVal(1L, "new value")); dataAttribute.getDaiValues().add(new DaVal(2L, "new value 2")); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); lnService.updateOrCreateDOAndDAInstances(tAnyLN, doLinkedToDa); @@ -375,9 +365,7 @@ void updateOrCreateDOAndDAInstance_should_create_given_DO_and_DA_instances_when_ dataAttribute.setDaName("antRef"); dataAttribute.setBdaNames(List.of("bda1")); dataAttribute.getDaiValues().add(new DaVal(null, "new value")); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); @@ -440,9 +428,7 @@ void updateOrCreateDOAndDAInstance_should_complete_DO_and_DA_instances_modificat dataAttribute.setBdaNames(List.of("BdaName1")); dataAttribute.getDaiValues().add(new DaVal(null, "new dai value")); - DoLinkedToDa doLinkedToDa = new DoLinkedToDa(); - doLinkedToDa.setDataObject(dataObject); - doLinkedToDa.setDataAttribute(dataAttribute); + DoLinkedToDa doLinkedToDa = new DoLinkedToDa(dataObject, dataAttribute); //When LnService lnService = new LnService(); diff --git a/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd b/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd new file mode 100644 index 000000000..a982faa69 --- /dev/null +++ b/sct-commons/src/test/resources/scl-lnodestatus/lnodestatus.scd @@ -0,0 +1,140 @@ + + + + + + + + SCD + +
+ + + 90 + + + + on + + + on + + + off + + + off + + + + + on + + + on + + + off + + + off + + + + + + + + + + + + on + + + + + + on;off + + + + + + on + + + + + + on;off + + + + + + off + + + + + + + + + + + + + + + on;off + + + + + + + + on + + + + + + + + on;off + + + + + + + + off + + + + + + + + + + + + + + + + + + + + on + off + test + + +