
	/*
	** Converts the iphone???.txt file to iphone???.iph file.
	** The latter stores the data in binary and is much smaller and
	** faster to read.
	**
	** If file number is < 100 (first 20) then it also updates the
	** -events file by adding the START from the first line of the
	** data file.
	*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define	MAX_DATA 15*60*60*48

int main(int argc, char *argv[])

{
FILE	*fpt;
double	*RawData[6];
int	Total_Data;
int	TimeOffset;
double	indata[10];
char	text[320],*str,textdate[320],texttime[320];
char	EventFilename[320];
int	i,j;
int	HaveStart,HaveEnd;  /* 0/1 flags for matching START/END gaps */
int	StartTime,EndTime;  /* times in seconds since midnight, for spanning the gap */
int	StartIndex;		 /* data index of last START time, used to look for missing data using timestamps */
int	TotalMissedData;  /* units are indices (@15Hz) */
char	filename[320];
float	raw;


fpt=fopen(argv[1],"rb");
if (fpt==NULL)
  {
  printf("Unable to open %s for reading\n",argv[1]);
  exit(0);
  }

 	/* read in the data file assuming iphone format */
for (j=0; j<6; j++)
  {
  RawData[j]=(double *)calloc(MAX_DATA,sizeof(double));
  if (RawData[j] == NULL)
    {
    printf("Unable to allocate memory for reading file\n");
    exit(0);
    }
  }
Total_Data=0;
HaveEnd=0;	  /* used to look for gaps */
HaveStart=0;
while (1)
  {
  /* inform user of progress... (takes a few seconds to load file) */
  if (Total_Data % 54000 == 0)
    {
    sprintf(text,"Loading %d hours",Total_Data/54000);
    for (i=0; i<Total_Data/54000; i++)
      strcat(text,".");
    strcat(text,"                ");
    printf("%s\n",text);
    }
  if (Total_Data >= MAX_DATA)
    {
    sprintf(text,"MAX_DATA (%d) exceeded in %s",MAX_DATA,argv[1]);
    printf("%s\n",text);
    exit(0);
    }
  i=fscanf(fpt,"%s",text);
  if (i != 1)	/* end of file */
    break;
  if (strcmp(text,"START") == 0)
    {
    i=fscanf(fpt,"%s %s",textdate,texttime);
    texttime[2]=texttime[5]=0;	/* null out colons */
    if (HaveStart == 0)
      {
				/* TimeOffset is delta-time of first datum (index 0) from midnight; units are milliseconds */
      TimeOffset=( atoi(&(texttime[0]))*(60*60*1000) ) +
    			 ( atoi(&(texttime[3]))*(60*1000) ) +
    			 ( atoi(&(texttime[6]))*(1000) );
      StartTime=TimeOffset/1000;	/* StartTime units are seconds */
      HaveStart=1;
      }
    else if (HaveEnd == 1)
      {
      StartTime=( atoi(&(texttime[0]))*(60*60) ) +
    		    ( atoi(&(texttime[3]))*(60) ) +
    		    ( atoi(&(texttime[6]))*(1) );
      TotalMissedData=(StartTime-EndTime)*15;
      for (; TotalMissedData>0; TotalMissedData--)
    	{
    	RawData[0][Total_Data]=RawData[1][Total_Data]=
    	RawData[2][Total_Data]=RawData[3][Total_Data]=
    	RawData[4][Total_Data]=RawData[5][Total_Data]=0.0;
    	Total_Data++;
    	if (Total_Data >= MAX_DATA)	/* max 20 hours */
    	  break;
    	}
      if (Total_Data >= MAX_DATA)	/* max 20 hours */
        break;
      HaveEnd=0;
      }
    StartIndex=Total_Data;		/* units are data indices @ 15 Hz */
    continue;
    }
  else if (strcmp(text,"END") == 0)
    {
    i=fscanf(fpt,"%s %s",textdate,texttime);
    texttime[2]=texttime[5]=0;	/* null out colons */
    EndTime=( atoi(&(texttime[0]))*(60*60) ) +		/* EndTime units are seconds */
    	    ( atoi(&(texttime[3]))*(60) ) +
    	    ( atoi(&(texttime[6]))*(1) );
    HaveEnd=1;

    TotalMissedData=((EndTime-StartTime)-((Total_Data-StartIndex)/15));	  /* units here are seconds */
    if (TotalMissedData > 5)	  /* START/END times differ by total data read, by more than 5 seconds */
      {
      TotalMissedData*=15;		  /* convert units to indices @ 15 Hz */
      for (; TotalMissedData>0; TotalMissedData--)
    	{
    	RawData[0][Total_Data]=RawData[1][Total_Data]=
    	RawData[2][Total_Data]=RawData[3][Total_Data]=
    	RawData[4][Total_Data]=RawData[5][Total_Data]=0.0;
    	Total_Data++;
    	if (Total_Data >= MAX_DATA)	/* max 20 hours */
    	  break;
    	}
      }

    continue;
    }
  else if (strcmp(text,"MARKER") == 0)
    {		/* not a data line; read the rest and do not keep */
    str=fgets(text,320,fpt);
    continue;
    }
  indata[0]=atof(text);				  /* timestamp since last START, in seconds */
  for (i=1; i<10; i++)
    j=fscanf(fpt,"%lf",&indata[i]);
  RawData[0][Total_Data]=indata[4];	  /* accel X (G) */
  RawData[1][Total_Data]=indata[5];	  /* accel Y (G) */
  RawData[2][Total_Data]=indata[6];	  /* accel Z (G) */
  RawData[3][Total_Data]=indata[7];	  /* yaw (deg/sec) */
  RawData[4][Total_Data]=indata[8];	  /* pitch (deg/sec) */
  RawData[5][Total_Data]=indata[9];	  /* roll (deg/sec) */
  Total_Data++;
  if (Total_Data >= MAX_DATA)	/* max 20 hours */
    break;
  }

fclose(fpt);

strcpy(filename,argv[1]);
filename[strlen(filename)-3]=0;
strcat(filename,"iph");

fpt=fopen(filename,"wb");
for (i=0; i<Total_Data; i++)
  {
  for (j=0; j<6; j++)
    {
    raw=(float)(RawData[j][i]);
    fwrite(&raw,sizeof(float),1,fpt);
    }
  }
fclose(fpt);

	/* check if file number is <100 */
filename[strlen(filename)-4]=0;
i=atoi(&(filename[strlen(filename)-3]));
if (i >= 100)
  exit(0);	/* do not need to fix events file */
fpt=fopen(argv[1],"rb");
fscanf(fpt,"%s %s %s",text,textdate,texttime);
fclose(fpt);
fpt=fopen("fixed.txt","w");
fprintf(fpt,"%s %s %s\n",text,textdate,texttime);
fclose(fpt);
strcpy(filename,argv[1]);
filename[strlen(filename)-4]=0;
strcat(filename,"-events.txt");
sprintf(text,"cat %s >> fixed.txt\n",filename);
system(text);
sprintf(text,"mv fixed.txt fixed%03d.txt\n",i);
system(text);
}


