00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
#ifndef _VRGUPPIBUFFER_H_
00038
#define _VRGUPPIBUFFER_H_
00039
00040
#include <unistd.h>
00041
#include <sys/mman.h>
00042
00043
template<
class T>
class VrGuppiBuffer;
00044
00045
#include <VrSigProc.h>
00046
#include <VrConnect.h>
00047
#include <VrBuffer.h>
00048
#include <guppi.h>
00049
00050
template<
class T>
class VrGuppiBuffer :
public VrBuffer {
00051
private:
00052 int guppi_fd;
00053 unsigned long bufferSize_bytes;
00054
virtual void allocateBuffer(
unsigned int arg_type_size);
00055
public:
00056 VrGuppiBuffer(
VrSigProc *m,
int gupfd) :
VrBuffer(m) {
guppi_fd=gupfd; }
00057 };
00058
00059
template<
class T>
void
00060 VrGuppiBuffer<T>::allocateBuffer(
unsigned int arg_type_size)
00061 {
00062 bufferSize = 0;
00063 type_size = arg_type_size;
00064
if(bufferSize<3*1024*
PAGE_SIZE/
sizeof(T))
00065 bufferSize=3*1024*
PAGE_SIZE/
sizeof(T);
00066
00067
bufferSize_bytes = bufferSize*
sizeof(T);
00068
00069
00070
if((
bufferSize_bytes %
PAGE_SIZE) != 0) {
00071
bufferSize_bytes = (
bufferSize_bytes/
PAGE_SIZE + 1) *
PAGE_SIZE;
00072
00073 bufferSize =
bufferSize_bytes/
sizeof(T);
00074 }
00075
00076
if((ioctl(
guppi_fd,
GIOCSETBUFSIZE,
bufferSize_bytes/
PAGE_SIZE)) < 0) {
00077 perror(
"VrGuppiBuffer(allocateBuffer): Failed to set buffersize");
00078 exit(-1);
00079 }
00080
00081
if((ioctl(
guppi_fd,
GIOCSTART)) < 0) {
00082 perror(
"VrGuppiBuffer(allocateBuffer): start receive failed");
00083 exit(-1);
00084 }
00085
00086
00087
char *start =
NULL;
00088
int fdz = open(
"/dev/zero",O_RDONLY);
00089
if((start=(
char *) mmap(0,
bufferSize_bytes*2,PROT_NONE,MAP_SHARED,fdz,0)) == MAP_FAILED ||
00090 munmap(start,
bufferSize_bytes*2) == -1) {
00091 perror(
"Could not allocate mmap memory for guppi buffer");
00092 exit(-1);
00093
return;
00094 }
00095 close(fdz);
00096
00097
00098
if((mmap(start,
bufferSize_bytes,PROT_READ,MAP_FIXED|MAP_SHARED,
guppi_fd,0)) == MAP_FAILED ||
00099 (mmap(start+
bufferSize_bytes,bufferSize_bytes,PROT_READ,MAP_FIXED|MAP_SHARED,
guppi_fd,0)) == MAP_FAILED) {
00100 perror(
"Could not mmap Guppi buffer");
00101 exit(-1);
00102
return;
00103 }
00104
00105 bufferDupStart = ((
char *)start) + bufferSize * type_size;
00106
00107 }
00108
#endif