Skip to content

Commit d5a1d09

Browse files
authored
Merge pull request #209 from hap-java/feature/162-custom-min-max
Add custom min/max to window covering tilt angle characteristics
2 parents 46e2a02 + 4ab8b92 commit d5a1d09

6 files changed

Lines changed: 133 additions & 8 deletions

File tree

‎CHANGES.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# HAP-Java 2.0.10
2+
* Add constructors with custom min/max to the window covering tilt angle characteristics [#162](https://github.com/hap-java/HAP-Java/issues/162)
23
* Add optional Mute characteristic to Doorbell service
34

45
# HAP-Java 2.0.9

‎src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentHorizontalTiltAngleCharacteristic.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,31 @@
1111
/** This characteristic describes the current angle of horizontal slats. */
1212
public class CurrentHorizontalTiltAngleCharacteristic extends IntegerCharacteristic
1313
implements EventableCharacteristic {
14+
public static final int DEFAULT_MIN_VALUE = -90;
15+
public static final int DEFAULT_MAX_VALUE = 90;
1416

1517
public CurrentHorizontalTiltAngleCharacteristic(
18+
int minValue,
19+
int maxValue,
1620
Supplier<CompletableFuture<Integer>> getter,
1721
Consumer<HomekitCharacteristicChangeCallback> subscriber,
1822
Runnable unsubscriber) {
1923
super(
2024
"0000006C-0000-1000-8000-0026BB765291",
2125
"current horizontal tilt angle",
22-
-90,
23-
90,
26+
minValue,
27+
maxValue,
2428
"arcdegrees",
2529
Optional.of(getter),
2630
Optional.empty(),
2731
Optional.of(subscriber),
2832
Optional.of(unsubscriber));
2933
}
34+
35+
public CurrentHorizontalTiltAngleCharacteristic(
36+
Supplier<CompletableFuture<Integer>> getter,
37+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
38+
Runnable unsubscriber) {
39+
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, subscriber, unsubscriber);
40+
}
3041
}

‎src/main/java/io/github/hapjava/characteristics/impl/windowcovering/CurrentVerticalTiltAngleCharacteristic.java‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,31 @@
1111
/** This characteristic describes the current angle of vertical slats for accessory. */
1212
public class CurrentVerticalTiltAngleCharacteristic extends IntegerCharacteristic
1313
implements EventableCharacteristic {
14+
public static final int DEFAULT_MIN_VALUE = -90;
15+
public static final int DEFAULT_MAX_VALUE = 90;
1416

1517
public CurrentVerticalTiltAngleCharacteristic(
18+
int minValue,
19+
int maxValue,
1620
Supplier<CompletableFuture<Integer>> getter,
1721
Consumer<HomekitCharacteristicChangeCallback> subscriber,
1822
Runnable unsubscriber) {
1923
super(
2024
"0000006E-0000-1000-8000-0026BB765291",
2125
"current vertical tilt angle",
22-
-90,
23-
90,
26+
minValue,
27+
maxValue,
2428
"arcdegrees",
2529
Optional.of(getter),
2630
Optional.empty(),
2731
Optional.of(subscriber),
2832
Optional.of(unsubscriber));
2933
}
34+
35+
public CurrentVerticalTiltAngleCharacteristic(
36+
Supplier<CompletableFuture<Integer>> getter,
37+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
38+
Runnable unsubscriber) {
39+
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, subscriber, unsubscriber);
40+
}
3041
}

‎src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetHorizontalTiltAngleCharacteristic.java‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,33 @@
1212
/** This characteristic describes the target angle of horizontal slats for accessories. */
1313
public class TargetHorizontalTiltAngleCharacteristic extends IntegerCharacteristic
1414
implements EventableCharacteristic {
15+
public static final int DEFAULT_MIN_VALUE = -90;
16+
public static final int DEFAULT_MAX_VALUE = 90;
1517

1618
public TargetHorizontalTiltAngleCharacteristic(
19+
int minValue,
20+
int maxValue,
1721
Supplier<CompletableFuture<Integer>> getter,
1822
ExceptionalConsumer<Integer> setter,
1923
Consumer<HomekitCharacteristicChangeCallback> subscriber,
2024
Runnable unsubscriber) {
2125
super(
2226
"0000007B-0000-1000-8000-0026BB765291",
2327
"target horizontal tilt angle",
24-
-90,
25-
90,
28+
minValue,
29+
maxValue,
2630
"arcdegrees",
2731
Optional.of(getter),
2832
Optional.of(setter),
2933
Optional.of(subscriber),
3034
Optional.of(unsubscriber));
3135
}
36+
37+
public TargetHorizontalTiltAngleCharacteristic(
38+
Supplier<CompletableFuture<Integer>> getter,
39+
ExceptionalConsumer<Integer> setter,
40+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
41+
Runnable unsubscriber) {
42+
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, setter, subscriber, unsubscriber);
43+
}
3244
}

‎src/main/java/io/github/hapjava/characteristics/impl/windowcovering/TargetVerticalTiltAngleCharacteristic.java‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,33 @@
1212
/** This characteristic describes the target angle of vertical slats. */
1313
public class TargetVerticalTiltAngleCharacteristic extends IntegerCharacteristic
1414
implements EventableCharacteristic {
15+
public static final int DEFAULT_MIN_VALUE = -90;
16+
public static final int DEFAULT_MAX_VALUE = 90;
1517

1618
public TargetVerticalTiltAngleCharacteristic(
19+
int minValue,
20+
int maxValue,
1721
Supplier<CompletableFuture<Integer>> getter,
1822
ExceptionalConsumer<Integer> setter,
1923
Consumer<HomekitCharacteristicChangeCallback> subscriber,
2024
Runnable unsubscriber) {
2125
super(
2226
"0000007D-0000-1000-8000-0026BB765291",
2327
"target vertical tilt angle",
24-
-90,
25-
90,
28+
minValue,
29+
maxValue,
2630
"arcdegrees",
2731
Optional.of(getter),
2832
Optional.of(setter),
2933
Optional.of(subscriber),
3034
Optional.of(unsubscriber));
3135
}
36+
37+
public TargetVerticalTiltAngleCharacteristic(
38+
Supplier<CompletableFuture<Integer>> getter,
39+
ExceptionalConsumer<Integer> setter,
40+
Consumer<HomekitCharacteristicChangeCallback> subscriber,
41+
Runnable unsubscriber) {
42+
this(DEFAULT_MIN_VALUE, DEFAULT_MAX_VALUE, getter, setter, subscriber, unsubscriber);
43+
}
3244
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package io.github.hapjava.characteristics.impl;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import io.github.hapjava.characteristics.Characteristic;
6+
import io.github.hapjava.characteristics.impl.windowcovering.CurrentHorizontalTiltAngleCharacteristic;
7+
import io.github.hapjava.characteristics.impl.windowcovering.CurrentVerticalTiltAngleCharacteristic;
8+
import io.github.hapjava.characteristics.impl.windowcovering.TargetHorizontalTiltAngleCharacteristic;
9+
import io.github.hapjava.characteristics.impl.windowcovering.TargetVerticalTiltAngleCharacteristic;
10+
import java.util.Arrays;
11+
import java.util.concurrent.CompletableFuture;
12+
import javax.json.JsonObject;
13+
import org.junit.Test;
14+
15+
/** Custom tilt angle ranges, see https://github.com/hap-java/HAP-Java/issues/162 */
16+
public class CustomTiltAngleRangeTest {
17+
18+
@Test
19+
public void defaultConstructorsKeepTheirSerializedOutput() {
20+
// Serialized output captured before custom ranges were added.
21+
for (Case c :
22+
Arrays.asList(
23+
Case.of(
24+
new CurrentHorizontalTiltAngleCharacteristic(
25+
() -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
26+
"{\"iid\":7,\"type\":\"6C\",\"perms\":[\"pr\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
27+
Case.of(
28+
new TargetHorizontalTiltAngleCharacteristic(
29+
() -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
30+
"{\"iid\":7,\"type\":\"7B\",\"perms\":[\"pr\",\"pw\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
31+
Case.of(
32+
new CurrentVerticalTiltAngleCharacteristic(
33+
() -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
34+
"{\"iid\":7,\"type\":\"6E\",\"perms\":[\"pr\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"),
35+
Case.of(
36+
new TargetVerticalTiltAngleCharacteristic(
37+
() -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
38+
"{\"iid\":7,\"type\":\"7D\",\"perms\":[\"pr\",\"pw\",\"ev\"],\"format\":\"int\",\"value\":50,\"minValue\":-90,\"maxValue\":90,\"minStep\":1,\"unit\":\"arcdegrees\"}"))) {
39+
assertThat(c.characteristic.toJson(7).join().toString())
40+
.as(c.characteristic.getClass().getSimpleName())
41+
.isEqualTo(c.expected);
42+
}
43+
}
44+
45+
@Test
46+
public void customRangeIsAdvertised() {
47+
for (Characteristic c :
48+
Arrays.<Characteristic>asList(
49+
new CurrentHorizontalTiltAngleCharacteristic(
50+
0, 90, () -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
51+
new TargetHorizontalTiltAngleCharacteristic(
52+
0, 90, () -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}),
53+
new CurrentVerticalTiltAngleCharacteristic(
54+
0, 90, () -> CompletableFuture.completedFuture(50), cb -> {}, () -> {}),
55+
new TargetVerticalTiltAngleCharacteristic(
56+
0, 90, () -> CompletableFuture.completedFuture(50), v -> {}, cb -> {}, () -> {}))) {
57+
JsonObject json = c.toJson(7).join();
58+
String name = c.getClass().getSimpleName();
59+
assertThat(json.getInt("minValue")).as(name).isEqualTo(0);
60+
assertThat(json.getInt("maxValue")).as(name).isEqualTo(90);
61+
assertThat(json.getInt("minStep")).as(name).isEqualTo(1);
62+
}
63+
}
64+
65+
private static class Case {
66+
final Characteristic characteristic;
67+
final String expected;
68+
69+
private Case(Characteristic characteristic, String expected) {
70+
this.characteristic = characteristic;
71+
this.expected = expected;
72+
}
73+
74+
static Case of(Characteristic characteristic, String expected) {
75+
return new Case(characteristic, expected);
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)