/// <summary> /// Builds GestureInfo objects from serialized xml content /// </summary> /// <param name="xml"></param> /// <returns></returns> public static GestureInfo Desirialize(string xml) { Contract.Requires(!string.IsNullOrEmpty(xml), "Xml content can not be null or empty"); GestureInfo gInfo = new GestureInfo(); // Create xml reader from string MemoryStream stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(xml)); //XmlReader reader = XmlReader.Create(stream); try { // Build the deserializer DataContractSerializer serializer = new DataContractSerializer(typeof(FrameInfo), GetRequiredKnownTypesForTouchFrameEventArgSerialization()); System.Diagnostics.Debug.WriteLine(xml); gInfo.Frames = serializer.ReadObject(stream) as List<FrameInfo>; return gInfo; } catch (Exception e) { //TODO: Testing string msg = e.Message; System.Diagnostics.Debug.WriteLine(msg); throw; } finally { stream.Dispose(); } }
/// <summary> /// Merges the frame lists from different gestureInfo into one list /// </summary> /// <param name="self"></param> /// <returns></returns> public static GestureInfo Merge(this List<GestureInfo> self) { // touchIdPadding is used to ensure unique id for each touch point when multiple sets are merged int touchIdPadding = 0; DateTime startTime = DateTime.Now; DateTime timeline = DateTime.Now; GestureInfo mergedGestureInfo = new GestureInfo(); int groupId = 0; foreach (var gesture in self) { touchIdPadding += 50; // 1. Update timestamp of each frame in all list timeline = startTime; foreach (var frame in gesture.Frames) { timeline = timeline.AddMilliseconds(frame.WaitTime); frame.TimeStamp = timeline.Ticks; // 1.1 Update groupIds for individual touch foreach (var touch in frame.Touches) { touch.GroupId = groupId; touch.TouchDeviceId += touchIdPadding; } } // 2. Combine lists into one mergedGestureInfo.Frames.AddRange(gesture.Frames); groupId++; } // 3. Sort the unified list mergedGestureInfo.Frames.Sort(new FrameInfoComparer()); return mergedGestureInfo; }
private void RunGesture(GestureInfo gestureInfo, GesturePlaybackCompleted playbackCompleted) { // Set touch provider to virtual touch provider var existingInputProvider = TouchInputManager.ActiveTouchProvider; GestureFramework.UpdateInputProvider(_touchListener); // Initializing background thread to playback recorded gestures var threadStart = new ParameterizedThreadStart(RunGesture); var backgroundThread = new Thread(threadStart); Tuple<GestureInfo, TouchInputRecorder.GesturePlaybackCompleted> args = new Tuple<GestureInfo, TouchInputRecorder.GesturePlaybackCompleted>(gestureInfo, playbackCompleted); backgroundThread.Start(args); // reset touch provider GestureFramework.UpdateInputProvider(existingInputProvider); }