#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "psgraph.h"

#define PRINTSHIFT  3


#define DIRSHIFT 80

#define MAXDATA 20000
#define CH 13
#define DT 0.1

#define A	0
#define B	1
#define W	2
#define Ts	3
#define Tpt	4
#define RH	5
#define q	6
#define I	7
#define Incx	8
#define Incy	9
#define Dir	10
#define W1D	11
#define T1D	12


#define Time	CH

void swap4( float *x );
float average( float *x, int num );


int main( int argc, char *argv[] )
{
	float xx[CH], *x[CH +1];
	int i, j, num;
	FILE *fp;

	float xmax, xmin, ymax, ymin, dx, dy, Label_dx, Label_dy;

	for(i=0; i<CH+1; i++){		/* 1 for Time	*/
		x[i] = (float *)malloc(sizeof(float)*MAXDATA);
		if( x[i] == NULL ) {
			fprintf( stderr, "Can not malloc\n" );
			exit( EXIT_FAILURE );
		}
	}




	if(argc < 2) {
		fprintf(stderr, "a.out datafile\n");
		exit( EXIT_FAILURE );
	}

	fp = fopen( argv[1], "r" );



	j=0;
	while(0 <  fread(xx, CH, 4, fp)){
		if( j >= MAXDATA ) {
			fprintf( stderr, "Data too large, change MAXDATA\n" );
			exit( EXIT_FAILURE );
		}
		for(i=0; i<CH; i++){
			swap4( &xx[i] );
			*(x[i] + j ) =  xx[i];
		}
		j++;
	}
	num = j;
	fclose(fp);

	for(j=0; j<num; j++){
		*( x[Dir] + j ) += DIRSHIFT;
	}

	for(j=0; j<num; j++){
		*( x[Time] + j ) = DT * j;
	}


        fp = psinit( "plot.ps");
	pssetfont( "Helvetica", 12, fp );
        pslinewidth( 1, fp );
        autoscale( x[Time], num, &xmax, &xmin, &dx, &Label_dx);
	psstrings_cm( 10, 24 + PRINTSHIFT, argv[1], 8, 0, fp);

        autoscale( x[A], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 22.25 + PRINTSHIFT, "A (m/s)", 6, 0, fp);
        pssetwindow(6, 18, 21.5 + PRINTSHIFT, 23 + PRINTSHIFT, xmin, xmax, ymin, ymax );
        psxaxis( xmin, xmax, dx, ymax, xmin, xmax, Label_dx, "%.0f", "t", fp);
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[A], num, fp);

        autoscale( x[B], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 20.75 + PRINTSHIFT, "B (m/s)", 6, 0, fp);
        pssetwindow(6, 18, 20 + PRINTSHIFT, 21.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[B], num, fp);



        autoscale( x[W], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 19.25 + PRINTSHIFT, "W (m/s)", 6, 0, fp);
        pssetwindow(6, 18, 18.5 + PRINTSHIFT, 20 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[W], num, fp);



        autoscale( x[Ts], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 17.75 + PRINTSHIFT, "Ts (deg)", 6, 0, fp);
        pssetwindow(6, 18, 17 + PRINTSHIFT, 18.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[Ts], num, fp);


        autoscale( x[Tpt], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 16.25 + PRINTSHIFT, "Tpt(deg)", 6, 0, fp);
        pssetwindow(6, 18, 15.5 + PRINTSHIFT, 17 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[Tpt], num, fp);



        autoscale( x[RH], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 14.75 + PRINTSHIFT, "RH (%)", 6, 0, fp);
        pssetwindow(6, 18, 14 + PRINTSHIFT, 15.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[RH], num, fp);

        autoscale( x[q], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 13.25+ PRINTSHIFT, "q (???)", 6, 0, fp);
        pssetwindow(6, 18, 12.5 + PRINTSHIFT, 14 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.3f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.3f", "r", fp);
        psline( x[Time], x[q], num, fp);



        autoscale( x[I], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5,  11.75 + PRINTSHIFT, "I (%)", 6, 0, fp);
        pssetwindow(6, 18,  11 + PRINTSHIFT,  12.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[I], num, fp);



        autoscale( x[Incx], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5,  10.25 + PRINTSHIFT, "Incx (deg)", 6, 0, fp);
        pssetwindow(6, 18,  9.5 + PRINTSHIFT,  11 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[Incx], num, fp);



        autoscale( x[Incy], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5,  8.75 + PRINTSHIFT, "Incy (deg)", 6, 0, fp);
        pssetwindow(6, 18,  8 + PRINTSHIFT,  9.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[Incy], num, fp);

        autoscale( x[Dir], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5,  7.25 + PRINTSHIFT, "Sensor Dir(deg)", 6, 0, fp);
        pssetwindow(6, 18,  6.5 + PRINTSHIFT,  8 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[Dir], num, fp);

        autoscale( x[W1D], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5,  5.75 + PRINTSHIFT, "1D-W(m/s)", 6, 0, fp);
        pssetwindow(6, 18,  5 + PRINTSHIFT,  6.5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[W1D], num, fp);



        autoscale( x[T1D], num, &ymax, &ymin, &dy, &Label_dy);
        psstrings_cm( 3.5, 4.25 + PRINTSHIFT, "1D-T(deg)", 6, 0, fp);
        pssetwindow(6, 18, 3.5 + PRINTSHIFT, 5 + PRINTSHIFT, xmin, xmax, ymin, ymax );
        psxaxis( xmin, xmax, dx, ymin, xmin, xmax, Label_dx, "%.0f", "b", fp);
	psyaxis( ymin, ymax, dy, xmin, ymin+Label_dy, ymax, Label_dy, "%.1f", "l", fp);
        psyaxis( ymin, ymax, dy, xmax, ymin+Label_dy, ymax, Label_dy, "%.1f", "r", fp);
        psline( x[Time], x[T1D], num, fp);
	psclose(fp);

}

void swap4( float *x )
{
	char *c;
	char c1;

	c = (char *)x;
	c1 = *c; *c = *(c+3); *(c+3) = c1;
	c1 = *(c+1); *(c+1) = *(c+2); *(c+2) = c1;
}


float average( float *x, int num )
{
	double s;
	int i;

	s=0;
	for(i=0; i<num; i++){
		s += *(x+i);
	}

	return (float)(s/(double)num);
}


