//
//  PostTimer.m
//  ZeroRec/Komadori
//
//  Created by AIG-Soft on 11/04/12.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "PostTimer.h"
#import	"Setup.h"
#import	"libs.h"

@implementation PostTimer

// 抑止タイマー終了
-(void)stopYokushi:(id)sender
{
	printSelf();
	if (yokushiTimer!=nil) {
		[yokushiTimer invalidate];
		yokushiTimer=nil;
		_fyokushi=NO;
	}
}

// ポストタイマー停止
-(void)stop
{
	printSelf();
	if (postTimer!=nil) {
		nslog(@"ポストタイマー実停止");
		[postTimer invalidate];
		postTimer=nil;
	}
}

// ポスト時間終了&抑止タイマー開始
-(void)startYokushi:(NSTimeInterval)tm
{
	printSelf();
	// ポストタイマーを止める
	[self stop];
	
	// ポスト終了時処理呼び出し
	nslog(@"ポスト終了時処理呼び出し:selector=%p",selector);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"        // 警告回避のため
	[target performSelector:selector withObject:self]; // sender!=nilで呼び出す
#pragma clang diagnostic pop

	if (tm!=None) {
		// 抑止タイマースタート
		nslog(@"start YokushiTimer:%f",tm);
		_fyokushi=YES; // アラーム抑止中
		yokushiTimer=[NSTimer timerWithTimeInterval:tm
											 target:self
										   selector:@selector(stopYokushi:)
										   userInfo:nil
											repeats:NO	// 抑止タイマーは終了判定1発のみ
					  ];
		AddTimerToRunLoop(yokushiTimer); // 実行ループにタイマーを追加する
	}
}

// ダウンカウンター初期化
-(void)restart
{
	nslog(@"ダウンカウンター初期化:counter=%f",counter0);
	counter=counter0;
}

// ダウンカウント処理
-(void)downCount:(id)sender
{
	nslog(@"downCount=%f:%f",counter,step);
	if (counter<=step) {
		nslog(@"終了");
		// 終了
		counter=0.0; // 念のため
		// ポスト時間終了&抑止タイマー開始
		[self startYokushi:yokushiTime];
	} else {
		nslog(@"途中");
		counter-=step;
	}
}

// ポスト中かどうか
-(BOOL)isInPost
{
	return (counter>0);
}

// ポスト開始；ダウンカウンタ間隔指定可能
// step : 数値についてはNSTimerを参照すること(>=1.0または<0 0.1ms)
// ytm=Noneなら抑止なし
// リターン値：YES=ポストあり , NO=なし（1枚なので）
-(BOOL)start:(NSTimeInterval)step_ post:(NSTimeInterval)tm yokushi:(NSTimeInterval)ytm
{
	[self stop];	// 前のポストを止める
	//
	_fyokushi=NO;	// ポスト開始時は抑止中でない
	//
	nslog(@"ポスト時間=%f/抑止=%f:PIC1=%f",tm,ytm,PIC1);
	step	=step_;			// ダウンカウンターステップ記録
	counter0=counter=tm;	// ダウンカウンター初期化
	yokushiTime=ytm;		// 抑止タイマー（保存）
	if (EquFloat(tm,PIC1)) {
		nslog(@"ポスト1枚");
		// 何もしない（ポストを止めるだけ）
		return (NO);
	}
	// 通常のポスト時間あり
	// 一定時間ごとに繰り返し、ソフト的にカウントダウンする
	// 時間一発で処理しないのは、レベル判定対応のため
	postTimer=[NSTimer timerWithTimeInterval:step
									  target:self
									selector:@selector(downCount:)
									userInfo:nil
									 repeats:YES // 繰り返す
			   ];
	AddTimerToRunLoop(postTimer); // 実行ループにタイマーを追加する
	return(YES);
}

// ダウンカウントは１秒単位のstart
-(BOOL)start:(NSTimeInterval)tm yokushi:(NSTimeInterval)ytm;
{
	return [self start:1.0 post:tm yokushi:ytm];
}

-(id)initWithTarget:(id)target_ selector:(SEL)selector_
{
	self=[super init];
	if (self!=nil) {
		target	=target_;
		selector=selector_;
	}
	return (self);
}

-(void)dealloc
{
	[self stop];
	[self stopYokushi:nil];
}

@end
