Skip to content

Commit 1bc1116

Browse files
committed
Use hardware bootloader reset if necessary
1 parent d3ab231 commit 1bc1116

File tree

9 files changed

+91
-34
lines changed

9 files changed

+91
-34
lines changed

com.zsmartsystems.zigbee.dongle.ember/src/test/java/com/zsmartsystems/zigbee/dongle/ember/internal/EmberFirmwareUpdateHandlerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,14 @@ public boolean open(int baudRate, FlowControl flowControl) {
202202
public void purgeRxBuffer() {
203203
}
204204

205+
@Override
206+
public void setDtr(boolean state) {
207+
}
208+
209+
@Override
210+
public void setRts(boolean state) {
211+
}
212+
205213
public byte[] getOutput() {
206214
return Arrays.copyOfRange(output, 0, cnt);
207215
}

com.zsmartsystems.zigbee.dongle.ember/src/test/java/com/zsmartsystems/zigbee/dongle/ember/internal/ash/AshFrameHandlerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,14 @@ public boolean open(int baudRate, FlowControl flowControl) {
206206
public void purgeRxBuffer() {
207207
}
208208

209+
@Override
210+
public void setDtr(boolean state) {
211+
}
212+
213+
@Override
214+
public void setRts(boolean state) {
215+
}
216+
209217
public List<Integer> getOutputData() {
210218
return outputData;
211219
}

com.zsmartsystems.zigbee.dongle.ember/src/test/java/com/zsmartsystems/zigbee/dongle/ember/internal/spi/SpiFrameHandlerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,5 +354,13 @@ public boolean open(int baudRate, FlowControl flowControl) {
354354
@Override
355355
public void purgeRxBuffer() {
356356
}
357+
358+
@Override
359+
public void setDtr(boolean state) {
360+
}
361+
362+
@Override
363+
public void setRts(boolean state) {
364+
}
357365
}
358366
}

com.zsmartsystems.zigbee.dongle.zstack/src/main/java/com/zsmartsystems/zigbee/dongle/zstack/ZigBeeDongleZstack.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ public ZigBeeStatus initialize() {
241241
ZstackNetworkInitialisation netInitialiser = new ZstackNetworkInitialisation(frameHandler);
242242
netInitialiser.setMagicNumber(magicNumber);
243243

244-
netInitialiser.initializeNcp(false);
244+
netInitialiser.initializeNcp(false, serialPort);
245245

246246
ZstackNcp ncp = getZstackNcp();
247247

@@ -296,7 +296,7 @@ public ZigBeeStatus startup(boolean reinitialize) {
296296
netInitialiser.setMagicNumber(magicNumber);
297297
if (reinitialize) {
298298
logger.debug("Reinitialising ZStack NCP network.");
299-
netInitialiser.initializeNcp(true);
299+
netInitialiser.initializeNcp(true, serialPort);
300300

301301
if (deviceType == DeviceType.COORDINATOR) {
302302
netInitialiser.formNetwork();

com.zsmartsystems.zigbee.dongle.zstack/src/main/java/com/zsmartsystems/zigbee/dongle/zstack/internal/ZstackNetworkInitialisation.java

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,23 @@
77
*/
88
package com.zsmartsystems.zigbee.dongle.zstack.internal;
99

10-
import java.util.concurrent.ExecutionException;
11-
import java.util.concurrent.Future;
12-
import java.util.concurrent.TimeUnit;
13-
import java.util.concurrent.TimeoutException;
14-
15-
import org.slf4j.Logger;
16-
import org.slf4j.LoggerFactory;
17-
1810
import com.zsmartsystems.zigbee.ZigBeeStatus;
1911
import com.zsmartsystems.zigbee.dongle.zstack.ZstackNcp;
2012
import com.zsmartsystems.zigbee.dongle.zstack.api.ZstackFrameResponse;
2113
import com.zsmartsystems.zigbee.dongle.zstack.api.ZstackResponseCode;
22-
import com.zsmartsystems.zigbee.dongle.zstack.api.sys.ZstackResetType;
2314
import com.zsmartsystems.zigbee.dongle.zstack.api.sys.ZstackSysResetIndAreq;
2415
import com.zsmartsystems.zigbee.dongle.zstack.api.sys.ZstackZdoState;
2516
import com.zsmartsystems.zigbee.dongle.zstack.api.util.ZstackUtilGetDeviceInfoSrsp;
2617
import com.zsmartsystems.zigbee.dongle.zstack.api.zdo.ZstackZdoStateChangeIndAreq;
2718
import com.zsmartsystems.zigbee.transport.DeviceType;
19+
import com.zsmartsystems.zigbee.transport.ZigBeePort;
20+
import org.slf4j.Logger;
21+
import org.slf4j.LoggerFactory;
22+
23+
import java.util.concurrent.ExecutionException;
24+
import java.util.concurrent.Future;
25+
import java.util.concurrent.TimeUnit;
26+
import java.util.concurrent.TimeoutException;
2827

2928
/**
3029
* This class provides utility functions to establish a ZStack ZigBee network
@@ -91,20 +90,16 @@ public void setMagicNumber(int magicNumber) {
9190
* The dongle is not reset completely, thus allowing it to be placed back into the previous network.
9291
*
9392
* @param initialize set to true to reset the dongle and erase all current network settings
93+
* @param serialPort
9494
*/
95-
public ZigBeeStatus initializeNcp(boolean initialize) {
95+
public ZigBeeStatus initializeNcp(boolean initialize, ZigBeePort serialPort) {
9696
logger.debug("ZStack Initialisation: Initialise");
9797
ZstackNcp ncp = new ZstackNcp(protocolHandler);
9898

99-
ZstackSysResetIndAreq resetResponse = ncp.resetNcp(ZstackResetType.SERIAL_BOOTLOADER);
100-
logger.debug("ZStack Initialisation: Reset response {}", resetResponse);
101-
102-
if (resetResponse == null) {
103-
// The reset failed - assume we're in the bootloader and try and exit
104-
if (exitBootloader() == false) {
105-
logger.debug("ZStack Initialisation: Failed to exit bootloader");
106-
return ZigBeeStatus.COMMUNICATION_ERROR;
107-
}
99+
// The reset failed - assume we're in the bootloader and try and exit
100+
if (exitBootloader(serialPort) == false) {
101+
logger.debug("ZStack Initialisation: Failed to exit bootloader");
102+
return ZigBeeStatus.COMMUNICATION_ERROR;
108103
}
109104

110105
if (initialize) {
@@ -194,20 +189,38 @@ public ZigBeeStatus startNetwork() {
194189
* Attempts to exit the bootloader by sending the "magic number" and waiting for the {@link ZstackSysResetIndAreq}
195190
* to be received to confirm that the NCP application firmware has started.
196191
*
192+
* https://www.ti.com/lit/an/swra466d/swra466d.pdf
193+
* https://www.ti.com/lit/ug/swcu185d/swcu185d.pdf
194+
*
197195
* @return true if the {@link ZstackSysResetIndAreq} was received, otherwise false
196+
* @param serialPort Serial port
198197
*/
199-
private boolean exitBootloader() {
200-
Future<ZstackFrameResponse> waiter = protocolHandler.waitForEvent(ZstackSysResetIndAreq.class);
198+
private boolean exitBootloader(ZigBeePort serialPort) {
199+
// FIXME this does not work in the OpenHAB binding, as it seems their write() implementation blocks
200+
/*
201201
protocolHandler.sendRaw(magicNumber);
202+
if (waitForBoot("Magicnumber")) {
203+
return true;
204+
}
205+
*/
202206

207+
serialPort.setDtr(false);
208+
209+
serialPort.setRts(false);
210+
serialPort.setRts(true);
211+
serialPort.setRts(false);
212+
213+
return waitForBoot("Hardware reset");
214+
}
215+
216+
private boolean waitForBoot(String resetMode) {
217+
Future<ZstackFrameResponse> waiter = protocolHandler.waitForEvent(ZstackSysResetIndAreq.class);
203218
try {
204219
ZstackFrameResponse response = waiter.get(BOOTLOAD_TIMEOUT, TimeUnit.MILLISECONDS);
205-
logger.debug("ZStack Initialisation: Bootloader reset response {}", response);
206-
220+
logger.debug("ZStack Initialisation: Bootloader reset via {} response {}", resetMode, response);
207221
return true;
208222
} catch (InterruptedException | ExecutionException | TimeoutException e) {
209-
logger.debug("ZStack Initialisation: Bootloader reset failed");
210-
223+
logger.debug("ZStack Initialisation: Bootloader reset via {} failed", resetMode, e);
211224
return false;
212225
}
213226
}

com.zsmartsystems.zigbee.dongle.zstack/src/main/java/com/zsmartsystems/zigbee/dongle/zstack/internal/ZstackProtocolHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ public ZstackTransaction sendTransaction(ZstackTransaction transaction) {
519519
futureResponse.get(TIMEOUT, TimeUnit.MILLISECONDS);
520520
} catch (InterruptedException | TimeoutException | ExecutionException e) {
521521
futureResponse.cancel(true);
522-
logger.debug("ZSTACK interrupted in sendTransaction for {}", transaction);
522+
logger.debug("ZSTACK interrupted in sendTransaction for {}", transaction, e);
523523
}
524524

525525
return transaction;

com.zsmartsystems.zigbee.dongle.zstack/src/test/java/com/zsmartsystems/zigbee/dongle/zstack/internal/ZstackProtocolHandlerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ public boolean open(int baudRate, FlowControl flowControl) {
150150
public void purgeRxBuffer() {
151151
}
152152

153+
@Override
154+
public void setDtr(boolean state) {
155+
}
156+
157+
@Override
158+
public void setRts(boolean state) {
159+
}
160+
153161
public List<Integer> getOutputData() {
154162
return outputData;
155163
}

com.zsmartsystems.zigbee.serial/src/main/java/com/zsmartsystems/zigbee/serial/ZigBeeSerialPort.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,19 +273,21 @@ public void purgeRxBuffer() {
273273
}
274274
}
275275

276-
public boolean setDtr(boolean state) {
276+
@Override
277+
public void setDtr(boolean state) {
277278
try {
278-
return serialPort.setDTR(state);
279+
serialPort.setDTR(state);
279280
} catch (SerialPortException e) {
280-
return false;
281+
logger.warn("Could not set DTR to {} on {}", state, this.portName, e);
281282
}
282283
}
283284

284-
public boolean setRts(boolean state) {
285+
@Override
286+
public void setRts(boolean state) {
285287
try {
286-
return serialPort.setRTS(state);
288+
serialPort.setRTS(state);
287289
} catch (SerialPortException e) {
288-
return false;
290+
logger.warn("Could not set RTS to {} on {}", state, this.portName, e);
289291
}
290292
}
291293
}

com.zsmartsystems.zigbee/src/main/java/com/zsmartsystems/zigbee/transport/ZigBeePort.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,16 @@ public interface ZigBeePort {
8585
*/
8686
void purgeRxBuffer();
8787

88+
/**
89+
* Set DTR on Port
90+
*/
91+
void setDtr(boolean state);
92+
93+
/**
94+
* Set DTS on Port
95+
*/
96+
void setRts(boolean state);
97+
8898
/**
8999
* Enumeration of flow control options
90100
*/

0 commit comments

Comments
 (0)