Skip to content

Commit 971f0c1

Browse files
author
Dennis Labordus
authored
feat(editor/subscriber): Added plugin for Subscriber Logical Nodes (GOOSE/SMV) (openscd#1036)
* Added plugin and show FCDA Elements including edit button * Added plugin and show FCDA Elements including edit button * Added plugin and show FCDA Elements including edit button + renaming other subscriber plugins * Fixed plugin test * Show connected and available LN + small fixes * Processed review comments.
1 parent a8e7859 commit 971f0c1

39 files changed

+3383
-508
lines changed

public/js/plugins.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,15 @@ export const officialPlugins = [
2121
kind: 'editor',
2222
},
2323
{
24-
name: 'Subscriber (GOOSE)',
25-
src: '/src/editors/GooseControlSubscription.js',
24+
name: 'Subscriber Message Binding (GOOSE)',
25+
src: '/src/editors/GooseSubscriberMessageBinding.js',
26+
icon: 'link',
27+
default: true,
28+
kind: 'editor',
29+
},
30+
{
31+
name: 'Subscriber Data Binding (GOOSE)',
32+
src: '/src/editors/GooseSubscriberDataBinding.js',
2633
icon: 'link',
2734
default: true,
2835
kind: 'editor',
@@ -31,12 +38,19 @@ export const officialPlugins = [
3138
name: 'Subscriber Later Binding (GOOSE)',
3239
src: '/src/editors/GooseSubscriberLaterBinding.js',
3340
icon: 'link',
34-
default: false,
41+
default: true,
42+
kind: 'editor',
43+
},
44+
{
45+
name: 'Subscriber Message Binding (SMV)',
46+
src: '/src/editors/SMVSubscriberMessageBinding.js',
47+
icon: 'link',
48+
default: true,
3549
kind: 'editor',
3650
},
3751
{
38-
name: 'Subscriber (SMV)',
39-
src: '/src/editors/SampledValuesSubscription.js',
52+
name: 'Subscriber Data Binding (SMV)',
53+
src: '/src/editors/SMVSubscriberDataBinding.js',
4054
icon: 'link',
4155
default: true,
4256
kind: 'editor',

snowpack.config.mjs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ export default ({
1111
"**/.eslintrc.cjs",
1212
"**/.git/**/*",
1313
"**/.gitignore",
14+
"**/.idea/**/*",
1415
"**/.travis.yml",
1516
"**/package*",
1617
"**/tsconfig.json",
1718
"**/web-test-runner.config.mjs",
1819
"**/node_modules/**/*"
19-
],
20-
});
20+
],
21+
});
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { css, html, LitElement, property, TemplateResult } from 'lit-element';
2+
3+
import { Nsdoc } from '../foundation/nsdoc.js';
4+
5+
import './subscription/fcda-binding-list.js';
6+
import './subscription/later-binding/ext-ref-ln-binding-list.js';
7+
8+
/** An editor [[`plugin`]] for Subscribe Data Binding (GOOSE). */
9+
export default class GooseSubscribeDataBindingPlugin extends LitElement {
10+
@property({ attribute: false })
11+
doc!: XMLDocument;
12+
@property()
13+
nsdoc!: Nsdoc;
14+
15+
render(): TemplateResult {
16+
return html`<div>
17+
<div class="container">
18+
<fcda-binding-list
19+
class="column"
20+
controlTag="GSEControl"
21+
.doc=${this.doc}
22+
>
23+
</fcda-binding-list>
24+
<extref-ln-binding-list
25+
class="column"
26+
controlTag="GSEControl"
27+
.doc="${this.doc}"
28+
.nsdoc="${this.nsdoc}"
29+
>
30+
</extref-ln-binding-list>
31+
</div>
32+
</div>`;
33+
}
34+
35+
static styles = css`
36+
:host {
37+
width: 100vw;
38+
}
39+
40+
.container {
41+
display: flex;
42+
padding: 8px 6px 16px;
43+
height: calc(100vh - 136px);
44+
}
45+
46+
.column {
47+
flex: 50%;
48+
margin: 0px 6px 0px;
49+
min-width: 300px;
50+
height: 100%;
51+
overflow-y: auto;
52+
}
53+
`;
54+
}

src/editors/GooseSubscriberLaterBinding.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
import { LitElement, property, html, TemplateResult, css } from 'lit-element';
1+
import { css, html, LitElement, property, TemplateResult } from 'lit-element';
22

3-
import './subscription/later-binding/fcda-later-binding-list.js';
3+
import './subscription/fcda-binding-list.js';
44
import './subscription/later-binding/ext-ref-later-binding-list.js';
55

6+
/** An editor [[`plugin`]] for Subscribe Later Binding (GOOSE). */
67
export default class GooseSubscribeLaterBindingPlugin extends LitElement {
78
@property({ attribute: false })
89
doc!: XMLDocument;
910

1011
render(): TemplateResult {
1112
return html`<div>
1213
<div class="container">
13-
<fcda-later-binding-list
14+
<fcda-binding-list
1415
class="column"
1516
.doc=${this.doc}
1617
controlTag="GSEControl"
1718
>
18-
</fcda-later-binding-list>
19+
</fcda-binding-list>
1920
<extref-later-binding-list
2021
class="column"
2122
controlTag="GSEControl"

src/editors/GooseControlSubscription.ts renamed to src/editors/GooseSubscriberMessageBinding.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {
2-
LitElement,
2+
css,
33
html,
4-
TemplateResult,
4+
LitElement,
55
property,
6-
css,
76
query,
7+
TemplateResult,
88
} from 'lit-element';
99
import { translate } from 'lit-translate';
1010

@@ -21,7 +21,7 @@ import { newViewEvent, View, ViewEvent } from './subscription/foundation.js';
2121
let view: View = View.PUBLISHER;
2222

2323
/** An editor [[`plugin`]] for subscribing IEDs to GOOSE messages. */
24-
export default class GooseControlSubscriptionPlugin extends LitElement {
24+
export default class GooseSubscriberMessageBindingPlugin extends LitElement {
2525
/** The document being edited as provided to plugins by [[`OpenSCD`]]. */
2626
@property()
2727
doc!: XMLDocument;
@@ -76,7 +76,11 @@ export default class GooseControlSubscriptionPlugin extends LitElement {
7676
<div class="container">
7777
${view == View.PUBLISHER
7878
? html`<goose-list class="row" .doc=${this.doc}></goose-list>`
79-
: html`<ied-list class="row" .doc=${this.doc} serviceType="goose"></ied-list>`}
79+
: html`<ied-list
80+
class="row"
81+
.doc=${this.doc}
82+
serviceType="goose"
83+
></ied-list>`}
8084
<subscriber-list-goose
8185
class="row"
8286
.doc=${this.doc}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { css, html, LitElement, property, TemplateResult } from 'lit-element';
2+
3+
import { Nsdoc } from '../foundation/nsdoc.js';
4+
5+
import './subscription/fcda-binding-list.js';
6+
import './subscription/later-binding/ext-ref-ln-binding-list.js';
7+
8+
/** An editor [[`plugin`]] for Subscribe Data Binding (SMV). */
9+
export default class SMVSubscribeDataBindingPlugin extends LitElement {
10+
@property({ attribute: false })
11+
doc!: XMLDocument;
12+
@property()
13+
nsdoc!: Nsdoc;
14+
15+
render(): TemplateResult {
16+
return html`<div>
17+
<div class="container">
18+
<fcda-binding-list
19+
class="column"
20+
controlTag="SampledValueControl"
21+
.doc=${this.doc}
22+
>
23+
</fcda-binding-list>
24+
<extref-ln-binding-list
25+
class="column"
26+
controlTag="SampledValueControl"
27+
.doc="${this.doc}"
28+
.nsdoc="${this.nsdoc}"
29+
>
30+
</extref-ln-binding-list>
31+
</div>
32+
</div>`;
33+
}
34+
35+
static styles = css`
36+
:host {
37+
width: 100vw;
38+
}
39+
40+
.container {
41+
display: flex;
42+
padding: 8px 6px 16px;
43+
height: calc(100vh - 136px);
44+
}
45+
46+
.column {
47+
flex: 50%;
48+
margin: 0px 6px 0px;
49+
min-width: 300px;
50+
height: 100%;
51+
overflow-y: auto;
52+
}
53+
`;
54+
}

src/editors/SMVSubscriberLaterBinding.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { css, html, LitElement, property, TemplateResult } from 'lit-element';
22

3-
import './subscription/later-binding/fcda-later-binding-list.js';
3+
import './subscription/fcda-binding-list.js';
44
import './subscription/later-binding/ext-ref-later-binding-list.js';
55

66
/** An editor [[`plugin`]] for Subscribe Later Binding (SMV). */
@@ -11,12 +11,12 @@ export default class SMVSubscribeLaterBindingPlugin extends LitElement {
1111
render(): TemplateResult {
1212
return html`<div>
1313
<div class="container">
14-
<fcda-later-binding-list
14+
<fcda-binding-list
1515
class="column"
1616
.doc=${this.doc}
1717
controlTag="SampledValueControl"
1818
>
19-
</fcda-later-binding-list>
19+
</fcda-binding-list>
2020
<extref-later-binding-list
2121
class="column"
2222
.doc=${this.doc}

src/editors/SampledValuesSubscription.ts renamed to src/editors/SMVSubscriberMessageBinding.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {
2-
LitElement,
2+
css,
33
html,
4-
TemplateResult,
4+
LitElement,
55
property,
6-
css,
76
query,
7+
TemplateResult,
88
} from 'lit-element';
99
import { translate } from 'lit-translate';
1010

@@ -19,7 +19,7 @@ import { newViewEvent, View, ViewEvent } from './subscription/foundation.js';
1919
let view: View = View.PUBLISHER;
2020

2121
/** An editor [[`plugin`]] for subscribing IEDs to Sampled Values. */
22-
export default class SampledValuesSubscriberPlugin extends LitElement {
22+
export default class SMVSubscriberMessageBindingPlugin extends LitElement {
2323
/** The document being edited as provided to plugins by [[`OpenSCD`]]. */
2424
@property()
2525
doc!: XMLDocument;
@@ -74,7 +74,11 @@ export default class SampledValuesSubscriberPlugin extends LitElement {
7474
<div class="container">
7575
${view == View.PUBLISHER
7676
? html`<smv-list class="row" .doc=${this.doc}></smv-list>`
77-
: html`<ied-list class="row" .doc=${this.doc} serviceType="smv"></ied-list>`}
77+
: html`<ied-list
78+
class="row"
79+
.doc=${this.doc}
80+
serviceType="smv"
81+
></ied-list>`}
7882
<subscriber-list-smv class="row" .doc=${this.doc}></subscriber-list-smv>
7983
</div>
8084
</div>`;

src/editors/subscription/later-binding/fcda-later-binding-list.ts renamed to src/editors/subscription/fcda-binding-list.ts

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ import {
2121
getNameAttribute,
2222
identity,
2323
newWizardEvent,
24-
} from '../../../foundation.js';
25-
import { gooseIcon, smvIcon } from '../../../icons/icons.js';
26-
import { wizards } from '../../../wizards/wizard-library.js';
24+
} from '../../foundation.js';
25+
import { gooseIcon, smvIcon } from '../../icons/icons.js';
26+
import { wizards } from '../../wizards/wizard-library.js';
2727

28-
import { styles } from '../foundation.js';
29-
30-
import { getFcdaTitleValue, newFcdaSelectEvent } from './foundation.js';
28+
import { getFcdaTitleValue, newFcdaSelectEvent, styles } from './foundation.js';
3129

3230
type controlTag = 'SampledValueControl' | 'GSEControl';
3331

@@ -38,8 +36,8 @@ type iconLookup = Record<controlTag, SVGTemplateResult>;
3836
* A control can be edited using the standard wizard.
3937
* And when selecting a FCDA Element a custom event is fired, so other list can be updated.
4038
*/
41-
@customElement('fcda-later-binding-list')
42-
export class FCDALaterBindingList extends LitElement {
39+
@customElement('fcda-binding-list')
40+
export class FcdaBindingList extends LitElement {
4341
@property({ attribute: false })
4442
doc!: XMLDocument;
4543
@property()
@@ -51,16 +49,14 @@ export class FCDALaterBindingList extends LitElement {
5149
@state()
5250
selectedFcdaElement: Element | undefined;
5351

54-
@property({ attribute: false })
55-
iconControlLookup: iconLookup;
52+
iconControlLookup: iconLookup = {
53+
SampledValueControl: smvIcon,
54+
GSEControl: gooseIcon,
55+
};
5656

5757
constructor() {
5858
super();
5959

60-
this.iconControlLookup = {
61-
SampledValueControl: smvIcon,
62-
GSEControl: gooseIcon,
63-
};
6460
this.resetSelection = this.resetSelection.bind(this);
6561
parent.addEventListener('open-doc', this.resetSelection);
6662
}
@@ -151,7 +147,7 @@ export class FCDALaterBindingList extends LitElement {
151147
${controlElements.length > 0
152148
? html`<h1>
153149
${translate(
154-
`subscription.laterBinding.${this.controlTag}.controlBlockList.title`
150+
`subscription.${this.controlTag}.controlBlockList.title`
155151
)}
156152
</h1>
157153
<filtered-list activatable>
@@ -193,7 +189,7 @@ export class FCDALaterBindingList extends LitElement {
193189
</filtered-list>`
194190
: html`<h1>
195191
${translate(
196-
`subscription.laterBinding.${this.controlTag}.controlBlockList.noControlBlockFound`
192+
`subscription.${this.controlTag}.controlBlockList.noControlBlockFound`
197193
)}
198194
</h1>`}
199195
</section>`;

src/editors/subscription/foundation.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,32 @@ export function newIEDSelectEvent(
5353
});
5454
}
5555

56+
export interface FcdaSelectDetail {
57+
controlElement: Element | undefined;
58+
fcda: Element | undefined;
59+
}
60+
export type FcdaSelectEvent = CustomEvent<FcdaSelectDetail>;
61+
export function newFcdaSelectEvent(
62+
controlElement: Element | undefined,
63+
fcda: Element | undefined,
64+
eventInitDict?: CustomEventInit<FcdaSelectDetail>
65+
): FcdaSelectEvent {
66+
return new CustomEvent<FcdaSelectDetail>('fcda-select', {
67+
bubbles: true,
68+
composed: true,
69+
...eventInitDict,
70+
detail: { controlElement, fcda, ...eventInitDict?.detail },
71+
});
72+
}
73+
74+
export function getFcdaTitleValue(fcdaElement: Element): string {
75+
return `${fcdaElement.getAttribute('doName')}${
76+
fcdaElement.hasAttribute('doName') && fcdaElement.hasAttribute('daName')
77+
? `.`
78+
: ``
79+
}${fcdaElement.getAttribute('daName')}`;
80+
}
81+
5682
export function existExtRef(parentInputs: Element, fcda: Element): boolean {
5783
const iedName = fcda.closest('IED')?.getAttribute('name');
5884
if (!iedName) return false;
@@ -381,5 +407,6 @@ declare global {
381407
interface ElementEventMap {
382408
['view']: ViewEvent;
383409
['ied-select']: IEDSelectEvent;
410+
['fcda-select']: FcdaSelectEvent;
384411
}
385412
}

0 commit comments

Comments
 (0)