From 6e9d0a33403aedc6c1998084f856dc270e238363 Mon Sep 17 00:00:00 2001
From: Noxer <tim@plusmid.net>
Date: Tue, 9 Jan 2018 17:19:37 +0100
Subject: [PATCH] Added all fingers and switched format to list of JSON

---
 Assets/Record/Recorder.cs | 93 +++++++++++++++++++++++++++++++--------
 1 file changed, 74 insertions(+), 19 deletions(-)

diff --git a/Assets/Record/Recorder.cs b/Assets/Record/Recorder.cs
index cd62112..aba7378 100644
--- a/Assets/Record/Recorder.cs
+++ b/Assets/Record/Recorder.cs
@@ -3,6 +3,7 @@ using Leap.Unity;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
+using System.Text;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -19,8 +20,14 @@ public class Recorder : MonoBehaviour
 
 	private string path = "Assets/Record/Recorded/";
 	private StreamWriter mStreamWriter;
-	private string date;
 
+	// Finger bones from base to tip
+	private Bone.BoneType[] bones = new Bone.BoneType[] {
+		Bone.BoneType.TYPE_METACARPAL,
+		Bone.BoneType.TYPE_PROXIMAL,
+		Bone.BoneType.TYPE_INTERMEDIATE,
+		Bone.BoneType.TYPE_DISTAL
+	};
 
 	public void ToggleRecording()
 	{
@@ -34,8 +41,7 @@ public class Recorder : MonoBehaviour
 	{
 		Directory.CreateDirectory (path + gestureName);
 		mStreamWriter = new StreamWriter(path + gestureName + "/" + recordingNumber.ToString() + ".txt");
-		mStreamWriter.WriteLine("Gesture: " + gestureName + "; Author: " + userName + "; Recorded: " + date);
-		mStreamWriter.WriteLine("timestamp l_palm_pos_x l_palm_pos_y l_palm_pos_z r_palm_pos_x r_palm_pos_y r_palm_pos_z");
+		mStreamWriter.WriteLine("Gesture: " + gestureName + "; Author: " + userName);
 
 		//UI
 		recordingLabel.SetActive (true);
@@ -59,42 +65,91 @@ public class Recorder : MonoBehaviour
 	{
 		if (mStreamWriter != null)
 		{
-			Vector3 leftPalmPosition = Vector3.zero, rightPalmPosition = Vector3.zero;
-			Vector4 leftPalmRotation = Vector3.zero, rightPalmRotation = Vector3.zero;
+			Dictionary<string, float> hands = new Dictionary<string, float>();
 
             Frame frame = LeapService.CurrentFrame;
             foreach (Hand hand in frame.Hands)
             {
 				if (hand.IsLeft)
 				{
-					leftPalmPosition = hand.PalmPosition.ToVector3 ();
-					leftPalmRotation = new Vector4(hand.Rotation.x, hand.Rotation.y, hand.Rotation.z, hand.Rotation.w);
+					handToDict ("l", hand, hands);
 				}
 				else
 				{
-					rightPalmPosition = hand.PalmPosition.ToVector3();
-					rightPalmRotation = new Vector4(hand.Rotation.x, hand.Rotation.y, hand.Rotation.z, hand.Rotation.w);
+					handToDict ("r", hand, hands);
 				}
             }
 
-			mStreamWriter.WriteLine(DataToString(VecToData(leftPalmPosition), VecToData(leftPalmRotation), VecToData(rightPalmPosition), VecToData(rightPalmRotation)));
+			hands ["timestamp"] = Time.unscaledTime;
+
+			mStreamWriter.WriteLine(JsonUtility.ToJson(hands));
         }
 	}
 
-	private static string VecToData(Vector3 vec)
-	{
-		return string.Format("{0} {1} {2}", vec.x, vec.y, vec.z);
+	private void handToDict(string prefix, Hand hand, Dictionary<string, float> result) {
+		// Iterate over each finger and bone
+		foreach (Finger finger in hand.Fingers) {
+			foreach (var boneType in bones) {
+				// Load the bone
+				var bone = finger.Bone (boneType);
+				var boneID = string.Join ("_", new string[]{prefix, FingerName (finger.Type), BoneName (boneType)});
+
+				// Store the center of the bone
+				result [boneID + "_cen_x"] = bone.Center.x;
+				result [boneID + "_cen_y"] = bone.Center.y;
+				result [boneID + "_cen_z"] = bone.Center.z;
+
+				// Store the direction of the bone
+				result [boneID + "_dir_x"] = bone.Direction.x;
+				result [boneID + "_dir_y"] = bone.Direction.y;
+				result [boneID + "_dir_z"] = bone.Direction.z;
+
+				// Store the length of the bone
+				result [boneID + "_len"] = bone.Length;
+			}
+		}
+
+		// Store the palm of the hand
+		var palmID = string.Join("_", new string[]{ prefix, "palm" });
+		result [palmID + "_pos_x"] = hand.PalmPosition.x;
+		result [palmID + "_pos_y"] = hand.PalmPosition.y;
+		result [palmID + "_pos_z"] = hand.PalmPosition.z;
+		result [palmID + "_rot_x"] = hand.Rotation.x;
+		result [palmID + "_rot_y"] = hand.Rotation.y;
+		result [palmID + "_rot_z"] = hand.Rotation.z;
+		result [palmID + "_rot_w"] = hand.Rotation.w;
 	}
 
-	private static string DataToString(params object[] list)
+	private string FingerName(Finger.FingerType fingerType)
 	{
-		string[] strs = new string[list.Length];
-
-		for (int i = 0; i < list.Length; i++) {
-			strs [i] = list [i].ToString ();
+		switch (fingerType) {
+		case Finger.FingerType.TYPE_INDEX:
+			return "index";
+		case Finger.FingerType.TYPE_MIDDLE:
+			return "middle";
+		case Finger.FingerType.TYPE_PINKY:
+			return "pinky";
+		case Finger.FingerType.TYPE_RING:
+			return "ring";
+		case Finger.FingerType.TYPE_THUMB:
+			return "thumb";
 		}
+		return "unknown";
+	}
 
-		return string.Join (" ", strs);
+	private string BoneName(Bone.BoneType boneType)
+	{
+		switch (boneType) {
+		case Bone.BoneType.TYPE_DISTAL:
+			return "distral";
+		case Bone.BoneType.TYPE_INTERMEDIATE:
+			return "intermediate";
+		case Bone.BoneType.TYPE_METACARPAL:
+			return "metacarpal";
+		case Bone.BoneType.TYPE_PROXIMAL:
+			return "proximal";
+		}
+		return "unknown";
 	}
 
 	public void UpdateGestureName(string name)
-- 
GitLab