diff options
Diffstat (limited to 'led/complex1/menu.cc')
-rw-r--r-- | led/complex1/menu.cc | 196 |
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)(); + } + } +} + |