Esempio n. 1
0
        /// <summary>
        /// Converts the enabled power bands from the sense_config file to the correct api format
        /// This ensures that power bands that are enabled are only enabled if the corresponding time domain channels is also enabled.
        /// If there is the case where there is a powerband that is enabled and the corresponding time domain channel is not enabled, then it will proceed as though the power band channel was set to disabled.
        /// </summary>
        /// <param name="senseModel">This is the sense model that was converted from the sense_config.json file and contains which power band and time domain channels are enabled</param>
        /// <returns>Correct BandEnables format for all enabled power bands or else 0 if no power bands are enabled</returns>
        public static BandEnables PowerBandEnablesConvert(SenseModel senseModel)
        {
            BandEnables bandEnables = 0;

            //Check to make sure Power channel AND respective TD Channel is enabled
            if (senseModel.Sense.PowerBands[0].IsEnabled && senseModel.Sense.TimeDomains[0].IsEnabled)
            {
                bandEnables = BandEnables.Ch0Band0Enabled;
            }
            if (senseModel.Sense.PowerBands[1].IsEnabled && senseModel.Sense.TimeDomains[0].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch0Band1Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch0Band1Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[2].IsEnabled && senseModel.Sense.TimeDomains[1].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch1Band0Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch1Band0Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[3].IsEnabled && senseModel.Sense.TimeDomains[1].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch1Band1Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch1Band1Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[4].IsEnabled && senseModel.Sense.TimeDomains[2].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch2Band0Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch2Band0Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[5].IsEnabled && senseModel.Sense.TimeDomains[2].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch2Band1Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch2Band1Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[6].IsEnabled && senseModel.Sense.TimeDomains[3].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch3Band0Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch3Band0Enabled;
                }
            }
            if (senseModel.Sense.PowerBands[7].IsEnabled && senseModel.Sense.TimeDomains[3].IsEnabled)
            {
                if (bandEnables.Equals(0))
                {
                    bandEnables = BandEnables.Ch3Band1Enabled;
                }
                else
                {
                    bandEnables = bandEnables | BandEnables.Ch3Band1Enabled;
                }
            }
            return(bandEnables);
        }
Esempio n. 2
0
        /// <summary>
        /// Write Sense Configuration Settings
        /// </summary>
        /// <param name="localModel">The config file to use for sensing parameters</param>
        /// <param name="theSummit">Summit system</param>
        /// <param name="showErrorMessage">True if you want a popup message on errors or false if show no error popup</param>
        /// <returns>true if successfully configuring sensing or false if unsuccessful</returns>
        public bool SummitConfigureSensing(SummitSystem theSummit, SenseModel localModel, bool showErrorMessage)
        {
            APIReturnInfo bufferReturnInfo;

            //This checks to see if sensing is already enabled. This can happen if adaptive is already running and we don't need to configure it.
            //If it is, then skip setting up sensing
            if (CheckIsAdaptiveRunning(theSummit))
            {
                return(true);
            }

            int counter = 5;

            while (counter > 0)
            {
                if (StopSensing(theSummit, showErrorMessage))
                {
                    break;
                }
                else
                {
                    _log.Warn("Could not stop sensing before configure sensing. Trying again...");
                    counter--;
                    Thread.Sleep(500);
                }
            }
            if (counter == 0)
            {
                _log.Warn("Could not stop sensing before configure sensing. Returning false");
                return(false);
            }

            // Create a sensing configuration
            List <TimeDomainChannel> TimeDomainChannels = new List <TimeDomainChannel>(4);

            // Channel Specific configuration - 0
            TimeDomainChannels.Add(new TimeDomainChannel(
                                       GetTDSampleRate(localModel.Sense.TimeDomains[0].IsEnabled, localModel),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[0].Inputs[0]),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[0].Inputs[1]),
                                       ConfigConversions.TdEvokedResponseEnableConvert(localModel.Sense.TimeDomains[0].TdEvokedResponseEnable),
                                       ConfigConversions.TdLpfStage1Convert(localModel.Sense.TimeDomains[0].Lpf1),
                                       ConfigConversions.TdLpfStage2Convert(localModel.Sense.TimeDomains[0].Lpf2),
                                       ConfigConversions.TdHpfsConvert(localModel.Sense.TimeDomains[0].Hpf)));

            // Channel Specific configuration - 1
            TimeDomainChannels.Add(new TimeDomainChannel(
                                       GetTDSampleRate(localModel.Sense.TimeDomains[1].IsEnabled, localModel),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[1].Inputs[0]),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[1].Inputs[1]),
                                       ConfigConversions.TdEvokedResponseEnableConvert(localModel.Sense.TimeDomains[1].TdEvokedResponseEnable),
                                       ConfigConversions.TdLpfStage1Convert(localModel.Sense.TimeDomains[1].Lpf1),
                                       ConfigConversions.TdLpfStage2Convert(localModel.Sense.TimeDomains[1].Lpf2),
                                       ConfigConversions.TdHpfsConvert(localModel.Sense.TimeDomains[1].Hpf)));

            // Channel Specific configuration - 2
            TimeDomainChannels.Add(new TimeDomainChannel(
                                       GetTDSampleRate(localModel.Sense.TimeDomains[2].IsEnabled, localModel),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[2].Inputs[0]),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[2].Inputs[1]),
                                       ConfigConversions.TdEvokedResponseEnableConvert(localModel.Sense.TimeDomains[2].TdEvokedResponseEnable),
                                       ConfigConversions.TdLpfStage1Convert(localModel.Sense.TimeDomains[2].Lpf1),
                                       ConfigConversions.TdLpfStage2Convert(localModel.Sense.TimeDomains[2].Lpf2),
                                       ConfigConversions.TdHpfsConvert(localModel.Sense.TimeDomains[2].Hpf)));

            // Channel Specific configuration - 3
            TimeDomainChannels.Add(new TimeDomainChannel(
                                       GetTDSampleRate(localModel.Sense.TimeDomains[3].IsEnabled, localModel),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[3].Inputs[0]),
                                       ConfigConversions.TdMuxInputsConvert(localModel.Sense.TimeDomains[3].Inputs[1]),
                                       ConfigConversions.TdEvokedResponseEnableConvert(localModel.Sense.TimeDomains[3].TdEvokedResponseEnable),
                                       ConfigConversions.TdLpfStage1Convert(localModel.Sense.TimeDomains[3].Lpf1),
                                       ConfigConversions.TdLpfStage2Convert(localModel.Sense.TimeDomains[3].Lpf2),
                                       ConfigConversions.TdHpfsConvert(localModel.Sense.TimeDomains[3].Hpf)));

            // Set up the FFT
            FftConfiguration fftChannel = new FftConfiguration(
                ConfigConversions.FftSizesConvert(localModel.Sense.FFT.FftSize),
                localModel.Sense.FFT.FftInterval,
                ConfigConversions.FftWindowAutoLoadsConvert(localModel.Sense.FFT.WindowLoad),
                localModel.Sense.FFT.WindowEnabled,
                ConfigConversions.FftWeightMultipliesConvert(localModel.Sense.FFT.WeightMultiplies),
                localModel.Sense.FFT.StreamSizeBins,
                localModel.Sense.FFT.StreamOffsetBins);

            // Set up the Power channels
            List <PowerChannel> powerChannels = new List <PowerChannel>();
            //This goes through each power channel and gets the lower power band and upper power band.
            //Medtronic api uses bin index values for setting power channels instead of actual values in Hz
            //This calls the CalculatePowerBins class to convert to proper medtronic api values from the user config file
            //User config file has estimated values in Hz for each channel.
            //CalculatePowerBins converts them to actual power values and we are able to get the bin index value from that.
            CalculatePowerBins    calculatePowerBins = new CalculatePowerBins(_log);
            List <PowerBandModel> powerBandsList     = calculatePowerBins.GetPowerBands(localModel);

            if (powerBandsList == null || powerBandsList.Count < 3)
            {
                MessageBox.Show("Error calculating power bins. Please check that power bins are correct in the config file and try again.", "Error", MessageBoxButton.OK, MessageBoxImage.Hand);
                return(false);
            }
            for (int i = 0; i < 4; i++)
            {
                //Add the lower and upper power bands to the power channel
                powerChannels.Add(new PowerChannel(powerBandsList[i].lowerIndexBand0, powerBandsList[i].upperIndexBand0, powerBandsList[i].lowerIndexBand1, powerBandsList[i].upperIndexBand1));
            }
            //Gets the enabled power bands from the sense config file and returns the correct api call for all enabled
            BandEnables theBandEnables = ConfigConversions.PowerBandEnablesConvert(localModel);

            // Set up the miscellaneous settings
            MiscellaneousSensing miscsettings = new MiscellaneousSensing();

            miscsettings.StreamingRate    = ConfigConversions.MiscStreamRateConvert(localModel.Sense.Misc.StreamingRate);
            miscsettings.LrTriggers       = ConfigConversions.MiscloopRecordingTriggersConvert(localModel.Sense.Misc.LoopRecordingTriggersState, localModel.Sense.Misc.LoopRecordingTriggersIsEnabled);
            miscsettings.LrPostBufferTime = localModel.Sense.Misc.LoopRecordingPostBufferTime;
            miscsettings.Bridging         = ConfigConversions.MiscBridgingConfigConvert(localModel.Sense.Misc.Bridging);

            //Writes all sensing information here
            try
            {
                bufferReturnInfo = theSummit.WriteSensingTimeDomainChannels(TimeDomainChannels);
                if (!CheckForReturnError(bufferReturnInfo, "Writing Sensing Time Domain", showErrorMessage))
                {
                    return(false);
                }
                bufferReturnInfo = theSummit.WriteSensingFftSettings(fftChannel);
                if (!CheckForReturnError(bufferReturnInfo, "Writing Sensing FFT", showErrorMessage))
                {
                    return(false);
                }
                bufferReturnInfo = theSummit.WriteSensingPowerChannels(theBandEnables, powerChannels);
                if (!CheckForReturnError(bufferReturnInfo, "Writing Sensing Power", showErrorMessage))
                {
                    return(false);
                }
                bufferReturnInfo = theSummit.WriteSensingMiscSettings(miscsettings);
                if (!CheckForReturnError(bufferReturnInfo, "Writing Sensing Misc", showErrorMessage))
                {
                    return(false);
                }
                bufferReturnInfo = theSummit.WriteSensingAccelSettings(ConfigConversions.AccelSampleRateConvert(localModel.Sense.Accelerometer.SampleRate, localModel.Sense.Accelerometer.SampleRateDisabled));
                if (!CheckForReturnError(bufferReturnInfo, "Writing Sensing Accel", showErrorMessage))
                {
                    return(false);
                }
            }
            catch (Exception error)
            {
                _log.Error(error);
                return(false);
            }
            return(true);
        }