help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Running Octave in the background


From: Ben Sapp
Subject: Re: Running Octave in the background
Date: Fri, 14 Apr 2000 08:37:57 -0600

Bob Bumala wrote: 
> Hi there,
>         I've been using the Matlab Engine to display real time data for our
> experiment "GLAST".  http://glast/ .   A real time stream of packets is
> archived by a set of programs called SETS, and the packet is placed in
> shared memory, where a separate C program extracts the data and sends it
> to the Matlab engine for display.
>         Is it possible to do this with Octave?
>         How do I invoke the engine?
>         How do I pass the parameters?

Hi Bob,  

If I understand your problem right you can do it all from Octave.  You
have a couple of choices.  I actually think it would be the most
efficient to read in the shared memory directly from Octave and by-pass
the seperate C program all together.  For example something like the
following:

---------------------------------------------------------
#include <octave/oct.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

DEFUN_DLD(shm_access,args, ,"Program to access shared memory")
{
  ColumnVector data(size_of_data);

  open(shared_memory);

  read(shared_memory_into_the_data_vector);

  return octave_value(data);
}
----------------------------------------------------------

You would put this in a file called shm_access.cc(or whatever the first
arguement to DEFUN_DLD was) then you would compile it with 'mkoctfile -v
shm_access.cc'.  Then you would need to put the shm_access.oct file in
your OCTAVE_PATH.  Then you could access the data from octave command
line like so:

octave:1> data = shm_access;
octave:2> plot(shm_access);

Now, you mentioned a C-program that passes the data to Matlab.  I am not
exactly sure how, maybe you could explain?  If it is by pipes you could
simply call your program from Octave and read in the data from stdin
like so:  

octave:1> shm = popen("shm_access","r");
octave:2> data = zeros(1,size_of_data);
octave:3> i = 1;
octave:4> while (isstr (s = fgets (fid)))
data(i) = str2num(s);
i++;
endwhile
octave:5> plot(data);

As far as invoking the Octave engine.  That is very simple.   Once you
know the command you want to execute put them in a file.  You can run it
from the command line like so:

octave display_data

where display_data is the name of your file.  On systems that support it
you can also put the following line on the top of the file:

#!/path/to/your/octave

and then make the file executable(chmod +x display_file) and then runit
directly from the command line like so: 

./display_file

I hope that answers your question.  If not,  keep asking!  I would like
to know how this goes Bob.  I had not thought of this approach before. 
I have written a program for a neutrino experiment
(http://www.neutrino.lanl.gov/BooNE) that accesses shared memory and
display certain information.  But,  I used Java as the GUI.  This is not
nearly as flexible as the capabilities of Octave and gnuplot.  The only
downside is I can not have buttons that say things like "go", "stop" 
and "pause".   Thanks for the idea.  :-)  

-- 
Ben Sapp                         Los Alamos National Laboratory
email: <mailto:address@hidden>   Phone: (505)667-3277
Fax:   (505)665-7920             URL:   http://www.neutrino.lanl.gov/
--



-----------------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:  http://www.che.wisc.edu/octave/octave.html
How to fund new projects:  http://www.che.wisc.edu/octave/funding.html
Subscription information:  http://www.che.wisc.edu/octave/archive.html
-----------------------------------------------------------------------



reply via email to

[Prev in Thread] Current Thread [Next in Thread]