/
AbstractKmtronicRelay.java
75 lines (63 loc) · 2.42 KB
/
AbstractKmtronicRelay.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package io.openems.edge.io.kmtronic;
import java.util.stream.Stream;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;
import io.openems.common.channel.AccessMode;
import io.openems.edge.bridge.modbus.api.AbstractOpenemsModbusComponent;
import io.openems.edge.bridge.modbus.api.BridgeModbus;
import io.openems.edge.bridge.modbus.api.ModbusComponent;
import io.openems.edge.common.channel.BooleanWriteChannel;
import io.openems.edge.common.channel.WriteChannel;
import io.openems.edge.common.component.OpenemsComponent;
import io.openems.edge.common.modbusslave.ModbusSlave;
import io.openems.edge.io.api.DigitalOutput;
public abstract class AbstractKmtronicRelay extends AbstractOpenemsModbusComponent
implements DigitalOutput, ModbusComponent, OpenemsComponent, ModbusSlave {
@Reference
private ConfigurationAdmin cm;
@Override
@Reference(policy = ReferencePolicy.STATIC, policyOption = ReferencePolicyOption.GREEDY, cardinality = ReferenceCardinality.MANDATORY)
protected void setModbus(BridgeModbus modbus) {
super.setModbus(modbus);
}
private final BooleanWriteChannel[] digitalOutputChannels;
protected AbstractKmtronicRelay(io.openems.edge.common.channel.ChannelId[] kmtronicChannelIds) {
super(//
OpenemsComponent.ChannelId.values(), //
ModbusComponent.ChannelId.values(), //
DigitalOutput.ChannelId.values(), //
kmtronicChannelIds //
);
this.digitalOutputChannels = Stream.of(kmtronicChannelIds) //
.filter(channelId -> channelId.doc().getAccessMode() == AccessMode.READ_WRITE) //
.map(this::channel) //
.toArray(BooleanWriteChannel[]::new);
}
@Override
public BooleanWriteChannel[] digitalOutputChannels() {
return this.digitalOutputChannels;
}
@Override
public String debugLog() {
var b = new StringBuilder();
var i = 1;
for (WriteChannel<Boolean> channel : this.digitalOutputChannels) {
String valueText;
var valueOpt = channel.value().asOptional();
if (valueOpt.isPresent()) {
valueText = valueOpt.get() ? "x" : "-";
} else {
valueText = "?";
}
b.append(i + valueText);
// add space for all but the last
if (++i <= this.digitalOutputChannels.length) {
b.append(" ");
}
}
return b.toString();
}
}