[Fact] public void Div_Int() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); var dat_j1 = hg.newJoints(); var dat_f = dg.newInt(100); var exp_j = hg.newJoints(); var mock_vh = new Mock <IVectorHelper>(); mock_vh.Setup(m => m.divList(dat_j1.pinky, dat_f)).Returns(exp_j.pinky); mock_vh.Setup(m => m.divList(dat_j1.ring, dat_f)).Returns(exp_j.ring); mock_vh.Setup(m => m.divList(dat_j1.middle, dat_f)).Returns(exp_j.middle); mock_vh.Setup(m => m.divList(dat_j1.index, dat_f)).Returns(exp_j.index); mock_vh.Setup(m => m.divList(dat_j1.thumb, dat_f)).Returns(exp_j.thumb); mock_vh.Setup(m => m.div(dat_j1.palm, dat_f)).Returns(exp_j.palm); JointsHelper jh = new JointsHelper(mock_vh.Object); var act_j = jh.div(dat_j1, dat_f); mock_vh.Verify(m => m.divList(dat_j1.pinky, dat_f), Times.Once()); mock_vh.Verify(m => m.divList(dat_j1.ring, dat_f), Times.Once()); mock_vh.Verify(m => m.divList(dat_j1.middle, dat_f), Times.Once()); mock_vh.Verify(m => m.divList(dat_j1.index, dat_f), Times.Once()); mock_vh.Verify(m => m.divList(dat_j1.thumb, dat_f), Times.Once()); mock_vh.Verify(m => m.div(dat_j1.palm, dat_f), Times.Once()); test.jointsEqual(exp_j, act_j); }
[Fact] public void Add() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); var dat_j1 = hg.newJoints(); var dat_j2 = hg.newJoints(); var exp_j = hg.newJoints(); var mock_vh = new Mock <IVectorHelper>(); mock_vh.Setup(m => m.addList(dat_j1.pinky, dat_j2.pinky)).Returns(exp_j.pinky); mock_vh.Setup(m => m.addList(dat_j1.ring, dat_j2.ring)).Returns(exp_j.ring); mock_vh.Setup(m => m.addList(dat_j1.middle, dat_j2.middle)).Returns(exp_j.middle); mock_vh.Setup(m => m.addList(dat_j1.index, dat_j2.index)).Returns(exp_j.index); mock_vh.Setup(m => m.addList(dat_j1.thumb, dat_j2.thumb)).Returns(exp_j.thumb); mock_vh.Setup(m => m.add(dat_j1.palm, dat_j2.palm)).Returns(exp_j.palm); JointsHelper jh = new JointsHelper(mock_vh.Object); var act_j = jh.add(dat_j1, dat_j2); mock_vh.Verify(m => m.addList(dat_j1.pinky, dat_j2.pinky), Times.Once()); mock_vh.Verify(m => m.addList(dat_j1.ring, dat_j2.ring), Times.Once()); mock_vh.Verify(m => m.addList(dat_j1.middle, dat_j2.middle), Times.Once()); mock_vh.Verify(m => m.addList(dat_j1.index, dat_j2.index), Times.Once()); mock_vh.Verify(m => m.addList(dat_j1.thumb, dat_j2.thumb), Times.Once()); mock_vh.Verify(m => m.add(dat_j1.palm, dat_j2.palm), Times.Once()); test.jointsEqual(exp_j, act_j); }
[Fact] public void Pow() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); var dat_j1 = hg.newJoints(); var exp_j = hg.newJoints(); var mock_vh = new Mock <IVectorHelper>(); mock_vh.Setup(m => m.powList(dat_j1.pinky, 2)).Returns(exp_j.pinky); mock_vh.Setup(m => m.powList(dat_j1.ring, 2)).Returns(exp_j.ring); mock_vh.Setup(m => m.powList(dat_j1.middle, 2)).Returns(exp_j.middle); mock_vh.Setup(m => m.powList(dat_j1.index, 2)).Returns(exp_j.index); mock_vh.Setup(m => m.powList(dat_j1.thumb, 2)).Returns(exp_j.thumb); mock_vh.Setup(m => m.pow(dat_j1.palm, 2)).Returns(exp_j.palm); JointsHelper jh = new JointsHelper(mock_vh.Object); var act_j = jh.pow(dat_j1, 2); mock_vh.Verify(m => m.powList(dat_j1.pinky, 2), Times.Once()); mock_vh.Verify(m => m.powList(dat_j1.ring, 2), Times.Once()); mock_vh.Verify(m => m.powList(dat_j1.middle, 2), Times.Once()); mock_vh.Verify(m => m.powList(dat_j1.index, 2), Times.Once()); mock_vh.Verify(m => m.powList(dat_j1.thumb, 2), Times.Once()); mock_vh.Verify(m => m.pow(dat_j1.palm, 2), Times.Once()); test.jointsEqual(act_j, exp_j); }
[Fact] public void HandToJoints() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); List <Vector[]> dat_vL = new List <Vector[]>() { dg.newVectors(5), dg.newVectors(5), dg.newVectors(5), dg.newVectors(5), dg.newVectors(5), }; List <Finger> dat_fL = hg.newFingerList(dat_vL); Hand dat_hand = hg.newHand(dat_fL); Joints exp_joints = new Joints { pinky = dat_vL[0], ring = dat_vL[1], middle = dat_vL[2], index = dat_vL[3], thumb = dat_vL[4], palm = dat_hand.PalmPosition }; VectorHelper vh = new VectorHelper(); JointsHelper jh = new JointsHelper(vh); Joints act_joints = jh.handToJoints(dat_hand); test.jointsEqual(exp_joints, act_joints); }
[Fact] public void LowestJoint() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); Hand dat_hand = hg.newHand(hg.newFingerList()); Vector exp_joint = new Vector(-1, -1, -1); dat_hand.Fingers[4].bones[3].NextJoint = exp_joint; VectorHelper vh = new VectorHelper(); JointsHelper jh = new JointsHelper(vh); Vector act_joint = jh.lowestJoint(dat_hand); }
[Fact] public void FingerToVectors() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); Finger inp_finger = hg.newFinger(dg.newVectors(5)); Vector[] exp_vL = new Vector[] { inp_finger.bones[0].PrevJoint, inp_finger.bones[1].PrevJoint, inp_finger.bones[2].PrevJoint, inp_finger.bones[3].PrevJoint, inp_finger.bones[3].NextJoint, }; VectorHelper vh = new VectorHelper(); JointsHelper jh = new JointsHelper(vh); Vector[] act_vL = jh.fingerToVectors(inp_finger); test.vectorsEqual(exp_vL, act_vL); }
[Fact] public void Emit() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); VectorHelper vh = new VectorHelper(); JointsHelper jh = new JointsHelper(vh); AmplitudeModulationEmitter mock_emitter = new AmplitudeModulationEmitter("MockDevice:U5;logfile=log.txt"); var j = hg.newJoints(); bool exp = false; bool act = false; var haptic = new Haptic(jh, mock_emitter); var point = haptic.AquireTarget(j); var points = new List <AmplitudeModulationControlPoint>(); points.Add(point); exp = mock_emitter.update(points); act = haptic.Emit(points); Assert.Equal(exp, act); }
[Fact] public void MinMax() { Data_Generator dg = new Data_Generator(); Hand_Generator hg = new Hand_Generator(dg); (Joints min, Joints max, Joints j)dat; dat.j = hg.newJoints(); dat.min = new Joints(dg.newMinVectors(5), dg.newMinVectors(5), dg.newMinVectors(5), dg.newMinVectors(5), dg.newMinVectors(5), dg.newMinVector(), dg.newFloat(100)); dat.max = new Joints(dg.newZeroVectors(5), dg.newZeroVectors(5), dg.newZeroVectors(5), dg.newZeroVectors(5), dg.newZeroVectors(5), dg.newZeroVector(), dg.newFloat(100)); (Joints min, Joints max)exp; exp.min = dat.min; exp.max = dat.j; var vH = new VectorHelper(); var jH = new JointsHelper(vH); var act = jH.minMax(dat.min, dat.max, dat.j); test.jointsEqual(exp.min, act.min); test.jointsEqual(exp.max, act.max); }
public Haptic(JointsHelper hand, AmplitudeModulationEmitter emitter) { jh = hand; ee = emitter; }
public static void Main() { Thread newWindowThread = new Thread(new ThreadStart(() => { // create and show the window App obj = new App(); // start the Dispatcher processing System.Windows.Threading.Dispatcher.Run(); })); newWindowThread.SetApartmentState(ApartmentState.STA); newWindowThread.IsBackground = true; newWindowThread.Start(); while (!GBL.DONE_EDITING) { System.Threading.Thread.Sleep(1000); } // Connect to LeapMotion Controller Console.WriteLine("Initializing Leap..."); var leapMotion = new Controller(); do { System.Threading.Thread.Sleep(1000); Console.WriteLine("."); } while (!leapMotion.IsConnected); Console.WriteLine("Leap ready."); // Connect to UHDK5 ultrasonic emitters Console.WriteLine("Initializing UHDK5..."); var uhdk5 = new AmplitudeModulationEmitter(); Console.WriteLine("UHDK5 ready."); Console.WriteLine("Dog Friendly Mode: " + GBL.DOG_FRIENDLY); // Connect virtual MIDI ports Console.WriteLine("Initializing virtual MIDI ports..."); MIDI.logging(MIDI.TE_VM_LOGGING_MISC | MIDI.TE_VM_LOGGING_RX | MIDI.TE_VM_LOGGING_TX); var leftManu = new Guid("aa4e075f-3504-4aab-9b06-9a4104a91cf0"); var leftProd = new Guid("bb4e075f-3504-4aab-9b06-9a4104a91cf0"); var leftMIDI = new MIDI("Air Drums Left Hand", 65535, MIDI.TE_VM_FLAGS_PARSE_RX, ref leftManu, ref leftProd); var rightManu = new Guid("cc4e075f-3504-4aab-9b06-9a4104a91cf0"); var rightProd = new Guid("dd4e075f-3504-4aab-9b06-9a4104a91cf0"); var rightMIDI = new MIDI("Air Drums Right Hand", 65535, MIDI.TE_VM_FLAGS_PARSE_RX, ref rightManu, ref rightProd); Console.WriteLine("MIDI resources ready."); // Haptics resources var hapticTargets = new List <AmplitudeModulationControlPoint>(); var hapticTimes = new List <int>(); var hapticVH = new VectorHelper(); var hapticJH = new JointsHelper(hapticVH); var haptic = new Haptic(hapticJH, uhdk5); // MIDI resources var leftComTable = new Commands(true); var leftNotes = new List <int>(); var leftTimes = new List <int>(); var leftPort = new Port(leftMIDI); var rightComTable = new Commands(false); var rightNotes = new List <int>(); var rightTimes = new List <int>(); var rightPort = new Port(rightMIDI); // Classification resources var leftVH = new VectorHelper(); var leftJH = new JointsHelper(leftVH); var leftStats = new Stats(leftJH); var leftClassify = new Classify(leftVH, leftStats); var leftQueues = new Queues(leftJH); var leftDataManager = new DataManager(leftQueues, true); var rightVH = new VectorHelper(); var rightJH = new JointsHelper(rightVH); var rightStats = new Stats(rightJH); var rightClassify = new Classify(rightVH, rightStats); var rightQueues = new Queues(rightJH); var rightDataManager = new DataManager(rightQueues, false); // Concurrency structures var leftFrameStream = new ConcurrentQueue <Frame>(); var leftCommandStream = new ConcurrentQueue <int>(); var rightFrameStream = new ConcurrentQueue <Frame>(); var rightCommandStream = new ConcurrentQueue <int>(); var hapticStream = new ConcurrentQueue <Joints>(); // Processes var data = new Proc_Data(leapMotion, leftFrameStream, rightFrameStream) as IProc; var leftGesture = new Proc_Gesture(leftClassify, leftDataManager, leftVH, leftFrameStream, leftCommandStream, hapticStream) as IProc; var leftCommand = new Proc_MIDI(leftPort, leftCommandStream, leftNotes, leftTimes, leftComTable) as IProc; var rightGesture = new Proc_Gesture(rightClassify, rightDataManager, rightVH, rightFrameStream, rightCommandStream, hapticStream) as IProc; var rightCommand = new Proc_MIDI(rightPort, rightCommandStream, rightNotes, rightTimes, rightComTable) as IProc; var haptics = new Proc_Haptics(haptic, hapticStream, hapticTargets, hapticTimes) as IProc; // Instantiate threads with looped pipelines var dataThread = new Thread(data.Loop); var leftGestureThread = new Thread(leftGesture.Loop); var rightGestureThread = new Thread(rightGesture.Loop); var leftCommandThread = new Thread(leftCommand.Loop); var rightCommandThread = new Thread(rightCommand.Loop); var hapticsThread = new Thread(haptics.Loop); // Start threads dataThread.Start(); leftGestureThread.Start(); rightGestureThread.Start(); leftCommandThread.Start(); rightCommandThread.Start(); hapticsThread.Start(); }