Thanks! That code makes is much closer to what I am looking for.
Question-- When trying to compile and run it I get
root@beaglebone:~/libpruio-0.2/src/c_examples# ./rb_file
config failed (sample rate too big)
Its failing on the call to config--
if (pruio_config(io, samp, mask, tmr, 0))
Is that expected? Should I just adjust the samp var? or is something I
using out-of-date?
On Saturday, August 22, 2015 at 11:24:02 AM UTC-6, TJF wrote:
>
> Hi!
>
> To sample as fast as possible you've to configure your steps first, using
> function AdcUdt::setStep:
>
> - Avaraging = 0
> - SaD = 0
> - OpD = 0
>
> Then you call PruIo::config()
>
> - Samp is the number of samples to fetch. In MM mode it's the size of
> the buffer, libpruio stops when the buffer is full. In RB mode the buffer
> is used as a ring buffer an sampling continues. Samp <= 1 means single
> mode
> (no accurate timing = variable sampling rate).
> - Tmr is the number of ns between the samples (MM and RB mode only),
> so that's the parameter to specify the sampling rate.
>
> io_input.c uses single mode. Better start with rb_file.c example:
>
> /** \file rb_file.c
> \brief Example: fetch ADC samples in a ring buffer and save to file.
>
> This file contains an example on how to use the ring buffer mode of
> libpruio. A fixed step mask of AIN-0, AIN-1 and AIN-2 get configured
> for maximum speed, sampled in to the ring buffer and from there saved
> as raw data to some files.
>
> Licence: GPLv3
>
> Copyright 2014-2015 by Thomas{ dOt ]Freiherr[ At ]gmx[ DoT }net
>
> Thanks for C code translation: Nils Kohrs (nils.kohrs [at] gmail.com)
>
> Compile by: `gcc -Wall -o rb_file rb_file.c -lpruio -lprussdrv`
>
> \since 0.2.0.2
> */
>
> #include "unistd.h"
> #include "time.h"
> #include "stdio.h"
> #include "../c_include/pruio.h"
>
> //! The main function.
> int main(int argc, char **argv)
> {
> const uint32 tSamp = 123401; //!< The number of samples in the files
> (per step).
> const uint32 tmr = 5000; //!< The sampling rate in ns (5000 -> 200
> kHz).
> const uint32 NoStep = 3; //!< The number of active steps (must
> match setStep calls and mask).
> const uint32 NoFile = 2; //!< The number of files to write.
> const char *NamFil = "output.%u"; //!< The output file names.
> struct timespec mSec;
> mSec.tv_nsec=1000000;
> pruIo *io = pruio_new(PRUIO_DEF_ACTIVE, 0x98, 0, 1); //! create new
> driver
> if (io->Errr){
> printf("constructor failed (%s)\n", io->Errr); return 1;}
>
> do {
> if (pruio_adc_setStep(io, 9, 0, 0, 0, 0)){ // step 9, AIN-0
> printf("step 9 configuration failed: (%s)\n", io->Errr); break;}
> if (pruio_adc_setStep(io,10, 1, 0, 0, 0)){ // step 10, AIN-1
> printf("step 10 configuration failed: (%s)\n", io->Errr); break;}
> if (pruio_adc_setStep(io,11, 2, 0, 0, 0)){ // step 11, AIN-2
> printf("step 11 configuration failed: (%s)\n", io->Errr); break;}
>
> uint32 mask = 7 << 9; //!< The active steps (9 to 11).
> uint32 tInd = tSamp * NoStep; //!< The maximum total index.
> uint32 half = ((io->ESize >> 2) / NoStep) * NoStep; //!< The maximum
> index of the half ring buffer.
>
> if (half > tInd){ half = tInd;} // adapt size for small files
> uint32 samp = (half << 1) / NoStep; //!< The number of samples (per
> step).
>
> if (pruio_config(io, samp, mask, tmr, 0)){ // configure driver
> printf("config failed (%s)\n", io->Errr); break;}
>
> if (pruio_rb_start(io)){
> printf("rb_start failed (%s)\n", io->Errr); break;}
>
> uint16 *p0 = io->Adc->Value; //!< A pointer to the start of the ring
> buffer.
> uint16 *p1 = p0 + half; //!< A pointer to the middle of the
> ring buffer.
> uint32 n; //!< File counter.
> char fName[20];
> for(n = 0; n < NoFile; n++){
> sprintf(fName, NamFil, n);
> printf("Creating file %s\n", fName);
> FILE *oFile = fopen(fName, "wb");
> uint32 i = 0; //!< Start index.
> while(i < tInd){
> i += half;
> if(i > tInd){ // fetch the rest(no complete chunk)
> uint32 rest = tInd + half - i;
> uint32 iEnd = p1 >= p0 ? rest : rest + half;
> while(io->DRam[0] < iEnd) nanosleep(&mSec, NULL);
> printf(" writing samples %u-%u\n", tInd -rest, tInd-1);
> fwrite(p0, sizeof(uint16), rest, oFile);
> uint16 *swap = p0;
> p0 = p1;
> p1 = swap;
> }
> if(p1 > p0) while(io->DRam[0] < half) nanosleep(&mSec, NULL);
> else while(io->DRam[0] > half) nanosleep(&mSec, NULL);
> printf(" writing samples %u-%u\n", i-half, i-1);
> fwrite(p0, sizeof(uint16), half, oFile);
> uint16 *swap = p0;
> p0 = p1;
> p1 = swap;
> }
> fclose(oFile);
> printf("Finished file %s\n", fName);
> }
> } while(0);
> pruio_destroy(io);
> return 0;
> }
>
> BR
>
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.