Skip to content

Commit 7df066d

Browse files
committed
Improve UseCase handling
- Add support for checking if a usecase is set - Fix removing all usecases for an entity
1 parent 8c2ebf6 commit 7df066d

File tree

6 files changed

+181
-1
lines changed

6 files changed

+181
-1
lines changed

api/api.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ type EntityLocalInterface interface {
9797
useCaseAvailable bool,
9898
scenarios []model.UseCaseScenarioSupportType,
9999
)
100+
HasUseCaseSupport(
101+
actor model.UseCaseActorType,
102+
useCaseName model.UseCaseNameType) bool
100103
RemoveUseCaseSupport(
101104
actor model.UseCaseActorType,
102105
useCaseName model.UseCaseNameType,

mocks/EntityLocalInterface.go

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

model/nodemanagement_additions.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ func (n *NodeManagementUseCaseDataType) AddUseCaseSupport(
105105
}
106106
}
107107

108+
func (n *NodeManagementUseCaseDataType) HasUseCaseSupport(
109+
address FeatureAddressType,
110+
actor UseCaseActorType,
111+
useCaseName UseCaseNameType) bool {
112+
nmMux.Lock()
113+
defer nmMux.Unlock()
114+
115+
// is there an entry for the entity address, actor and usecase name
116+
_, ok := n.useCaseInformationIndex(address, actor, useCaseName)
117+
return ok
118+
}
119+
108120
// Remove a UseCaseSupportType with
109121
// a provided FeatureAddressType, UseCaseActorType and UseCaseNameType
110122
func (n *NodeManagementUseCaseDataType) RemoveUseCaseSupport(
@@ -141,3 +153,20 @@ func (n *NodeManagementUseCaseDataType) RemoveUseCaseSupport(
141153

142154
n.UseCaseInformation = usecaseInfo
143155
}
156+
157+
// Remove all data for a given address type
158+
func (n *NodeManagementUseCaseDataType) RemoveUseCaseDataForAddress(address FeatureAddressType) {
159+
nmMux.Lock()
160+
defer nmMux.Unlock()
161+
162+
var usecaseInfo []UseCaseInformationDataType
163+
164+
for _, item := range n.UseCaseInformation {
165+
if !reflect.DeepEqual(item.Address, &address) {
166+
usecaseInfo = append(usecaseInfo, item)
167+
continue
168+
}
169+
}
170+
171+
n.UseCaseInformation = usecaseInfo
172+
}

model/nodemanagement_additions_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ func (s *NodeManagementUseCaseDataTypeSuite) Test_AdditionsAndRemovals() {
7979
assert.Equal(s.T(), 2, len(ucs.UseCaseInformation[0].UseCaseSupport))
8080
assert.Equal(s.T(), 1, len(ucs.UseCaseInformation[1].UseCaseSupport))
8181

82+
hasUC := ucs.HasUseCaseSupport(address, UseCaseActorTypeCEM, UseCaseNameTypeEVChargingSummary)
83+
assert.Equal(s.T(), false, hasUC)
84+
8285
ucs.RemoveUseCaseSupport(
8386
address,
8487
UseCaseActorTypeCEM,
@@ -87,6 +90,9 @@ func (s *NodeManagementUseCaseDataTypeSuite) Test_AdditionsAndRemovals() {
8790
assert.Equal(s.T(), 2, len(ucs.UseCaseInformation))
8891
assert.Equal(s.T(), 2, len(ucs.UseCaseInformation[0].UseCaseSupport))
8992

93+
hasUC = ucs.HasUseCaseSupport(address, UseCaseActorTypeCEM, UseCaseNameTypeControlOfBattery)
94+
assert.Equal(s.T(), true, hasUC)
95+
9096
ucs.RemoveUseCaseSupport(
9197
address,
9298
UseCaseActorTypeCEM,
@@ -120,4 +126,18 @@ func (s *NodeManagementUseCaseDataTypeSuite) Test_AdditionsAndRemovals() {
120126
)
121127
assert.Equal(s.T(), 1, len(ucs.UseCaseInformation))
122128

129+
ucs.AddUseCaseSupport(
130+
address,
131+
UseCaseActorTypeEnergyGuard,
132+
UseCaseNameTypeLimitationOfPowerConsumption,
133+
SpecificationVersionType(""),
134+
"",
135+
true,
136+
[]UseCaseScenarioSupportType{},
137+
)
138+
assert.Equal(s.T(), 1, len(ucs.UseCaseInformation))
139+
assert.Equal(s.T(), 1, len(ucs.UseCaseInformation[0].UseCaseSupport))
140+
141+
ucs.RemoveUseCaseDataForAddress(address)
142+
assert.Equal(s.T(), 0, len(ucs.UseCaseInformation))
123143
}

spine/entity_local.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@ func (r *EntityLocal) AddUseCaseSupport(
123123
nodeMgmt.SetData(model.FunctionTypeNodeManagementUseCaseData, data)
124124
}
125125

126+
func (r *EntityLocal) HasUseCaseSupport(actor model.UseCaseActorType, useCaseName model.UseCaseNameType) bool {
127+
nodeMgmt := r.device.NodeManagement()
128+
129+
data := nodeMgmt.DataCopy(model.FunctionTypeNodeManagementUseCaseData).(*model.NodeManagementUseCaseDataType)
130+
if data == nil {
131+
return false
132+
}
133+
134+
address := model.FeatureAddressType{
135+
Device: r.address.Device,
136+
Entity: r.address.Entity,
137+
}
138+
139+
return data.HasUseCaseSupport(address, actor, useCaseName)
140+
}
141+
126142
// Remove a usecase with a given actor ans usecase name
127143
func (r *EntityLocal) RemoveUseCaseSupport(
128144
actor model.UseCaseActorType,
@@ -147,7 +163,21 @@ func (r *EntityLocal) RemoveUseCaseSupport(
147163

148164
// Remove all usecases
149165
func (r *EntityLocal) RemoveAllUseCaseSupports() {
150-
r.RemoveUseCaseSupport("", "")
166+
nodeMgmt := r.device.NodeManagement()
167+
168+
data := nodeMgmt.DataCopy(model.FunctionTypeNodeManagementUseCaseData).(*model.NodeManagementUseCaseDataType)
169+
if data == nil {
170+
return
171+
}
172+
173+
address := model.FeatureAddressType{
174+
Device: r.address.Device,
175+
Entity: r.address.Entity,
176+
}
177+
178+
data.RemoveUseCaseDataForAddress(address)
179+
180+
nodeMgmt.SetData(model.FunctionTypeNodeManagementUseCaseData, data)
151181
}
152182

153183
// Remove all subscriptions

spine/entity_local_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ func (suite *EntityLocalTestSuite) Test_Entity() {
5656

5757
entity.RemoveAllUseCaseSupports()
5858

59+
hasUC := entity.HasUseCaseSupport(
60+
model.UseCaseActorTypeCEM,
61+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
62+
)
63+
assert.Equal(suite.T(), false, hasUC)
64+
5965
entity.AddUseCaseSupport(
6066
model.UseCaseActorTypeCEM,
6167
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
@@ -65,6 +71,38 @@ func (suite *EntityLocalTestSuite) Test_Entity() {
6571
[]model.UseCaseScenarioSupportType{1, 2},
6672
)
6773

74+
hasUC = entity.HasUseCaseSupport(
75+
model.UseCaseActorTypeCEM,
76+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
77+
)
78+
assert.Equal(suite.T(), true, hasUC)
79+
80+
entity.AddUseCaseSupport(
81+
model.UseCaseActorTypeCEM,
82+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
83+
model.SpecificationVersionType("1.0.0"),
84+
"",
85+
true,
86+
[]model.UseCaseScenarioSupportType{1, 2},
87+
)
88+
89+
hasUC = entity.HasUseCaseSupport(
90+
model.UseCaseActorTypeCEM,
91+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
92+
)
93+
assert.Equal(suite.T(), true, hasUC)
94+
95+
entity.RemoveUseCaseSupport(
96+
model.UseCaseActorTypeCEM,
97+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
98+
)
99+
100+
hasUC = entity.HasUseCaseSupport(
101+
model.UseCaseActorTypeCEM,
102+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
103+
)
104+
assert.Equal(suite.T(), false, hasUC)
105+
68106
entity.AddUseCaseSupport(
69107
model.UseCaseActorTypeCEM,
70108
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
@@ -74,7 +112,20 @@ func (suite *EntityLocalTestSuite) Test_Entity() {
74112
[]model.UseCaseScenarioSupportType{1, 2},
75113
)
76114

115+
hasUC = entity.HasUseCaseSupport(
116+
model.UseCaseActorTypeCEM,
117+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
118+
)
119+
assert.Equal(suite.T(), true, hasUC)
120+
77121
entity.RemoveAllUseCaseSupports()
122+
123+
hasUC = entity.HasUseCaseSupport(
124+
model.UseCaseActorTypeCEM,
125+
model.UseCaseNameTypeEVSECommissioningAndConfiguration,
126+
)
127+
assert.Equal(suite.T(), false, hasUC)
128+
78129
entity.RemoveAllBindings()
79130
entity.RemoveAllSubscriptions()
80131
}

0 commit comments

Comments
 (0)