You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

321 lines
8.8 KiB
C

/***************************************************************************
* A program illustrating reading miniSEED from buffers
*
* This file is part of the miniSEED Library.
*
* Copyright (c) 2023 Chad Trabant, EarthScope Data Services
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
#include <errno.h>
#include <stdio.h>
#include <sys/stat.h>
#include <libmseed.h>
#define TESTCPPDLL_API __declspec(dllexport)
TESTCPPDLL_API int __stdcall MseedDatas (int argc, char **argv) // MseedDatas(char *argv, int length)
{
struct stat sb = {0};
int64_t records = 0;
FILE *fh;
MS3TraceList *mstl = NULL;
char *buffer = NULL;
uint64_t bufferlength = 0;
int8_t splitversion = 0;
uint32_t flags = 0;
int8_t verbose = 0;
if (argc != 2)
{
ms_log (2, "%s requires a single file name argument\n", argv[0]);
return -1;
}
/* Read specified file into buffer */
if (!(fh = fopen (argv[1], "rb")))
{
ms_log (2, "Error opening %s: %s\n", argv[1], strerror (errno));
return -1;
}
if (fstat (fileno (fh), &sb))
{
ms_log (2, "Error stating %s: %s\n", argv[1], strerror (errno));
return -1;
}
if (!(buffer = (char *)malloc (sb.st_size)))
{
ms_log (2, "Error allocating buffer of %" PRIsize_t " bytes\n",
(sb.st_size >= 0) ? (size_t)sb.st_size : 0);
return -1;
}
if (fread (buffer, sb.st_size, 1, fh) != 1)
{
ms_log (2, "Error reading file\n");
return -1;
}
fclose (fh);
bufferlength = sb.st_size;
/* Set bit flags to validate CRC and unpack data samples */
flags |= MSF_VALIDATECRC;
flags |= MSF_UNPACKDATA;
mstl = mstl3_init (NULL);
if (!mstl)
{
ms_log (2, "Error allocating MS3TraceList\n");
return -1;
}
/* Read all miniSEED in buffer, accumulate in MS3TraceList */
records = mstl3_readbuffer (&mstl, buffer, bufferlength,
splitversion, flags, NULL, verbose);
if (records < 0)
{
ms_log (2, "Problem reading miniSEED from buffer: %s\n", ms_errorstr (records));
}
/* Print summary */
mstl3_printtracelist (mstl, ISOMONTHDAY, 1, 1, 0);
ms_log (1, "Total records: %" PRId64 "\n", records);
/* Make sure everything is cleaned up */
if (mstl)
mstl3_free (&mstl, 0);
free (buffer);
return 0;
}
typedef struct AsciiDataStruct
{
char *sid;
char *starttime; //!< Time of first sample
char *endtime; //!< Time of last sample
double samprate; //!< Nominal sample rate (Hz)
int64_t samplecnt; //!< Number of samples in trace coverage
size_t datasize; //!< Size of datasamples buffer in bytes
int64_t numsamples; //!< Number of data samples in datasamples
char sampletype; //!< Sample type code, see @ref sample-types
uint8_t samplesize;
void *datasamples; //!< Data samples, \a numsamples of type \a sampletype
} AsciiDataStruct;
typedef void (__stdcall *generalDataFunction) (AsciiDataStruct AsciiData);
generalDataFunction generalData;
TESTCPPDLL_API void __stdcall MseedDatasCallFun (generalDataFunction fn)
{
generalData = fn;
}
TESTCPPDLL_API int __stdcall bufferMseedData (int argc, char *argv)
{
struct stat sb = {0};
int64_t records = 0;
FILE *fh;
MS3TraceList *mstl = NULL;
char *buffer = NULL;
uint64_t bufferlength = 0;
int8_t splitversion = 0;
uint32_t flags = 0;
int8_t verbose = 0;
// if (argc != 2)
//{
// ms_log (2, "%s requires a single file name argument\n", argv[0]);
// return -1;
// }
/* Read specified file into buffer
if (!(fh = fopen (argv[1], "rb")))
{
ms_log (2, "Error opening %s: %s\n", argv[1], strerror (errno));
return -1;
}
if (fstat (fileno (fh), &sb))
{
ms_log (2, "Error stating %s: %s\n", argv[1], strerror (errno));
return -1;
}
if (!(buffer = (char *)malloc (sb.st_size)))
{
ms_log (2, "Error allocating buffer of %" PRIsize_t " bytes\n",
(sb.st_size >= 0) ? (size_t)sb.st_size : 0);
return -1;
}
if (fread (buffer, sb.st_size, 1, fh) != 1)
{
ms_log (2, "Error reading file\n");
return -1;
}
fclose (fh);
*/
bufferlength = argc;
// buffer = argv;
/* Set bit flags to validate CRC and unpack data samples */
flags |= MSF_VALIDATECRC;
flags |= MSF_UNPACKDATA;
mstl = mstl3_init (NULL);
if (!mstl)
{
ms_log (2, "Error allocating MS3TraceList\n");
return -1;
}
/* Read all miniSEED in buffer, accumulate in MS3TraceList */
records = mstl3_readbuffer (&mstl, argv, bufferlength,
splitversion, flags, NULL, verbose);
if (records < 0)
{
ms_log (2, "Problem reading miniSEED from buffer: %s\n", ms_errorstr (records));
}
/* Print summary */
// mstl3_printtracelist (mstl, ISOMONTHDAY, 1, 1, 0);
/* Traverse trace list structures and print summary information */
MS3TraceID *tid = mstl->traces.next[0];
char starttimestr[30];
char endtimestr[30];
MS3TraceSeg *seg = NULL;
MS3RecordPtr *recptr = NULL;
char *mseedfile = NULL;
char bufferptrstr[30];
char fileptrstr[30];
size_t idx;
int rv;
char printdata = 'd';
int64_t unpacked;
uint8_t samplesize;
char sampletype;
size_t lineidx;
size_t lines;
int col;
void *sptr;
AsciiDataStruct ybbmqj;
/* Traverse trace list structures and print summary information */
tid = mstl->traces.next[0];
while (tid)
{
ms_log (0, "TraceID for %s (%d), segments: %u\n",
tid->sid, tid->pubversion, tid->numsegments);
seg = tid->first;
while (seg)
{
if (!ms_nstime2timestr (seg->starttime, starttimestr, ISOMONTHDAY, NANO) ||
!ms_nstime2timestr (seg->endtime, endtimestr, ISOMONTHDAY, NANO))
{
ms_log (2, "Cannot create time strings\n");
starttimestr[0] = endtimestr[0] = '\0';
}
ms_log (0, " Segment %s - %s, samples: %" PRId64 ", sample rate: %g\n",
starttimestr, endtimestr, seg->samplecnt, seg->samprate);
unpacked = seg->numsamples; // mstl3_unpack_recordlist (tid, seg, NULL, 0, verbose);
sampletype = seg->sampletype;
samplesize = ms_samplesize (seg->sampletype);
if (unpacked != seg->samplecnt)
{
ms_log (2, "Cannot unpack samples for %s\n", tid->sid);
}
else
{
ms_log (0, "DATA (%" PRId64 " samples) of type '%c':\n", seg->numsamples, seg->sampletype);
if (sampletype == 't')
{
printf ("%*s",
(seg->numsamples > INT_MAX) ? INT_MAX : (int)seg->numsamples,
(char *)seg->datasamples);
}
else
{
ybbmqj.sid = tid->sid;
ybbmqj.starttime = starttimestr;
ybbmqj.endtime = endtimestr;
ybbmqj.samprate = seg->samprate;
ybbmqj.samplecnt = seg->samplecnt;
ybbmqj.datasamples = seg->datasamples;
ybbmqj.numsamples = seg->numsamples;
ybbmqj.datasize = seg->datasize;
ybbmqj.samplesize = samplesize;
ybbmqj.sampletype = seg->sampletype;
if (generalData != NULL)
{
generalData (ybbmqj);
}
lines = (unpacked / 6) + 1;
//for (idx = 0, lineidx = 0; lineidx < lines; lineidx++)
//{
// for (col = 0; col < 6 && idx < seg->numsamples; col++)
// {
// sptr = (char *)seg->datasamples + (idx * samplesize);
// if (sampletype == 'i')
// ms_log (0, "%10d ", *(int32_t *)sptr);
// else if (sampletype == 'f')
// ms_log (0, "%10.8g ", *(float *)sptr);
// else if (sampletype == 'd')
// ms_log (0, "%10.10g ", *(double *)sptr);
// idx++;
// }
// ms_log (0, "\n");
// // if (printdata == 'd')
// // break;
//}
}
seg = seg->next;
}
}
tid = tid->next[0];
}
//****************************************************
ms_log (1, "Total records: %" PRId64 "\n", records);
/* Make sure everything is cleaned up */
if (mstl)
mstl3_free (&mstl, 0);
free (buffer);
return 0;
}