CompassHandler.cs 2.3 KB

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