diff --git a/SkyMoteCommandResponseService.py b/SkyMoteCommandResponseService.py index 63346d8..cdfc239 100644 --- a/SkyMoteCommandResponseService.py +++ b/SkyMoteCommandResponseService.py @@ -34,28 +34,34 @@ def dataReceived(self, data): d = defer.Deferred() d.addCallback(self.responseReceived) self.queuedJobs.append([data, d]) + else: + print "dataReceived: got data. length: %d" % len(data) + print "dataReceived: ", + print [ hex(ord(c)) for c in data ] - return True - - print "dataReceived: got data. length: %d" % len(data) - print "dataReceived: ", - print [ hex(ord(c)) for c in data ] - - if len(data.strip()) == 4: - data = data.strip() - print "Got special command:", data - if data.lower() == "lock": - # Prevent others from talking to this device - self.factory.lockout(self.connectionNumber) - elif data.lower() == "done": - # Allow others to talk to the device - self.factory.unlockEveryone() - else: - d = defer.Deferred() - d.addCallback(self.responseReceived) - - #self.factory.exchanger.newPacketEvent.set() - readBytes = self.factory.writeRead(data, d) + if len(data.strip()) == 4: + data = data.strip() + print "Got special command:", data + if data.lower() == "lock": + # Prevent others from talking to this device + self.factory.lockout(self.connectionNumber) + elif data.lower() == "done": + # Allow others to talk to the device + self.factory.unlockEveryone() + elif data.lower().startswith("crh"): + # Close and re-open handleOnly + sleepTime = int(data[3]) + self.factory.exchanger.closeAndReopenDevice(sleepTime, True) + elif data.lower().startswith("rst"): + # Close and re-open normally + sleepTime = int(data[3]) + self.factory.exchanger.closeAndReopenDevice(sleepTime) + else: + d = defer.Deferred() + d.addCallback(self.responseReceived) + + #self.factory.exchanger.newPacketEvent.set() + readBytes = self.factory.writeRead(data, d) def responseReceived(self, data): print "responseReceived: Got results:", data diff --git a/SkyMoteExchanger.py b/SkyMoteExchanger.py index 5de130f..5870536 100644 --- a/SkyMoteExchanger.py +++ b/SkyMoteExchanger.py @@ -14,6 +14,9 @@ from SkyMoteSpontaneousDataService import SkyMoteSpontaneousFactory from time import sleep +from threading import Event + +from LabJackPython import deviceCount class SkyMoteExchanger(object): def __init__(self, device, commandResponsePort, spontaneousPort, serviceCollection, deviceLostFnx ): @@ -35,7 +38,9 @@ def __init__(self, device, commandResponsePort, spontaneousPort, serviceCollecti self.spontaneousService.setServiceParent(serviceCollection) self.deviceLost = deviceLostFnx - + self.deviceClosedEvent = Event() + self.closingDevice = False + self.running = True self.lastCommandTime = datetime.now() @@ -76,9 +81,31 @@ def shutdown(self, serviceCollection = None): def sendSpontaneousData(self, data): for connection in self.spontaneousService.args[1].connections.values(): connection.sendData(data) + + def closeAndReopenDevice(self, sleepTime = 4, handleOnly = False): + print "closeAndReopenDevice called, sleepTime = %s, handleOnly = %s" % (sleepTime, handleOnly) + # Save the serial number of the device. + #devNumber = deviceCount(self.device.devType) + + self.closingDevice = True + self.running = False # Tell the looping read to stop + self.deviceClosedEvent.wait() # Wait for the looping read to stop + + # Now sleep for the desired number of seconds. + sleep(sleepTime) + + # Re-open device + self.device.open(handleOnly = handleOnly, LJSocket = None) + + # Restart looping reading + self.running = True + self.closingDevice = False + reactor.callInThread(self.loopingRead) def loopingRead(self): + self.deviceClosedEvent.clear() # The device isn't close, so set the flag to False. + while self.running: # Busy wait just for a bit because we recently received a @@ -116,10 +143,14 @@ def loopingRead(self): if str(e).endswith('-7'): #print "Read timed out." pass + elif self.closingDevice: + # We're closing the device anyway. + pass else: print type(e), e self.deviceLost() self.device.close() print "Shutting down read loop." + self.deviceClosedEvent.set() # Device is closed, so let people know. \ No newline at end of file