Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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"
            };
        }
Esempio n. 4
0
        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();
        }