-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGnssStatusReceiver.cs
More file actions
63 lines (62 loc) · 2.2 KB
/
GnssStatusReceiver.cs
File metadata and controls
63 lines (62 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using Android.Locations;
using System;
using System.Collections.Generic;
namespace SensorLab {
public class GnssStatusReceiver : GnssStatus.Callback {
internal Dictionary<SatelliteIdentifier, SatelliteStatus> ActiveSatellites
= new Dictionary<SatelliteIdentifier, SatelliteStatus>();
public event Action SatelliteStatusChanged;
public GnssStatusReceiver() { }
public override void OnStarted() {
base.OnStarted();
}
public override void OnStopped() {
base.OnStopped();
}
public override void OnFirstFix(int ttffMillis) {
base.OnFirstFix(ttffMillis);
}
public override void OnSatelliteStatusChanged(GnssStatus status) {
base.OnSatelliteStatusChanged(status);
lock (ActiveSatellites) {
ActiveSatellites.Clear();
for (int i = 0; i < status.SatelliteCount; i++) {
var id = new SatelliteIdentifier {
Constellation = status.GetConstellationType(i),
SVID = status.GetSvid(i),
};
if (ActiveSatellites.TryGetValue(id, out var ex) && ex.IsUsedInFix) continue;
ActiveSatellites[id] = new SatelliteStatus {
Azimuth = status.GetAzimuthDegrees(i),
Elevation = status.GetElevationDegrees(i),
IsUsedInFix = status.UsedInFix(i),
CNR = status.GetCn0DbHz(i),
BasebandCNR = status.HasBasebandCn0DbHz(i) ? status.GetBasebandCn0DbHz(i) : (float?)null,
CarrierFrequency = status.HasCarrierFrequencyHz(i) ? status.GetCarrierFrequencyHz(i) : (float?)null,
HasAlmanacData = status.HasAlmanacData(i),
HasEphemerisData = status.HasEphemerisData(i),
};
}
}
SatelliteStatusChanged?.Invoke();
}
}
internal struct SatelliteIdentifier {
public GnssConstellationType Constellation { get; set; }
public int SVID { get; set; }
}
internal struct SatelliteStatus {
public float Azimuth { get; set; }
public float Elevation { get; set; }
public bool IsUsedInFix { get; set; }
public float CNR { get; set; }
public float? BasebandCNR { get; set; }
public float? CarrierFrequency { get; set; }
public bool HasAlmanacData { get; set; }
public bool HasEphemerisData { get; set; }
}
internal struct SatelliteStatusEvent {
public SatelliteIdentifier Identifier { get; set; }
public SatelliteStatus Status { get; set; }
}
}