// // RootViewController.m // ipjsystest // // Created by Liong Sauw Ming on 3/20/10. // Copyright Teluu Inc. (http://www.teluu.com) 2010. All rights reserved. // #import "RootViewController.h" #import "gui.h" #import "systest.h" /* Sleep interval duration, change to shorter duration for better * interaction but make sure there is enough time for the other * thread to do what it's supposed to do */ #define SLEEP_INTERVAL 0.5 @implementation RootViewController @synthesize titles; @synthesize menus; @synthesize testView; RootViewController *view; bool systest_initialized; bool thread_quit; gui_menu *gmenu; int section; int row; const char *ctitle; const char *cmsg; enum gui_flag cflag; pj_status_t gui_init(gui_menu *menu) { PJ_UNUSED_ARG(menu); return PJ_SUCCESS; } /* Run GUI main loop */ pj_status_t gui_start(gui_menu *menu) { view.titles = [NSMutableArray arrayWithCapacity:menu->submenu_cnt]; view.menus = [NSMutableArray arrayWithCapacity:menu->submenu_cnt]; NSMutableArray *smenu; for (int i = 0; i < menu->submenu_cnt; i++) { NSString *str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->title]; [view.titles addObject: str]; smenu = [NSMutableArray arrayWithCapacity:menu->submenus[i]->submenu_cnt]; /* We do not need the last two menus of the "Tests" menu (NULL and "Exit"), * so subtract by 2 */ for (int j = 0; j < menu->submenus[i]->submenu_cnt - (i==0? 2: 0); j++) { str = [NSString stringWithFormat:@"%s" , menu->submenus[i]->submenus[j]->title]; [smenu addObject:str]; } [view.menus addObject:smenu]; } gmenu = menu; return PJ_SUCCESS; } /* Signal GUI mainloop to stop */ void gui_destroy(void) { } /* AUX: display messagebox */ enum gui_key gui_msgbox(const char *title, const char *message, enum gui_flag flag) { ctitle = title; cmsg = message; cflag = flag; [view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES]; view.testView.key = 0; while(view.testView.key == 0) { /* Let the main thread do its job (refresh the view) while we wait for * user interaction (button click) */ [NSThread sleepForTimeInterval:SLEEP_INTERVAL]; } if (view.testView.key == 1) return KEY_OK; else return (flag == WITH_YESNO? KEY_NO: KEY_CANCEL); } /* AUX: sleep */ void gui_sleep(unsigned sec) { [NSThread sleepForTimeInterval:sec]; } - (void)viewDidLoad { [super viewDidLoad]; view = self; /* Get a writable path for output files */ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; [documentsDirectory getCString:doc_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding]; strncat(doc_path, "/", PATH_LENGTH); /* Get path for our test resources (the wav files) */ NSString *resPath = [[NSBundle mainBundle] resourcePath]; [resPath getCString:res_path maxLength:PATH_LENGTH encoding:NSASCIIStringEncoding]; strncat(res_path, "/", PATH_LENGTH); systest_initialized = false; thread_quit = false; [NSThread detachNewThreadSelector:@selector(startTest) toTarget:self withObject:nil]; /* Let our new thread initialize */ while (!systest_initialized) { [NSThread sleepForTimeInterval:SLEEP_INTERVAL]; } // Uncomment the following line to display an Edit button in the navigation bar for this view controller. // self.navigationItem.rightBarButtonItem = self.editButtonItem; } /* - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } */ /* - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } */ /* - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } */ /* - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } */ /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release anything that can be recreated in viewDidLoad or on demand. // e.g. self.myOutlet = nil; self.titles = nil; self.menus = nil; thread_quit = true; [NSThread sleepForTimeInterval:SLEEP_INTERVAL]; } #pragma mark Table view methods - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [titles count]; } // Customize the number of rows in the table view. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [[menus objectAtIndex:section] count]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { // The header for the section is the region name -- get this from the region at the section index. return [titles objectAtIndex:section]; } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell. cell.textLabel.text = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; return cell; } - (void)startTest { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if (systest_init() != PJ_SUCCESS) { [pool release]; return; } systest_run(); systest_initialized = 1; while(!thread_quit) { section = -1; while (section == -1) { [NSThread sleepForTimeInterval:SLEEP_INTERVAL]; } (*gmenu->submenus[section]->submenus[row]->handler)(); cmsg = NULL; [view performSelectorOnMainThread:@selector(showMsg) withObject:nil waitUntilDone:YES]; } systest_deinit(); [pool release]; } - (void)showMsg { if (cmsg == NULL) { self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: @"Finished"]; [self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)]; [self.testView.button1 setHidden:true]; [self.testView.button2 setHidden:true]; return; } self.testView.title = [NSString stringWithFormat:@"%s", ctitle]; self.testView.testDesc.text = [self.testView.testDesc.text stringByAppendingString: [NSString stringWithFormat:@"%s\n\n", cmsg]]; [self.testView.testDesc scrollRangeToVisible:NSMakeRange([self.testView.testDesc.text length] - 1, 1)]; [self.testView.button1 setHidden:false]; [self.testView.button2 setHidden:false]; if (cflag == WITH_YESNO) { [self.testView.button1 setTitle:@"Yes" forState:UIControlStateNormal]; [self.testView.button2 setTitle:@"No" forState:UIControlStateNormal]; } else if (cflag == WITH_OK) { [self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal]; [self.testView.button2 setHidden:true]; } else if (cflag == WITH_OKCANCEL) { [self.testView.button1 setTitle:@"OK" forState:UIControlStateNormal]; [self.testView.button2 setTitle:@"Cancel" forState:UIControlStateNormal]; } } // Override to support row selection in the table view. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Navigation logic may go here -- for example, create and push another view controller. // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil]; // [self.navigationController pushViewController:anotherViewController animated:YES]; // [anotherViewController release]; if (self.testView == nil) { self.testView = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:[NSBundle mainBundle]]; } [self.navigationController pushViewController:self.testView animated:YES]; self.testView.title = [[menus objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; self.testView.testDesc.text = @""; section = indexPath.section; row = indexPath.row; } /* // Override to support conditional editing of the table view. - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to be editable. return YES; } */ /* // Override to support editing the table view. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source. [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } else if (editingStyle == UITableViewCellEditingStyleInsert) { // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. } } */ /* // Override to support rearranging the table view. - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { } */ /* // Override to support conditional rearranging of the table view. - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the item to be re-orderable. return YES; } */ - (void)dealloc { [super dealloc]; } @end