public void PowerBurstBt30()
        {
            PredictionModel model = new PredictionModel();

            double _CEI_ = 0.249;
            double _DeploymentDuration_ = 30;
            int    _Beams_           = 4;
            double _SystemFrequency_ = 288000;
            bool   _CWPON_           = true;
            double _CWPBL_           = 1;
            double _CWPBS_           = 4;
            double _CWPBN_           = 30;
            double _CWPBB_LagLength_ = 1;

            Commands.AdcpSubsystemCommands.eCWPBB_TransmitPulseType _CWPBB_TransmitPulseType_ = Commands.AdcpSubsystemCommands.eCWPBB_TransmitPulseType.BROADBAND;
            double _CWPP_   = 1;
            double _CWPTBP_ = 0.5;
            bool   _CBTON_  = true;

            Commands.AdcpSubsystemCommands.eCBTBB_Mode _CBTBB_TransmitPulseType_ = Commands.AdcpSubsystemCommands.eCBTBB_Mode.BROADBAND_CODED;
            double _BeamAngle_        = 20;
            double _SpeedOfSound_     = 1490;
            double _SystemBootPower_  = 1.80;
            double _SystemWakeupTime_ = 0.40;
            double _SystemInitPower_  = 2.80;
            double _SystemInitTime_   = 0.25;
            bool   _BroadbandPower_   = true;
            double _SystemSavePower_  = 1.80;
            double _SystemSaveTime_   = 0.15;
            double _SystemSleepPower_ = 0.024;
            double _BeamDiameter_     = 0.075;
            double _CyclesPerElement_ = 12;

            int    _CBI_EnsemblesPerBurst_ = 4096;
            double _CBI_BurstInterval_     = 3600;
            int    _CBI_IsInterleaved_     = 0;

            double _BatteryCapacity_      = 440.0;
            double _BatteryDerate_        = 0.85;
            double _BatterySelfDischarge_ = 0.05;

            double temperature = 10.0;
            double salinity    = 35.0;
            double xdcrDepth   = 0.0;

            double power         = model.CalculatePowerBurst(_CEI_, _DeploymentDuration_, _Beams_, _SystemFrequency_, _CWPON_, _CWPBL_, _CWPBS_, _CWPBN_, _CWPBB_LagLength_, _CWPBB_TransmitPulseType_, _CWPP_, _CWPTBP_, _CBTON_, _CBTBB_TransmitPulseType_, _BeamAngle_, _SpeedOfSound_, _SystemBootPower_, _SystemWakeupTime_, _SystemInitPower_, _SystemInitTime_, _BroadbandPower_, _SystemSavePower_, _SystemSaveTime_, _SystemSleepPower_, _BeamDiameter_, _CyclesPerElement_, temperature, salinity, xdcrDepth, _CBI_EnsemblesPerBurst_, _CBI_BurstInterval_, _CBI_IsInterleaved_);
            double correctAnswer = 12475.41;

            Assert.AreEqual(correctAnswer, power, 0.01);

            double batteryUsage   = model.BatteryUsage(power, _DeploymentDuration_, _BatteryCapacity_, _BatteryDerate_, _BatterySelfDischarge_);
            double correctBattery = 33.36;

            Assert.AreEqual(correctBattery, batteryUsage, 0.01);
        }
        public void PowerNB()
        {
            PredictionModel model = new PredictionModel();

            double _CEI_ = 1;
            double _DeploymentDuration_ = 30;
            int    _Beams_           = 4;
            double _SystemFrequency_ = 288000;
            bool   _CWPON_           = true;
            double _CWPBL_           = 1;
            double _CWPBS_           = 4;
            double _CWPBN_           = 30;
            double _CWPBB_LagLength_ = 1;

            Commands.AdcpSubsystemCommands.eCWPBB_TransmitPulseType _CWPBB_TransmitPulseType_ = Commands.AdcpSubsystemCommands.eCWPBB_TransmitPulseType.NARROWBAND;
            double _CWPP_   = 9;
            double _CWPTBP_ = 0.5;
            bool   _CBTON_  = true;

            Commands.AdcpSubsystemCommands.eCBTBB_Mode _CBTBB_TransmitPulseType_ = Commands.AdcpSubsystemCommands.eCBTBB_Mode.NARROWBAND_LONG_RANGE;
            double _BeamAngle_        = 20;
            double _SpeedOfSound_     = 1490;
            double _SystemBootPower_  = 1.80;
            double _SystemWakeupTime_ = 0.40;
            double _SystemInitPower_  = 2.80;
            double _SystemInitTime_   = 0.25;
            bool   _BroadbandPower_   = true;
            double _SystemSavePower_  = 1.80;
            double _SystemSaveTime_   = 0.15;
            double _SystemSleepPower_ = 0.024;
            double _BeamDiameter_     = 0.075;
            double _CyclesPerElement_ = 12;

            double _BatteryCapacity_      = 440.0;
            double _BatteryDerate_        = 0.85;
            double _BatterySelfDischarge_ = 0.05;

            double temperature = 10.0;
            double salinity    = 35.0;
            double xdcrDepth   = 0.0;

            double power         = model.CalculatePower(_CEI_, _DeploymentDuration_, _Beams_, _SystemFrequency_, _CWPON_, _CWPBL_, _CWPBS_, _CWPBN_, _CWPBB_LagLength_, _CWPBB_TransmitPulseType_, _CWPP_, _CWPTBP_, _CBTON_, _CBTBB_TransmitPulseType_, _BeamAngle_, _SpeedOfSound_, _SystemBootPower_, _SystemWakeupTime_, _SystemInitPower_, _SystemInitTime_, _BroadbandPower_, _SystemSavePower_, _SystemSaveTime_, _SystemSleepPower_, _BeamDiameter_, _CyclesPerElement_, temperature, salinity, xdcrDepth);
            double correctAnswer = 34770.30;

            Assert.AreEqual(correctAnswer, power, 0.01);

            double batteryUsage   = model.BatteryUsage(power, _DeploymentDuration_, _BatteryCapacity_, _BatteryDerate_, _BatterySelfDischarge_);
            double correctBattery = 92.97;

            Assert.AreEqual(correctBattery, batteryUsage, 0.01);
        }
        /// <summary>
        /// Setup the predictor.
        /// </summary>
        public void CalcPrediction()
        {
            if (_pm.SelectedProject.Configuration.SubsystemConfigDict.ContainsKey(ConfigKey))
            {
                PredictionModelInput predInput = new PredictionModelInput(_pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].SubsystemConfig.SubSystem);

                if (_pm.SelectedProject.Configuration.DeploymentOptions.Duration <= 0)
                {
                    predInput.DeploymentDuration = 1;
                }
                else
                {
                    predInput.DeploymentDuration = _pm.SelectedProject.Configuration.DeploymentOptions.Duration;
                }

                // Absorption
                predInput.Temperature = _pm.SelectedProject.Configuration.Commands.CWT;
                predInput.Salinity    = _pm.SelectedProject.Configuration.Commands.CWS;
                predInput.XdcrDepth   = _pm.SelectedProject.Configuration.Commands.CTD;

                predInput.CEI = _pm.SelectedProject.Configuration.Commands.CEI.ToSecondsD();

                predInput.CWPON = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPON;
                predInput.CBTON = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBTON;

                predInput.CBTTBP = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBTTBP;
                predInput.CBTBB_TransmitPulseType = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBTBB_Mode;
                //predInput.CBTBB_TransmitPulseType = Commands.AdcpSubsystemCommands.eCBTBB_Mode.NARROWBAND_LONG_RANGE;   // DEFAULT to narrowband because it autoswitches now

                predInput.CWPTBP = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPTBP;
                predInput.CWPBN  = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPBN;
                predInput.CWPBS  = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPBS;
                predInput.CWPBL  = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPBL;
                predInput.CWPBB_TransmitPulseType = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPBB_TransmitPulseType;
                predInput.CWPBB_LagLength         = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPBB_LagLength;
                predInput.CWPP = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CWPP;

                predInput.BatteryType = _pm.SelectedProject.Configuration.DeploymentOptions.BatteryType;

                predInput.CBI_BurstInterval   = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBI_BurstInterval.ToSecondsD();
                predInput.CBI_SamplesPerBurst = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBI_NumEnsembles;
                predInput.CBI_IsInterleaved   = _pm.SelectedProject.Configuration.SubsystemConfigDict[ConfigKey].Commands.CBI_BurstPairFlag;

                // Create Prediction model
                PredictionModel Predictor = new PredictionModel();

                // Set the prediction values
                PredictionModel.PredictedRanges ranges = Predictor.GetPredictedRange(predInput);
                PredictedBottomRange    = ranges.BottomTrack;
                PredictedProfileRange   = ranges.WaterProfile;
                ProfileFirstBinPosition = ranges.FirstBinPosition.ToString("0.0000");

                double maxVel = Predictor.GetMaxVelocity(predInput);
                MaximumVelocity = maxVel.ToString("0.0000");

                double std = Predictor.GetStandardDeviation(predInput);
                StandardDeviation = std.ToString("0.0000");

                double numBatts = Predictor.BatteryUsage(predInput);
                NumberBatteryPacks = numBatts;

                if (CBI_NumEnsembles > 0)
                {
                    NumberBytes = Predictor.GetDataStorageBurst(predInput);
                }
                else
                {
                    NumberBytes = Predictor.GetDataStorage(predInput);
                }

                if (RangeVM != null)
                {
                    // Update all the properites
                    RangeVM.WaterProfileRange = ranges.WaterProfile;
                    RangeVM.BottomTrackRange  = ranges.BottomTrack;
                    RangeVM.WpBlank           = predInput.CWPBL;
                    RangeVM.WpFirstBinRange   = ranges.FirstBinPosition;
                    if (_pm.IsProjectSelected && _pm.SelectedProject.Configuration != null)
                    {
                        RangeVM.DepthToBottom = predInput.XdcrDepth;
                    }
                }

                //this.NotifyOfPropertyChange(() => this.CWPP);
                //this.NotifyOfPropertyChange(() => this.CWPTBP);
                //this.NotifyOfPropertyChange(() => this.CWPBS);
                //this.NotifyOfPropertyChange(() => this.CWPBN);
                //this.NotifyOfPropertyChange(() => this.CWPBL);
                //this.NotifyOfPropertyChange(() => this.CWPBB_TransmitPulseType);
                //this.NotifyOfPropertyChange(() => this.CWPBB_LagLength);
                //this.NotifyOfPropertyChange(() => this.CBTON);
                //this.NotifyOfPropertyChange(() => this.CBI_BurstInterval);

                //this.NotifyOfPropertyChange(() => this.DataSize);
                //this.NotifyOfPropertyChange(() => this.NumberBatteryPackStr);
                //this.NotifyOfPropertyChange(() => this.PredictedBottomRangeStr);
                //this.NotifyOfPropertyChange(() => this.PredictedProfileRangeStr);
                //this.NotifyOfPropertyChange(() => this.ProfileFirstBinPosition);
                //this.NotifyOfPropertyChange(() => this.MaximumVelocity);
                //this.NotifyOfPropertyChange(() => this.StandardDeviation);
            }
        }