//
//  waitClass.m
//  X-BASIC'
//
//  Created by AIG-Soft(iMac) on 2013/07/25.
//  Copyright (c) 2013年 AIG-Soft. All rights reserved.
//

#import "waitClass.h"
#import "libs.h"

@implementation WaitClass

-(id)init
{
	printSelf();
	self=[super init];
	if (self!=nil) {
		_ftimeWaitDone=YES; // 時間経過済みにしておく
		_checkBreak=NULL;
	}
	return (self);
}

// メインスレッドで実行させて終了を待つ
// 引数付き
-(void)doThread:(SEL)selector withObject:(id)object
{
	printSelf();
	// メインスレッドに入れる
	[self performSelectorOnMainThread:selector
						   withObject:object
						waitUntilDone:YES];	// 命令終了を待つ
	nslog(@"命令発行終了");
}

-(void)waitTimeEnd
{
	printSelf();
	self.ftimeWaitDone=YES; // 時間待ちが終了した印
}

// メインスレッドで時間待ちをタイマーに入れる
-(void)waitTimeInMainThread:(id)arg
{
	@autoreleasepool { // 別スレッドのお約束
	NSTimeInterval tm;
	[(NSValue *)arg getValue:&tm];
	nslog(@"waitTimeInMainThread:%@ → %f",arg,tm);
	self.ftimeWaitDone=NO; // 終了してない印
	waitTimer=[NSTimer scheduledTimerWithTimeInterval:tm
											   target:self
											 selector:@selector(waitTimeEnd) // 終了時呼び出し
											 userInfo:nil
											  repeats:NO
			   ];
	nslog(@"isValid=%d/fireDate=%@/timeInterval=%f",[waitTimer isValid],[waitTimer fireDate],[waitTimer timeInterval]);
	// [waitTimer timeInterval]はrepeats=YESの時のみ設定される(とドキュメントにも書いてある)
	[[NSRunLoop currentRunLoop] addTimer:waitTimer forMode:NSDefaultRunLoopMode];
	}
}

-(BOOL)wait_:(BOOL)fbreakEnable 
// 入力等待ち
{
	nslog(@"wait_:isMainThread=%d/isMultiThreaded=%d",[NSThread isMainThread],[NSThread isMultiThreaded]);
	while (!self.ftimeWaitDone) {
		// ftimeWaitDoneはKVOで変更される
		EnterRunLoop(0.0); // これがないと、他の並行動作・イベント取得処理が全て無視されておかしくなる(TouchEndedとか)
		if (fbreakEnable) {
			if (_checkBreak!=NULL) { // BREAKチェック指定がある
				if (_checkBreak()) {
					// Breakが押された
					if ([waitTimer isValid]) [waitTimer invalidate]; // タイマー待ち中だったときは禁止する
					nslog(@"wait_ break");
					return(YES);
				}
			}
		}
	}
	// 正常終了
	nslog(@"wait_ end");
	return (NO);
}

-(void)waitTime:(NSTimeInterval)tm fwait:(BOOL)fwait
// tm=秒 ; <1.0=*100ms
{
	nslog(@"waitTime(%f):fwait=%d",tm,fwait);
	@autoreleasepool {
	//
	// timerはメインスレッドで実行しなければいけないようなので、一旦メインスレッドに渡す
		NSValue *val=[NSValue valueWithBytes:&tm objCType:@encode(NSTimeInterval)];
		[self doThread:@selector(waitTimeInMainThread:) withObject:val];
		//
		if (fwait) [self wait_:YES]; // 時間経過待ち
	//
	}
}

@end
