duplex: make diff of previous value configurable

We might want to use raw values instead of diffs, and this makes that
possible. Doing so could be used for disks, etc.
This commit is contained in:
Christian Hergert
2019-07-01 12:23:17 -07:00
parent 652f7225b1
commit 145afe825b
2 changed files with 43 additions and 5 deletions

View File

@ -43,6 +43,8 @@ struct _SysprofDuplexVisualizer
guint rx_rgba_set : 1;
guint tx_rgba_set : 1;
guint use_diff : 1;
PointCache *cache;
};
@ -62,6 +64,9 @@ typedef struct
/* Counter IDs */
guint rx;
guint tx;
/* Do we need to subtract previous value */
guint use_diff : 1;
} Collect;
G_DEFINE_TYPE (SysprofDuplexVisualizer, sysprof_duplex_visualizer, SYSPROF_TYPE_VISUALIZER)
@ -142,7 +147,7 @@ collect_values_cb (const SysprofCaptureFrame *frame,
{
gint64 v64 = values->values[j].v64;
guint id = values->ids[j];
gint64 val = 0;
gint64 val = v64;
gdouble y = 0.5;
if (id == 0)
@ -150,8 +155,13 @@ collect_values_cb (const SysprofCaptureFrame *frame,
if (id == state->rx)
{
if (state->last_rx_val != G_MININT64)
val = v64 - state->last_rx_val;
if (state->use_diff)
{
if (state->last_rx_val == G_MININT64)
val = 0;
else
val -= state->last_rx_val;
}
/* RX goes upward from half point */
if (state->max_change != 0)
@ -161,8 +171,13 @@ collect_values_cb (const SysprofCaptureFrame *frame,
}
else if (id == state->tx)
{
if (state->last_tx_val != G_MININT64)
val = v64 - state->last_tx_val;
if (state->use_diff)
{
if (state->last_tx_val == G_MININT64)
val = 0;
else
val -= state->last_tx_val;
}
/* TX goes downward from half point */
if (state->max_change != 0)
@ -206,6 +221,7 @@ sysprof_duplex_visualizer_worker (GTask *task,
state.last_rx_val = G_MININT64;
state.last_tx_val = G_MININT64;
state.max_change = 0;
state.use_diff = self->use_diff;
point_cache_add_set (state.cache, state.rx);
point_cache_add_set (state.cache, state.tx);
@ -516,6 +532,7 @@ sysprof_duplex_visualizer_class_init (SysprofDuplexVisualizerClass *klass)
static void
sysprof_duplex_visualizer_init (SysprofDuplexVisualizer *self)
{
self->use_diff = TRUE;
}
GtkWidget *
@ -554,3 +571,21 @@ sysprof_duplex_visualizer_set_colors (SysprofDuplexVisualizer *self,
gtk_widget_queue_draw (GTK_WIDGET (self));
}
gboolean
sysprof_duplex_visualizer_get_use_diff (SysprofDuplexVisualizer *self)
{
g_return_val_if_fail (SYSPROF_IS_DUPLEX_VISUALIZER (self), FALSE);
return self->use_diff;
}
void
sysprof_duplex_visualizer_set_use_diff (SysprofDuplexVisualizer *self,
gboolean use_diff)
{
g_return_if_fail (SYSPROF_IS_DUPLEX_VISUALIZER (self));
self->use_diff = !!use_diff;
gtk_widget_queue_allocate (GTK_WIDGET (self));
}

View File

@ -29,6 +29,9 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (SysprofDuplexVisualizer, sysprof_duplex_visualizer, SYSPROF, DUPLEX_VISUALIZER, SysprofVisualizer)
GtkWidget *sysprof_duplex_visualizer_new (void);
gboolean sysprof_duplex_visualizer_get_use_diff (SysprofDuplexVisualizer *self);
void sysprof_duplex_visualizer_set_use_diff (SysprofDuplexVisualizer *self,
gboolean use_diff);
void sysprof_duplex_visualizer_set_counters (SysprofDuplexVisualizer *self,
guint rx_counter,
guint tx_counter);