<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>JogNoteのラップタイムとGPSデータを融合しGarminConnectのtcxデータを生成する</title>
</head>
<body>
  
<?php

// JogNoteからエクスポートしたjsonファイルを置く場所が異なる場合は以下を編集
$jsonFiles = glob( dirname(__FILE__).'/JogNote/json/*.json' );
if (!empty($jsonFiles))
{

  foreach ($jsonFiles as $jsonFile)
  {
    //テンプレートXMLファイルを置く場所が異なる場合は以下を編集
	$read_template = dirname(__FILE__).'/JogNote/gpx/templates/template.tcx';
    // 読み込み用.tcxファイルが存在する場合のみ、処理する
	if( is_file($read_template) )
	{
		// 出力XML形式のDOMオブジェクト作成
      	$domOut = new DOMDocument('1.0', 'UTF-8');
		$domOut->preserveWhiteSpace = false;
		$domOut->formatOutput = true;
		$domOut->load($read_template);

       	$oRoot      = $domOut->getElementsByTagName("Activities")[0];
		$oActivity 	= $oRoot->getElementsByTagName("Activity")[0];
      	$oLap		= $oActivity->getElementsByTagName("Lap")[0];

    } else {
        print("No template File</br>");
        die();
    }

	$json = file_get_contents($jsonFile);
	$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
	$arr = json_decode($json,true);
	if ($arr === NULL) {die();}
?>
  
	<h1>【日付】<?php	echo $arr["note"]["date"];?></h1>
  　<p>天気:&nbsp;<?php	echo $arr["note"]["weather"];?></p>
  　<h2>ワークアウト</h2>
	<p>日記:&nbsp;<?php	echo $arr["note"]["diary"];?></p>
  	<?php
    foreach($arr["note"]["workouts"] as $_workouts)
	{
      $kcal = $_workouts["kcal"];
      $memo = $_workouts["memo"];
  	?>

  	<p>ワークアウトID:&nbsp;<?php	echo $_workouts["workout_id"];?></p>
	<p>ワークアウト名:&nbsp;<?php	echo $_workouts["name"];?></p>
	<p>メモ:&nbsp;<?php	echo $memo;?></p>
	<p>消費カロリー:&nbsp;<?php echo $kcal;?></p>
  	<p><table border=1><tr><td>距離</td><td>タイム</td></tr>
  	<?php
      //各LAPデータを1行毎に出力
	  foreach($_workouts["laps"] as $_laps)
      {
  	?>
    	<tr><td><?php echo $_laps["meter"];?>&nbsp;</td>
    	<td><?php echo $_laps["sec"];?>&nbsp;</td></tr>
  	<?php
      }	// endof foreach $_laps
	?>
  
	</table></p>
	<p>GPSファイル名:<?php	echo $_workouts["route"];?></p>
  	<?php

    // 作業手順
    // JogNoteからエクスポートした.gpxファイルを、.jsonファイルとは別のフォルダに格納する。
    // GPSデータが無いものは対応していません。
    // 読み込みXMLファイルを置く場所が異なる場合は以下を編集
    // フォルダ内の全ファイルを一度に変換処理するので、負荷を考えオススメは20ファイルくらいまで。
	$read_gpx = dirname(__FILE__).'/JogNote/gpx/'.$_workouts["route"];

      // 書き出しXMLファイルを置く場所が異なる場合は以下を編集
    // 同じファイル名で保存するため、読み込みフォルダとは別の場所とすること
	$write_tcx = dirname(__FILE__).'/JogNote/tcx_w/'.str_replace('.gpx','.tcx', $_workouts["route"]);

		if( is_file($read_gpx) )
		{
			// XML形式のDOMオブジェクトに読み込み
      		$dom = new DOMDocument('1.0', 'UTF-8');
			$dom->preserveWhiteSpace = false;
			$dom->formatOutput = true;
			$dom->load($read_gpx);

          // DomからActivityを抽出
        	$root       = $dom->getElementsByTagName("trk")[0];
			$oTrkseg 	= $root->getElementsByTagName("trkseg")[0];
          
          	// LAPデータのポインタを初期化
          	$i_lap = 0;
          
          	// 総走行距離を記憶
          	$totalDistance = $_workouts["meter"];
          	// 総走行時間を記憶
          	$totalTime = $_workouts["sec"];
            // 総消費カロリーを記憶
          	$totaltKcal = $_workouts["kcal"];
          
	      	print("<p>走行距離:".$totalDistance."</p>");
          	print("<p>走行時間:".$totalTime."</p>");
          	print("<p>消費カロリー:".$totaltKcal."</p>");
	     	print("<p>最高速度:".$oLap->getElementsByTagName('MaximumSpeed')[0]->nodeValue."</p>");
                     	
            $startTime = $oTrkseg->getElementsByTagName('trkpt')[0]->getElementsByTagName('time')[0]->nodeValue;
			$lapStartTime = strtotime($startTime);

          	print( (count( $_workouts["laps"]) +1)."</p>");
          
          	foreach( $oTrkseg->getElementsByTagName('trkpt') as $num_trkpt => $trkpt )
          	{
              
             	if( $num_trkpt == 0 ||  ( $lapStartTime + $cur_dist_time <= strtotime($lastTime) ) )
              	{
                	print("----- LAP ------".($i_lap + 1)."</br>");
                  
					if( 0 < $num_trkpt ) { $lapStartTime = $lapStartTime + $cur_dist_time ; }
                  
                  	$num_trkpt_Lap = 0 ;
                  
                   if( !empty($_workouts["laps"][$i_lap]["meter"]) )
                    {	// 最終ラップを超えるまでは区間距離（今回ラップ距離－前回ラップ距離）
          				$cur_distance = $_workouts["laps"][$i_lap]["meter"] - $_workouts["laps"][$i_lap-1]["meter"];
                      	// 時間はラップ時間のまま代入
                      	$cur_dist_time = $_workouts["laps"][$i_lap]["sec"];
                    }
			          	// JogNoteには最終ラップ分が記録されていないので、最終GPSデータから計算する
                    else{  // 最終ラップを超えたら、総走行距離から引く
                        $cur_distance = $totalDistance - $_workouts["laps"][$i_lap-1]["meter"];
                      	// 時間はトータル時間から、開始時間～最終LAP開始時間　を差し引く
                      	$cur_dist_time = $totalTime - ($lapStartTime - strtotime($startTime));
                    }

                    print($i_lap."</br>");
					print($lapStartTime." </br>");
                    print($cur_dist_time."</br>");
                    print(strtotime($lastTime)." ".$lastTime."</br>");
 
                  // DOMにLAPを追加
                  	$newLap = $oLap->cloneNode(true);
                	$oActivity->appendChild($newLap);
                	$newLap->setAttribute('StartTime', date('Y-m-d\TH:i:s\.Z\Z', $lapStartTime) );

                	$newLap->getElementsByTagName('DistanceMeters')[0]->nodeValue = $cur_distance;
                	$newLap->getElementsByTagName('TotalTimeSeconds')[0]->nodeValue = $cur_dist_time;
          			$newLap->getElementsByTagName('Intensity')[0]->nodeValue = $oLap->getElementsByTagName('Intensity')[0]->nodeValue;
          			$newLap->getElementsByTagName('TriggerMethod')[0]->nodeValue = $oLap->getElementsByTagName('TriggerMethod')[0]->nodeValue;
               		$newLap->getElementsByTagName('Calories')[0]->nodeValue = $totaltKcal * $cur_distance / $totalDistance;
  
                  	$newTrack = $newLap->getElementsByTagName('Track')[0];
                  
                  	$newSpeed = $cur_distance / $cur_dist_time;
                  	$newLap->getElementsByTagName('Extensions')[0]->getElementsByTagName('LX')[0]->getElementsByTagName('AvgSpeed')[0]->nodeValue = $newSpeed;
                  	print("<p>区間距離:".$cur_distance."</p>");
            		print("<p>秒:".$cur_dist_time."</p>");
            		print("<p>速度:".$newSpeed."</p>");

                  	$last_distance = $_workouts["laps"][$i_lap]["meter"] - $last_distance;
               
				    print("走行距離:". $_workouts["laps"][$i_lap]["meter"]."</p>");

                  //--------------------------------------------
                  
                  
                 	$i_lap = $i_lap + 1;

                  	$cur_max_speed = "";

                }	//end if
 
                  	$num_trkpt_Lap = $num_trkpt_Lap +1 ;

              		$newTrackpoint = $newTrack->getElementsByTagName('Trackpoint')[0]->cloneNode(true);
          			if( $num_trkpt_Lap == 1 ) { $newTrack->removeChild($newTrack->getElementsByTagName('Trackpoint')[0]); }

                  	$lastTime = $trkpt->getElementsByTagName('time')[0]->nodeValue;
              		$newTrackpoint->getElementsByTagName('Time')[0]->nodeValue = date( 'Y-m-d\TH:i:s\.Z\Z', strtotime($lastTime) );

              		$newTrackpoint->getElementsByTagName('Position')[0]->getElementsByTagName('LatitudeDegrees')[0]->nodeValue 
                      					= $trkpt->getAttribute('lat');
                  	$newTrackpoint->getElementsByTagName('Position')[0]->getElementsByTagName('LongitudeDegrees')[0]->nodeValue 
                      					= $trkpt->getAttribute('lon');
					// GPSデータツリーを新しいLAPデータに１つずつ追加
              		$newTrack->appendChild($newTrackpoint);

                print("-----------".$num_Trk."</br>");
                print("<p>GPStime:".$newTrackpoint->getElementsByTagName('Time')[0]->nodeValue."</p>");
          	
            }	//end foreach 'Trackpoint'
          
            // GarminConnect上で1ラップとして存在したラップデータを消去  
           	$oActivity->removeChild($oActivity->getElementsByTagName('Lap')[0]);
		
        $oActivity->getElementsByTagName('Id')[0]->nodeValue = $startTime;
        
		$domOut->save($write_tcx);
	
  	}	// end if $read_tcx exists
  }	//end foreach $_workouts
 }	// end foreach $jsonFiles
}	//end if $jsonFiles exists
?>
</body>
