From fa4142b4b85085f092533dd54097d3c4efbf5441 Mon Sep 17 00:00:00 2001 From: Steffen van den Driest <35229971+Stef3st@users.noreply.github.com> Date: Mon, 15 Jan 2024 11:47:34 +0100 Subject: [PATCH] feat(104): implement enc cdc support (#1391) * feat(104): implement enc cdc support Signed-off-by: Stef3st * chore: add automatic ti selection Signed-off-by: Stef3st * chore: tidy up if statement Signed-off-by: Stef3st * chore: removed dupliceate imports Signed-off-by: Stef3st --------- Signed-off-by: Stef3st Co-authored-by: Juan Munoz Co-authored-by: Pascal Wilbrink --- .../src/editors/protocol104/foundation/cdc.ts | 29 +++++++++++++ .../protocol104/wizards/createAddresses.ts | 24 +++++++++++ .../wizards/createAddresses.test.ts | 41 +++++++++++++++++++ .../protocol104/wizards/selectDo.test.ts | 4 +- 4 files changed, 97 insertions(+), 1 deletion(-) diff --git a/packages/open-scd/src/editors/protocol104/foundation/cdc.ts b/packages/open-scd/src/editors/protocol104/foundation/cdc.ts index ddcd428e0..82168581c 100644 --- a/packages/open-scd/src/editors/protocol104/foundation/cdc.ts +++ b/packages/open-scd/src/editors/protocol104/foundation/cdc.ts @@ -39,6 +39,7 @@ export const supportedCdcTypes = [ 'CMV', 'DPC', 'DPS', + 'ENC', 'ENG', 'ENS', 'INC', @@ -257,6 +258,34 @@ export const cdcProcessings: Record< }, control: {}, }, + ENC: { + monitor: { + '30': { + daPaths: [{ path: ['stVal'] }], + create: createAddressAction, + inverted: true, + }, + '35': { + daPaths: [{ path: ['stVal'] }], + create: createAddressAction, + inverted: false, + }, + }, + control: { + '58': { + daPaths: [{ path: ['Oper', 'ctlVal'] }], + create: createAddressWithExpectValueAction, + checkDaPaths: [{ path: ['Oper', 'Check'] }], + checkCreate: createCheckAddressAction, + }, + '62': { + daPaths: [{ path: ['Oper', 'ctlVal'] }], + create: createAddressWithExpectValueAction, + checkDaPaths: [{ path: ['Oper', 'Check'] }], + checkCreate: createCheckAddressAction, + }, + }, + }, ENG: { monitor: { '58': { diff --git a/packages/open-scd/src/editors/protocol104/wizards/createAddresses.ts b/packages/open-scd/src/editors/protocol104/wizards/createAddresses.ts index a65d8b06d..a5fda3070 100644 --- a/packages/open-scd/src/editors/protocol104/wizards/createAddresses.ts +++ b/packages/open-scd/src/editors/protocol104/wizards/createAddresses.ts @@ -11,6 +11,7 @@ import '@material/mwc-switch'; import '../../../wizard-textfield.js'; import '../../../WizardDivider.js'; +import { WizardSelect } from '../../../wizard-select.js'; import { ComplexAction, @@ -214,6 +215,25 @@ export function createAddressesWizard( ); } + function setMonitorControlValue( + e: SelectedEvent, + isMonitor: boolean + ): void { + const selectedTi = (e.target).parentElement!.querySelector( + `wizard-select[label="${counterType}"]` + ) as WizardSelect; + + availableTis.maybeValue = isMonitor + ? selectedTi === '30' + ? '58' + : '62' + : selectedTi === '58' + ? '30' + : '35'; + } + // Add the basic fields to the list. const fields = [ html` { setMonitorInvertedSwitch(e); + if (cdc === 'ENC') setMonitorControlValue(e, true); }} > ${monitorTis.map( @@ -334,6 +355,9 @@ export function createAddressesWizard( helper="${translate('protocol104.wizard.controlTiHelper')}" fixedMenuPosition required + @selected=${(e: SelectedEvent) => { + if (cdc === 'ENC') setMonitorControlValue(e, false); + }} > ${controlTis.map( controlTi => diff --git a/packages/open-scd/test/unit/editors/protocol104/wizards/createAddresses.test.ts b/packages/open-scd/test/unit/editors/protocol104/wizards/createAddresses.test.ts index cd73265e0..f6781aaaa 100644 --- a/packages/open-scd/test/unit/editors/protocol104/wizards/createAddresses.test.ts +++ b/packages/open-scd/test/unit/editors/protocol104/wizards/createAddresses.test.ts @@ -121,6 +121,47 @@ describe('Wizards for preparing 104 Address Creation', () => { }); }); + describe('show prepare 104 Address creation with enc cdc value', () => { + let monitorTi: WizardSelect; + let controlTi: WizardSelect; + + beforeEach(async () => { + await prepareWizard( + 'IED[name="B1"] LN[lnType="SE_GGIO_SET_V002"]', + 'Mod' + ); + const cdc = element.wizardUI.dialog!.querySelector( + 'wizard-textfield[label="Common Data Class"]' + ) as WizardTextField; + expect(cdc).to.exist; + expect(cdc.maybeValue).to.equal('ENC'); + monitorTi = element.wizardUI.dialog!.querySelector( + 'wizard-select[label="monitorTi"]' + ) as WizardSelect; + controlTi = element.wizardUI.dialog!.querySelector( + 'wizard-select[label="controlTi"]' + ) as WizardSelect; + expect(monitorTi).to.exist; + expect(controlTi).to.exist; + }); + it('controlTi should change to correct value when selecting monitorTi', async () => { + monitorTi.value = '30'; + await element.requestUpdate(); + expect(controlTi.maybeValue).to.equal('58'); + monitorTi.value = '35'; + await element.requestUpdate(); + expect(controlTi.maybeValue).to.equal('62'); + }); + it('monitorTi should change to correct value when selecting controlTi', async () => { + controlTi.value = '58'; + await element.requestUpdate(); + expect(monitorTi.maybeValue).to.equal('30'); + controlTi.value = '62'; + await element.requestUpdate(); + expect(monitorTi.maybeValue).to.equal('35'); + }); + }); + describe('show prepare 104 Address creation (single monitor TI with CtlModel)', () => { beforeEach(async () => { await prepareWizard( diff --git a/packages/open-scd/test/unit/editors/protocol104/wizards/selectDo.test.ts b/packages/open-scd/test/unit/editors/protocol104/wizards/selectDo.test.ts index dab7807dd..ebdae3580 100644 --- a/packages/open-scd/test/unit/editors/protocol104/wizards/selectDo.test.ts +++ b/packages/open-scd/test/unit/editors/protocol104/wizards/selectDo.test.ts @@ -70,13 +70,15 @@ describe('data model nodes child getter', () => { 'IED[name="B1"] LDevice[inst="LD0"] > LN0[lnClass="LLN0"]' )!; expect(getDataChildren(parent)).to.not.be.empty; - expect(getDataChildren(parent).length).to.equal(3); + expect(getDataChildren(parent).length).to.equal(4); expect(getDataChildren(parent)[0].tagName).to.be.equal('DO'); expect(getDataChildren(parent)[0]).to.have.attribute('name', 'Beh'); expect(getDataChildren(parent)[1].tagName).to.be.equal('DO'); expect(getDataChildren(parent)[1]).to.have.attribute('name', 'Health'); expect(getDataChildren(parent)[2].tagName).to.be.equal('DO'); expect(getDataChildren(parent)[2]).to.have.attribute('name', 'MltLev'); + expect(getDataChildren(parent)[3].tagName).to.be.equal('DO'); + expect(getDataChildren(parent)[3]).to.have.attribute('name', 'Mod'); }); });