From 5cb2e87246dd72c62457b00ceb3e5d006a4a718c Mon Sep 17 00:00:00 2001 From: terminet Date: Sun, 5 Feb 2017 04:42:26 +0100 Subject: [PATCH 1/5] Committer: terminet <> Sul branch new/hardware Your branch is up-to-date with 'origin/new/hardware'. Changes to be committed: modified: Changelog --- Changelog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 28d2dfe..e7f6f04 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,3 @@ Sat Jan 30 11:14:05 CET 2016 Flavio Castelli - +test * Initial release 0.1.0 From ccd94863d57da7a01d5a86aca34d90be78821558 Mon Sep 17 00:00:00 2001 From: terminet Date: Sun, 5 Feb 2017 04:49:07 +0100 Subject: [PATCH 2/5] Committer: terminet <> Sul branch new/hardware Your branch is up-to-date with 'origin/new/hardware'. Changes to be committed: modified: scsgate/tasks.py --- scsgate/tasks.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/scsgate/tasks.py b/scsgate/tasks.py index 1d8bfb4..7c3300e 100644 --- a/scsgate/tasks.py +++ b/scsgate/tasks.py @@ -2,7 +2,7 @@ scsgate.Reactor """ from scsgate.messages import compose_telegram, parse, StateMessage - +import socket class ExecutionError(BaseException): """ Error raised when something goes wrong while executing a task """ @@ -26,11 +26,14 @@ def __init__(self, notification_endpoint): self._last_raw_state_message = None def execute(self, connection): - connection.serial.write(b"@r") - length = int(connection.serial.read(), 16) + connection.send(b"@r") + raw = connection.receive() + if (raw == b'k') or (raw is None): + return + length = int(raw[:1], 16) if length == 0: return - data = connection.serial.read(length * 2) + data = raw[1:] message = parse(data) # Filter duplicated state messages. The filtering feature # of SCSGate is buggy and causes @r to always return 0 available @@ -58,9 +61,9 @@ def execute(self, connection): action=self._action, target=self._target) - connection.serial.write(str.encode(command)) - ret = connection.serial.read() - if ret != b'k': + connection.send(str.encode(command)) + ret = connection.receive() + if (ret != b'k') or (ret is None): raise ExecutionError( "Error while setting status. Command {}, got {}".format( command, ret)) @@ -143,9 +146,9 @@ def execute(self, connection): b"00", b"15", b"00"]) - connection.serial.write(command) - ret = connection.serial.read() - if ret != b'k': + connection.send(command) + ret = connection.receive() + if (ret != b'k') or (ret is None): raise ExecutionError( "Error while requesting status. Command {}, got {}".format( command, ret)) From 2bcea253a29915fbd815255e16e0dff7050d8578 Mon Sep 17 00:00:00 2001 From: terminet Date: Sun, 5 Feb 2017 04:51:30 +0100 Subject: [PATCH 3/5] Added socket(udp) routines for ESP_SCSGATE --- scsgate/connection.py | 86 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 17 deletions(-) diff --git a/scsgate/connection.py b/scsgate/connection.py index 5638a02..f62e7ef 100644 --- a/scsgate/connection.py +++ b/scsgate/connection.py @@ -1,53 +1,105 @@ """ This module contains an helper class to initiate a connection with the SCSGate device """ -import serial as pyserial - - +"""import serial as pyserial""" +import socket class Connection: + """ Connection to SCSGate device """ - def __init__(self, device, logger): + def __init__(self, device, logger, port): """ Initialize the class Arguments: device: string containing the serial device allocated to SCSGate logger: instance of logging """ - self._serial = pyserial.Serial(device, 115200) + """self._serial = pyserial.Serial(device, 115200)""" + self.device = device + self.logger = logger + self.port = port + if port != 0: + try: + self._socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self._socket.settimeout(1) + except socket.error: + raise RuntimeError("Failed to create sockt") + else: + self._socket = pyserial.Serial(device, 115200) logger.info("Clearing buffers") - self._serial.write(b"@b") - ret = self._serial.read(1) + """self._serial.write(b"@b")""" + """self._socket.sendto(b"@b", (device, port))""" + self.send(b"@b") + """ret = self._serial.read(1)""" + ret = self.receive() + """ret = self._socket.recvfrom(1);""" if ret != b"k": raise RuntimeError("Error while clearing buffers") # ensure pending operations are terminated (eg: @r, @l) - self._serial.write(b"@c") - ret = self._serial.read() + """self._serial.write(b"@c")""" + """self._socket.sendto(b"@c", (device, port))""" + """ret = self._serial.read()""" + """ret = self._socket.recvfrom(1);""" + self.send(b"@c") + ret = self.receive() if ret != b"k": raise RuntimeError("Error while cancelling pending operations") logger.info("Enabling ASCII mode") - self._serial.write(b"@MA") - ret = self._serial.read(1) + """self._serial.write(b"@MA")""" + """self._socket.sendto(b"@MA", (device, port))""" + """ret = self._serial.read(1)""" + """ret = self._socket.recvfrom(1);""" + self.send(b"@MA") + ret = self.receive() if ret != b"k": raise RuntimeError("Error while enabling ASCII mode") logger.info("Filter Ack messages") - self._serial.write(b"@F2") - ret = self._serial.read(1) + """self._serial.write(b"@F2")""" + """self._socket.sendto(b"@F2", (device, port))""" + """ret = self._serial.read(1)""" + """ret = self._socket.recvfrom(1);""" + self.send(b"@F2") + ret = self.receive() if ret != b"k": raise RuntimeError("Error while setting filter") @property def serial(self): """ Returns the pyserial.Serial instance """ - return self._serial + return self._socket def close(self): """ Closes the connection to the serial port and ensure no pending operatoin are left """ - self._serial.write(b"@c") - self._serial.read() - self._serial.close() + """self._serial.write(b"@c")""" + self._socket.sendto(b"@c", ("192.168.1.26", 52056)) + """self._serial.read()""" + self._socket.recvfrom(1); + """self._serial.close()""" + + def send(self, message): + if self.port != 0: + self._socket.sendto(message, (self.device, self.port)) + else: + self._serial.write(message) + + def receive(self): + ret = None + if self.port != 0: + try: + ret = self._socket.recvfrom(1024); + except socket.timeout: + self.logger.info("Socket Timeout") + return + else: + lenght = int(self._socket.read(), 16) + if lenght == b'k': + return lenght + else: + data = self._socket.read(lenght * 2) + return lenght + data + return ret[0] From e2322f15fd8f832643085f55bdfbc5e7c008003a Mon Sep 17 00:00:00 2001 From: terminet Date: Sun, 5 Feb 2017 04:57:16 +0100 Subject: [PATCH 4/5] New release --- Changelog | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Changelog b/Changelog index e7f6f04..05fd74a 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,3 @@ -Sat Jan 30 11:14:05 CET 2016 Flavio Castelli -test - * Initial release 0.1.0 +Sun Feb 05 04:55:23 CET 2017 Emanuele Leuzzi + * Release 0.1.1 + * Release 0.1.0 (Inizial by Flavio Castelli ) From 347e02cef1bbcb8d2310de942e9299ff91821d7f Mon Sep 17 00:00:00 2001 From: terminet Date: Sun, 5 Feb 2017 05:17:56 +0100 Subject: [PATCH 5/5] Added socket(udp) routines for ESP_SCSGATE --- scsgate/connection.py | 41 +++++++++-------------------------------- scsgate/reactor.py | 1 + 2 files changed, 10 insertions(+), 32 deletions(-) diff --git a/scsgate/connection.py b/scsgate/connection.py index f62e7ef..cf4f7ca 100644 --- a/scsgate/connection.py +++ b/scsgate/connection.py @@ -1,7 +1,7 @@ """ This module contains an helper class to initiate a connection with the SCSGate device """ -"""import serial as pyserial""" +import serial as pyserial import socket class Connection: @@ -14,7 +14,6 @@ def __init__(self, device, logger, port): device: string containing the serial device allocated to SCSGate logger: instance of logging """ - """self._serial = pyserial.Serial(device, 115200)""" self.device = device self.logger = logger self.port = port @@ -28,64 +27,42 @@ def __init__(self, device, logger, port): self._socket = pyserial.Serial(device, 115200) logger.info("Clearing buffers") - """self._serial.write(b"@b")""" - """self._socket.sendto(b"@b", (device, port))""" self.send(b"@b") - """ret = self._serial.read(1)""" ret = self.receive() - """ret = self._socket.recvfrom(1);""" - if ret != b"k": + if (ret != b"k") or (ret is None): raise RuntimeError("Error while clearing buffers") # ensure pending operations are terminated (eg: @r, @l) - """self._serial.write(b"@c")""" - """self._socket.sendto(b"@c", (device, port))""" - """ret = self._serial.read()""" - """ret = self._socket.recvfrom(1);""" self.send(b"@c") ret = self.receive() - if ret != b"k": + if (ret != b"k") or (ret is None): raise RuntimeError("Error while cancelling pending operations") logger.info("Enabling ASCII mode") - """self._serial.write(b"@MA")""" - """self._socket.sendto(b"@MA", (device, port))""" - """ret = self._serial.read(1)""" - """ret = self._socket.recvfrom(1);""" self.send(b"@MA") ret = self.receive() - if ret != b"k": + if (ret != b"k") or (ret is None): raise RuntimeError("Error while enabling ASCII mode") logger.info("Filter Ack messages") - """self._serial.write(b"@F2")""" - """self._socket.sendto(b"@F2", (device, port))""" - """ret = self._serial.read(1)""" - """ret = self._socket.recvfrom(1);""" self.send(b"@F2") ret = self.receive() - if ret != b"k": + if (ret != b"k") or (ret is None): raise RuntimeError("Error while setting filter") @property - def serial(self): - """ Returns the pyserial.Serial instance """ - return self._socket - def close(self): """ Closes the connection to the serial port and ensure no pending operatoin are left """ - """self._serial.write(b"@c")""" - self._socket.sendto(b"@c", ("192.168.1.26", 52056)) - """self._serial.read()""" - self._socket.recvfrom(1); - """self._serial.close()""" + self.send(b"@c") + self.receive() + self._socket.close() def send(self, message): if self.port != 0: self._socket.sendto(message, (self.device, self.port)) else: - self._serial.write(message) + self._socket.write(message) def receive(self): ret = None diff --git a/scsgate/reactor.py b/scsgate/reactor.py index 4de3ff2..75aa209 100644 --- a/scsgate/reactor.py +++ b/scsgate/reactor.py @@ -58,4 +58,5 @@ def stop(self): def append_task(self, task): """ Adds a tasks to the list of the jobs to execute """ + self._logger.debug("scsgate.Reactor: add to queue") self._request_queue.put(task)