summaryrefslogtreecommitdiff
path: root/led/complex1/menu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'led/complex1/menu.cc')
-rw-r--r--led/complex1/menu.cc196
1 files changed, 196 insertions, 0 deletions
diff --git a/led/complex1/menu.cc b/led/complex1/menu.cc
new file mode 100644
index 0000000..d6918ac
--- /dev/null
+++ b/led/complex1/menu.cc
@@ -0,0 +1,196 @@
+/*
+ * This is a general set of routines to provide a user interface
+ * for testing.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "menu.h"
+
+int Test_menu_Get_int_bounded(
+ const char *str,
+ int min,
+ int max
+)
+{
+ int selection = 0x80000000;
+ char Message[ 80 ];
+ int i=0;
+ bool done = false;
+ char *temp;
+
+ assert( min <= max );
+ do {
+ if (i != 0)
+ printf(" Invalid Entry\n");
+
+ printf("\n %s (%d:%d) > ", str, min, max );
+ fflush( stdout );
+ fflush( stdin );
+ fgets( Message, 80, stdin );
+ if ((Message[0] != '\0') && (Message[0] != '\n')) {
+ selection = strtol( Message, &temp, 10 );
+ if ((*temp == '\0') || (*temp == '\n') || (*temp == '\r') )
+ if (!( selection < min || selection > max ))
+ done = true;
+ }
+ i++;
+ }
+ while (!done );
+
+ return selection;
+}
+int Test_menu_Get_int(
+ const char *str
+)
+{
+ int selection = 0x80000000;
+ char Message[ 80 ];
+ int i=0;
+ bool done = false;
+ char *temp;
+
+ do {
+ if (i != 0)
+ printf(" Invalid Entry\n");
+
+ printf("\n %s > ", str );
+ fflush( stdout );
+ fflush( stdin );
+ fgets( Message, 80, stdin );
+ selection = strtol( Message, &temp, 10 );
+ if ( *temp == '\0' )
+ done = true;
+ i++;
+ }
+ while (!done );
+
+ return selection;
+}
+
+float Test_menu_Get_float_bounded(
+ const char *str,
+ float min,
+ float max
+)
+{
+ double selection = -99999999.0;
+ char Message[ 80 ];
+ int i=0;
+ bool done = false;
+ char *temp;
+
+ assert( min <= max );
+
+ do {
+ if (i != 0)
+ printf(" Invalid Entry\n");
+
+ printf("\n %s (%f:%f) > ", str, min, max );
+ fflush( stdout );
+ fflush( stdin );
+ fgets( Message, 80, stdin );
+ selection = strtod( Message, &temp );
+ if (( *temp == '\0' ) || ( *temp == '\n' ))
+ if (!( selection < min || selection > max ))
+ done = true;
+ i++;
+ }
+ while (!done );
+
+ return (float)selection;
+}
+
+int Test_menu_Get_selection(
+ const char *title,
+ int count,
+ char *selection[]
+)
+{
+ int i;
+ int value;
+
+ printf("\n %s \n ", title);
+ for(i=0; i<(int)strlen(title);i++)
+ printf("=");
+ printf("\n");
+
+ if ( count<21 ) {
+ for (i=0; i<count; i++)
+ printf("\n(%d) %s", i, selection[i] );
+ } else {
+ for (i=0; i<count; ) {
+ printf("\n(%2d) %-30s", i, selection[i] );
+ if ( ++i >= count ) break;
+ printf(" (%2d) %-30s", i, selection[i] );
+ i++;
+ }
+ }
+
+ value = Test_menu_Get_int_bounded(
+ " Enter your selection> ",
+ 0,
+ count-1
+ );
+
+ return value;
+}
+
+
+char *Test_menu_Get_string(
+ const char *str
+)
+{
+ static char Message[ 500 ];
+ int last;
+
+ printf("\n Enter %s : ", str);
+ fgets( Message, 500, stdin );
+ last = strlen( Message );
+
+ if (Message[last-1] == '\n')
+ Message[last-1] = '\0';
+
+ return Message;
+}
+
+void Test_menu_run(
+ Test_menu *menu
+)
+{
+ int selection;
+ bool done = false;
+ int i;
+
+ while ( !done ) {
+
+ printf("\n %s \n ", menu->header);
+ for(i=0; i<(int)strlen(menu->header);i++)
+ printf("=");
+ printf("\n");
+
+ for (i=0; i<(int)menu->number_of_entries; i++)
+ printf("\n (%d) %s", i+1, menu->entry[i].name );
+
+ printf("\n (0) Exit\n");
+
+ selection = Test_menu_Get_int_bounded(
+ " Enter your selection> ",
+ 0,
+ menu->number_of_entries
+ );
+
+ if ( selection == 0 ) {
+ // printf( "Exiting %s\n", menu->header );
+ done = true;
+ } else {
+ (*menu->entry[ selection - 1 ].routine)();
+ }
+ }
+}
+