summaryrefslogtreecommitdiff
path: root/led/complex1/test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'led/complex1/test.cc')
-rw-r--r--led/complex1/test.cc238
1 files changed, 238 insertions, 0 deletions
diff --git a/led/complex1/test.cc b/led/complex1/test.cc
new file mode 100644
index 0000000..3be1e23
--- /dev/null
+++ b/led/complex1/test.cc
@@ -0,0 +1,238 @@
+//
+// $Id$
+//
+
+#include <stdio.h>
+#include "ledServer.h"
+#include "menu.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+Examples::LEDServer *led;
+
+void StartLED(void)
+{
+ led->start();
+}
+
+void StopLED(void)
+{
+ led->stop();
+}
+
+void SetPeriodOfLED(void)
+{
+ unsigned int onPeriod;
+ unsigned int offPeriod;
+ onPeriod = Test_menu_Get_int_bounded(
+ "Length LED is ON (in milliseconds)",
+ 1,
+ 10000
+ );
+ offPeriod = Test_menu_Get_int_bounded(
+ "Length LED is OFF (in milliseconds)",
+ 1,
+ 10000
+ );
+ led->setPeriod( onPeriod, offPeriod );
+}
+
+Menu_entry LEDMenu_entries[] = {
+ { "Activate LED Server", StartLED },
+ { "Deactivate LED Server", StopLED },
+ { "Set Period of LED Server", SetPeriodOfLED },
+};
+
+Test_menu LEDMenu = {
+ "LED Server Control Menu",
+ (sizeof(LEDMenu_entries) / sizeof(LEDMenu_entries[0])),
+ LEDMenu_entries
+};
+
+
+/*
+ * Top level menu
+ */
+
+#define MAX_FILES_IN_MENU 60
+
+char *FileNames[MAX_FILES_IN_MENU];
+int FileCount = 0;
+bool FileNamesLoaded = false;
+
+extern "C" {
+ // strcasecmp is not 100% portable
+ int Mystrcasecmp( const char *s1, const char *s2 )
+ {
+ while (*s1 != '\0' && tolower(*s1) == tolower(*s2)) {
+ s1++;
+ s2++;
+ }
+ return tolower(*(unsigned char *) s1) - tolower(*(unsigned char *) s2);
+ }
+
+ static int qsortcmp( const void *l, const void *r )
+ {
+ char **ld = (char **)l;
+ char **rd = (char **)r;
+
+ // fprintf( stderr, "-%s- -%s-\n", *ld, *rd );
+ return Mystrcasecmp( *ld, *rd );
+ }
+};
+
+int LoadDirectoryMenu(void)
+{
+ DIR *dir;
+ struct dirent *d;
+
+ if (FileNamesLoaded)
+ return 0;
+ FileNamesLoaded = true;
+
+ /* initialize */
+ dir = opendir(".");
+
+ if (!dir) {
+ fprintf( stderr, "Unable to open current directory\n" );
+ return -1;
+ }
+
+ /* find all the .txt files */
+
+ FileNames[ FileCount++ ] = strdup("Return to previous menu");
+
+ for ( ; ; ) {
+ d = readdir(dir);
+ if (!d)
+ break;
+
+ FileNames[ FileCount++ ] = strdup( d->d_name );
+
+ /* fprintf( stderr, "%s\n", d->d_name ); */
+ if ( FileCount >= MAX_FILES_IN_MENU ) {
+ fprintf( stderr, "Too many files in current directory\n" );
+ return -1;
+ }
+ }
+
+ /* shutdown */
+ closedir( dir );
+
+ qsort( &FileNames[1], FileCount - 1, sizeof(char *), qsortcmp );
+
+ return 0;
+}
+
+void LEDMenuFunction(void)
+{
+ Test_menu_run( &LEDMenu );
+}
+
+void statFile()
+{
+ int selected;
+ struct stat statb;
+
+ if ( LoadDirectoryMenu() )
+ return;
+
+ selected = Test_menu_Get_selection(
+ "Select a File To stat()",
+ FileCount,
+ FileNames
+ );
+ if ( selected == 0 )
+ return;
+
+ fprintf( stderr,
+ "You picked %d --> %s\n", selected, FileNames[selected] );
+
+ if ( stat( FileNames[selected], &statb ) ) {
+ fprintf( stderr, "Error stating file\n" );
+ return;
+ }
+
+ fprintf( stderr, "Owner/Group: %d %d Permissions: 0%o\n"
+ "Size... in bytes: %ld in blocks: %ld of %ld\n"
+ "Times of Last.. Access: %ld Modification %ld Change: %ld\n",
+ statb.st_uid, statb.st_gid, statb.st_mode,
+ (long) statb.st_size, (long) statb.st_blocks, (long) statb.st_blksize,
+ (long) statb.st_atime, (long) statb.st_mtime, (long) statb.st_ctime );
+}
+
+#if defined(__rtems__)
+#include <rtems.h>
+#include <rtems/stackchk.h>
+#include <rtems/cpuuse.h>
+
+#include "periodic.h"
+
+void SetNumberOfPeriodicThreads(void)
+{
+ unsigned int threads = Test_menu_Get_int_bounded(
+ "How many periodic threads do you want to create",
+ 1,
+ 100
+ );
+ PeriodicThreads_Count = threads;
+}
+
+Menu_entry PeriodicThreadsMenu_entries[] = {
+ { "Start Periodic Threads", PeriodicThreads_Start},
+ { "Stop Periodic Threads", PeriodicThreads_Stop},
+ { "Set Number Of Periodic Threads", SetNumberOfPeriodicThreads},
+};
+
+Test_menu PeriodicThreadsMenu = {
+ "Periodic Threads Menu",
+ (sizeof(PeriodicThreadsMenu_entries) /
+ sizeof(PeriodicThreadsMenu_entries[0])),
+ PeriodicThreadsMenu_entries
+};
+
+void PeriodicThreadsFunction(void)
+{
+ Test_menu_run( &PeriodicThreadsMenu );
+}
+
+#endif
+
+Menu_entry MainMenu_entries[] = {
+ { "LED Server Control Menu", LEDMenuFunction },
+ { "stat() a file", statFile },
+#if defined(__rtems__)
+ { "Periodic Threads Control Menu", PeriodicThreadsFunction },
+ { "Stack Usage Report", rtems_stack_checker_report_usage },
+ { "CPU Usage Report", rtems_cpu_usage_report },
+ { "Reset CPU Usage Statistics", rtems_cpu_usage_reset },
+ { "Period Usage Report", rtems_rate_monotonic_report_statistics },
+ { "Reset Period Usage Statistics", rtems_rate_monotonic_reset_all_statistics},
+#endif
+};
+
+Test_menu MainMenu = {
+ "Main Menu",
+ (sizeof(MainMenu_entries) / sizeof(MainMenu_entries[0])),
+ MainMenu_entries
+};
+
+void doTest(void)
+{
+ LED_INIT();
+
+ led = new Examples::LEDServer();
+
+ Test_menu_run( &MainMenu );
+#if defined(__rtems__)
+ PeriodicThreads_Stop();
+#endif
+ delete led;
+}
+