diff options
author | Chris Johns <chrisj@rtems.org> | 2014-02-15 06:30:06 +1100 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2014-02-15 06:30:06 +1100 |
commit | 50fdf12244e784bd52732be1e68d966bc9629b24 (patch) | |
tree | 93b6656d397f3ef358b50aeaef6dc4d10a653f8c /tester/rt/console.py | |
parent | libffi: Fix for Fedora 64bit pkg-config file. (diff) | |
download | rtems-tools-50fdf12244e784bd52732be1e68d966bc9629b24.tar.bz2 |
rt: Add the rtems-tester.
Diffstat (limited to '')
-rw-r--r-- | tester/rt/console.py | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/tester/rt/console.py b/tester/rt/console.py new file mode 100644 index 0000000..74ec3bf --- /dev/null +++ b/tester/rt/console.py @@ -0,0 +1,143 @@ +# +# RTEMS Tools Project (http://www.rtems.org/) +# Copyright 2013-2014 Chris Johns (chrisj@rtems.org) +# All rights reserved. +# +# This file is part of the RTEMS Tools package in 'rtems-tools'. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# +# RTEMS Testing Consoles +# + +import errno +import fcntl +import os +import threading +import time + +import stty + +def save(): + return stty.save() + +def restore(attributes): + stty.restore(attributes) + +class console(object): + '''RTEMS Testing console base.''' + + def __init__(self, name, trace): + self.name = name + self.trace = trace + + def __del__(self): + pass + + def _tracing(self): + return self.trace + + def open(self): + pass + + def close(self): + pass + +class stdio(console): + '''STDIO console.''' + + def __init__(self, trace = False): + super(stdio, self).__init__('stdio', trace) + +class tty(console): + '''TTY console connects to serial ports.''' + + raw = 'B115200,~BRKINT,IGNBRK,IGNCR,~ICANON,~ISIG,~IEXTEN,~ECHO,CLOCAL,~CRTSCTS' + + def __init__(self, dev, output, setup = None, trace = False): + self.tty = None + self.read_thread = None + self.dev = dev + self.output = output + if setup is None: + self.setup = raw + else: + self.setup = setup + super(tty, self).__init__(dev, trace) + + def __del__(self): + super(tty, self).__del__() + if self._tracing(): + print ':: tty close', self.dev + fcntl.fcntl(me.tty.fd, fcntl.F_SETFL, + fcntl.fcntl(me.tty.fd, fcntl.F_GETFL) & ~os.O_NONBLOCK) + self.close() + + def open(self): + def _readthread(me, x): + if self._tracing(): + print ':: tty runner started', self.dev + fcntl.fcntl(me.tty.fd, fcntl.F_SETFL, + fcntl.fcntl(me.tty.fd, fcntl.F_GETFL) | os.O_NONBLOCK) + line = '' + while me.running: + time.sleep(0.05) + try: + data = me.tty.fd.read() + except IOError, ioe: + if ioe.errno == errno.EAGAIN: + continue + raise + except: + raise + for c in data: + if len(c) == 0: + continue + if c != chr(0): + line += c + if c == '\n': + me.output(line) + line = '' + if self._tracing(): + print ':: tty runner finished', self.dev + if self._tracing(): + print ':: tty open', self.dev + self.tty = stty.tty(self.dev) + self.tty.set(self.setup) + self.tty.on() + self.read_thread = threading.Thread(target = _readthread, + name = 'tty[%s]' % (self.dev), + args = (self, 0)) + self.read_thread.daemon = True + self.running = True + self.read_thread.start() + + def close(self): + if self.tty: + time.sleep(1) + if self.read_thread: + self.running = False + self.read_thread.join(1) + self.tty = None |