Unix Device File Emulation

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • blaine

    Unix Device File Emulation

    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
  • Helmut Jarausch

    #2
    Re: Unix Device File Emulation

    blaine wrote:
    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



    Download pyinotify for free. None



    --
    Helmut Jarausch

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

    Comment

    • Ville M. Vainio

      #3
      Re: Unix Device File Emulation

      blaine wrote:
      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()?

      Comment

      • Dan Upton

        #4
        Re: Unix Device File Emulation

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

        On Wed, Apr 23, 2008 at 11:02 AM, blaine <frikker@gmail. comwrote:
        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...lath er, 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

        Comment

        • blaine

          #5
          Re: Unix Device File Emulation

          On Apr 23, 11:17 am, "Ville M. Vainio" <vivai...@gmail .comwrote:
          blaine wrote:
          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()?
          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.re adline()
          print r

          nokia = nokia_fkscrn('d ev.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

          Comment

          • Martin Blume

            #6
            Re: Unix Device File Emulation

            "blaine" schrieb
            >
            # 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.re adline()
            print r
            >
            nokia = nokia_fkscrn('d ev.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
            >
            while 1:
            r = self.fifodev.re adline()
            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



            Comment

            • blaine

              #7
              Re: Unix Device File Emulation

              On Apr 23, 12:27 pm, "Martin Blume" <mbl...@freesur f.chwrote:
              "blaine" schrieb
              >
              >
              >
              >
              >
              # 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.re adline()
              print r
              >
              nokia = nokia_fkscrn('d ev.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
              >
              while 1:
              r = self.fifodev.re adline()
              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'?

              Comment

              • Martin Blume

                #8
                Re: Unix Device File Emulation

                "blaine" schrieb

                while 1:
                r = self.fifodev.re adline()
                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.
                >
                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'?
                >
                No,
                while 1:
                r = self.fifodev.re adline()
                if r: print r
                else: time.sleep(0.1)
                is ok (note the "if r:" clause).

                Martin



                Comment

                • blaine

                  #9
                  Re: Unix Device File Emulation

                  On Apr 23, 2:01 pm, "Martin Blume" <mbl...@freesur f.chwrote:
                  "blaine" schrieb
                  >
                  >
                  >
                  while 1:
                  r = self.fifodev.re adline()
                  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.
                  >
                  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'?
                  >
                  No,
                  while 1:
                  r = self.fifodev.re adline()
                  if r: print r
                  else: time.sleep(0.1)
                  is ok (note the "if r:" clause).
                  >
                  Martin
                  Beautiful! Thanks Martin!

                  Comment

                  • A.T.Hofkamp

                    #10
                    Re: Unix Device File Emulation

                    On 2008-04-23, blaine <frikker@gmail. comwrote:
                    On Apr 23, 2:01 pm, "Martin Blume" <mbl...@freesur f.chwrote:
                    >"blaine" schrieb
                    >No,
                    > while 1:
                    > r = self.fifodev.re adline()
                    > if r: print r
                    > else: time.sleep(0.1)
                    >is ok (note the "if r:" clause).
                    >>
                    >Martin
                    >
                    Beautiful! Thanks Martin!
                    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

                    Comment

                    • blaine

                      #11
                      Re: Unix Device File Emulation

                      On Apr 24, 3:38 am, "A.T.Hofkam p" <h...@se-162.se.wtb.tue. nlwrote:
                      On 2008-04-23, blaine <frik...@gmail. comwrote:
                      >
                      On Apr 23, 2:01 pm, "Martin Blume" <mbl...@freesur f.chwrote:
                      "blaine" schrieb
                      No,
                      while 1:
                      r = self.fifodev.re adline()
                      if r: print r
                      else: time.sleep(0.1)
                      is ok (note the "if r:" clause).
                      >
                      Martin
                      >
                      Beautiful! Thanks Martin!
                      >
                      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!

                      Comment

                      Working...