/****************************************************/ /* */ /* Sample program KAK_read */ /* */ /* This C program read the monthly file of Kakioka */ /* one-second resolution geomagnetic data for */ /* given date and time (year, month, day, hour,min)*/ /* and simply write the data on the display. */ /* */ /* Coded by T. Takeuchi (Nov. 1998)*/ /* */ /****************************************************/ #include #include #include #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #endif typedef struct { unsigned char year[2] ; unsigned char month[2] ; unsigned char day[2] ; unsigned char hour[2] ; unsigned char minute[2] ; unsigned char sday[2] ; unsigned char sminute[2] ; } day_time_part ; typedef struct { unsigned char offF[2] ; unsigned char offH[2] ; unsigned char offZ[2] ; unsigned char offD[2] ; } offset_part ; typedef struct { unsigned char F[2] ; unsigned char H[2] ; unsigned char Z[2] ; unsigned char D[2] ; } data_part ; void Print_Usage(void) ; void Print_Head(long YEAR, long MM, long DD) ; /****************************************************/ /* MAIN */ /****************************************************/ void main(int argc, char *argv[]) { FILE *data_fp ; char data_fname[80] ; int i ; long YYMMDD, YEAR, MM, DD, hhmm, hh, mm ; long seek ; day_time_part day_time ; offset_part offset ; data_part data ; /**** INITIAL SETUP ***/ if (argc != 4){ Print_Usage() ; } if ( strlen( argv[1] ) != 6 ){ Print_Usage() ; } if ( strlen( argv[2] ) != 4 ){ Print_Usage() ; } YYMMDD = atol(argv[1]) ; YEAR = 1900 + YYMMDD / 10000 ; MM = (YYMMDD % 10000) / 100 ; DD = YYMMDD % 100 ; hhmm = atol(argv[2]) ; hh = hhmm / 100 ; mm = hhmm % 100 ; sprintf(data_fname, argv[3]) ; /*** READ DATA ***/ if ((data_fp = fopen(data_fname, "rb")) == NULL){ fprintf(stderr, "File \'%s\' could not be opened.\n", data_fname) ; exit( EXIT_FAILURE ) ; } Print_Head(YEAR, MM, DD) ; seek = (((DD - 1) * 24 + hh) * 60 + mm) * 512 ; fseek(data_fp, seek, SEEK_SET) ; fread(&day_time, 14, 1, data_fp); fseek(data_fp, 2, SEEK_CUR) ; fread(&offset, 8, 1, data_fp) ; fseek(data_fp, 8, SEEK_CUR) ; if (( (day_time.year[0]*256 + day_time.year[1]) != YEAR) || ( (day_time.month[0]*256 + day_time.month[1]) != MM)){ fprintf(stderr, "\nWrong File Name.\n\n") ; exit( EXIT_FAILURE ) ; } for (i = 0 ; i <= 59 ; i++){ fread(&data, 8, 1, data_fp) ; printf("%2.2hd:%2.2hd:%2.2d %9.3f %9.3f %9.3f %9.3f\n", day_time.hour[0] * 256 + day_time.hour[1], day_time.minute[0] * 256 + day_time.minute[1], i, (offset.offF[0] * 256 + offset.offF[1]) * 10 + (data.F[0] * 256 + data.F[1]) * 0.01, (offset.offH[0] * 256 + offset.offH[1]) * 10 + (data.H[0] * 256 + data.H[1]) * 0.01, (offset.offZ[0] * 256 + offset.offZ[1]) * 10 + (data.Z[0] * 256 + data.Z[1]) * 0.01, (offset.offD[0] * 256 + offset.offD[1]) * 10 + (data.D[0] * 256 + data.D[1]) * 0.001) ; } fclose(data_fp) ; } /****************************************************/ /* Print Usage */ /****************************************************/ void Print_Usage() { fprintf(stderr, "\nUsage: KAK_read YYMMDD hhmm [fname]\n") ; fprintf(stderr, "(ex)KAK_read 950101 1200 /data/1995/kak9505.sec\n\n") ; exit( EXIT_FAILURE ) ; } /****************************************************/ /* Print Head */ /****************************************************/ void Print_Head(long YEAR, long MM, long DD) { printf("\n") ; printf("=====================================================\n") ; printf(" KAK(1sec) Sample Read\n") ; printf("=====================================================\n") ; printf(" F : Total force [nanoteslas]\n") ; printf(" H : Horizontal intensity (Northward) [nanoteslas]\n") ; printf(" Z : Vertical intensity (Downward) [nanoteslas]\n") ; printf(" D : Declination (Westward) [minutes]\n") ; printf("\n") ; printf(" Day : %4.4ld.%2.2ld.%2.2ld\n", YEAR, MM, DD) ; printf("----------------------------------------------------\n") ; printf("hh:mm:ss F H Z D\n") ; }