forked from GideonLeGrange/panstamp-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestEvents.java
More file actions
172 lines (145 loc) · 5.64 KB
/
TestEvents.java
File metadata and controls
172 lines (145 loc) · 5.64 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package example;
import java.math.BigInteger;
import java.util.logging.Level;
import java.util.logging.Logger;
import me.legrange.panstamp.Endpoint;
import me.legrange.panstamp.EndpointListener;
import me.legrange.panstamp.ModemException;
import me.legrange.panstamp.Network;
import me.legrange.panstamp.NetworkException;
import me.legrange.panstamp.NetworkListener;
import me.legrange.panstamp.PanStamp;
import me.legrange.panstamp.PanStampListener;
import me.legrange.panstamp.Parameter;
import me.legrange.panstamp.Register;
import me.legrange.panstamp.RegisterListener;
/**
* This example shows how to work with the classes from Network, PanStamp, Register and Endpoint
* so that events for all instances in the structure can be received.
*
* It is important to understand that when you add a listener (event handler) to an instance of one of these
* classes, it is very likely that you may already have "missed" some events.
*
* This examples demonstrates how to iterate through existing data and how to add listeners to receive future data.
*
* @author Gideon le Grange https://github.com/GideonLeGrange
*/
public class TestEvents {
private static final String PORT = "/dev/tty.usbserial-A800HNMV";
private static final int BAUD = 38400;
private Network nw;
private int seq = 0;
public static void main(String... args) throws Exception {
TestEvents te = new TestEvents();
te.connect();
te.setupListeners();
while (true) {
Thread.sleep(1000);
}
}
/** Connect to serial port and start the network */
private void connect() throws NetworkException {
nw = Network.openSerial(PORT, BAUD);
}
/** Set up the listeners for the objects currently in the tree.
* Note that we build and event handler that will call addPanstamp() when we are notified of a new panStamp,
* AND we call addPanstamp on devices already known when our code executes */
private void setupListeners() throws NetworkException {
nw.addListener(new NetworkListener() {
@Override
public void deviceDetected(Network gw, PanStamp dev) {
addPanStamp(dev);
say("N: Device with address %d added to network", dev.getAddress());
}
@Override
public void deviceRemoved(Network gw, PanStamp dev) {
say("N: Device with address %d removed to network", dev.getAddress());
}
@Override
public void networkOpened(Network nw) {
say("N: Opened");
}
@Override
public void networkClosed(Network nw) {
say("N: Closed");
}
});
for (PanStamp ps : nw.getDevices()) {
addPanStamp(ps);
}
}
/** Do whatever we do if we have a new panStamp. */
private void addPanStamp(PanStamp ps) {
ps.addListener(new PanStampListener() {
@Override
public void productCodeChange(PanStamp dev, int manufacturerId, int productId) {
say("P: Product code for %d changed to %d/%d\n", dev.getAddress(),
manufacturerId, productId);
}
@Override
public void syncStateChange(PanStamp dev, int syncState) {
say("P: Sync state for %d changed to %d\n", dev.getAddress(), syncState);
}
@Override
public void registerDetected(PanStamp dev, Register reg) {
addRegister(reg);
say("P: Register %d detected for device %d", reg.getId(), dev.getAddress());
}
@Override
public void syncRequired(PanStamp dev) {
say("P: Sync required for device %d", dev.getAddress());
}
});
for (Register reg : ps.getRegisters()) {
addRegister(reg);
}
}
/** do whatever we do if we have a new register */
private void addRegister(Register reg) {
reg.addListener(new RegisterListener() {
@Override
public void valueReceived(Register reg, byte[] value) {
say("R: Value for %d updated to '%s'", reg.getId(), formatBytes(value));
}
@Override
public void valueSet(Register reg, byte[] value) {
say("R: Value for %d set to '%s'", reg.getId(), formatBytes(value));
}
@Override
public void endpointAdded(Register reg, Endpoint ep) {
addEndpoint(ep);
say("R: Endpoint '%s' added to %d", ep.getName(), reg.getId());
}
@Override
public void parameterAdded(Register reg, Parameter par) {
say("R: Parameter '%s' added to %d", par.getName(), reg.getId());
}
});
for (Endpoint ep : reg.getEndpoints()) {
addEndpoint(ep);
}
}
/** do what we do if we encounter a new endpoint */
private void addEndpoint(Endpoint ep) {
ep.addListener(new EndpointListener() {
@Override
public void valueReceived(Endpoint ep, Object value) {
say("E: Value '%s' received for '%s'", ep.getName(), value);
}
});
}
private void disconnect() throws ModemException {
nw.close();
}
private synchronized void say(String fmt, Object... args) {
System.out.printf("[%04d] ", seq);
System.out.printf(fmt, args);
if (!fmt.endsWith("\n")) {
System.out.println();
}
seq++;
}
private String formatBytes(byte val[]) {
return new BigInteger(val).toString(16);
}
}