blob: a3be41b68520dfb8fcd0bead1f1ce922f1d9ff60 [file] [log] [blame]
/* $Id$ */
/*
* Copyright (C) 2010-2011 Teluu Inc. (http://www.teluu.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#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