Exemplo n.º 1
0
        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);
			}
		}