ダイビングコンピュータからデータを取り出してみた備忘録

ダイビングツールの１つに「ダイビングコンピュータ」というものがあるのだが、コレかなり高性能で面白い。
ダイビング中の潜水深度を表示してくれるだけでなく、減圧停止時間を知らせてくれたり、過去のダイビングを記録してくれていたりする。
そして、ダイビングコンピュータ(以下ダイコン)のデータをPCに落とせるらしいので、今回挑戦してみた。
ダイコンの機種は[SUUNTO D4I NOVO LIME](http://www.suunto.jp/ja-jp/products/dive-computers-and-instruments/suunto-d4i/suunto-d4i-novo-lime)で、PCはMacです。

# SUUNTO DM5のインストール
以下のページからSUUNTO DM5をインストールします。
http://www.suunto.com/ja-jp/support/suunto-dm5
使うには、以下のものも必要みたいです。
[Mono](http://www.mono-project.com/download/)
[FTDI USB Serial Driver](http://www.ftdichip.com/FTDrivers.htm)

#USB端子で端末を差し込む
USB接続するだけなのだが、**不器用な私は差し込むのに苦労した**。
というのも、防水性は勿論のこと、水深100mくらいまで耐えうる設計みたいなので、あまり普段は見ない端子です。
![IMG_20160925_111411.jpg](https://qiita-image-store.s3.amazonaws.com/0/59687/020008bb-793c-92b7-998e-01ceb2106149.jpeg)
全然、固定されない…と四苦八苦していたが、赤ポチマークを上にして差し込んで少し左に回すと固定された。
![IMG_20160925_111430.jpg](https://qiita-image-store.s3.amazonaws.com/0/59687/cca24e73-18fc-d6c8-4547-eea980f42299.jpeg)

#起動して日本語設定
「起動してもダイコンを認識しない！！」と思ったが、再起動したら動いた。
日本語設定は、File→Setting→General→Select languageで*日本語*を選択すればいけます。
こんなカンジに表示されました。
<img width="1199" alt="スクリーンショット 2016-09-25 12.07.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/59687/4970af76-f9df-9945-c2d3-5d8b260e5082.png">

#データをエクスポートする
ファイル→エクスポートでいけます。
形式はXML・PDF・SDE・SMLなどでエクスポートできます。
私はSMLが気に入りました。
温度はケルビンなんですねー。

```xml:sample.sml
<?xml version="1.0" encoding="utf-8"?>
<sml SdkVersion="2.6.6" Modified="2012-09-22T10:39:51" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.suunto.com/schemas/sml">
	<DeviceLog>
		<Header>
			<Battery>3</Battery>
			<DateTime>2015-09-21T11:12:26</DateTime>
			<Duration>1883</Duration>
			<Depth>
				<Max>22.26</Max>
				<Avg>15.23</Avg>
			</Depth>
			<Diving>
				<DiveMode>Air</DiveMode>
				<Conservatism>0</Conservatism>
				<Altitude>0</Altitude>
				<SurfaceTime>0</SurfaceTime>
				<NumberInSeries>1</NumberInSeries>
				<SurfacePressure>101500</SurfacePressure>
				<Algorithm>Suunto Technical RGBM</Algorithm>
				<Gases>
					<Gas>
						<State>Air</State>
						<Oxygen>0.210</Oxygen>
					</Gas>
				</Gases>
				<StartTissue>
					<CNS>0</CNS>
					<OTU>0</OTU>
					<Nitrogen>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
						<Pressure>79000</Pressure>
					</Nitrogen>
					<RgbmNitrogen>1</RgbmNitrogen>
				</StartTissue>
				<EndTissue>
					<CNS>0.034375</CNS>
					<OTU>7.51171875</OTU>
					<OLF>0.034375</OLF>
					<Nitrogen>
						<Pressure>181300</Pressure>
						<Pressure>189900</Pressure>
						<Pressure>181400</Pressure>
						<Pressure>157200</Pressure>
						<Pressure>128900</Pressure>
						<Pressure>107500</Pressure>
						<Pressure>98800</Pressure>
						<Pressure>89400</Pressure>
						<Pressure>84300</Pressure>
					</Nitrogen>
					<RgbmNitrogen>1</RgbmNitrogen>
				</EndTissue>
			</Diving>
			<SampleInterval>20</SampleInterval>
		</Header>
		<Device>
			<Name>Suunto D4i</Name>
			<SerialNumber>11111111</SerialNumber>
			<Info>
				<SW>1.0.0</SW>
				<HW>0.0.0</HW>
				<BSL>0.0.0</BSL>
			</Info>
		</Device>
		<Samples>
			<Sample>
				<Time>0</Time>
				<Events>
					<State>
						<Type>Below Surface</Type>
						<Active>true</Active>
					</State>
					<State>
						<Type>Wet Outside</Type>
						<Active>true</Active>
					</State>
					<State>
						<Type>Below Wet Activation Depth</Type>
						<Active>true</Active>
					</State>
				</Events>
			</Sample>
			<Sample>
				<Time>0</Time>
				<Depth>1.49</Depth>
				<Temperature>302.15</Temperature>
				<Events>
					<State>
						<Type>Dive Active</Type>
						<Active>true</Active>
					</State>
				</Events>
			</Sample>
			<Sample>
				<Time>20</Time>
				<Depth>3.75</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>40</Time>
				<Depth>5.51</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>60</Time>
				<Depth>8.289999999999999</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>80</Time>
				<Depth>9.9</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>100</Time>
				<Depth>9.119999999999999</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>120</Time>
				<Depth>10.33</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>140</Time>
				<Depth>12.34</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>160</Time>
				<Depth>13.96</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>180</Time>
				<Depth>14.28</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			<Sample>
				<Time>200</Time>
				<Depth>15.75</Depth>
				<Temperature>302.15</Temperature>
			</Sample>
			・・・・・・・・・・・・・・・・・・・・
			<Sample>
				<Time>1940</Time>
				<Depth>1.19</Depth>
				<Temperature>302.15</Temperature>
				<Events>
					<Alarm>
						<Type>Mandatory Safety Stop Broken</Type>
						<Active>false</Active>
					</Alarm>
					<Notify>
						<Type>Tissue Level</Type>
					</Notify>
					<State>
						<Type>Below Surface</Type>
						<Active>false</Active>
					</State>
				</Events>
			</Sample>
		</Samples>
	</DeviceLog>
</sml>
```

## (余談)取り出してみたファイルでシェル芸に挑戦した
DM5で見やすく表示されるので特に実行する必要もないのだが、せっかく取り出せたので、シェル芸に挑戦した。
芸人さんには程遠すぎる腕だが、このデータなら出来るかもと挑戦。何事も挑戦。

### 水温が摂氏20度以上の水深の平均を求める
```
cat sample.sml | grep -E -e "<Depth\>.*</Depth\>|<Temperature>.*</Temperature>" | tr -d "\t" | perl -pe "s/<\/.*>//g" | tr -d "\n" | perl -pe "s/<Depth>/\n/g" | perl -pe "s/<Temperature>/\t/g" | awk '{if($2>293){a=a+$1;k=k+1}}END{print a/k;}'
```

###　潜った時の深度をグラフっぽく表示
```
cat sample.sml | grep -E  \<Depth\>.*\</Depth\>  | perl -pe 's/<.{0,1}Depth>//g' | awk '{a=int($1+0.5);for(i=1;i<=a;i++){printf "*"};print "";}' 
```

絶対もっとスマートに出来るハズなのに。。。。。
難しい。。。。

参考にした資料：[【問題と解答】第24回◯◯o◯裏番組シェル芸勉強会](https://blog.ueda.asia/?p=8592)