Skip to content

Commit 7714b21

Browse files
committed
Add percentage output to priority switch. Fix wrong label regarding priority of inputs
1 parent 496b344 commit 7714b21

7 files changed

+150
-21
lines changed

doc/Applikationsbeschreibung-FunctionBlocks.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ Legt fest, welchen Werttype für den Ausgang verwendet wird
285285
Ausgang ist Prozent (5.001)
286286
- **1 Byte (Ohne Vorzeichen)**
287287
Ausgang ist byte (5.* 8 bit vorzeichenlos)
288+
- **Szene**
289+
Ausgang ist byte (17.001)
288290
289291
<!-- DOC -->
290292
### Ausgangswert wenn alle Eingänge AUS

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "OFM-FunctionBlocks",
3-
"version": "0.4.0-DEV",
3+
"version": "0.5.0",
44
"description": "Function Blocks",
55
"homepage": "https://openknx.de",
66
"authors": {

src/FunctionBlocks.share.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,19 @@
110110
<TypeRestriction Base="Value" SizeInBit="2">
111111
<Enumeration Text="Prozent (0-100%)" Value="0" Id="%ENID%" />
112112
<Enumeration Text="1 Byte (Ohne Vorzeichen)" Value="1" Id="%ENID%" />
113+
<Enumeration Text="Szene" Value="2" Id="%ENID%" />
113114
</TypeRestriction>
114115
</ParameterType>
115116

116-
<ParameterType Id="%AID%_PT-FCBValuePercentage" Name="FCBValuePercentage">
117+
<ParameterType Id="%AID%_PT-FCBValuePercent" Name="FCBValuePercent">
117118
<TypeNumber SizeInBit="8" Type="unsignedInt" minInclusive="0" maxInclusive="100" />
118119
</ParameterType>
119120

121+
<ParameterType Id="%AID%_PT-FCBValueScene" Name="FCBValueScene">
122+
<TypeNumber SizeInBit="8" Type="unsignedInt" minInclusive="1" maxInclusive="64" />
123+
</ParameterType>
124+
125+
120126
<ParameterType Id="%AID%_PT-FCBValue1Byte" Name="FCBValue1Byte">
121127
<TypeNumber SizeInBit="8" Type="unsignedInt" minInclusive="0" maxInclusive="255" />
122128
</ParameterType>

src/FunctionBlocks.templ.xml

Lines changed: 77 additions & 11 deletions
Large diffs are not rendered by default.

src/FunctionBlocks/FunctionBlock.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ GroupObject& FunctionBlock::getKo(uint8_t nr)
9696
return KoFCB_CHKO7;
9797
case 8:
9898
return KoFCB_CHKO8;
99+
case 9:
100+
return KoFCB_CHKO9;
99101
default:
100102
openknx.hardware.fatalError(FATAL_SYSTEM, "Invalid Ko");
101103
return KoFCB_CHKO0;

src/FunctionBlocks/PrioritySwitchFunctionBlock.cpp

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,36 @@ uint8_t PrioritySwitchFunctionBlock::getParamOutPercent(uint8_t input)
121121
}
122122
}
123123

124+
uint8_t PrioritySwitchFunctionBlock::getParamOutScene(uint8_t input)
125+
{
126+
switch (input)
127+
{
128+
case 0:
129+
return ParamFCB_CHPrioOutSceneKo0 - 1;
130+
case 1:
131+
return ParamFCB_CHPrioOutSceneKo1 - 1;
132+
case 2:
133+
return ParamFCB_CHPrioOutSceneKo2 - 1;
134+
case 3:
135+
return ParamFCB_CHPrioOutSceneKo3 - 1;
136+
case 4:
137+
return ParamFCB_CHPrioOutSceneKo4 - 1;
138+
case 5:
139+
return ParamFCB_CHPrioOutSceneKo5 - 1;
140+
case 6:
141+
return ParamFCB_CHPrioOutSceneKo6 - 1;
142+
case 7:
143+
return ParamFCB_CHPrioOutSceneKo7 - 1;
144+
case 8:
145+
return ParamFCB_CHPrioOutSceneKo8 - 1;
146+
case 255:
147+
return ParamFCB_CHPrioOutSceneDefault - 1;
148+
default:
149+
openknx.hardware.fatalError(FATAL_SYSTEM, "Invalid input");
150+
return 0;
151+
}
152+
}
153+
124154
void PrioritySwitchFunctionBlock::readInputKos()
125155
{
126156
for (uint8_t i = 0; i < 9; i++)
@@ -195,17 +225,17 @@ void PrioritySwitchFunctionBlock::handleKo(GroupObject& ko)
195225
// <Enumeration Text="Deaktiviert" Value="0" Id="%ENID%" />
196226
// <Enumeration Text="Normal" Value="1" Id="%ENID%" />
197227
// <Enumeration Text="Invertiert" Value="2" Id="%ENID%" />
198-
auto inputKo = getParamInput(i);
199-
if (inputKo == 0)
228+
auto inputKoHandling = getParamInput(i);
229+
if (inputKoHandling == 0)
200230
continue;
201231

202232
if (!hasValue(i))
203233
return;
204234

205-
auto& ko = getKo(i);
235+
auto& inputKo = getKo(i);
206236

207-
auto inputValue = (bool)ko.value(DPT_Switch);
208-
if (inputKo == 2)
237+
auto inputValue = (bool)inputKo.value(DPT_Switch);
238+
if (inputKoHandling == 2)
209239
inputValue = !inputValue;
210240
if (inputValue)
211241
{
@@ -221,13 +251,35 @@ void PrioritySwitchFunctionBlock::setOutputForPrio(uint8_t input)
221251
{
222252
// <Enumeration Text="Prozent" Value="0" Id="%ENID%" />
223253
// <Enumeration Text="1 Byte (Ohne Vorzeichen)" Value="1" Id="%ENID%" />
254+
// <Enumeration Text="Szene" Value="2" Id="%ENID%" />
224255
auto outputType = ParamFCB_CHPrioOutputType;
225-
uint8_t result = outputType ? getParamOutByte(input) : getParamOutPercent(input);
256+
uint8_t result;
257+
Dpt dptType;
258+
switch (outputType)
259+
{
260+
case 0 : // Percent
261+
result = getParamOutPercent(input);
262+
dptType = DPT_Scaling;
263+
break;
264+
case 1 : // Byte
265+
result = getParamOutByte(input);
266+
dptType = DPT_Value_1_Count;
267+
break;
268+
case 2 : // Scene
269+
result = getParamOutScene(input);
270+
dptType = DPT_SceneNumber;
271+
break;
272+
default:
273+
result = 0;
274+
dptType = DPT_Value_1_Count;
275+
break;
276+
277+
}
226278

227279
// <Enumeration Text="Bei jedem Eingangstelegram" Value="0" Id="%ENID%" />
228280
// <Enumeration Text="Nur bei Änderung des Ausgangswertes" Value="1" Id="%ENID%" />
229281
if (ParamFCB_CHPrioBehavOut && KoFCB_CHKO9.initialized())
230-
KoFCB_CHKO9.valueCompare(result, outputType ? DPT_Value_1_Count : DPT_Scaling);
282+
KoFCB_CHKO9.valueCompare(result, dptType);
231283
else
232-
KoFCB_CHKO9.value(result, outputType ? DPT_Value_1_Count : DPT_Scaling);
284+
KoFCB_CHKO9.value(result, dptType);
233285
}

src/FunctionBlocks/PrioritySwitchFunctionBlock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class PrioritySwitchFunctionBlock : public FunctionBlock
77
uint8_t getParamInputBehavior(uint8_t input);
88
uint8_t getParamOutByte(uint8_t input);
99
uint8_t getParamOutPercent(uint8_t input);
10+
uint8_t getParamOutScene(uint8_t input);
1011
void setOutputForPrio(uint8_t input);
1112
public:
1213
PrioritySwitchFunctionBlock(uint8_t channelIndex);

0 commit comments

Comments
 (0)