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.
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
[-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.
[-C native | si | customary] Convert units in decoded output.
[-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
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 "reltime" to add sample position meta data (preset for read-file and stdin).
Use "notime" to remove time meta data.
Use "hires" to add microsecods to date time meta data.
Use "utc" / "noutc" to output timestamps in UTC.
Use "time:rel" to add sample position meta data (preset for read-file and stdin).
Use "time:unix" to show the seconds since unix epoch as time meta data.
Use "time:iso" to show the time with ISO-8601 format (YYYY-MM-DD"T"hh:mm:ss).
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).
"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 "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
Use "stats[:[<level>][:<interval>]]" to report statistics (default: 600 seconds).

View file

@ -115,13 +115,16 @@ analyze_pulses false
#out_block_size
# 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 "reltime" to add sample position meta data (preset for read-file and stdin).
# Use "notime" to remove time meta data.
# Use "hires" to add microsecods to date time meta data.
# Use "utc" / "noutc" to output timestamps in UTC.
# Use "time:rel" to add sample position meta data (preset for read-file and stdin).
# Use "time:unix" to show the seconds since unix epoch as time meta data.
# Use "time:iso" to show the time with ISO-8601 format (YYYY-MM-DD"T"hh:mm:ss).
# 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).
# "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 "level" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.
# 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.
report_meta level
report_meta stats
report_meta hires
report_meta time:usec
report_meta protocol
report_meta newmodel

View file

@ -35,19 +35,21 @@ void get_time_now(struct timeval *tv);
/** 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 buf: output buffer, long enough for "YYYY-MM-DD HH:MM:SS"
@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.
@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 buf: output buffer, long enough for "YYYY-MM-DD HH:MM:SS"
@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.

View file

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

View file

@ -64,7 +64,7 @@ void pulse_data_print_vcd_header(FILE *file, uint32_t sample_rate)
timescale = "1 us";
else
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, "$comment Acquisition at %s Hz $end\n", nice_freq(sample_rate));
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, ";timescale 1us\n");
//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)

View file

@ -259,10 +259,16 @@ char *time_pos_str(r_cfg_t *cfg, unsigned samples_ago, char *buf)
}
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)
return usecs_time_str(&ago, buf);
return usecs_time_str(buf, format, &ago);
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");
}
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;
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
#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;
}
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 tm *tm_info;
@ -56,7 +59,10 @@ char *usecs_time_str(struct timeval *tv, char *buf)
time_t t_secs = tv->tv_sec;
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);
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"
" 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"
" [-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"
" [-C native | si | customary] Convert units in decoded output.\n"
" [-T <seconds>] Specify number of seconds to run\n"
@ -195,13 +195,16 @@ static void help_output(void)
static void help_meta(void)
{
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 \"reltime\" to add sample position meta data (preset for read-file and stdin).\n"
"\tUse \"notime\" to remove time meta data.\n"
"\tUse \"hires\" to add microsecods to date time meta data.\n"
"\tUse \"utc\" / \"noutc\" to output timestamps in UTC.\n"
"\tUse \"time:rel\" to add sample position meta data (preset for read-file and stdin).\n"
"\tUse \"time:unix\" to show the seconds since unix epoch as time meta data.\n"
"\tUse \"time:iso\" to show the time with ISO-8601 format (YYYY-MM-DD\"T\"hh:mm:ss).\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\"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 \"level\" to add Modulation, Frequency, RSSI, SNR, and Noise meta data.\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)
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;
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"))
cfg->report_time = REPORT_TIME_SAMPLES;
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;
else if (!strcasecmp(arg, "noutc"))
cfg->report_time_utc = 0;
else if (!strcasecmp(arg, "protocol"))
cfg->report_protocol = 1;
else if (!strcasecmp(arg, "noprotocol"))