1 using System.Collections;
5 using UnityEngine.Android;
16 protected double LowPassFilterFactor;
22 public abstract string Name {
get; }
72 public LocationProviderStatus
Status {
get;
protected set; }
102 public bool Paused {
get;
protected set; }
104 public int LocationUpdateCount {
get;
protected set; }
105 public bool HasStarted =>
Status == LocationProviderStatus.Started;
106 public bool ApplyCompassTiltCompensationOnAndroid {
get;
set; } =
true;
108 public double DistanceFromStartPoint
123 public event LocationEnabledDelegate LocationEnabled;
124 public event LocationFailedDelegate LocationFailed;
125 public event LocationUpdatedDelegate LocationUpdatedRaw;
157 Status = LocationProviderStatus.Idle;
160 public virtual IEnumerator Start(uint maxWaitTime = 10000, uint delay = 0)
165 if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
167 Permission.RequestUserPermission(Permission.FineLocation);
170 yield
return new WaitForSeconds(1);
175 yield
return new WaitForSeconds(delay);
179 uint maxWait = maxWaitTime;
181 while (
Status == LocationProviderStatus.Initializing && maxWait > 0)
185 yield
return new WaitForSeconds(1);
194 LocationFailed?.Invoke(
"Timed out");
199 if (
Status == LocationProviderStatus.Failed)
203 LocationFailed?.Invoke(
"Falied to initialize location updates.");
208 if (
Status != LocationProviderStatus.Started)
212 LocationFailed?.Invoke(
"Unknown error initializing location updates.");
223 public void ForceLocationUpdate()
229 protected virtual void InnerOnEnabled()
235 protected void EmitLocationUpdated()
240 protected void EmitLocationUpdatedRaw()
245 protected void EmitCompassUpdated()
250 protected void UpdateLocation(LocationReading newLocation)
260 EmitLocationUpdatedRaw();
262 if (!ShouldUpdateLocation(newLocation))
270 LocationUpdateCount++;
272 EmitLocationUpdated();
275 protected void UpdateHeading(HeadingReading newHeading)
277 if (!ShouldUpdateHeading(newHeading))
286 EmitCompassUpdated();
289 protected bool ShouldUpdateHeading(HeadingReading newHeading)
299 protected bool ShouldUpdateLocation(LocationReading newLocation)
325 public virtual void Update()
335 if (location ==
null || heading ==
null)
351 LocationEnabled?.Invoke();
354 EmitCompassUpdated();
355 EmitLocationUpdated();
356 EmitLocationUpdatedRaw();
361 UpdateLocation(location.Value);
362 UpdateHeading(heading.Value);
365 public void Restart()
367 LocationUpdateCount = 0;
371 public void ResetStartPoint()
376 public void SetCompassLowPassFactor(
double factor)
378 LowPassFilterFactor = factor;
381 public string GetStatusString()
385 case LocationProviderStatus.Idle:
387 case LocationProviderStatus.Failed:
389 case LocationProviderStatus.Initializing:
390 return "Initializing";
391 case LocationProviderStatus.Started:
395 return "UnknownStatus";
398 public string GetInfoString()
404 "Status = " + GetStatusString() +
"\n" +
405 "DistanceFromStartPoint = " + DistanceFromStartPoint +
"\n" +
406 "TimeSinceStart = " + (Time.time -
StartTime) +
"\n" +
410 public void OnEnabled(LocationEnabledDelegate del)
412 LocationEnabled += del;
420 public void OnFail(LocationFailedDelegate del)
422 LocationFailed += del;