Unbreak the timestamp calculation when session data is received in
multiple packets. Avoid a division by zero when the samplerate is not
known yet the time column is requested. Only calculate timestamps when
the time column is requested. Use floating point during the scaling,
only convert to integer immediately before printing. Change line breaks
to not split a complex sub-expression across several lines.
uint32_t channels_seen;
uint64_t sample_rate;
uint64_t sample_scale;
uint32_t channels_seen;
uint64_t sample_rate;
uint64_t sample_scale;
+ uint64_t out_sample_count;
uint8_t *previous_sample;
float *analog_samples;
uint8_t *logic_samples;
uint8_t *previous_sample;
float *analog_samples;
uint8_t *logic_samples;
ctx->did_header = TRUE;
}
ctx->did_header = TRUE;
}
+ /* Time column requested but samplerate unknown. Emit a warning. */
+ if (ctx->time && !ctx->sample_rate)
+ sr_warn("Samplerate unknown, cannot provide timestamps.");
+
static void dump_saved_values(struct context *ctx, GString **out)
{
unsigned int i, j, analog_size, num_channels;
static void dump_saved_values(struct context *ctx, GString **out)
{
unsigned int i, j, analog_size, num_channels;
+ double sample_time_dbl;
+ uint64_t sample_time_u64;
float *analog_sample, value;
uint8_t *logic_sample;
float *analog_sample, value;
uint8_t *logic_sample;
if (ctx->label_do) {
if (ctx->time)
g_string_append_printf(*out, "%s%s",
if (ctx->label_do) {
if (ctx->time)
g_string_append_printf(*out, "%s%s",
- ctx->label_names ? "Time" :
- ctx->xlabel, ctx->value);
+ ctx->label_names ? "Time" : ctx->xlabel,
+ ctx->value);
for (i = 0; i < num_channels; i++) {
g_string_append_printf(*out, "%s%s",
ctx->channels[i].label, ctx->value);
for (i = 0; i < num_channels; i++) {
g_string_append_printf(*out, "%s%s",
ctx->channels[i].label, ctx->value);
ctx->previous_sample = g_malloc0(analog_size + ctx->num_logic_channels);
for (i = 0; i < ctx->num_samples; i++) {
ctx->previous_sample = g_malloc0(analog_size + ctx->num_logic_channels);
for (i = 0; i < ctx->num_samples; i++) {
- ctx->sample_time = (ctx->sample_scale * i) / ctx->sample_rate;
analog_sample =
&ctx->analog_samples[i * ctx->num_analog_channels];
logic_sample =
analog_sample =
&ctx->analog_samples[i * ctx->num_analog_channels];
logic_sample =
analog_sample, analog_size);
}
analog_sample, analog_size);
}
+ if (ctx->time && !ctx->sample_rate) {
+ g_string_append_printf(*out, "0%s", ctx->value);
+ } else if (ctx->time) {
+ sample_time_dbl = ctx->out_sample_count++;
+ sample_time_dbl /= ctx->sample_rate;
+ sample_time_dbl *= ctx->sample_scale;
+ sample_time_u64 = sample_time_dbl;
g_string_append_printf(*out, "%" PRIu64 "%s",
g_string_append_printf(*out, "%" PRIu64 "%s",
- ctx->sample_time, ctx->value);
+ sample_time_u64, ctx->value);
+ }
for (j = 0; j < num_channels; j++) {
if (ctx->channels[j].ch->type == SR_CHANNEL_ANALOG) {
for (j = 0; j < num_channels; j++) {
if (ctx->channels[j].ch->type == SR_CHANNEL_ANALOG) {