diff --git a/tag.c b/tag.c index e8760fc..da24395 100644 --- a/tag.c +++ b/tag.c @@ -11,6 +11,7 @@ struct private { long value; long min; long max; + enum tag_realtime_unit realtime_unit; } value_as_int; bool value_as_bool; double value_as_float; @@ -31,6 +32,12 @@ unimpl_min_max(const struct tag *tag) return 0; } +static enum tag_realtime_unit +no_realtime(const struct tag *tag) +{ + return TAG_REALTIME_NONE; +} + static void destroy_int_and_float(struct tag *tag) { @@ -62,6 +69,13 @@ int_max(const struct tag *tag) return priv->value_as_int.max; } +static enum tag_realtime_unit +int_realtime(const struct tag *tag) +{ + const struct private *priv = tag->private; + return priv->value_as_int.realtime_unit; +} + static const char * int_as_string(const struct tag *tag) { @@ -197,12 +211,20 @@ tag_new_int(const char *name, long value) struct tag * tag_new_int_range(const char *name, long value, long min, long max) +{ + return tag_new_int_realtime(name, value, min, max, TAG_REALTIME_NONE); +} + +struct tag * +tag_new_int_realtime(const char *name, long value, long min, long max, + enum tag_realtime_unit unit) { struct private *priv = malloc(sizeof(*priv)); priv->name = strdup(name); priv->value_as_int.value = value; priv->value_as_int.min = min; priv->value_as_int.max = max; + priv->value_as_int.realtime_unit = unit; struct tag *tag = malloc(sizeof(*tag)); tag->private = priv; @@ -210,6 +232,7 @@ tag_new_int_range(const char *name, long value, long min, long max) tag->name = &tag_name; tag->min = &int_min; tag->max = &int_max; + tag->realtime = &int_realtime; tag->as_string = &int_as_string; tag->as_int = &int_as_int; tag->as_bool = &int_as_bool; @@ -230,6 +253,7 @@ tag_new_bool(const char *name, bool value) tag->name = &tag_name; tag->min = &unimpl_min_max; tag->max = &unimpl_min_max; + tag->realtime = &no_realtime; tag->as_string = &bool_as_string; tag->as_int = &bool_as_int; tag->as_bool = &bool_as_bool; @@ -250,6 +274,7 @@ tag_new_float(const char *name, double value) tag->name = &tag_name; tag->min = &unimpl_min_max; tag->max = &unimpl_min_max; + tag->realtime = &no_realtime; tag->as_string = &float_as_string; tag->as_int = &float_as_int; tag->as_bool = &float_as_bool; @@ -270,6 +295,7 @@ tag_new_string(const char *name, const char *value) tag->name = &tag_name; tag->min = &unimpl_min_max; tag->max = &unimpl_min_max; + tag->realtime = &no_realtime; tag->as_string = &string_as_string; tag->as_int = &string_as_int; tag->as_bool = &string_as_bool; diff --git a/tag.h b/tag.h index b035977..7f22535 100644 --- a/tag.h +++ b/tag.h @@ -4,6 +4,11 @@ #include +enum tag_realtime_unit { + TAG_REALTIME_NONE, + TAG_REALTIME_SECONDS +}; + struct tag { void *private; @@ -16,6 +21,7 @@ struct tag { long (*min)(const struct tag *tag); long (*max)(const struct tag *tag); + enum tag_realtime_unit (*realtime)(const struct tag *tag); }; struct tag_set { @@ -25,6 +31,8 @@ struct tag_set { struct tag *tag_new_int(const char *name, long value); struct tag *tag_new_int_range(const char *name, long value, long min, long max); +struct tag *tag_new_int_realtime(const char *name, long value, long min, + long max, enum tag_realtime_unit unit); struct tag *tag_new_bool(const char *name, bool value); struct tag *tag_new_float(const char *name, double value); struct tag *tag_new_string(const char *name, const char *value);