wiringPi: Add readall option '--all' and refactor readall.c

Signed-off-by: Yang Deokgyu <secugyu@gmail.com>
diff --git a/gpio/readall.c b/gpio/readall.c
index a332a39..a121b7a 100755
--- a/gpio/readall.c
+++ b/gpio/readall.c
@@ -296,8 +296,7 @@
 } ;
 
 /*----------------------------------------------------------------------------*/
-static void readallPhysOdroid (int model, int UNU rev, int physPin, const char *physNames[])
-{
+static void readallPhys(int model, int UNU rev, int physPin, const char *physNames[], int isAll) {
 	int pin ;
 
 	// GPIO, wPi pin number
@@ -311,10 +310,12 @@
 	// GPIO pin name
 	printf (" | %s", physNames [physPin]) ;
 
-	// GPIO pin mode, value, drive strength, pupd
-	if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
-		printf (" |      |   |    |      ") ;
-	else {
+	// GPIO pin mode, value
+	if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
+		printf(" |      |  ");
+		if (isAll == TRUE)
+			printf(" |    |      ");
+	} else {
 		if (wpMode == MODE_GPIO)
 			pin = physPinToGpio (physPin);
 		else if (wpMode == MODE_PHYS)
@@ -324,20 +325,24 @@
 
 		printf (" | %4s", alts [getAlt (pin)]) ;
 		printf (" | %d", digitalRead (pin)) ;
-		switch (model) {
-		case MODEL_ODROID_N1:
-			printf (" |    |      ");
-			break;
-		case MODEL_ODROID_C1:
-		case MODEL_ODROID_C2:
-			printf (" |    | %5s", pupd[getPUPD(pin)]);
-			break;
-		case MODEL_ODROID_XU3:
-		case MODEL_ODROID_N2:
-			printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]);
-			break;
-		default:
-			break;
+
+		// GPIO pin drive strength, pu/pd
+		if (isAll == TRUE) {
+			switch (model) {
+			case MODEL_ODROID_N1:
+				printf (" |    |      ");
+				break;
+			case MODEL_ODROID_C1:
+			case MODEL_ODROID_C2:
+				printf (" |    | %5s", pupd[getPUPD(pin)]);
+				break;
+			case MODEL_ODROID_XU3:
+			case MODEL_ODROID_N2:
+				printf (" | %2d | %5s", getPadDrive(pin), pupd[getPUPD(pin)]);
+				break;
+			default:
+				break;
+			}
 		}
 	}
 
@@ -346,10 +351,13 @@
 	++physPin ;
 	printf (" || %-2d", physPin) ;
 
-	// GPIO pin mode, value, drive strength, pupd
-	if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1))
-		printf (" |       |    |   |     ") ;
-	else {
+	// GPIO pin mode, value
+	if ((physToWpi [physPin] == -1) || (physPinToGpio (physPin) == -1)) {
+		printf(" |");
+		if (isAll == TRUE)
+			printf("       |    |");
+		printf ("   |     ");
+	} else {
 		if (wpMode == MODE_GPIO)
 			pin = physPinToGpio (physPin);
 		else if (wpMode == MODE_PHYS)
@@ -357,20 +365,24 @@
 		else
 			pin = physToWpi [physPin];
 
-		switch (model) {
-		case MODEL_ODROID_N1:
-			printf (" |       |   ");
-			break;
-		case MODEL_ODROID_C1:
-		case MODEL_ODROID_C2:
-			printf (" | %-5s |   ", pupd[getPUPD(pin)]);
-			break;
-		case MODEL_ODROID_XU3:
-		case MODEL_ODROID_N2:
-			printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin));
-			break;
-		default:
-			break;
+
+		// GPIO pin drive strength, pu/pd
+		if (isAll == TRUE) {
+			switch (model) {
+			case MODEL_ODROID_N1:
+				printf (" |       |   ");
+				break;
+			case MODEL_ODROID_C1:
+			case MODEL_ODROID_C2:
+				printf (" | %-5s |   ", pupd[getPUPD(pin)]);
+				break;
+			case MODEL_ODROID_XU3:
+			case MODEL_ODROID_N2:
+				printf (" | %-5s | %-2d", pupd[getPUPD(pin)], getPadDrive(pin));
+				break;
+			default:
+				break;
+			}
 		}
 		printf (" | %d", digitalRead (pin));
 		printf (" | %-4s", alts [getAlt (pin)]);
@@ -391,15 +403,35 @@
 }
 
 /*----------------------------------------------------------------------------*/
-void ReadallOdroid (int model, int rev, const char *physNames[])
-{
-	int pin ;
+static void printHeader(const char *headerName, int isAll) {
+	const char *headerLeft = " +------+-----+----------+------+---+";
+	const char *headerRight = "+---+------+----------+-----+------+\n";
+	const char *headerLeftAll = " +------+-----+----------+------+---+----+";
+	const char *headerRightAll = "+----+---+------+----------+-----+------+\n";
 
-	printf (" | GPIO | wPi |   Name   | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode |   Name   | wPi | GPIO |\n") ;
-	printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
-	for (pin = 1 ; pin <= 40 ; pin += 2)
-		readallPhysOdroid (model, rev, pin, physNames) ;
-	printf (" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n") ;
+	(isAll == FALSE) ? printf("%s", headerLeft) : printf("%s", headerLeftAll);
+	printf("%s", headerName);
+	(isAll == FALSE) ? printf("%s", headerRight) : printf("%s", headerRightAll);
+}
+
+/*----------------------------------------------------------------------------*/
+static void printBody(int model, int rev, const char *physNames[], int isAll) {
+	(isAll == FALSE)
+		? printf(
+			" | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode |   Name   | wPi | GPIO |\n"
+			" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n")
+		: printf(
+			" | GPIO | wPi |   Name   | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode |   Name   | wPi | GPIO |\n"
+			" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n");
+	for (int pin = 1; pin <= 40; pin += 2)
+		readallPhys(model, rev, pin, physNames, isAll);
+	(isAll == FALSE)
+		? printf(
+			" +------+-----+----------+------+---+----++----+---+------+----------+-----+------+\n"
+			" | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode |   Name   | wPi | GPIO |\n")
+		: printf(
+			" +------+-----+----------+------+---+----+-------+----++----+-------+----+---+------+----------+-----+------+\n"
+			" | GPIO | wPi |   Name   | Mode | V | DS | PU/PD | Physical | PU/PD | DS | V | Mode |   Name   | wPi | GPIO |\n");
 }
 
 /*----------------------------------------------------------------------------*/
@@ -412,48 +444,62 @@
  *	one external device at a time, we'll use that to our advantage...
  */
 /*----------------------------------------------------------------------------*/
-void doReadall (void)
-{
-	int model, rev, mem, maker, overVolted;
-	char *physNames;
+void doReadall(int argc, char *argv[]) {
+	int model, rev, mem, maker, overVolted, isAll;
+	char *headerName, *physNames;
 
 	// External readall
 	if (wiringPiNodes != NULL) {
-		doReadallExternal ();
-		return ;
+		doReadallExternal();
+		return;
 	}
 
-	piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
+	if (argc <= 2) {
+		isAll = FALSE;
+	} else if (argc == 3 && (strcasecmp(argv[2], "-a") == 0 || strcasecmp(argv[2], "--all") == 0)) {
+		isAll = TRUE;
+	} else {
+		printf("Oops - unknown readall option:\n");
+		for (int i = 3; i < argc + 1; i++)
+			printf("\targv[%d]: %s\n", i, argv[i - 1]);
+
+		return;
+	}
+
+	piBoardId (&model, &rev, &mem, &maker, &overVolted);
 
 	switch (model) {
-	case MODEL_ODROID_C1:
-		printf (" +------+-----+----------+------+---+----+---- Model  ODROID-C1 ----+----+---+------+----------+-----+------+\n") ;
-		physNames = (char *) physNamesOdroidC1;
-	break;
-	case MODEL_ODROID_C2:
-		printf (" +------+-----+----------+------+---+----+---- Model  ODROID-C2 ----+----+---+------+----------+-----+------+\n") ;
-		if (rev == 1)
-			physNames = (char *) physNamesOdroidC2_Rev1;
-		else
-			physNames = (char *) physNamesOdroidC2_Rev2;
-	break;
-	case MODEL_ODROID_XU3:
-		printf (" +------+-----+----------+------+---+----+--- Model ODROID-XU3/4 ---+----+---+------+----------+-----+------+\n") ;
-		physNames = (char *) physNamesOdroidXU3;
-	break;
-	case MODEL_ODROID_N1:
-		printf (" +------+-----+----------+------+---+----+---- Model  ODROID-N1 ----+----+---+------+----------+-----+------+\n") ;
-		physNames = (char *) physNamesOdroidN1;
-	break;
-	case MODEL_ODROID_N2:
-		printf (" +------+-----+----------+------+---+----+---- Model  ODROID-N2 ----+----+---+------+----------+-----+------+\n") ;
-		physNames = (char *) physNamesOdroidN2;
-	break;
-	default:
-		printf ("Oops - unable to determine board type... model: %d\n", model) ;
-	return;
+		case MODEL_ODROID_C1:
+			headerName = (isAll == FALSE) ? "--- C1 ---" : "---- Model  ODROID-C1 ----";
+			physNames = (char *) physNamesOdroidC1;
+			break;
+		case MODEL_ODROID_C2:
+			headerName = (isAll == FALSE) ? "--- C2 ---" : "---- Model  ODROID-C2 ----";
+			if (rev == 1)
+				physNames = (char *) physNamesOdroidC2_Rev1;
+			else
+				physNames = (char *) physNamesOdroidC2_Rev2;
+			break;
+		case MODEL_ODROID_XU3:
+			headerName = (isAll == FALSE) ? "- XU3, 4 -" : "--- Model ODROID-XU3/4 ---";
+			physNames = (char *) physNamesOdroidXU3;
+			break;
+		case MODEL_ODROID_N1:
+			headerName = (isAll == FALSE) ? "--- N1 ---" : "---- Model  ODROID-N1 ----";
+			physNames = (char *) physNamesOdroidN1;
+			break;
+		case MODEL_ODROID_N2:
+			headerName = (isAll == FALSE) ? "--- N2 ---" : "---- Model  ODROID-N2 ----";
+			physNames = (char *) physNamesOdroidN2;
+			break;
+		default:
+			printf("Oops - unknown model: %d\n", model);
+			return;
 	}
-	ReadallOdroid(model, rev, (const char **) physNames);
+
+	printHeader((const char *) headerName, isAll);
+	printBody(model, rev, (const char **) physNames, isAll);
+	printHeader((const char *) headerName, isAll);
 }
 
 /*----------------------------------------------------------------------------*/
@@ -462,9 +508,10 @@
  *	Force reading of all pins regardless of Pi model
  */
 /*----------------------------------------------------------------------------*/
-void doAllReadall (void)
-{
-	doReadall();
+void doAllReadall(void) {
+	char *fakeArgv[3] = { "", "", "--all" };
+
+	doReadall(3, fakeArgv);
 }
 
 /*----------------------------------------------------------------------------*/