//----------------------------------------------------------------------------------------------
// compass
// V3.20以降専用
//----------------------------------------------------------------------------------------------
// 画面的には全機種対応；ただし、iPod系はコンパス機能がないので動かない

print "version Motion=";versionXBiOSMotion$()

font("Cochin",6):// ファンクションキーのフォントを設定
setFunctionKey(0,"end"   ,'!')
setFunctionKey(1,"pause" ,'p')
setFunctionKey(2,"start" ,'s')
setFunctionKey(3,"clear" ,'c')
setFunctionKey(4,"mode"  ,'g')
displayFunctionKey(YES,0,4)
kBackgroundAlpha(0.9)
font("IPAGothic")

print "コンパス機能準備中・・・";

if compassStart(10) then {
	print localizedString("方位取得は使えません","Can't use compass.")
	end
}
print "完了"

int gwx
int gwy=getScreenSize(gwx)
float cx=gwx/2,cy=gwy/2
float r=gwx/4

float baseDegree=90.0
if isLandscape() then {
	// 横画面の時
	baseDegree=0
}

vpriority(TPAGE,GPAGE3,GPAGE1,GPAGE2,GPAGE0,SPAGE)
vpage(B_TPAGE+B_GPAGE0+B_GPAGE1+B_GPAGE2+B_GPAGE3)

// グラフィックページごと初期設定
apage(GPAGE1)
lineWidth(6.0)
lineCap(LineCapRound)
gColor(&hff0000ff)
//gBlend(BlendModeXOR)
//gAntiAlias(YES)
//
apage(GPAGE2)
lineWidth(6.0)
lineCap(LineCapRound)
gColor(&h00ff00ff)
//gBlend(BlendModeColorDodge)
//gAntiAlias(NO)
//

int page=0:// 初期描画の印

enum
	MODE_HARI=0	:// 0=標準コンパス
	MODE_PIC	:// 1=絵コンパス
	MODE_TEXT	:// 2=文字のみ
endenum
int gmode=MODE_HARI

int i
float degree,magnetic

//-----------------↓テスト↓
if NO then {
	// 画像回転テスト
	r=drawCircle()
	apage(GPAGE1):wipe()
	int wwx,wwy
	pngHeader("compass.png",wwx,wwy)
	imgLoad(cx-wwx/2,cy-wwy/2,,,"compass.png")
	magnetic=0
	for i=0 to 7
		print magnetic;"度",://deg2rad(magnetic)
		compassPointedNorth(magnetic,MODE_PIC)
		magnetic=magnetic+45
		hitKey(NO)
	next
	stop
}
if NO then {
	// グラフィックテスト
	cls()
	// GPAGE2
	line(10,10,100,90)
	line(10,20,20,10)
	apage(GPAGE1)
	line(10,90,100,10)
	line(90,10,100,20)
	stop
}
//-----------------↑テスト↑

// 外枠描画
r=drawCircle()
// 初期描画
compassPointedNorth(0,gmode)

int ky,cnt

while YES
	if not kbhit() then {
		i=0
		cnt=compassCount()
		if (gmode=2) then {
			if cnt>0 then locate(0,2):print "cnt=";cnt
		}
		while cnt>0
			degree=compassGetData(magnetic)
			switch gmode
				case MODE_TEXT
					// 文字のみ表示
					locate(0,3+i)
					if isLocalizeJapan() then {
						print using "極北からの角度=###.####,磁北からの角度=###.####";degree,magnetic
					} else {
						print using "true=###.####,magnetic=###.####";degree,magnetic
					}
					break
				case MODE_HARI
				case MODE_PIC
					// コンパス描画
					compassPointedNorth(degree,gmode)
					break
			endswitch
			cnt=cnt-1
			i=i+1
			if kbhit() then break
		endwhile
	} else {
		ky=inkey()
		switch ky
			case 'p'
				compassPause(YES)
				print "Pause"
				break
			case 's'
				compassPause(NO)
				print "Start"
				break
			case 'c'
				cls()
				compassClear()
				break
			case 'g'
				gmode=gmode+1
				if gmode>MODE_TEXT then gmode=MODE_HARI
				cls()
				apage(GPAGE1)
				gTransform():// 変形解除
				switch gmode
					case MODE_TEXT
						vpage(B_TPAGE)
						locate(0,3):print localizedString("データ待ち中","Waiting data")
						break
					case MODE_PIC
						vpage(B_TPAGE+B_GPAGE0+B_GPAGE1+B_GPAGE2+B_GPAGE3)
						apage(GPAGE2):wipe()
						// コンパスの中を白く塗りつぶす；pngが透過なので下が見えるから
						//gColor(&hff00ffff)
						gColor(&hffffffff)
						circle(cx,cy,r,,,,YES)
						apage(GPAGE1):wipe()
						int wx,wy
						// compass256.pngは透過付き256色画像
						// compass2.pngは透過付きインデックスカラー画像
						// compass.pngは透過付きフルカラー色画像；でもiOS上では透過しない
						str pngName="compass2.png"
						pngHeader(pngName,wx,wy)
						imgLoad(cx-wx/2,cy-wy/2,,,pngName)
						compassPointedNorth(degree,gmode):// 再描画
						break
					case MODE_HARI
						vpage(B_TPAGE+B_GPAGE0+B_GPAGE1+B_GPAGE2+B_GPAGE3)
						apage(GPAGE2):wipe()
						apage(GPAGE1):wipe()
						compassPointedNorth(degree,gmode):// 再描画
						break
				endswitch
				break
			default:
				// 念のため / just in case
				beep()
				break
		endswitch
		if ky='!' then break
	}
endwhile
compassEnd()
end

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

// コンパス枠の描画
func float drawCircle()
fenum
	WD	=10.0
endenum

	apage(GPAGE3)
	gColor(&hffff0080)
	circle(cx,cy,10,,,,YES)
	gColor(&h00000060)
	circle(cx,cy, 5,,,,YES)

	apage(GPAGE0)
	gColor(&hffffffff)
	lineWidth(WD)
	// 外枠を描く
	circle(cx,cy,r)

	str fnt
	float fntsz
	dim str direction(8-1):// 方角文字列
	dim float dx(8-1)={-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,-0.5}:// 方角別文字表示xオフセット
	dim float dy(8-1)={-0.5,-0.5,-0.5,-0.5,-0.5, 0  ,-0.5, 0  }:// 方角別文字表示yオフセット
	if isLocalizeJapan() then {
		fnt="IPAGothic"
		fntsz=24.0
		direction={"東","北東","北","北西","西","南西","南","南東"}:// 水平を東からスタート
	} else {
		fnt="SourceCodePro-Bold"
		fntsz=24.0
		direction={"W","NW","N","NE","E","SE","S","SW"}:// 水平を東からスタート
	}
	lineWidth(1)
	float degree=0,rr=r+WD/2+fntsz
	int i
	for i=0 to 7:// 8方向
		float rad=pi(i)/4
		float x=cx+rr*cos(rad)
		float y=cy-rr*sin(rad)
		float x1=cx+r*cos(rad)
		float y1=cy-r*sin(rad)
		gColor(&hff0000ff)
		circle(x1,y1,WD/2,,,,YES)
		str d$=direction(i)
		int w=utf8Len(d$)
		float ww=w*fntsz
		gColor(&h00ffffff)
		symbol(x+dx(i)*ww,y+dy(i)*ww,d$,fnt,fntsz)
	next

	// 新しい半径を返す
	// 以降ｒは針の描画にのみ利用される。
	// CapRoundなので更に少し引いておく
	return (r-WD/2-2)
endfunc

// 常に北方向を指す
func compassPointedNorth(degree;float,gmode;int)
	// degreeは北方向からの角度
	// デバイスの垂直方向を0度にするため角度転換する
	// 0度:水平 -> 0度:垂直
	float rad
	switch gmode
		case MODE_HARI
			rad=deg2rad(degree+baseDegree):// 針は上＝北を基準にするため補正する
			float dx=r*cos(rad)
			float dy=r*sin(rad)
			float xn=cx+dx:// 北
			float yn=cy-dy
			float xs=cx-dx:// 南
			float ys=cy+dy
			// 針はpage1/2で交互に描画
			switch page
				case 0
					// 初回;前はないので消し処理なし
					apage(GPAGE1)
					page=2
					break
				case 1
					// 前のを消す
					wipe()
					page=2
					apage(GPAGE2)
					break
				case 2
					// 前のを消す
					wipe()
					apage(GPAGE1)
					page=1
				break
			endswitch
			gColor(&hff0000ff)
			line(cx,cy,xn,yn)
			gColor(&h0000ffff)
			line(cx,cy,xs,ys)
			break
		case MODE_PIC
			rad=deg2rad(degree):// 画像は最初から上を向いているので補正不要
			apage(GPAGE1)
			gTransform(,,,,,rad)
			break
	endswitch
endfunc

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