CompassTracker.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using YJMPD_UWP.Helpers;
  2. using System;
  3. using Windows.Devices.Sensors;
  4. namespace YJMPD_UWP.Model
  5. {
  6. public class CompassTracker
  7. {
  8. public delegate void OnHeadingUpdateHandler(object sender, HeadingUpdatedEventArgs e);
  9. public event OnHeadingUpdateHandler OnHeadingUpdate;
  10. public delegate void OnHeadingUpdateSlowHandler(object sender, HeadingUpdatedEventArgs e);
  11. public event OnHeadingUpdateSlowHandler OnSlowHeadingUpdated;
  12. private Compass comp;
  13. private CompassReading hdn;
  14. public CompassReading Heading { get { return hdn; } }
  15. private CompassReading lastreading;
  16. private double lastreadingtime;
  17. public CompassTracker()
  18. {
  19. comp = Compass.GetDefault();
  20. // Assign an event handler for the compass reading-changed event
  21. if (comp != null)
  22. {
  23. // Establish the report interval for all scenarios
  24. uint minReportInterval = comp.MinimumReportInterval;
  25. uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
  26. comp.ReportInterval = reportInterval;
  27. comp.ReadingChanged += Comp_ReadingChanged;
  28. hdn = comp.GetCurrentReading();
  29. }
  30. }
  31. private void Comp_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
  32. {
  33. UpdateHeading(args.Reading);
  34. UpdateSlowHeading(args.Reading);
  35. }
  36. private void UpdateHeading(CompassReading r)
  37. {
  38. hdn = r;
  39. //Make sure someone is listening
  40. if (OnHeadingUpdate == null) return;
  41. OnHeadingUpdate(this, new HeadingUpdatedEventArgs(r));
  42. }
  43. private void UpdateSlowHeading(CompassReading r)
  44. {
  45. if (lastreading == null) { lastreading = r; lastreadingtime = Util.Now; }
  46. if (Math.Abs(r.HeadingMagneticNorth - lastreading.HeadingMagneticNorth) > 10 && Util.Now - lastreadingtime > 25)
  47. {
  48. lastreading = r;
  49. lastreadingtime = Util.Now;
  50. //Make sure someone is listening
  51. if (OnSlowHeadingUpdated == null) return;
  52. OnSlowHeadingUpdated(this, new HeadingUpdatedEventArgs(r));
  53. }
  54. }
  55. }
  56. public class HeadingUpdatedEventArgs : EventArgs
  57. {
  58. public CompassReading Heading;
  59. public HeadingUpdatedEventArgs(CompassReading heading)
  60. {
  61. Heading = heading;
  62. }
  63. }
  64. }