X-Git-Url: http://git.kpe.io/?p=wdq2wav.git;a=blobdiff_plain;f=wdq2wav.cpp;h=2ea87bf9ce0af8c94e7dc8b9e3e246f2196b3cd9;hp=23e764bef1631d44f33b03372ab6c449c4bdc0fc;hb=HEAD;hpb=c4d6bc834d8ba6a3c3748996cd56706addfe4df2 diff --git a/wdq2wav.cpp b/wdq2wav.cpp index 23e764b..2ea87bf 100644 --- a/wdq2wav.cpp +++ b/wdq2wav.cpp @@ -25,11 +25,10 @@ #include #include -const char* g_szIdStr = "$Id$"; - bool g_quiet = false; bool g_verbose = false; bool g_debug = false; +bool g_dry_run = false; bool g_ignore_zero = false; bool g_dont_demean = false; @@ -92,7 +91,7 @@ fileBasename (const char* filename) char * str_rm_tail (char *str, const char* const charlist) { - size_t i; + int i; for (i = strlen(str) - 1; i >= 0; i--) if (strchr (charlist, str[i]) != NULL) @@ -119,9 +118,9 @@ usage (const char* progname) std::cout << " -q Supress all messages\n"; std::cout << " -z Scale output without preserving zero point\n"; std::cout << " -m Do not demean the data (don't subtract the mean value from each sample)\n"; + std::cout << " -n Dry run (do not create any output\n"; std::cout << " -v Verbose mode\n"; std::cout << " -d Debug mode\n"; - std::cout << " -r Print program version and exit\n"; std::cout << " -h Print this help message\n"; } @@ -134,18 +133,17 @@ main (int argc, char *argv[]) const char* progname = argv[0]; - while ((c = getopt (argc, argv, "rqvzmdph")) != -1) { + while ((c = getopt (argc, argv, "rqvzmndph")) != -1) { switch (c) { - case 'r': - std::cout << "Version " << g_szIdStr << std::endl; - exit(0); - break; case 'q': g_quiet = true; break; case 'm': g_dont_demean = true; break; + case 'n': + g_dry_run = true; + break; case 'z': g_ignore_zero = true; break; @@ -168,9 +166,6 @@ main (int argc, char *argv[]) } } - if (g_verbose || g_debug) - std::cout << "Version " << g_szIdStr << std::endl; - argc -= optind; argv += optind; if (argc > 3) { @@ -181,39 +176,40 @@ main (int argc, char *argv[]) char wdq_fname[MAX_INPUT_STR]; if (argc >= 1) - strncpy (wdq_fname, argv [0], MAX_INPUT_STR); + strncpy (wdq_fname, argv [0], MAX_INPUT_STR); else { std::cout << "Enter input WinDAQ filename: "; - std::cin.getline (wdq_fname, MAX_INPUT_STR); - } - - char channel_buf [MAX_INPUT_STR]; - if (argc >= 2) - strncpy (channel_buf, argv[1], MAX_INPUT_STR); - else { - std::cout << "Enter channel number: "; - std::cin.getline (channel_buf, MAX_INPUT_STR); - } + std::cin.getline (wdq_fname, MAX_INPUT_STR); + } - char *channel_endptr; - int channel = static_cast(strtol (channel_buf, &channel_endptr, 10)); - if (*channel_endptr != 0) { - std::ostringstream os; - os << "Error: Channel " << channel_buf << " is not an integer"; - error_msg (os.str().c_str()); + char channel_buf [MAX_INPUT_STR]; + if (argc >= 2) + strncpy (channel_buf, argv[1], MAX_INPUT_STR); + else { + std::cout << "Enter channel number: "; + std::cin.getline (channel_buf, MAX_INPUT_STR); + } + + char *channel_endptr; + int channel = static_cast(strtol (channel_buf, &channel_endptr, 10)); + if (*channel_endptr != 0) { + std::ostringstream os; + os << "Error: Channel " << channel_buf << " is not an integer"; + error_msg (os.str().c_str()); usage (progname); return (1); - } - - char wav_fname[MAX_INPUT_STR]; + } + + char wav_fname[MAX_INPUT_STR]; + if (! g_dry_run) { if (argc >= 3) strncpy (wav_fname, argv[2], MAX_INPUT_STR); else { std::cout << "Enter output wav filename: "; std::cin.getline (wav_fname, MAX_INPUT_STR); } - - if (! wdq2wav (wdq_fname, channel, wav_fname, play)) + } + if (! wdq2wav (wdq_fname, channel, wav_fname, play)) return 1; return 0; @@ -247,27 +243,23 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool p if (! g_quiet || g_verbose || g_debug) { std::ostringstream os1; - os1 << "File: " << wdq_fname; + os1 << "File: " << wdq_fname; info_msg (os1.str().c_str()); - std::ostringstream os; - os << "Legacy Format: "; - if (wdq.m_bLegacy_format) - os << "Yes"; - else - os << "No"; - info_msg(os.str().c_str()); + std::ostringstream os; + os << "Format: " << (wdq.m_bLegacy_format ? "Legacy" : "Non-legacy"); + info_msg(os.str().c_str()); std::ostringstream os2; time_t time = wdq.m_time_acq_start; struct tm* tm = gmtime (&time); - os2 << " Time File Creation: " << asctime(tm); + os2 << "Time File Creation: " << asctime(tm); info_msg_sans_newline (os2.str().c_str()); std::ostringstream os3; time = wdq.m_time_acq_stop; tm = gmtime (&time); - os3 << " Time File Written: " << asctime(tm); + os3 << "Time File Written: " << asctime(tm); info_msg_sans_newline (os3.str().c_str()); std::ostringstream os4; - os4 << " Samples: " << wdq.m_nSamples << + os4 << "Samples: " << wdq.m_nSamples << ", Channels: " << wdq.m_nChannels << ", Sample Rate: " << wdq.m_sample_rate; info_msg (os4.str().c_str()); @@ -281,15 +273,24 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool p if (! g_quiet || g_verbose || g_debug) { std::ostringstream os1; - os1 << "Channel " << channel; + os1 << "Channel " << channel << ", Units: " << wdq_channel.m_units + << ", Minimum: " << wdq_channel.m_min_raw_data + << " (" << wdq_channel.raw2measured(wdq_channel.m_min_raw_data) + << "), Maximum: " << wdq_channel.m_max_raw_data + << " (" << wdq_channel.raw2measured(wdq_channel.m_max_raw_data) << ")"; info_msg (os1.str().c_str()); - std::ostringstream os2; - os2 << " Units: " << wdq_channel.m_units.c_str(); - info_msg (os2.str().c_str()); - std::ostringstream os3; - os3 << " Raw minimum: " << wdq_channel.m_min_raw_data << - ", maximum: " << wdq_channel.m_max_raw_data; - info_msg (os3.str().c_str()); + + std::cout << "Mean: " << wdq_channel.raw2measured(wdq_channel.m_raw_mean) << + " " << wdq_channel.m_units; + } + + if (! g_dry_run && !g_dont_demean) { + std::cout << " (removing)\n"; + int mean = nearest(wdq_channel.m_raw_mean); + for (unsigned int i = 0; i < wdq.m_nSamples; i++) + wdq_channel.m_data[i] -= mean; + } else { + std::cout << " (not removing)\n"; } if (g_debug) { @@ -299,9 +300,12 @@ wdq2wav (const char* wdq_fname, const int channel, const char *wav_fname, bool p info_msg (os4.str().c_str()); std::ostringstream os5; os5 << " Slope " << wdq_channel.m_slope << - ", Intercept " << wdq_channel.m_intercept; + ", Intercept " << wdq_channel.m_intercept; info_msg (os5.str().c_str()); } + + if (g_dry_run) + return true; WavFile wav (wdq_channel, wav_fname); @@ -374,19 +378,20 @@ bool read_int4 (int fd, unsigned int& n) bool read_float8 (int fd, double& f) { - unsigned char buf[8]; - if (read (fd, &buf, 8) != 8) + unsigned char p[8]; + if (read (fd, p, 8) != 8) return false; #if WORDS_BIG_ENDIAN unsigned char c; - c = buf[0]; buf[0] = buf[7]; buf[7] = c; - c = buf[1]; buf[1] = buf[6]; buf[6] = c; - c = buf[2]; buf[2] = buf[5]; buf[5] = c; - c = buf[3]; buf[3] = buf[4]; buf[4] = c; + c = p[0]; p[0] = p[7]; p[7] = c; + c = p[1]; p[1] = p[6]; p[6] = c; + c = p[2]; p[2] = p[5]; p[5] = c; + c = p[3]; p[3] = p[4]; p[4] = c; #endif - f = *(reinterpret_cast(buf)); + double *pd = reinterpret_cast(&p[0]); + f = *pd; return true; } @@ -629,15 +634,7 @@ WindaqChannel::read_channel_data () m_max_scaled_data = (m_slope * data_max) + m_intercept; m_min_scaled_data = (m_slope * data_min) + m_intercept; - if (! g_dont_demean) { - double dmean = total_data / static_cast(r_wdq.m_nSamples); - int mean = nearest(dmean); - std::cout << "Removing mean: " << (dmean * m_slope) + m_intercept << - " " << m_units << std::endl; - - for (i = 0; i < r_wdq.m_nSamples; i++) - m_data[i] -= mean; - } + m_raw_mean = total_data / static_cast(r_wdq.m_nSamples); delete sample_row; return true;