ZIG SIMが送信するセンサの種類とデータ構造について

# ZIG SIMとは？
ZIG SIMは1-10driveで開発した『プロトタイピングをプロトタイピングする』ためのアプリケーションです。
iOSデバイスを『Arduino + Wifi shield + LiPo + 沢山のセンサ』と見立てることで、簡単にセンサをPCに送信する仕組みを構築できます。
同様にリリースしているZIG INDICATORを利用するとPC側でアプリケーションを開発することなく、センサの値をチェックできます。

# ZIG SIMのデータ構造
Settingsを編集することでJSON形式とOSC形式が選択可能です。
ただしZIG INDICATORは現時点でJSON形式にのみの対応。
ZIG SIMはWifiを利用するため、パケットロストの可能性があります。
そのため、TCP(Client)のOSCにも対応してます。
vvvvやProcessingなどではTCPのOSCも利用可能なようです。

# ZIG SIMのTCP通信時のデリミタについて

ZIG SIMでTCP通信を設定した場合、"\n"をデリミタとして利用しています。
Windowsの場合は"¥n"になります。
JSON、OSCどちらもこのデリミタを採用しています。

# ZIG SIMで送れるデータ形式(iOS版)
### ACCEL
重力加速度を除いた加速度です。x,y,zの3つのパラメータで構成されています。単位はGです。
iOSでは±8Gの範囲を計測可能です。
### GRAVITY
重力加速度です。x,y,zの3つのパラメータで構成されています。単位はGです。
### GYRO
角速度です。x,y,zの3つのパラメータで構成されています。単位は°です。
### QUATERNION
クォータニオン(デバイスの姿勢)です。x,y,z,wの4つパラメータで構成されています。
### COMPASS
コンパスです。コンパスの角度とFaceUp(画面を上にした場合)か否(スマホを立てた場合)か、の2つのパラメータで構成されています。コンパスの角度の単位は°です。
### PRESSURE
気圧です。気圧、相対高度の2つのパラメータで構成されています。
気圧の単位はhPa、相対高度はmeterです。
### GPS
GPSです。緯度、経度の2つパラメータで構成されています。
単位は°です。
### 2D TOUCH
タッチ座標です。x,yの2つのパラメータで構成されています。配列として複数のセットが飛んでくる可能性があります。
最大数はiOSによって決定されています。
単位はpixelです。
### TOUCH RADIUS
タッチの範囲です。1つのパラメータで構成されています。
単位はpixelです。
### 3D TOUCH
タッチの強さ(force)です。1つのパラメータで構成されています。
### BEACON
iBeaconです。UUID、RSSI、Major、Minorの4つで構成されています。配列として複数のセットが飛んでくる可能性があります。
### PROXIMITY MONITOR
近接センサです。検知しているか否か、の1つのパラメータで構成されています。
### MIC LEVEL
マイクレベルです。最大値(max)と平均値(average)の2つのパラメータで構成されています。
単位はdBです。
### REMOTE CONTROL
リモコンです。playが押されたか否か、volume upが押されたか否か、volume downが押されたか否かの3つのパラメータで構成されています。

# ZIG SIMのデータ構造(JSON)

実際のJSONファイルを一例として記述します。

```Javascript:ZigSimSample.js
{
	"device":{ // 絶対に飛ぶ基本情報
		"name" : "iPhone 6s Plus",
		"uuid":"0123456789abcdef",
		"os":"ios",
		"osversion":"10.0.2",
		"displaywidth":1920,
		"displayheight":1080
	},
	"timestamp" : "2016/04/06 15:36", // 絶対に飛ぶ基本情報
	"sensordata":{
		"accel" : { // "ACCEL"選択時に出力される
			"x" : 1.00,
			"y" : 1.00,
			"z" : 1.00
			},
		"gravity" : { // "GRAVITY"選択時に出力される
			"x" : 1.00,
			"y" : 1.00,
			"z" : 1.00
			},
		"gyro" : { // "GYRO"選択時に出力される
			"x" : 1.00,
			"y" : 1.00,
			"z" : 1.00
			},

		"quaternion": { // "QUATERNION"選択時に出力される
			"x" : 1.00,
			"y" : 1.00,
			"z" : 1.00,
			"w" : 1.00
		}, 
		"compass": { // "COMPASS"選択時に出力される
			"faceup": false,
			"compass": 180.0
		}, 
		"pressure": { // "PRESSURE"選択時に出力される
			"pressure" : 1.000,
			"altitude" : 1.000
		}, 
		"gps": { // "GPS"選択時に出力される
			"latitude" : 180.0,
			"longitude" : 180.0
		}, 
		"miclevel":{
			"average":-33.25574493408203,
			"max":-26.98263359069824
		},
		"proximitymonitor":{
			"proximitymonitor":false
		},
		"remotecontrol":{
			"volumeup":false,
			"playpause":false,
			"volumedown":false
	        },

		"touch" : [  // "2D Touch"、"TOUCH RADIUS"、"3D TOUCH"のどれかが選択されていると出力される 
                       {    
                            "x" : 0.5, // "2D Touch"選択時に出力される
                            "y" : 0.3, // "2D Touch"選択時に出力される
                            "radius" : 1.0, // "Touch RADIUS"選択時に出力される
                            "force" : 1.0  // "3D Touch"選択時に出力される
                      },
                      {  // 複数のタッチポイントがあれば出力される。iOSの場合最大5点
                            "x" : 0.1, 
                            "y" : 0.1,
                            "radius" : 2.0,
                            "force" : 0.5
                      },
		]
		"beacon" : [ // "BEACON"選択時に出力される
                       {    
                            "uuid" : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,
                            "rssi" : -100,
                            "major" : 100,
                            "minor" : 1,
                      },
                     {    // 複数のBeaconが検出されてれば出力される。
                            "uuid" : XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX,
                            "rssi" : -50,
                            "major" : 101,
                            "minor" : 1,
                      }
		]
	}
}
```

# ZIG SIMのデータ構造(OSC)
OSCを選択した場合、OSC Bundleを利用して複数のOSC Messageをまとめて送信します。
アドレスは"/ZIGSIM/UUIDの名称/センサの名称"と言う感じです。
最初の『スラッシュ2つ』と言うのがややこしいというフィードバックをいただいたので、『スラッシュ1つ』に変更予定です。
### DEVICE
アドレス："/ZIGSIM/UUIDの名称/DEVICE"
パラメータ：String(デバイス名),  String(OS),  String(OSバージョン), Int(ディスプレイ幅), Int(ディスプレイ高さ)
### ACCEL
アドレス："/ZIGSIM/UUIDの名称/accel"
パラメータ：Float(x), Float(y), Float(z)
### GRAVITY
アドレス："//UUIDの名称/gravity"
パラメータ：Float(x), Float(y), Float(z)
### GYRO
アドレス："/ZIGSIM/UUIDの名称/gyro"
パラメータ：Float(x), Float(y), Float(z)
### QUATERNION
アドレス："/ZIGSIM/UUIDの名称/quaternion"
パラメータ：Float(x), Float(y), Float(z), Float(w)
### COMPASS
アドレス："/ZIGSIM/UUIDの名称/compass"
パラメータ：Float(角度), Int(faceUpか否か) 
### PRESSURE
アドレス："/ZIGSIM/UUIDの名称/pressure"
パラメータ：Float(気圧), Float(相対高度) 
### GPS
アドレス："/ZIGSIM/UUIDの名称/gps"
パラメータ：Float(緯度), Float(経度) 
### 2D TOUCH
アドレス："/ZIGSIM/UUIDの名称/touch検出数"
パラメータ：Float(x), Float(y) 
備考：次のアドレスで配列数も同時に飛ばします。
　　アドレス："/ZIGSIM/UUIDの名称/touchcount"
　　パラメータ：Int(x) 
### TOUCH RADIUS
アドレス："/ZIGSIM/UUIDの名称/touchradius検出数"
*ver1.3.1までは2D TOUCHに含まれます
パラメータ：Float(x), Float(y), Float(radius)
備考：次のアドレスで配列数も同時に飛ばします。
　　アドレス："/ZIGSIM/UUIDの名称/touchcount"
　　パラメータ：Int(x) 
### 3D TOUCH
アドレス："//UUIDの名称/touchforce検出数"
*ver1.3.1までは2D TOUCHに含まれます
パラメータ：Float(x), Float(y), Float(force)
備考：次のアドレスで配列数も同時に飛ばします。
　　アドレス："/ZIGSIM/UUIDの名称/touchcount"
　　パラメータ：Int(x) 
### BEACON
アドレス："/ZIGSIM/UUIDの名称/beacon検出数"
パラメータ：String(BeaconのUUID), Float(Major) , Float(Minor), Float(RSSI)
備考：次のアドレスで配列数も同時に飛ばします。
　　アドレス："/ZIGSIM/UUIDの名称/beaconcount"
　　パラメータ：Int(x) 
### PROXIMITY MONITOR
アドレス："/ZIGSIM/UUIDの名称/proximitymonitor"
パラメータ：Int(0/1)
### REMOTE CONTROL
アドレス："/ZIGSIM/UUIDの名称/remotecontrol"
パラメータ：Int(play0/1), Int(volume up 0/1), Int(volume down 0/1)
### MIC LEVEL
アドレス："/ZIGSIM/UUIDの名称/miclevel"
パラメータ：Float(max), Float(average)