예제 #1
0
    def DetectDevice(self):
        # try to detect com device

        # reset com port status
        self.ResetComPort()

        # put message to the logger
        if self._detMsg:
            coreUtils.SafeLogger('info', self._detMsg, self)

        # NOTE: serial.tools.list_ports.grep(name) does not seem to work...
        for p in serial.tools.list_ports.comports():
            if self._comPortName in p.description:
                self._comPortList.append(p)

                coreUtils.SafeLogger(
                    'info', 'Found device \'%s\' on \'%s\'.' % (p[1], p[0]),
                    self)

        if len(self._comPortList) == 1:
            self.comPortInfo = self._comPortList[self._comPortListIdx]
        else:
            None
            # multiple ones found...user needs to choose the correct port...

        if not self.comPortInfo:
            coreUtils.SafeLogger('info', 'Could not be found!', self)
예제 #2
0
    def SafeWriteToComPort(self, outData, **flags):

        success = True
        leaveOpen = flags.get('leaveOpen', False)

        if self.SafeOpenComPort():

            # just lock for anybody else
            self._isReadingWriting = True

            try:
                if not self._isAboutToOpenClose:
                    self.comPort.write(outData)
            except (serial.SerialException, serial.SerialTimeoutException):
                self.comPortStatus = False
                success = False

                coreUtils.SafeLogger(
                    'error', 'Could not write: \'%s\' to port \'%s\'!' %
                    (outData, self.comPortInfo[0]), self)

            finally:
                # release lock
                self._isReadingWriting = False

                if not leaveOpen:
                    success = self.SafeCloseComPort()

        return success
예제 #3
0
    def SafeCloseComPort(self):

        success = False

        if self.comPortStatus and isinstance(self.comPort,
                                             serial.serialwin32.Serial):
            # wait until reading/writing was finished
            # or the port is opened/closed by somebody else
            while self._isReadingWriting or self._isAboutToOpenClose:
                sleep(50e-6)

            # try to close now
            self._isAboutToOpenClose = True

            try:
                if self.comPort.isOpen():
                    self.comPort.close()
            except serial.SerialException:

                # to avoid any contact afterwards
                self.comPortStatus = False

                coreUtils.SafeLogger('error', 'Could not close serial port!',
                                     self)
            else:
                # closing finished
                self._isAboutToOpenClose = False
                success = True

        return success
예제 #4
0
    def SafeOpenComPort(self):

        success = False

        if self.comPortStatus:
            # wait until reading/writing was finished
            # or the port is opened/closed by somebody else
            while self._isReadingWriting or self._isAboutToOpenClose:
                sleep(50e-6)

            # try to open now, if not already...
            self._isAboutToOpenClose = True

            try:
                if not self.comPort.isOpen():
                    self.comPort.open()
            except serial.SerialException:

                # to avoid any contact afterwards
                self.comPortStatus = False

                coreUtils.SafeLogger('error', 'Could not open serial port!',
                                     self)
            else:
                # opening finished
                self._isAboutToOpenClose = False
                success = True

        return success
예제 #5
0
    def SetupSerialPort(self, flags={}):

        if self.comPortInfo:

            coreUtils.SafeLogger('info', 'Initializing serial port.', self)

            # do it step by step to avoid reset of Arduino by DTR HIGH signal (pulls reset pin)
            # NOTE: some solutions use hardware to solve this problem...
            try:
                self.comPort = serial.Serial()
                self.comPort.port = self.comPortInfo.device
            except serial.SerialException:
                coreUtils.SafeLogger('error',
                                     'Could not initialize serial port!', self)
            else:
                try:
                    self.comPort.baudrate = flags.get('baudrate', 9600)
                    self.comPort.bytesize = flags.get('bytesize',
                                                      serial.EIGHTBITS)
                    self.comPort.parity = flags.get('parity',
                                                    serial.PARITY_NONE)
                    self.comPort.stopbits = flags.get('stopbits',
                                                      serial.STOPBITS_ONE)
                    self.comPort.timeout = flags.get('timeout', 0)
                    self.comPort.xonxoff = flags.get('xonxoff', False)
                    self.comPort.rtscts = flags.get('rtscts', False)
                    self.comPort.dsrdtr = flags.get('dsrdtr', False)
                    self.comPort.dtr = flags.get('dtr', False)
                except ValueError:
                    coreUtils.SafeLogger(
                        'error',
                        'Com port initialization: value out of range!', self)

                # if no exception was raised until here, com port status should be fine
                else:
                    self.comPortStatus = True
예제 #6
0
    def _ListenFunction(self):
        ''' listen to incoming messages and process them according to user flag 'keepMessages'
        '''

        if self.SafeOpenComPort():

            while self._listening:

                inMsg = self.SafeReadFromComPort('waiting',
                                                 decode=True,
                                                 leaveOpen=True)

                #                print('\''+inMsg+'\'')

                if len(inMsg) > 0:
                    inMsg = inMsg.split(self._messageDelimiter)

                    # if user wants to handle messages
                    # append new messages to class member
                    # user can access later via GetMessages()
                    if self._keepMessages:
                        self._inMessages += inMsg
                    else:
                        while len(inMsg) > 0:
                            msg = inMsg.pop(0)
                            if msg:
                                coreUtils.SafeLogger('info',
                                                     msg.strip(chr(241)), self)

                # automatically stop loop
                if self._listenFor:
                    if (time() - self._listenStart) > self._listenFor:
                        self._listening = False

                sleep(1e-4)

            self.SafeCloseComPort()
예제 #7
0
    def SafeReadFromComPort(self, mode='', waitFor=0, bePatient=0, **flags):

        inData = bytes()
        leaveOpen = flags.get('leaveOpen', False)
        decode = flags.get('decode', False)

        if self.SafeOpenComPort():

            # just lock for anybody else
            self._isReadingWriting = True

            try:
                if mode == '':

                    # check if comport is not going to be killed
                    if not self._isAboutToOpenClose:
                        inData = self.comPort.read()

                elif mode == 'line':
                    # check if comport is not going to be killed
                    if not self._isAboutToOpenClose:
                        inData = self.comPort.readline()

                elif mode == 'waiting':

                    if waitFor > 0 and bePatient > 0:

                        waitingFor = 0

                        while self.comPort.in_waiting == 0 and waitingFor < waitFor * 1e3:
                            waitingFor += 1
                            sleep(1e-3)

                        # collecting incoming bytes and wait max 'bePatient' ms for the next one
                        waitingFor = 0

                        while self.comPort.in_waiting != 0 or waitingFor < bePatient:
                            # check if comport is not going to be killed
                            if not self._isAboutToOpenClose:
                                inData += self.comPort.read(
                                    self.comPort.in_waiting)

                            # in case there's something more just wait a bit...
                            if self.comPort.in_waiting == 0:
                                waitingFor += 1
                                sleep(1e-3)

                    else:
                        while self.comPort.in_waiting != 0:
                            inData += self.comPort.read(
                                self.comPort.in_waiting)

            except (serial.SerialException, serial.SerialTimeoutException):
                self.comPortStatus = False

                coreUtils.SafeLogger(
                    'error', 'Could not read bytes from port \'%s\'!' %
                    self.comPortInfo[0], self)

            finally:
                # release lock
                self._isReadingWriting = False

                if not leaveOpen:
                    self.SafeCloseComPort()

            if decode:
                inData = inData.decode('latin-1')

        return inData