private void OnAPLA(object[] parameters) { // Incoming APLA sentence received // $PAPLA,bID,bLat,bLon,bDpt,bBat,bTOA BaseIDs baseID = (BaseIDs)(int)parameters[0]; double bLat = doubleNullChecker(parameters[1]); double bLon = doubleNullChecker(parameters[2]); double bDpt = doubleNullChecker(parameters[3]); bool bBat = Convert.ToBoolean(intNullChecker(parameters[4])); double bTOA = doubleNullChecker(parameters[5]); if ((baseID != BaseIDs.BASE_INVALID) && (!double.IsNaN(bLat) && (!double.IsNaN(bLon) && (!double.IsNaN(bDpt))))) { TrackUpdateHandler.Rise(this, new TrackUpdateEventArgs(baseID.ToString().Replace('_', ' '), new GeoPoint3DETm(bLat, bLon, bDpt, 0.0, GetTimeStamp()), double.NaN)); BaseBatStates[baseID].Value = bBat; var bases = basesProcessor.ProcessBase(baseID, bLat, bLon, bDpt, bTOA); if (bases != null) { TryLocate(bases); } } }
public GeoPoint3DT[] ProcessBase(BaseIDs baseID, double lat, double lon, double dpt, double toa) { GeoPoint3DT[] result = null; if (!double.IsNaN(toa)) { if (bases.ContainsKey(baseID)) { if (bases.Count >= 3) { result = GetBases(); } bases.Clear(); bases.Add(baseID, new GeoPoint3DT(lat, lon, dpt, toa)); } else { if (!double.IsNaN(prevTOA)) { if (((toa - prevTOA) <= pingerPeriod / 2) || ((toa + 60 - prevTOA) <= pingerPeriod / 2)) { bases.Add(baseID, new GeoPoint3DT(lat, lon, dpt, toa)); if (bases.Count >= 4) { result = GetBases(); bases.Clear(); } } else { if (bases.Count >= 3) { result = GetBases(); } bases.Clear(); bases.Add(baseID, new GeoPoint3DT(lat, lon, dpt, toa)); } } else { bases.Add(baseID, new GeoPoint3DT(lat, lon, dpt, toa)); } } prevTOA = toa; } return(result); }
public override void SetDefaults() { InPortName = "COM1"; InPortBaudrate = BaudRate.baudRate9600; IsUseOutPort = false; OutPortName = "COM1"; OutPortBaudrate = BaudRate.baudRate9600; IsUseAUXGNSSPort = false; AUXGNSSPortName = "COM1"; AUXGNSSPortBaudrate = BaudRate.baudRate9600; SalinityPSU = 0.0; IsSoundSpeedAuto = true; SoundSpeedMPS = 1500; RadialErrorThrehsold = 10; TrackPointsToShow = 100; IsEmulatorButtonVisible = false; CourseEstimatorFIFOSize = 8; TrackFilterFIFOSize = 4; IsUseBuoyAsAUXGNSS = false; AuxGNSSBuoyID = BaseIDs.BASE_1; TileServers = new string[] { "https://a.tile.openstreetmap.org", "https://b.tile.openstreetmap.org", "https://c.tile.openstreetmap.org" }; }
private void OnLBLA(object[] parameters) { // IC_D2H_LBLA $PRWLA,bID,baseLat,baseLon,[baseDpt],baseBat,pingerDataID,pingerData,TOAsecond,MSR_dB BaseIDs baseID = (parameters[0] == null) ? BaseIDs.BASE_INVALID : (BaseIDs)(int)parameters[0]; double baseLat = doubleNullChecker(parameters[1]); double baseLon = doubleNullChecker(parameters[2]); double baseDepth = (parameters[3] == null) ? RWLT.DEFAULT_BASE_DPT_M : (double)parameters[3]; double baseBat = doubleNullChecker(parameters[4]); PingerDataIDs pDataID = (parameters[5] == null) ? PingerDataIDs.DID_INVALID : (PingerDataIDs)(int)parameters[5]; double pData = doubleNullChecker(parameters[6]); double TOAs = doubleNullChecker(parameters[7]); double MSR = doubleNullChecker(parameters[8]); if ((baseID != BaseIDs.BASE_INVALID) && (!double.IsNaN(baseLat)) && (!double.IsNaN(baseLon)) && (!double.IsNaN(baseDepth))) { if ((baseID == auxGNSSBuoyID) && (!AUXGNSSUsed)) { GNSS_RMCSentenceReceived(this, new RMCMessageEventArgs(0xFF, TalkerIdentifiers.GN, GetTimeStamp(), baseLat, baseLon, double.NaN, double.NaN, double.NaN, true)); } LocationUpdatedEvent.Rise(this, new LocationUpdatedEventArgs(baseID.ToString().Replace('_', ' '), baseLat, baseLon, baseDepth, true, GetTimeStamp())); if (!double.IsNaN(MSR)) { BaseMSRs[baseID].Value = MSR; } if (!double.IsNaN(baseBat)) { BaseBatVoltages[baseID].Value = baseBat; } if (gravityAccNeedsUpdate) { gravityAcc = PHX.Gravity_constant_wgs84_calc(baseLat); gravityAccNeedsUpdate = false; } if (pDataID == PingerDataIDs.DID_BAT) { TargetBatVoltage.Value = pData; } else if (pDataID == PingerDataIDs.DID_TMP) { TargetTemperature.Value = pData; if (IsAutoSoundSpeed && TargetPressure.IsInitialized) { Soundspeed = PHX.Speed_of_sound_UNESCO_calc(TargetTemperature.Value, TargetPressure.Value / 2.0, salinity); } } else if (pDataID == PingerDataIDs.DID_PRS) { TargetPressure.Value = pData; if (TargetTemperature.IsInitialized) { if (IsAutoSoundSpeed) { Soundspeed = PHX.Speed_of_sound_UNESCO_calc(TargetTemperature.Value, TargetPressure.Value / 2.0, salinity); } double rho = PHX.Water_density_calc(TargetTemperature.Value, TargetPressure.Value / 2.0, salinity); // p0 is zero, because pinger calibrates surface pressure on start and transmits pressure relative to the surface TargetDepth.Value = PHX.Depth_by_pressure_calc(TargetPressure.Value, 0, rho, gravityAcc); } else if (TargetPressure.IsInitialized) { TargetDepth.Value = PHX.Depth_by_pressure_calc(TargetPressure.Value, 0, PHX.PHX_FWTR_DENSITY_KGM3, gravityAcc); } } else if (pDataID == PingerDataIDs.DID_CODE) { TargetAlarm.Value = (PingerCodeIDs)Enum.ToObject(typeof(PingerCodeIDs), Convert.ToInt32(pData)); } var bases = baseProcessor.ProcessBase(baseID, baseLat, baseLon, baseDepth, TOAs); if (bases != null) { TryLocate(bases); } } OnSystemUpdate(); }