[powerdebug,7/7] display the gpio info

Message ID 1314280027-7547-7-git-send-email-daniel.lezcano@linaro.org
State Accepted
Headers show

Commit Message

Daniel Lezcano Aug. 25, 2011, 1:47 p.m.
Show in ncurses mode the gpio informations.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 gpio.c |  130 +++++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 101 insertions(+), 29 deletions(-)

Patch

diff --git a/gpio.c b/gpio.c
index 562a11d..f7d2a10 100644
--- a/gpio.c
+++ b/gpio.c
@@ -57,33 +57,6 @@  static struct gpio_info *gpio_alloc(void)
 	return gi;
 }
 
-static int gpio_display(bool refresh)
-{
-	return 0;
-}
-
-static int gpio_select(void)
-{
-	return 0;
-}
-
-static int gpio_find(const char *name)
-{
-	return 0;
-}
-
-static int gpio_selectf(void)
-{
-	return 0;
-}
-
-static struct display_ops gpio_ops = {
-	.display = gpio_display,
-	.select  = gpio_select,
-	.find    = gpio_find,
-	.selectf = gpio_selectf,
-};
-
 static int gpio_filter_cb(const char *name)
 {
 	/* let's ignore some directories in order to avoid to be
@@ -169,8 +142,21 @@  static int dump_gpio_cb(struct tree *t, void *data)
 			     t->depth > 1 ? "   ": "", t->next ? "|" : " ") < 0)
 			return -1;
 
-	printf("%s%s-- %s (active_low:%d)\n",
-	       gpio->prefix,  !t->next ? "`" : "", t->name, gpio->active_low);
+	printf("%s%s-- %s (", gpio->prefix,  !t->next ? "`" : "", t->name);
+
+	if (gpio->active_low != -1)
+		printf(" active_low:%d", gpio->active_low);
+
+	if (gpio->value != -1)
+		printf(", value:%d", gpio->value);
+
+	if (gpio->edge != -1)
+		printf(", edge:%d", gpio->edge);
+
+	if (gpio->direction != -1)
+		printf(", direction:%d", gpio->direction);
+
+	printf(" )\n");
 
 	return 0;
 }
@@ -192,6 +178,92 @@  int gpio_dump(void)
 	return ret;
 }
 
+static char *gpio_line(struct tree *t)
+{
+	struct gpio_info *gpio = t->private;
+	char *gpioline;
+
+	if (asprintf(&gpioline, "%-20s %-10d %-10d %-10d %-10d", t-> name,
+		     gpio->value, gpio->active_low, gpio->edge, gpio->direction) < 0)
+		return NULL;
+
+	return gpioline;
+}
+
+static int _gpio_print_info_cb(struct tree *t, void *data)
+{
+	int *line = data;
+	char *buffer;
+
+        /* we skip the root node of the tree */
+	if (!t->parent)
+		return 0;
+
+	buffer = gpio_line(t);
+	if (!buffer)
+		return -1;
+
+	display_print_line(GPIO, *line, buffer, 0, t);
+
+	(*line)++;
+
+	free(buffer);
+
+	return 0;
+}
+
+static int gpio_print_info_cb(struct tree *t, void *data)
+{
+        /* we skip the root node of the tree */
+	if (!t->parent)
+		return 0;
+
+	return _gpio_print_info_cb(t, data);
+}
+
+static int gpio_print_header(void)
+{
+	char *buf;
+	int ret;
+
+	if (asprintf(&buf, "%-20s %-10s %-10s %-10s %-10s",
+		     "Name", "Value", "Active_low", "Edge", "Direction") < 0)
+		return -1;
+
+	ret = display_column_name(buf);
+
+	free(buf);
+
+	return ret;
+}
+
+static int gpio_print_info(struct tree *tree)
+{
+	int ret, line = 0;
+
+	display_reset_cursor(GPIO);
+
+	gpio_print_header();
+
+	ret = tree_for_each(tree, gpio_print_info_cb, &line);
+
+	display_refresh_pad(GPIO);
+
+	return ret;
+}
+
+static int gpio_display(bool refresh)
+{
+	if (refresh && read_gpio_info(gpio_tree))
+		return -1;
+
+	return gpio_print_info(gpio_tree);
+}
+
+static struct display_ops gpio_ops = {
+	.display = gpio_display,
+};
+
 /*
  * Initialize the gpio framework
  */