From 334f1427233510aa5249e4e2dea4b1e5c76c514f Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 10 Apr 2008 01:18:46 +0200 Subject: * host/proto: - added program io utility. - added Proto.wait. --- host/proto/popen_io.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++ host/proto/proto.py | 10 +++++++++- host/proto/test/asserv.py | 11 +++-------- 3 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 host/proto/popen_io.py diff --git a/host/proto/popen_io.py b/host/proto/popen_io.py new file mode 100644 index 00000000..f1c3cb84 --- /dev/null +++ b/host/proto/popen_io.py @@ -0,0 +1,50 @@ +# proto - Proto interface. {{{ +# +# Copyright (C) 2008 Nicolas Schodet +# +# APBTeam: +# Web: http://apbteam.org/ +# Email: team AT apbteam DOT org +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# }}} +"""Popen IO, to be used with a program.""" +import os, time + +class PopenIO: + r"""Implements the required interface to dialog with a program. Will + convert from and to \r and \n.""" + + def __init__ (self, cmd): + """Initialise and start the given commande line.""" + fout, fin = os.popen2 (cmd, 'b', 1) + time.sleep (0.2) + self.fin = fin + self.fout = fout + + def read (self, *args): + buf = self.fin.read (*args).replace ('\n', '\r') + return buf + + def write (self, *args): + return self.fout.write (*[i.replace ('\r', '\n') for i in args]) + + def fileno (self): + return self.fin.fileno () + + def close (self): + self.fin.close () + self.fout.close () diff --git a/host/proto/proto.py b/host/proto/proto.py index e6d3ab32..36616d9c 100644 --- a/host/proto/proto.py +++ b/host/proto/proto.py @@ -22,7 +22,7 @@ # # }}} """Proto interface module.""" -import binascii, struct +import binascii, struct, select START = 0 BANG = 1 @@ -68,6 +68,14 @@ class Proto: self.send_head () return not self.send_queue + def wait (self, cond = None): + """Wait forever or until cond () is True.""" + while not (self.sync () and (cond is None or cond ())): + fds = select.select ((self,), (), (), self.timeout)[0] + for i in fds: + assert i is self + i.read () + def register (self, command, fmt, handler): """Register a handler for the specified command and format. The handler will receive decoded arguments.""" diff --git a/host/proto/test/asserv.py b/host/proto/test/asserv.py index e578d9dd..265f0815 100644 --- a/host/proto/test/asserv.py +++ b/host/proto/test/asserv.py @@ -2,13 +2,11 @@ import sys sys.path.append (sys.path[0] + '/..') import proto -from fio import IO +from popen_io import PopenIO import time, select, os # Pass program name as argument. -fout, fin = os.popen2 (sys.argv[1:], 't', 1) -time.sleep (0.5) -io = IO (fin, fout) +io = PopenIO (sys.argv[1:]) def log (x): print x @@ -30,7 +28,4 @@ p.register ('C', 'HHH', counter_stat) p.send ('C', 'B', 255) -while not p.sync () or done != 3: - fds = select.select ((p,), (), (), 0.1)[0] - for i in fds: - i.read () +p.wait (lambda: done == 3) -- cgit v1.2.3