Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "plxfunctions.h"
  4. #include "plxstructs.h"
  5.  
  6.  
  7. void test()
  8. {
  9.     printf("test\n");
  10. }
  11.  
  12. long int *UnitTimeStamps_ReturnPointer(char *FileName, int Channel, int Unit)
  13. {
  14.     long int *UnitTimeStamps_Pointer;
  15.     long int UnitTimeStamp;
  16.     FILE *PLXFile;
  17.     struct PL_FileHeader PLXFileHeader;
  18.     struct PL_ChanHeader PLXChannelHeader[128];
  19.     struct PL_SlowChannelHeader PLXSlowChannelHeader[384];
  20.     struct PL_EventHeader PLXEventHeader[64];
  21.     struct PL_DataBlockHeader PLXDataBlockHeader;
  22.     int InternalUnitCount = 0;
  23.    
  24.     PLXFile = fopen(FileName, "rb");
  25.     if (PLXFile == NULL)
  26.     {
  27.         printf("ERROR: File Not Found\n");
  28.         return NULL;
  29.     }
  30.    
  31.     UnitTimeStamps_Pointer = (long int *)malloc(UnitTimeStamps_TimeStampCount(FileName, Channel, Unit) * sizeof(long int)); //allocate space
  32.    
  33.     rewind(PLXFile);
  34.        
  35.     fread(&PLXFileHeader, sizeof(struct PL_FileHeader), 1, PLXFile);
  36.     fread(&PLXChannelHeader, sizeof(struct PL_ChanHeader) * PLXFileHeader.NumDSPChannels, 1, PLXFile); 
  37.     fread(&PLXEventHeader, sizeof(struct PL_EventHeader) * PLXFileHeader.NumEventChannels, 1, PLXFile);
  38.     fread(&PLXSlowChannelHeader, sizeof(struct PL_SlowChannelHeader) * PLXFileHeader.NumSlowChannels, 1, PLXFile);
  39.    
  40.     while (1)
  41.     {
  42.         fread(&PLXDataBlockHeader, sizeof(struct PL_DataBlockHeader), 1, PLXFile);
  43.         if (feof(PLXFile)) {break;}
  44.        
  45.         if (PLXDataBlockHeader.Type == 1 && PLXDataBlockHeader.Channel == Channel && PLXDataBlockHeader.Unit == Unit)
  46.         {
  47.             UnitTimeStamp = ((long int)PLXDataBlockHeader.UpperByteOf5ByteTimestamp << 32) + (long int)PLXDataBlockHeader.TimeStamp;
  48.             UnitTimeStamps_Pointer[InternalUnitCount] = UnitTimeStamp;
  49.             InternalUnitCount++;
  50.             SkipSpikeData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  51.         }
  52.        
  53.         else if (PLXDataBlockHeader.Type == 1)
  54.         {
  55.             SkipSpikeData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  56.         }
  57.        
  58.         else if (PLXDataBlockHeader.Type == 4)
  59.         {
  60.             SkipEventBlock();
  61.         }
  62.        
  63.         else if (PLXDataBlockHeader.Type == 5)
  64.         {
  65.             SkipContinuousData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  66.         }
  67.        
  68.     }
  69.    
  70.     fclose(PLXFile);
  71.     return UnitTimeStamps_Pointer;
  72.  
  73. }
  74.  
  75. int UnitTimeStamps_TimeStampCount(char *FileName, int Channel, int Unit)
  76. {
  77.     FILE *PLXFile;
  78.     struct PL_FileHeader PLXFileHeader;
  79.     struct PL_ChanHeader PLXChannelHeader[128];
  80.     struct PL_SlowChannelHeader PLXSlowChannelHeader[384];
  81.     struct PL_EventHeader PLXEventHeader[64];
  82.     struct PL_DataBlockHeader PLXDataBlockHeader;
  83.     int InternalUnitCount = 0;
  84.    
  85.     PLXFile = fopen(FileName, "rb");
  86.     if (PLXFile == NULL)
  87.     {
  88.         printf("ERROR: File Not Found\n");
  89.         return 0;
  90.     }
  91.    
  92.     //First pass through the file to determine how many units there are
  93.     fread(&PLXFileHeader, sizeof(struct PL_FileHeader), 1, PLXFile);
  94.     fread(&PLXChannelHeader, sizeof(struct PL_ChanHeader) * PLXFileHeader.NumDSPChannels, 1, PLXFile); 
  95.     fread(&PLXEventHeader, sizeof(struct PL_EventHeader) * PLXFileHeader.NumEventChannels, 1, PLXFile);
  96.     fread(&PLXSlowChannelHeader, sizeof(struct PL_SlowChannelHeader) * PLXFileHeader.NumSlowChannels, 1, PLXFile);
  97.    
  98.     while (1)
  99.     {
  100.         fread(&PLXDataBlockHeader, sizeof(struct PL_DataBlockHeader), 1, PLXFile);
  101.         if (feof(PLXFile)) {break;}
  102.        
  103.         if (PLXDataBlockHeader.Type == 1 && PLXDataBlockHeader.Channel == Channel && PLXDataBlockHeader.Unit == Unit)
  104.         {
  105.             InternalUnitCount++;
  106.             SkipSpikeData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  107.         }
  108.        
  109.         else if (PLXDataBlockHeader.Type == 1)
  110.         {
  111.             SkipSpikeData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  112.         }
  113.        
  114.         else if (PLXDataBlockHeader.Type == 4)
  115.         {
  116.             SkipEventBlock();
  117.         }
  118.        
  119.         else if (PLXDataBlockHeader.Type == 5)
  120.         {
  121.             SkipContinuousData(PLXFile, PLXDataBlockHeader.NumberOfWordsInWaveform);
  122.         }
  123.        
  124.     }
  125.    
  126.     return InternalUnitCount;
  127.     fclose(PLXFile);
  128.    
  129.    
  130. }
  131.  
  132. void SkipSpikeData (FILE *file, int SkipLength)
  133. {
  134.     fseek(file, (SkipLength * sizeof(short int)), SEEK_CUR);
  135.     return;
  136. }
  137.  
  138. void SkipEventBlock()
  139. {
  140.     return;
  141. }
  142.  
  143. void SkipContinuousData(FILE *file, int SkipLength)
  144. {
  145.     fseek(file, (SkipLength * sizeof(short int)), SEEK_CUR);
  146.     return;
  147. }