//
//  Motion.m
//  X-BASIC'
//
//  Created by AIG-Soft(iMac) on 2012/09/19.
//  Copyright (c) 2012-15年 AIG-Soft. All rights reserved.
//

#import "Motion.h"

@implementation Motion

// 取得処理開始
// dataSecond : データ確保秒数
// リターン値 : YES=エラー
-(BOOL)start:(NSInteger)dataSecond dno:(NSInteger)dno_
{
	printSelf();
	// X-BASIC内ではサンプリングレート100ms固定
	rotationControl=[[RotationControl alloc]initWithSampling:DEF_SAMPLING]; // ここで.datasがalloc+initされる
	if (rotationControl==nil) {
		// モーションが使えないときはYES
		return (YES);
	}
	rotationControl.dataStore=self;
	rotationControl.dno=dno_;	// データ種類
	
	// 指定秒数分のデータを保存できる量
	max_datas=((dataSecond*SEC_MS)/DEF_SAMPLING);
	// ダミーデータを結合して容量を確保しておく
	CMRotationRate xyz; // 構造体
	NSValue *val=[NSValue value:&xyz withObjCType:@encode(CMRotationRate)];
	for (int i=0;i<max_datas;i++) {
		[rotationControl.datas addObject:val];
	}
	[self clear];
	[rotationControl startSampling];
	// モーションは使える
	return (NO);
}

// データ個数を数える
-(int)calcSamples
{
	if (wp>=rp) return(wp-rp);
	// wp<rp
	return (max_datas-(rp-wp));
}

// バッファークリア
-(void)clear
{
	rp=wp=0;
}

// MOTION_VELOCITY/MOTION_ROTATION/MOTION_DEGREE
-(void)getRotation:(CMRotationRate *)xyz
{
	if (rotationControl==nil||(rp==wp)) {
		xyz=NULL; // データはない
		return;
	}
	NSValue *val=(rotationControl.datas)[rp];
	[val getValue:xyz];
	// 読んだら消すので注意
	rp++;
	if (rp>=max_datas) rp=0;
	/* MOTION_VELOCITY	MOTION_ROTATION		MOTION_DEGREE
	 typedef struct {
	 	double x;		roll(ラジアン）		x軸重力加速度
	 	double y;		pitch(ラジアン）		y軸重力加速度
	 	double z;		yaw(ラジアン）		z軸重力加速度
	 } CMRotationRate
	 角速度 rad/sec
	 */
}

// 実記録データ数
-(int)count
{
	if (rotationControl==nil) {
		return (0);
	}
	return ([self calcSamples]);
}

// 一時停止のon/off
-(void)pause:(BOOL)fpause
{
	if (rotationControl!=nil) {
		rotationControl.fpause=fpause;
	}
}

-(void)selectData:(NSUInteger)dno_
{
	printSelf();
	if (rotationControl!=nil) {
		rotationControl.dno=dno_;
	}
}

-(void)end
{
	printSelfs(@"%@",rotationControl);
	if (rotationControl!=nil) {
		[rotationControl stopRotationControl];
		rotationControl=nil;
	}
}

//------------------

// これはデリゲートで呼び出される
-(void)rotationControlStoreData:(CMRotationRate *)xyz
{
	if (rotationControl!=nil) {
		NSValue *val=[NSValue value:xyz withObjCType:@encode(CMRotationRate)];
		(rotationControl.datas)[wp] = val;
		wp++;
		if (wp>=max_datas) wp=0;
		if (wp==rp) {
			rp++;
			if (rp>=max_datas) rp=0;
		}
	}
}

//------------------

-(void)dealloc
{
	printSelf();
	[self end];
}
	
@end
