Unix Device File Emulation

B

blaine

Hey everyone,
So I've got a quick query for advice.

We have an embedded device in which we are displaying to an LCD
device that sits at /dev/screen. This device is not readily available
all the time, so I am needing to write an emulator. This will
basically just monitor a file, /dev/screen for example, and write the
commands to a TK or WxWindows canvas.

So sending 'line 0 0 10 10' will draw a line on my canvas from (0,0)
to (10,10).

My question: Whats the best way to set up a monitor (in python) of
this file? Would I simply open up the file for read, check for
changes, get any updated data, and clear the file? Or is there some
standard way of doing something like this that guarantees no overlap
or data loss?

example usage: echo 'line 0 0 10 10' > /dev/screen

On the actual embedded device this is handled by a kernel module. We
can spit commands into it as fast as we can and the kernel module can
keep up. This is typical unix device file behavior.

Any suggestions or advice would be splendid. Thanks!
Blaine
 
H

Helmut Jarausch

blaine said:
Hey everyone,
So I've got a quick query for advice.

We have an embedded device in which we are displaying to an LCD
device that sits at /dev/screen. This device is not readily available
all the time, so I am needing to write an emulator. This will
basically just monitor a file, /dev/screen for example, and write the
commands to a TK or WxWindows canvas.

So sending 'line 0 0 10 10' will draw a line on my canvas from (0,0)
to (10,10).

My question: Whats the best way to set up a monitor (in python) of
this file? Would I simply open up the file for read, check for
changes, get any updated data, and clear the file? Or is there some
standard way of doing something like this that guarantees no overlap
or data loss?

example usage: echo 'line 0 0 10 10' > /dev/screen

On the actual embedded device this is handled by a kernel module. We
can spit commands into it as fast as we can and the kernel module can
keep up. This is typical unix device file behavior.

Any suggestions or advice would be splendid. Thanks!
Blaine

It looks as if you need something like the Unix 'tail -f' command.
Perhaps here is some help

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/414771
http://mail.python.org/pipermail/python-list/2002-August/157510.html
http://pyinotify.sourceforge.net/


--
Helmut Jarausch

Lehrstuhl fuer Numerische Mathematik
RWTH - Aachen University
D 52056 Aachen, Germany
 
V

Ville M. Vainio

blaine said:
example usage: echo 'line 0 0 10 10' > /dev/screen

On the actual embedded device this is handled by a kernel module. We
can spit commands into it as fast as we can and the kernel module can
keep up. This is typical unix device file behavior.

Any suggestions or advice would be splendid. Thanks!

Assuming you are on unix, have you considered FIFO's, os.mkfifo()?
 
D

Dan Upton

(let's try this again, and actually send it to the list this time)

Hey everyone,
So I've got a quick query for advice.

We have an embedded device in which we are displaying to an LCD
device that sits at /dev/screen. This device is not readily available
all the time, so I am needing to write an emulator. This will
basically just monitor a file, /dev/screen for example, and write the
commands to a TK or WxWindows canvas.

So sending 'line 0 0 10 10' will draw a line on my canvas from (0,0)
to (10,10).

My question: Whats the best way to set up a monitor (in python) of
this file? Would I simply open up the file for read, check for
changes, get any updated data, and clear the file? Or is there some
standard way of doing something like this that guarantees no overlap
or data loss?

example usage: echo 'line 0 0 10 10' > /dev/screen

On the actual embedded device this is handled by a kernel module. We
can spit commands into it as fast as we can and the kernel module can
keep up. This is typical unix device file behavior.

Any suggestions or advice would be splendid. Thanks!
Blaine

've only interacted with device files from python that I was only
reading from. And I guess technically they were under /proc and /sys,
rather than /dev, although they may be handled the same way. Anyway,
in that case my method was basically to open the file, read it, close
it, do whatever processing I needed to do on the data, sleep for some
interval...lather, rinse, repeat. Sleeping for some interval may or
may not be appropriate in your case. I know in the case of /proc
files and /sys files, the files are generated on demand by the kernel
and relevant kernel structures are basically printed to a string and
copied into a page in memory that the user program can access. AFAIK,
you can seek back and forth through them, but I don't know whether the
data in the page is updated on a seek, so you may have to close and
reopen the file ever iteration to see what's changed.

HTH,
-dan
 
B

blaine

Assuming you are on unix, have you considered FIFO's, os.mkfifo()?

Thank you - this is exactly what I need, I believe. I'm having a
problem though. The os.mkfifo() works fine, but when I read from the
file my blocking calls dont work as intended... See below:

# Fake Nokia Screen Emulator
import sys, os

class nokia_fkscrn:
def __init__(self, file):
if not os.path.exists(file):
os.mkfifo(file)
self.fifodev = open(file, 'r')
def read(self):
while 1:
r = self.fifodev.readline()
print r

nokia = nokia_fkscrn('dev.file')
nokia.read()

This works at first, but when I write to the 'dev.file' for the first
time, the text is displayed as intended, but then the program just
keeps spitting out blank lines. I can continue to write to the file
(using echo 'test\n' > dev.file) and this shows up in my output, but
amist a giant mass of scrolling blank lines. This also causes my CPU
usage to shoot up to 100%.

Any ideas? This is OS X 10.4
-Blaine
 
B

blaine

while 1:
r = self.fifodev.readline()
if r: print r

According to my docs, readline() returns an empty string
at the end of the file.
Also, you might want to sleep() between reads a little bit.

IMHO. HTH.
Martin

Oh ok, that makes sense. Hmm. So do I not want to use readline()? Or
is there a way to do something like 'block until the file is not
empty'?
 
B

blaine

yes, but you have to follow the usual file handling rules, and close/re-open
the fifo after detecting EOF. You will be blocked on attempting to re-open
until there is another writing process.

while 1:
fp = open('my_fifo', 'r')
while 1:
line = fp.readline()
if line == '':
break
print line.rstrip() # To prevent printing of \n in line
fp.close()

Albert

Oh, good call. Thanks a lot, that really helps. I felt that the
previous solution was workable, but not perhaps 100% correct.

Thanks Albert!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,812
Latest member
GracielaWa

Latest Threads

Top