/*************************************************************************** * mst_writemseedgroup: * * Pack MSTraceGroup data into Mini-SEED records by calling mst_pack() * for each MSTrace in the group and write to a specified file. * * Returns the number of records written on success and -1 on error. ***************************************************************************/ int mst_writemseedgroup (MSTraceGroup *mstg, const char *msfile, flag overwrite, int reclen, flag encoding, flag byteorder, flag verbose) { MSTrace *mst; FILE *ofp; char srcname[50]; char *perms = (overwrite) ? "wb" : "ab"; int trpackedrecords; int packedrecords = 0; if (!mstg || !msfile) return -1; /* Open output file or use stdout */ if (strcmp (msfile, "-") == 0) { ofp = stdout; } else if ((ofp = fopen (msfile, perms)) == NULL) { ms_log (1, "Cannot open output file %s: %s\n", msfile, strerror (errno)); return -1; } /* Pack each MSTrace in the group */ mst = mstg->traces; while (mst) { if (mst->numsamples <= 0) { mst = mst->next; continue; } trpackedrecords = mst_pack (mst, &ms_record_handler_int, ofp, reclen, encoding, byteorder, NULL, 1, verbose - 1, NULL); if (trpackedrecords < 0) { mst_srcname (mst, srcname, 1); ms_log (1, "Cannot write Mini-SEED for %s\n", srcname); } else { packedrecords += trpackedrecords; } mst = mst->next; } /* Close file and return record count */ fclose (ofp); return packedrecords; } /* End of mst_writemseedgroup() */
main() { outfile = fopen("int32_Steim2_littleEndian.mseed", "w"); int psamples; int precords; MSTrace *mst; char srcname[50]; psamples = 0; int *mychar; mychar = (int *) malloc(50 * sizeof(int)); // Write integers from 1 to 50. int i = 1; for(i; i<51; i++){ mychar[i-1] = i; } mst = mst_init (NULL); /* Populate MSTrace values */ strcpy (mst->network, "XX"); strcpy (mst->station, "TEST"); strcpy (mst->channel, "BHE"); mst->starttime = ms_seedtimestr2hptime ("2004,350,00:00:00.000000"); mst->samprate = 1.0; /* The datasamples pointer and numsamples counter will be adjusted by the packing routine, the datasamples array must be dynamic memory allocated by the malloc() family of routines. */ mst->datasamples = mychar; mst->numsamples = 50; mst->samplecnt = 50; mst->sampletype = 'i'; mst_srcname (mst, srcname, 0); /* Pack 512 byte, big-endian records, ´write Chars */ precords = mst_pack (mst, &record_handler, srcname, 256, DE_STEIM2, 0, &psamples, 1, verbose, NULL); ms_log (0, "Packed %d samples into %d records\n", psamples, precords); fclose(outfile); mst_free (&mst); }
/*************************************************************************** * mst_writemseed: * * Pack MSTrace data into Mini-SEED records by calling mst_pack() and * write to a specified file. * * Returns the number of records written on success and -1 on error. ***************************************************************************/ int mst_writemseed (MSTrace *mst, const char *msfile, flag overwrite, int reclen, flag encoding, flag byteorder, flag verbose) { FILE *ofp; char srcname[50]; char *perms = (overwrite) ? "wb" : "ab"; int packedrecords = 0; if (!mst || !msfile) return -1; /* Open output file or use stdout */ if (strcmp (msfile, "-") == 0) { ofp = stdout; } else if ((ofp = fopen (msfile, perms)) == NULL) { ms_log (1, "Cannot open output file %s: %s\n", msfile, strerror (errno)); return -1; } /* Pack the MSTrace */ if (mst->numsamples > 0) { packedrecords = mst_pack (mst, &ms_record_handler_int, ofp, reclen, encoding, byteorder, NULL, 1, verbose - 1, NULL); if (packedrecords < 0) { mst_srcname (mst, srcname, 1); ms_log (1, "Cannot write Mini-SEED for %s\n", srcname); } } /* Close file and return record count */ fclose (ofp); return (packedrecords >= 0) ? packedrecords : -1; } /* End of mst_writemseed() */
main() { outfile = fopen("fullASCII_bigEndian.mseed", "w"); int psamples; int precords; MSTrace *mst; char srcname[50]; psamples = 0; // Allocate char array. One more allocated char is necessary for // the zero terminating last char. char *mychar = (char *) malloc(96 * sizeof(char)); // Copy contents to char. In this case copy all ASCII chars. strcpy(mychar, " !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); mst = mst_init (NULL); /* Populate MSTrace values */ strcpy (mst->network, "XX"); strcpy (mst->station, "TEST"); strcpy (mst->channel, "BHE"); mst->starttime = ms_seedtimestr2hptime ("2004,350,00:00:00.000000"); mst->samprate = 1.0; /* The datasamples pointer and numsamples counter will be adjusted by the packing routine, the datasamples array must be dynamic memory allocated by the malloc() family of routines. */ mst->datasamples = mychar; /* pointer to 8-bit ascii data samples */ mst->numsamples = 95; mst->samplecnt = 95; mst->sampletype = 'a'; /* declare type to be 8 bit ASCII */ mst_srcname (mst, srcname, 0); /* Pack 256 byte, big-endian records, write chars */ precords = mst_pack (mst, &record_handler, srcname, 256, DE_ASCII, 1, &psamples, 1, verbose, NULL); ms_log (0, "Packed %d samples into %d records\n", psamples, precords); fclose(outfile); mst_free (&mst); }
/*************************************************************************** * writeascii: * * Write data buffer to output file as ASCII. * * Returns the number of samples written or -1 on error. ***************************************************************************/ static int writeascii (MSTrace *mst) { char outfile[1024]; char *outname; char timestr[50]; char srcname[50]; char *samptype; int line, col, cnt, samplesize; int lines; void *sptr; if ( ! mst ) return -1; if ( mst->numsamples == 0 || mst->samprate == 0.0 ) return 0; if ( verbose ) fprintf (stderr, "Writing ASCII for %.8s.%.8s.%.8s.%.8s\n", mst->network, mst->station, mst->location, mst->channel); /* Generate source name and ISO time string */ mst_srcname (mst, srcname, 1); ms_hptime2isotimestr (mst->starttime, timestr, 1); /* Set sample type description */ if ( mst->sampletype == 'i' ) { samptype = "INTEGER"; } /* Generate and open output file name if single file not being used */ if ( ! ofp ) { /* Create output file name: Net.Sta.Loc.Chan.Qual.Year-Month-DayTHour:Min:Sec.Subsec.txt */ snprintf (outfile, sizeof(outfile), "%s.%s.%s.%s.%c.%s.txt", mst->network, mst->station, mst->location, mst->channel, mst->dataquality, timestr); /* Open output file */ if ( (ofp = fopen (outfile, "wb")) == NULL ) { fprintf (stderr, "Cannot open output file: %s (%s)\n", outfile, strerror(errno)); return -1; } outname = outfile; } /* Header format: * "TIMESERIES Net_Sta_Loc_Chan_Qual, ## samples, ## sps, isotime, SLIST|TSPAIR, INTEGER|FLOAT|ASCII, Units" */ /* Print header line */ fprintf (ofp, "TIMESERIES %s, %lld samples, %g sps, %s, SLIST, %s\n", srcname, (long long int)mst->numsamples, mst->samprate, timestr, samptype); // lines = (mst->numsamples / slistcols) + ((slistcols == 1) ? 0 : 1); lines = mst->numsamples; printf("lines: %d numsamples: %d\n",lines,mst->numsamples); if ( (samplesize = ms_samplesize(mst->sampletype)) == 0 ) { fprintf (stderr, "Unrecognized sample type: %c\n", mst->sampletype); } else for ( cnt = 0, line = 0; line < lines; line++ ) { if ( cnt < mst->numsamples ) { sptr = (char*)mst->datasamples + (cnt * samplesize); if ( mst->sampletype == 'i' ) { fprintf (ofp, "%d", *(int32_t *)sptr); // printf("%d\n",*(int32_t *)sptr); } cnt++; } fprintf (ofp, "\n"); } if ( outname == outfile ) { fclose (ofp); ofp = 0; } fprintf (stderr, "Wrote %lld samples from %s to %s\n", (long long int)mst->numsamples, srcname, outname); return mst->numsamples; } /* End of writeascii() */