public void PerformCalibration(EventHandler <CalibrationProgressEventArgs> handler) { if (!isCalibrating) { isCalibrating = true; rangedBeacons.Clear(); percentComplete = 0.0f; ProgressHandler = handler; locationManager.StartRangingBeacons(region); timer = NSTimer.CreateTimer(20.0f, (r) => { locationManager.StopRangingBeacons(region); DispatchQueue.DefaultGlobalQueue.DispatchAsync(new Action(delegate { NSError error = null; List <CLBeacon> allBeacons = new List <CLBeacon> (); int measuredPower = 0; if (!isCalibrating) { error = new CalibrationCancelledError(); } else { foreach (CLBeacon[] beacons in rangedBeacons) { if (beacons.Length > 1) { error = new CalibrationCancelledError(); break; } else { allBeacons.AddRange(beacons); } } if (allBeacons.Count == 0) { error = new CalibrationCancelledError(); } else { allBeacons.Sort(delegate(CLBeacon x, CLBeacon y) { return((x.ValueForKey(Rssi) as NSNumber).CompareTo(y.ValueForKey(Rssi))); }); float power = 0; int number = 0; int outlierPadding = (int)(allBeacons.Count * 0.1f); for (int k = outlierPadding; k < allBeacons.Count - (outlierPadding * 2); k++) { power += ((NSNumber)allBeacons [k].ValueForKey(Rssi)).FloatValue; number++; } measuredPower = (int)power / number; } } DispatchQueue.MainQueue.DispatchAsync(delegate { CalibrationCompletionHandler(this, new CalibrationCompletedEventArgs() { MeasurePower = measuredPower, Error = error }); }); isCalibrating = false; rangedBeacons.Clear(); })); }); NSRunLoop.Current.AddTimer(timer, NSRunLoopMode.Default); } }
public void PerformCalibration (EventHandler<CalibrationProgressEventArgs> handler) { if (!isCalibrating) { isCalibrating = true; rangedBeacons.Clear (); percentComplete = 0.0f; ProgressHandler = handler; locationManager.StartRangingBeacons (region); timer = NSTimer.CreateTimer (20.0f, new NSAction (delegate { locationManager.StopRangingBeacons (region); DispatchQueue.DefaultGlobalQueue.DispatchAsync (new NSAction (delegate { NSError error = null; List<CLBeacon> allBeacons = new List<CLBeacon> (); int measuredPower = 0; if (!isCalibrating) { error = new CalibrationCancelledError (); } else { foreach (CLBeacon[] beacons in rangedBeacons) { if (beacons.Length > 1) { error = new CalibrationCancelledError (); break; } else { allBeacons.AddRange (beacons); } } if (allBeacons.Count == 0) { error = new CalibrationCancelledError (); } else { allBeacons.Sort (delegate (CLBeacon x, CLBeacon y) { return (x.ValueForKey (Rssi) as NSNumber).CompareTo (y.ValueForKey (Rssi)); }); float power = 0; int number = 0; int outlierPadding = (int) (allBeacons.Count * 0.1f); for (int k = outlierPadding; k < allBeacons.Count - (outlierPadding * 2); k++) { power += ((NSNumber) allBeacons[k].ValueForKey (Rssi)).FloatValue; number ++; } measuredPower = (int) power/number; } } DispatchQueue.MainQueue.DispatchAsync (delegate { CalibrationCompletionHandler (this, new CalibrationCompletedEventArgs () { MeasurePower = measuredPower, Error = error }); }); isCalibrating = false; rangedBeacons.Clear (); })); })); NSRunLoop.Current.AddTimer (timer, NSRunLoopMode.Default); } }