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