From 2605b0dc40bfe9da2c2b2f90d5082b00b4281446 Mon Sep 17 00:00:00 2001 From: woutergordts Date: Tue, 23 May 2017 09:32:09 +0200 Subject: [PATCH 1/2] added TCP support and fixed a bug in setUpdateInterval --- pypozyx/lib.py | 4 ++-- pypozyx/pozyx_serial.py | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/pypozyx/lib.py b/pypozyx/lib.py index 9b8a576..fbb8bb9 100755 --- a/pypozyx/lib.py +++ b/pypozyx/lib.py @@ -766,8 +766,8 @@ def setUpdateInterval(self, ms, remote_id=None): """ if not dataCheck(ms): ms = SingleRegister(ms, size=2) - assert ms[0] > 100 and ms[ - 0] <= 600000, 'setUpdateInterval: ms not 100 10 and ms[ + 0] <= 600000, 'setUpdateInterval: ms not 10 Date: Thu, 15 Jun 2017 14:02:45 +0200 Subject: [PATCH 2/2] added threading, device list and updated the tcp function --- pypozyx/pozyx_serial.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/pypozyx/pozyx_serial.py b/pypozyx/pozyx_serial.py index f6ade38..0919892 100644 --- a/pypozyx/pozyx_serial.py +++ b/pypozyx/pozyx_serial.py @@ -6,13 +6,25 @@ from pypozyx.lib import PozyxLib from pypozyx.structures.generic import Data, SingleRegister from serial import Serial +# os is used to get the wlan0 ip address +import os # serial_for_url is needed for tcp socket support from serial import serial_for_url +# weakref is used for retrieve all instances of pozyx devices +import weakref +# RLock based locking for multithread operations +import threading from serial.tools.list_ports import comports ## \addtogroup auxiliary_serial # @{ +def get_wlan0_ip(): + """Return the wlan0 ip used for the TCP bridge""" + import os + ip_wlan0 = os.popen('ip addr show wlan0 | grep "\" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip() + return ip_wlan0 + def list_serial_ports(): """Prints the open serial ports line per line""" ports = comports() @@ -68,18 +80,25 @@ class PozyxSerial(PozyxLib): >>> pozyx = PozyxSerial(serial.tools.list_ports.comports()[0]) """ + # builds a list of all pozyx devices used in one script + instances = [] + ## \addtogroup core # @{ - def __init__(self, port, baudrate=115200, timeout=0.1, write_timeout=0.1, print_output=False, debug_trace=False, tcp=False, ip="127.0.0.1"): + def __init__(self, port=9001, baudrate=115200, timeout=0.1, write_timeout=0.1, print_output=False, debug_trace=False, tcp=False, ip=get_wlan0_ip()): """Initializes the PozyxSerial object. See above for details.""" + self.__class__.instances.append(weakref.proxy(self)) self.print_output = print_output + self.baudrate = baudrate + self.ip = ip + self.port = port + self.url = "socket://" + self.ip + ":" + self.port + # threading lock for the serial exchange + self.rlock = threading.RLock() try: # adding TCP support if tcp == True: - # socket constructor - url="socket://" + ip + ":" + port - print(url) - self.ser = serial_for_url(url=url) + self.ser = serial_for_url(url=self.url, baudrate=self.baudrate, ) else: self.ser = Serial(port, baudrate, timeout=timeout, write_timeout=write_timeout) @@ -153,8 +172,14 @@ def serialExchange(self, s): Serial message the Pozyx returns, stripped from 'D,' at its start and NL+CR at the end. """ + self.rlock.acquire() self.ser.write(s.encode()) + self.rlock.release() + + self.rlock.aqcuire() response = self.ser.readline().decode() + self.rlock.release() + if self.print_output: print('The response to %s is %s.' % (s.strip(), response.strip())) if len(response) == 0: