Change time meta option format ()

This commit is contained in:
Christian W. Zuckschwerdt 2019-04-24 07:36:47 +02:00 committed by GitHub
parent 8e457e5c73
commit e130d04793
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 95 additions and 31 deletions

View file

@ -66,7 +66,7 @@ Usage: = General options =
[-F kv | json | csv | mqtt | syslog | null | help] Produce decoded output in given format. [-F kv | json | csv | mqtt | syslog | null | help] Produce decoded output in given format.
Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout. Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.
Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514 Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514
[-M time | reltime | notime | hires | utc | protocol | level | stats | bits | help] Add various meta data to each output. [-M time[:<options>] | protocol | level | stats | bits | help] Add various meta data to each output.
[-K FILE | PATH | <tag>] Add an expanded token or fixed tag to every output line. [-K FILE | PATH | <tag>] Add an expanded token or fixed tag to every output line.
[-C native | si | customary] Convert units in decoded output. [-C native | si | customary] Convert units in decoded output.
[-T <seconds>] Specify number of seconds to run [-T <seconds>] Specify number of seconds to run
@ -285,13 +285,16 @@ Option -F:
Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514 Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514
Option -M: Option -M:
[-M time|reltime|notime|hires|level] Add various metadata to every output line. [-M time[:<options>]|protocol|level|stats|bits|newmodel] Add various metadata to every output line.
Use "time" to add current date and time meta data (preset for live inputs). Use "time" to add current date and time meta data (preset for live inputs).
Use "reltime" to add sample position meta data (preset for read-file and stdin). Use "time:rel" to add sample position meta data (preset for read-file and stdin).
Use "notime" to remove time meta data. Use "time:unix" to show the seconds since unix epoch as time meta data.
Use "hires" to add microsecods to date time meta data. Use "time:iso" to show the time with ISO-8601 format (YYYY-MM-DD"T"hh:mm:ss).
Use "utc" / "noutc" to output timestamps in UTC. Use "time:off" to remove time meta data.
Use "time:usec" to add microseconds to date time meta data.
Use "time:utc" to output time in UTC.
(this may also be accomplished by invocation with TZ environment variable set). (this may also be accomplished by invocation with TZ environment variable set).
"usec" and "utc" can be combined with other options, eg. "time:unix:utc:usec".
Use "protocol" / "noprotocol" to output the decoder protocol number meta data. Use "protocol" / "noprotocol" to output the decoder protocol number meta data.
Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data. Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds). Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).

View file

@ -115,13 +115,16 @@ analyze_pulses false
#out_block_size #out_block_size
# as command line option: # as command line option:
# [-M time|reltime|notime|hires|level] Add various metadata to every output line. # [-M time[:<options>]|protocol|level|stats|bits|newmodel] Add various metadata to every output line.
# Use "time" to add current date and time meta data (preset for live inputs). # Use "time" to add current date and time meta data (preset for live inputs).
# Use "reltime" to add sample position meta data (preset for read-file and stdin). # Use "time:rel" to add sample position meta data (preset for read-file and stdin).
# Use "notime" to remove time meta data. # Use "time:unix" to show the seconds since unix epoch as time meta data.
# Use "hires" to add microsecods to date time meta data. # Use "time:iso" to show the time with ISO-8601 format (YYYY-MM-DD"T"hh:mm:ss).
# Use "utc" / "noutc" to output timestamps in UTC. # Use "time:off" to remove time meta data.
# Use "time:usec" to add microseconds to date time meta data.
# Use "time:utc" to output time in UTC.
# (this may also be accomplished by invocation with TZ environment variable set). # (this may also be accomplished by invocation with TZ environment variable set).
# "usec" and "utc" can be combined with other options, eg. "time:unix:utc:usec".
# Use "protocol" / "noprotocol" to output the decoder protocol number meta data. # Use "protocol" / "noprotocol" to output the decoder protocol number meta data.
# Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data. # Use "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
# Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds). # Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).
@ -129,7 +132,7 @@ analyze_pulses false
# Use "newmodel" to transition to new model keys. This will become the default someday. # Use "newmodel" to transition to new model keys. This will become the default someday.
report_meta level report_meta level
report_meta stats report_meta stats
report_meta hires report_meta time:usec
report_meta protocol report_meta protocol
report_meta newmodel report_meta newmodel

View file

@ -35,19 +35,21 @@ void get_time_now(struct timeval *tv);
/** Printable timestamp in local time. /** Printable timestamp in local time.
@param buf[out]: output buffer, long enough for "YYYY-MM-DD HH:MM:SS"
@param format: time format string, uses "%Y-%m-%d %H:%M:%S" if NULL
@param time_secs: 0 for now, or seconds since the epoch @param time_secs: 0 for now, or seconds since the epoch
@param buf: output buffer, long enough for "YYYY-MM-DD HH:MM:SS"
@return buf pointer (for short hand use as operator) @return buf pointer (for short hand use as operator)
*/ */
char* local_time_str(time_t time_secs, char *buf); char *format_time_str(char *buf, char const *format, time_t time_secs);
/** Printable timestamp in local time with microseconds. /** Printable timestamp in local time with microseconds.
@param buf[out]: output buffer, long enough for "YYYY-MM-DD HH:MM:SS.uuuuuu"
@param format: time format string without usec, uses "%Y-%m-%d %H:%M:%S" if NULL
@param tv: NULL for now, or seconds and microseconds since the epoch @param tv: NULL for now, or seconds and microseconds since the epoch
@param buf: output buffer, long enough for "YYYY-MM-DD HH:MM:SS"
@return buf pointer (for short hand use as operator) @return buf pointer (for short hand use as operator)
*/ */
char *usecs_time_str(struct timeval *tv, char *buf); char *usecs_time_str(char *buf, char const *format, struct timeval *tv);
/** Printable sample position. /** Printable sample position.

View file

@ -40,6 +40,8 @@ typedef enum {
REPORT_TIME_DEFAULT, REPORT_TIME_DEFAULT,
REPORT_TIME_DATE, REPORT_TIME_DATE,
REPORT_TIME_SAMPLES, REPORT_TIME_SAMPLES,
REPORT_TIME_UNIX,
REPORT_TIME_ISO,
REPORT_TIME_OFF, REPORT_TIME_OFF,
} time_mode_t; } time_mode_t;

View file

@ -64,7 +64,7 @@ void pulse_data_print_vcd_header(FILE *file, uint32_t sample_rate)
timescale = "1 us"; timescale = "1 us";
else else
timescale = "100 ns"; timescale = "100 ns";
fprintf(file, "$date %s $end\n", local_time_str(0, time_str)); fprintf(file, "$date %s $end\n", format_time_str(time_str, NULL, 0));
fprintf(file, "$version rtl_433 0.1.0 $end\n"); fprintf(file, "$version rtl_433 0.1.0 $end\n");
fprintf(file, "$comment Acquisition at %s Hz $end\n", nice_freq(sample_rate)); fprintf(file, "$comment Acquisition at %s Hz $end\n", nice_freq(sample_rate));
fprintf(file, "$timescale %s $end\n", timescale); fprintf(file, "$timescale %s $end\n", timescale);
@ -145,7 +145,7 @@ void pulse_data_print_pulse_header(FILE *file)
fprintf(file, ";version 1\n"); fprintf(file, ";version 1\n");
fprintf(file, ";timescale 1us\n"); fprintf(file, ";timescale 1us\n");
//fprintf(file, ";samplerate %u\n", data->sample_rate); //fprintf(file, ";samplerate %u\n", data->sample_rate);
fprintf(file, ";created %s\n", local_time_str(0, time_str)); fprintf(file, ";created %s\n", format_time_str(time_str, NULL, 0));
} }
void pulse_data_dump(FILE *file, pulse_data_t *data) void pulse_data_dump(FILE *file, pulse_data_t *data)

View file

@ -259,10 +259,16 @@ char *time_pos_str(r_cfg_t *cfg, unsigned samples_ago, char *buf)
} }
ago.tv_usec -= usecs_ago; ago.tv_usec -= usecs_ago;
char const *format = NULL;
if (cfg->report_time == REPORT_TIME_UNIX)
format = "%s";
else if (cfg->report_time == REPORT_TIME_ISO)
format = "%Y-%m-%dT%H:%M:%S";
if (cfg->report_time_hires) if (cfg->report_time_hires)
return usecs_time_str(&ago, buf); return usecs_time_str(buf, format, &ago);
else else
return local_time_str(ago.tv_sec, buf); return format_time_str(buf, format, ago.tv_sec);
} }
} }

View file

@ -21,7 +21,7 @@ void get_time_now(struct timeval *tv)
perror("gettimeofday"); perror("gettimeofday");
} }
char *local_time_str(time_t time_secs, char *buf) char *format_time_str(char *buf, char const *format, time_t time_secs)
{ {
time_t etime; time_t etime;
struct tm tm_info; struct tm tm_info;
@ -39,11 +39,14 @@ char *local_time_str(time_t time_secs, char *buf)
localtime_r(&etime, &tm_info); // thread-safe localtime_r(&etime, &tm_info); // thread-safe
#endif #endif
strftime(buf, LOCAL_TIME_BUFLEN, "%Y-%m-%d %H:%M:%S", &tm_info); if (!format || !*format)
format = "%Y-%m-%d %H:%M:%S";
strftime(buf, LOCAL_TIME_BUFLEN, format, &tm_info);
return buf; return buf;
} }
char *usecs_time_str(struct timeval *tv, char *buf) char *usecs_time_str(char *buf, char const *format, struct timeval *tv)
{ {
struct timeval now; struct timeval now;
struct tm *tm_info; struct tm *tm_info;
@ -56,7 +59,10 @@ char *usecs_time_str(struct timeval *tv, char *buf)
time_t t_secs = tv->tv_sec; time_t t_secs = tv->tv_sec;
tm_info = localtime(&t_secs); // note: win32 doesn't have localtime_r() tm_info = localtime(&t_secs); // note: win32 doesn't have localtime_r()
size_t l = strftime(buf, LOCAL_TIME_BUFLEN, "%Y-%m-%d %H:%M:%S", tm_info); if (!format || !*format)
format = "%Y-%m-%d %H:%M:%S";
size_t l = strftime(buf, LOCAL_TIME_BUFLEN, format, tm_info);
snprintf(buf + l, LOCAL_TIME_BUFLEN - l, ".%06ld", (long)tv->tv_usec); snprintf(buf + l, LOCAL_TIME_BUFLEN - l, ".%06ld", (long)tv->tv_usec);
return buf; return buf;
} }

View file

@ -112,7 +112,7 @@ static void usage(int exit_code)
" [-F kv | json | csv | mqtt | syslog | null | help] Produce decoded output in given format.\n" " [-F kv | json | csv | mqtt | syslog | null | help] Produce decoded output in given format.\n"
" Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.\n" " Append output to file with :<filename> (e.g. -F csv:log.csv), defaults to stdout.\n"
" Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514\n" " Specify host/port for syslog with e.g. -F syslog:127.0.0.1:1514\n"
" [-M time | reltime | notime | hires | utc | protocol | level | stats | bits | help] Add various meta data to each output.\n" " [-M time[:<options>] | protocol | level | stats | bits | help] Add various meta data to each output.\n"
" [-K FILE | PATH | <tag>] Add an expanded token or fixed tag to every output line.\n" " [-K FILE | PATH | <tag>] Add an expanded token or fixed tag to every output line.\n"
" [-C native | si | customary] Convert units in decoded output.\n" " [-C native | si | customary] Convert units in decoded output.\n"
" [-T <seconds>] Specify number of seconds to run\n" " [-T <seconds>] Specify number of seconds to run\n"
@ -195,13 +195,16 @@ static void help_output(void)
static void help_meta(void) static void help_meta(void)
{ {
fprintf(stderr, fprintf(stderr,
"[-M time|reltime|notime|hires|level] Add various metadata to every output line.\n" "[-M time[:<options>]|protocol|level|stats|bits|newmodel] Add various metadata to every output line.\n"
"\tUse \"time\" to add current date and time meta data (preset for live inputs).\n" "\tUse \"time\" to add current date and time meta data (preset for live inputs).\n"
"\tUse \"reltime\" to add sample position meta data (preset for read-file and stdin).\n" "\tUse \"time:rel\" to add sample position meta data (preset for read-file and stdin).\n"
"\tUse \"notime\" to remove time meta data.\n" "\tUse \"time:unix\" to show the seconds since unix epoch as time meta data.\n"
"\tUse \"hires\" to add microsecods to date time meta data.\n" "\tUse \"time:iso\" to show the time with ISO-8601 format (YYYY-MM-DD\"T\"hh:mm:ss).\n"
"\tUse \"utc\" / \"noutc\" to output timestamps in UTC.\n" "\tUse \"time:off\" to remove time meta data.\n"
"\tUse \"time:usec\" to add microseconds to date time meta data.\n"
"\tUse \"time:utc\" to output time in UTC.\n"
"\t\t(this may also be accomplished by invocation with TZ environment variable set).\n" "\t\t(this may also be accomplished by invocation with TZ environment variable set).\n"
"\t\t\"usec\" and \"utc\" can be combined with other options, eg. \"time:unix:utc:usec\".\n"
"\tUse \"protocol\" / \"noprotocol\" to output the decoder protocol number meta data.\n" "\tUse \"protocol\" / \"noprotocol\" to output the decoder protocol number meta data.\n"
"\tUse \"level\" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.\n" "\tUse \"level\" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.\n"
"\tUse \"stats[:[<level>][:<interval>]]\" to report statistics (default: 600 seconds).\n" "\tUse \"stats[:[<level>][:<interval>]]\" to report statistics (default: 600 seconds).\n"
@ -780,8 +783,46 @@ static void parse_conf_option(r_cfg_t *cfg, int opt, char *arg)
if (!arg) if (!arg)
help_meta(); help_meta();
if (!strcasecmp(arg, "time")) if (!strncasecmp(arg, "time", 4)) {
char *p = arg_param(arg);
// time time:1 time:on time:yes
// time:0 time:off time:no
// time:rel
// time:unix
// time:iso
// time:...:usec time:...:sec
// time:...:utc time:...:local
cfg->report_time = REPORT_TIME_DATE; cfg->report_time = REPORT_TIME_DATE;
while (p && *p) {
if (!strncasecmp(p, "0", 1) || !strncasecmp(p, "no", 2) || !strncasecmp(p, "off", 3))
cfg->report_time = REPORT_TIME_OFF;
else if (!strncasecmp(p, "1", 1) || !strncasecmp(p, "yes", 3) || !strncasecmp(p, "on", 2))
cfg->report_time = REPORT_TIME_DATE;
else if (!strncasecmp(p, "rel", 3))
cfg->report_time = REPORT_TIME_SAMPLES;
else if (!strncasecmp(p, "unix", 4))
cfg->report_time = REPORT_TIME_UNIX;
else if (!strncasecmp(p, "iso", 3))
cfg->report_time = REPORT_TIME_ISO;
else if (!strncasecmp(p, "usec", 4))
cfg->report_time_hires = 1;
else if (!strncasecmp(p, "sec", 3))
cfg->report_time_hires = 0;
else if (!strncasecmp(p, "utc", 3))
cfg->report_time_utc = 1;
else if (!strncasecmp(p, "local", 5))
cfg->report_time_utc = 0;
else {
fprintf(stderr, "Unknown time format option: %s\n", p);
help_meta();
}
p = arg_param(p);
}
// fprintf(stderr, "time format: %d, usec:%d utc:%d\n", cfg->report_time, cfg->report_time_hires, cfg->report_time_utc);
}
// TODO: old time options, remove someday
else if (!strcasecmp(arg, "reltime")) else if (!strcasecmp(arg, "reltime"))
cfg->report_time = REPORT_TIME_SAMPLES; cfg->report_time = REPORT_TIME_SAMPLES;
else if (!strcasecmp(arg, "notime")) else if (!strcasecmp(arg, "notime"))
@ -792,6 +833,7 @@ static void parse_conf_option(r_cfg_t *cfg, int opt, char *arg)
cfg->report_time_utc = 1; cfg->report_time_utc = 1;
else if (!strcasecmp(arg, "noutc")) else if (!strcasecmp(arg, "noutc"))
cfg->report_time_utc = 0; cfg->report_time_utc = 0;
else if (!strcasecmp(arg, "protocol")) else if (!strcasecmp(arg, "protocol"))
cfg->report_protocol = 1; cfg->report_protocol = 1;
else if (!strcasecmp(arg, "noprotocol")) else if (!strcasecmp(arg, "noprotocol"))