/// <summary>
        /// This maybe should go into a different class like Stimulation.cs, but it's here for now.
        ///It gets the group stim params based on the group that was read from the device.
        ///if Group b was read from the device, then it gets the params for that specific group.
        /// </summary>
        /// <param name="theSummit">Summit System</param>
        /// <param name="group">Active Group after being converted: Group A, Group B, Group C, Group D</param>
        /// <param name="program">program 0-3</param>
        /// <returns>StimParameterModel filled with data</returns>
        public StimParameterModel GetStimParamsBasedOnGroup(SummitSystem theSummit, string group, int program)
        {
            StimParameterModel stimParam = new StimParameterModel("Error", "Error", "Error", "Error", null);

            if (string.IsNullOrEmpty(group))
            {
                return(stimParam);
            }
            switch (group)
            {
            case "Group A":
                stimParam = GetStimParameterModel(theSummit, GroupNumber.Group0, program);
                break;

            case "Group B":
                stimParam = GetStimParameterModel(theSummit, GroupNumber.Group1, program);
                break;

            case "Group C":
                stimParam = GetStimParameterModel(theSummit, GroupNumber.Group2, program);
                break;

            case "Group D":
                stimParam = GetStimParameterModel(theSummit, GroupNumber.Group3, program);
                break;

            default:
                break;
            }
            return(stimParam);
        }
        /// <summary>
        /// Gets the Stim parameters for a Group
        /// </summary>
        /// <param name="theSummit">SummitSystem for making the api call to INS</param>
        /// <param name="group">Group number to get the data</param>
        /// <returns>StimParameterModel that contains stim amp, stim rate and pulse width</returns>
        public Tuple <bool, string, TherapyGroup> GetTherapyDataForGroup(SummitSystem theSummit, GroupNumber group)
        {
            TherapyGroup insStateGroup = null;

            if (theSummit == null || theSummit.IsDisposed)
            {
                return(Tuple.Create(false, "Summit Disposed", insStateGroup));
            }

            try
            {
                //Get the data from the api
                bufferInfo = theSummit.ReadStimGroup(group, out insStateGroup);
                if (bufferInfo.RejectCode != 0 || insStateGroup == null)
                {
                    _log.Warn("Could not read stim group from Medtronic api call");
                    return(Tuple.Create(false, "Could not read stim group from Medtronic api call", insStateGroup));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, "Error reading stim group.", insStateGroup));
            }
            return(Tuple.Create(true, "Success", insStateGroup));
        }
示例#3
0
        /// <summary>
        /// Stops sensing
        /// </summary>
        /// <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 success or false if unsuccessful</returns>
        public bool StopSensing(SummitSystem theSummit, bool showErrorMessage)
        {
            if (theSummit == null)
            {
                return(false);
            }
            bool          success = true;
            APIReturnInfo bufferReturnInfo;

            try
            {
                _log.Info("Stop Sensing");
                bufferReturnInfo = theSummit.WriteSensingState(SenseStates.None, 0x00);
                if (!CheckForReturnError(bufferReturnInfo, "Turn off Sensing", showErrorMessage))
                {
                    success = false;
                }
            }
            catch (Exception error)
            {
                _log.Error(error);
                success = false;
            }
            return(success);
        }
示例#4
0
 private bool ChangeFFTChannelCode(SenseTimeDomainChannel channel, SummitSystem localSummit, SenseModel localSenseModel)
 {
     SummitSensing summitSensing = new SummitSensing(_log);
     if (localSummit != null && !localSummit.IsDisposed && localSenseModel != null)
     {
         try
         {
             if (!summitSensing.StopSensing(localSummit, false))
             {
                 return false;
             }
             localSenseModel.Sense.FFT.Channel = (int)channel;
             if (!summitSensing.StartSensingAndStreaming(localSummit, localSenseModel, false))
             {
                 return false;
             }
         }
         catch (Exception e)
         {
             _log.Error(e);
             return false;
         }
     }
     else
     {
         //error occurred
         return false;
     }
     return true;
 }
        /// <summary>
        /// Turns stim therapy on. Resets POR if needed
        /// </summary>
        /// <param name="localSummit">Summit System</param>
        /// <returns>Tuple with bool true if success or false if not. string give error message</returns>
        public async Task <Tuple <bool, string> > ChangeStimTherapyON(SummitSystem localSummit)
        {
            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, "Error: Summit null or disposed."));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                bufferReturnInfo = await Task.Run(() => localSummit.StimChangeTherapyOn());

                if (bufferReturnInfo.RejectCodeType == typeof(MasterRejectCode) &&
                    (MasterRejectCode)bufferReturnInfo.RejectCode == MasterRejectCode.ChangeTherapyPor)
                {
                    ResetPOR(localSummit);
                    bufferReturnInfo = await Task.Run(() => localSummit.StimChangeTherapyOn());

                    _log.Info("Turn stim therapy on after resetPOR success");
                }

                if (bufferReturnInfo.RejectCode != 0)
                {
                    _log.Warn(":: Error: Medtronic API return error turning stim therapy on: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                    return(Tuple.Create(false, "Error: Medtronic API return error turning stim therapy on: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, "Error: Could not turn stim therapy on"));
            }
            return(Tuple.Create(true, "Successfully turned stim therapy on"));
        }
        /// <summary>
        /// Turns stim therapy off.
        /// </summary>
        /// <param name="localSummit">Summit System</param>
        /// <param name="withRamp">withRamp	Inidicates if soft start parameters should be used to ramp down stim if true, or if should just jump to off if false</param>
        /// <returns>Tuple with bool true if success or false if not. string give error message</returns>
        public async Task <Tuple <bool, string> > ChangeStimTherapyOFF(SummitSystem localSummit, bool withRamp = false)
        {
            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, "Error: Summit null or disposed."));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                bufferReturnInfo = await Task.Run(() => localSummit.StimChangeTherapyOff(withRamp));

                if (bufferReturnInfo.RejectCode != 0)
                {
                    _log.Warn(":: Error: Medtronic API return error turning stim therapy off: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                    return(Tuple.Create(false, "Error: Medtronic API return error turning stim therapy off: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, "Error: Could not turn stim therapy off"));
            }
            return(Tuple.Create(true, "Successfully turned stim therapy off"));
        }
        /// <summary>
        /// Gets the Device ID from the API
        /// </summary>
        /// <returns>Device ID or null if couldn't find it</returns>
        public string GetDeviceID(SummitSystem theSummit)
        {
            if (theSummit == null || theSummit.IsDisposed)
            {
                _log.Warn("Summit null or disposed when trying to get subject id");
            }
            _log.Info("Getting Device ID");
            string deviceID = null;
            int    counter  = 10;

            while (deviceID == null && counter > 0)
            {
                try
                {
                    deviceID = theSummit.DeviceID;
                    _log.Info("Device ID: " + deviceID);
                }
                catch (Exception e)
                {
                    //do nothing until I have device ID
                    _log.Error(e);
                }
                counter--;
            }
            _log.Info("Retrieved Device ID");
            return(deviceID);
        }
示例#8
0
        public static bool WriteEventLog(SummitSystem localSummit, string successLogMessage, string successLogMessageSubType, string unsuccessfulMessageBoxMessage, ILog _log)
        {
            int           counter = 5;
            APIReturnInfo bufferReturnInfo;

            try
            {
                do
                {
                    bufferReturnInfo = localSummit.LogCustomEvent(DateTime.Now, DateTime.Now, successLogMessage, successLogMessageSubType);
                    counter--;
                } while (bufferReturnInfo.RejectCode != 0 && counter > 0);
                if (counter == 0)
                {
                    ShowMessageBox.Show(unsuccessfulMessageBoxMessage, "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return(false);
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                ShowMessageBox.Show("Error calling summit system while logging event.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
            }

            return(true);
        }
示例#9
0
        /// <summary>
        /// Stops streaming
        /// </summary>
        /// <param name="localSummit">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 success or false if unsuccessful</returns>
        public bool StopStreaming(SummitSystem localSummit, bool showErrorMessage)
        {
            if (localSummit == null)
            {
                return(false);
            }
            bool          success = true;
            APIReturnInfo bufferReturnInfo;

            try
            {
                _log.Info("Stop Streaming");
                bufferReturnInfo = localSummit.WriteSensingDisableStreams(true, true, true, true, true, true, true, true);
                if (!CheckForReturnError(bufferReturnInfo, "Turn off Streaming", showErrorMessage))
                {
                    success = false;
                }
            }
            catch (Exception error)
            {
                _log.Error(error);
                success = false;
            }
            return(success);
        }
示例#10
0
        /// <summary>
        /// Checks if adaptive is running
        /// </summary>
        /// <param name="localSummit">Summit system</param>
        /// <returns>true if adaptive is running, false if not or errors</returns>
        private bool CheckIsAdaptiveRunning(SummitSystem localSummit)
        {
            SensingState state;
            int          counter = 5;

            while (counter > 0)
            {
                try
                {
                    localSummit.ReadSensingState(out state);
                    if (state == null)
                    {
                        counter--;
                    }
                    else if (state.State.ToString().Contains("DetectionLd0") || state.State.ToString().Contains("DetectionLd1"))
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                catch (Exception error)
                {
                    _log.Error(error);
                }
            }
            if (counter == 0)
            {
                _log.Warn("Could not stop sensing before configure sensing. Returning false");
                return(false);
            }
            return(false);
        }
示例#11
0
        /// <summary>
        /// Starts streaming
        /// </summary>
        /// <param name="theSummit">the summit system</param>
        /// <param name="senseConfig">The sense Model from the config file</param>
        /// <param name="showErrorMessage">True if you want a popup message on errors or false if show no error popup</param>
        /// <returns>True if success and false if unsuccessful</returns>
        public bool StartStreaming(SummitSystem theSummit, SenseModel senseConfig, bool showErrorMessage)
        {
            APIReturnInfo bufferReturnInfo;

            try
            {
                _log.Info("Start Streaming");
                // Start streaming
                bufferReturnInfo = theSummit.WriteSensingEnableStreams(
                    senseConfig.StreamEnables.TimeDomain,
                    senseConfig.StreamEnables.FFT,
                    senseConfig.StreamEnables.Power,
                    senseConfig.StreamEnables.AdaptiveTherapy,
                    senseConfig.StreamEnables.AdaptiveState,
                    senseConfig.StreamEnables.Accelerometry,
                    senseConfig.StreamEnables.TimeStamp,
                    senseConfig.StreamEnables.EventMarker);
                if (!CheckForReturnError(bufferReturnInfo, "Stream Enables", showErrorMessage))
                {
                    return(false);
                }
            }
            catch (Exception error)
            {
                _log.Error(error);
                return(false);
            }
            return(true);
        }
        /// <summary>
        /// Gets the Stim Therapy Status from the API
        /// </summary>
        /// <param name="theSummit">SummitSystem for making the call to the API to the INS</param>
        /// <returns>String showing Therapy Active or Therapy Inactive</returns>
        public string GetTherapyStatus(ref SummitSystem theSummit)
        {
            if (theSummit == null || theSummit.IsDisposed)
            {
                return("");
            }
            GeneralInterrogateData insGeneralInfo = null;

            try
            {
                //Add a sleep in there to allow status of therapy to get pass Therapy Transitioning state
                //Allows it to either be Active or InActive and not inbetween
                Thread.Sleep(200);
                //Get data from api
                bufferInfo = theSummit.ReadGeneralInfo(out insGeneralInfo);
                //parse insGeneralInfo to get stim therapy status
                if (insGeneralInfo != null)
                {
                    stimState = insGeneralInfo.TherapyStatusData.TherapyStatus.ToString();
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
            }
            return(stimState);
        }
示例#13
0
        /// <summary>
        /// Starts sensing and streaming.  Skips starting sensing if Adaptive running.
        /// </summary>
        /// <param name="theSummit">Summit System</param>
        /// <param name="senseConfig">Sense Model</param>
        /// <param name="showErrorMessage">True if you want a popup message on errors or false if show no error popup</param>
        /// <returns>True if success and false if unsuccessful</returns>
        public bool StartSensingAndStreaming(SummitSystem theSummit, SenseModel senseConfig, bool showErrorMessage)
        {
            APIReturnInfo bufferReturnInfo;

            try
            {
                _log.Info("Start Sensing and Streaming");
                //This checks to see if sensing is already enabled.
                //If it is, then skip write sensing state and just start streaming
                SensingState state;
                theSummit.ReadSensingState(out state);
                if (!state.State.ToString().Contains("DetectionLd0") && !state.State.ToString().Contains("DetectionLd1"))
                {
                    _log.Info("Detection is off. Turn sensing on with LD0/LD1 off");
                    // Start sensing
                    //LDO is false because if it is in adaptive then it will bypass this. If not in adaptive, don't need it.
                    bufferReturnInfo = theSummit.WriteSensingState(ConfigConversions.TDSenseStatesConvert(
                                                                       senseConfig.SenseOptions.TimeDomain,
                                                                       senseConfig.SenseOptions.FFT,
                                                                       senseConfig.SenseOptions.Power,
                                                                       false,
                                                                       false,
                                                                       senseConfig.SenseOptions.AdaptiveState,
                                                                       senseConfig.SenseOptions.LoopRecording,
                                                                       senseConfig.SenseOptions.Unused), ConfigConversions.FFTChannelConvert(senseConfig));
                    if (!CheckForReturnError(bufferReturnInfo, "Write Sensing State", showErrorMessage))
                    {
                        return(false);
                    }
                }
                else
                {
                    _log.Warn("Detection is on. SKIP SENSING AND START STREAMING!");
                }
                // Start streaming
                bufferReturnInfo = theSummit.WriteSensingEnableStreams(
                    senseConfig.StreamEnables.TimeDomain,
                    senseConfig.StreamEnables.FFT,
                    senseConfig.StreamEnables.Power,
                    senseConfig.StreamEnables.AdaptiveTherapy,
                    senseConfig.StreamEnables.AdaptiveState,
                    senseConfig.StreamEnables.Accelerometry,
                    senseConfig.StreamEnables.TimeStamp,
                    senseConfig.StreamEnables.EventMarker);
                if (!CheckForReturnError(bufferReturnInfo, "Stream Enables", showErrorMessage))
                {
                    return(false);
                }
            }
            catch (Exception error)
            {
                _log.Error(error);
                return(false);
            }
            return(true);
        }
        /// <summary>
        /// Change stim rate to specific value.
        /// </summary>
        /// <param name="localSummit">Summit system</param>
        /// <param name="senseFriendly">True for sense friendly values or false for not</param>
        /// <param name="rateValueToChangeTo">Value to set stim rate to.</param>
        /// <param name="currentRateValue">Value of the current stim rate.</param>
        /// <returns>bool for success/failure and double for new stim rate. string give error message</returns>
        public async Task <Tuple <bool, double?, string> > ChangeStimRateToValue(SummitSystem localSummit, bool senseFriendly, double rateValueToChangeTo, double currentRateValue)
        {
            double?updatedStimRate = 0;

            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, updatedStimRate, "Summit Disposed"));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                double rateToChangeTo = 0;
                rateToChangeTo = Math.Round(rateValueToChangeTo + (-1 * currentRateValue), 1);
                if (rateToChangeTo != 0)
                {
                    int counter = 5;
                    do
                    {
                        bufferReturnInfo = await Task.Run(() => localSummit.StimChangeStepFrequency(rateToChangeTo, senseFriendly, out updatedStimRate));

                        if (counter < 5)
                        {
                            Thread.Sleep(400);
                        }
                        counter--;
                    } while ((bufferReturnInfo.RejectCode != 0) && (bufferReturnInfo.RejectCode != 5) && counter > 0);
                    //Sense friendly rate not found, just return back original value
                    if (bufferReturnInfo.RejectCode == 5)
                    {
                        return(Tuple.Create(true, (double?)currentRateValue, "Success"));
                    }
                    if ((bufferReturnInfo.RejectCode != 0) && counter == 0)
                    {
                        _log.Warn(":: Error: Medtronic API return error changing stim rate to value: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                        return(Tuple.Create(false, updatedStimRate, "Error: Medtronic API return error changing stim rate to value: " + bufferReturnInfo.Descriptor + ".Reject Code: " + bufferReturnInfo.RejectCode));
                    }
                }
                else
                {
                    return(Tuple.Create(false, updatedStimRate, "Could not change stim rate to value"));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, updatedStimRate, "Error changing stim rate to value"));
            }
            return(Tuple.Create(true, updatedStimRate, "Success"));
        }
        /// <summary>
        /// Change stim pulse width to specific value.
        /// </summary>
        /// <param name="localSummit">Summit system</param>
        /// <param name="programNumber">Program 0-3</param>
        /// <param name="pwValueToChangeTo">Value to set stim pulse width to.</param>
        /// <param name="currentPWValue">Value of the current stim pulse width.</param>
        /// <returns>bool for success/failure and int for new stim pulse width. string give error message</returns>
        public async Task <Tuple <bool, int?, string> > ChangeStimPulseWidthToValue(SummitSystem localSummit, byte programNumber, int pwValueToChangeTo, int currentPWValue)
        {
            int?updatedStimPW = 0;

            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, updatedStimPW, "Summit Disposed"));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                int pwToChangeTo = 0;
                pwToChangeTo = pwValueToChangeTo + (-1 * currentPWValue);
                if (pwToChangeTo != 0)
                {
                    int counter = 5;
                    do
                    {
                        bufferReturnInfo = await Task.Run(() => localSummit.StimChangeStepPW(programNumber, pwToChangeTo, out updatedStimPW));

                        if (counter < 5)
                        {
                            Thread.Sleep(400);
                        }
                        counter--;
                    } while ((bufferReturnInfo.RejectCode != 0) && counter > 0);
                    if ((bufferReturnInfo.RejectCode != 0) && counter == 0)
                    {
                        _log.Warn(":: Error: Medtronic API return error changing stim pulse width to value: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                        return(Tuple.Create(false, updatedStimPW, "Error: Medtronic API return error changing stim pulse width to value: " + bufferReturnInfo.Descriptor + ".Reject Code: " + bufferReturnInfo.RejectCode));
                    }
                }
                else
                {
                    return(Tuple.Create(false, updatedStimPW, "Could not change stim pulse width to value"));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, updatedStimPW, "Error changing stim pulse width to value"));
            }
            return(Tuple.Create(true, updatedStimPW, "Success"));
        }
        /// <summary>
        /// Change stim amp to specific value.
        /// </summary>
        /// <param name="localSummit">Summit system</param>
        /// <param name="programNumber">Program 0-3</param>
        /// <param name="ampValueToChangeTo">Value to set stim amp to.</param>
        /// <param name="currentAmpValue">Value of the current stim amp.</param>
        /// <returns>bool for success/failure and double for new stim amp</returns>
        public async Task <Tuple <bool, double?, string> > ChangeStimAmpToValue(SummitSystem localSummit, byte programNumber, double ampValueToChangeTo, double currentAmpValue)
        {
            double?updatedStimAmp = 0;

            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, updatedStimAmp, "Summit Disposed"));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                double ampToChangeTo = 0;
                ampToChangeTo = Math.Round(ampValueToChangeTo + (-1 * currentAmpValue), 1);
                if (ampToChangeTo != 0)
                {
                    int counter = 5;
                    do
                    {
                        bufferReturnInfo = await Task.Run(() => localSummit.StimChangeStepAmp(programNumber, ampToChangeTo, out updatedStimAmp));

                        if (counter < 5)
                        {
                            Thread.Sleep(400);
                        }
                        counter--;
                    } while ((bufferReturnInfo.RejectCode != 0) && counter > 0);
                    if ((bufferReturnInfo.RejectCode != 0) && counter == 0)
                    {
                        _log.Warn(":: Error: Medtronic API return error changing stim amp to value: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                        return(Tuple.Create(false, updatedStimAmp, "Error: Medtronic API return error changing stim amp to value: " + bufferReturnInfo.Descriptor + ".Reject Code: " + bufferReturnInfo.RejectCode));
                    }
                }
                else
                {
                    return(Tuple.Create(false, updatedStimAmp, "Could not change stim amp to value"));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, updatedStimAmp, "Error changing stim step amp to value"));
            }
            return(Tuple.Create(true, updatedStimAmp, "Success"));
        }
        /// <summary>
        /// Gets the battery level for the INS
        /// </summary>
        /// <param name="theSummit">Summit System</param>
        /// <param name="_log">Caliburn Micro Logger</param>
        /// <returns>String that tells the battery status of the INS</returns>
        public string GetINSBatteryLevel(ref SummitSystem theSummit, ILog _log)
        {
            BatteryStatusResult outputBuffer = null;
            APIReturnInfo       commandInfo  = new APIReturnInfo();

            //Return Not Connected if summit is null
            if (theSummit == null)
            {
                return(INSBatteryLevel);
            }

            try
            {
                commandInfo = theSummit.ReadBatteryLevel(out outputBuffer);
            }
            catch (Exception e)
            {
                _log.Error(e);
            }

            // Ensure the command was successful before using the result
            try
            {
                //Check if command was successful
                if (commandInfo.RejectCode == 0)
                {
                    // Retrieve the battery level from the output buffer
                    if (outputBuffer != null)
                    {
                        INSBatteryLevel = outputBuffer.BatteryLevelPercent.ToString();
                    }
                }
                else
                {
                    INSBatteryLevel = "";
                }
            }
            catch (Exception e)
            {
                INSBatteryLevel = "";
                _log.Error(e);
            }
            //Return either battery level, empty string or Not Connected
            return(INSBatteryLevel);
        }
        //constructor
        public StimSweeper(SweepParameters parameters, SummitSystem theSummit, GroupNumber groupNum, string quitKey)
        {
            //assign all values
            m_sweepParameters = parameters;

            m_currentAmp        = m_sweepParameters.ampValues[0];
            m_currentPulseWidth = m_sweepParameters.pulseWidthValues[0];
            m_currentFreq       = m_sweepParameters.freqValues[0];

            m_stimPaused = false;
            m_summit     = theSummit;
            m_groupNum   = groupNum;

            m_stopSweep          = false;
            m_stimOutOfRangeFlag = false;
            m_sweepFinished      = true;
            m_quitKey            = quitKey;
        }
示例#19
0
        /// <summary>
        /// Constructor for fft visualizer
        /// </summary>
        /// <param name="summitLeft">Summit system for left</param>
        /// <param name="summitRight">Summit system for right</param>
        /// <param name="senseLeftModelConfig">Sense model for left</param>
        /// <param name="senseRightModelConfig">Sense model for right</param>
        /// <param name="_log">Caliburn micro log</param>
        public FFTVisualizerViewModel(SummitSystem summitLeft, SummitSystem summitRight, SenseModel senseLeftModelConfig, SenseModel senseRightModelConfig, ILog _log)
        {
            theSummitLeft = summitLeft;
            theSummitRight = summitRight;
            if(theSummitLeft != null)
            {
                theSummitLeft.DataReceivedFFTHandler += theSummit_DataReceived_FFT_Left;
            }
            if(theSummitRight != null)
            {
                theSummitRight.DataReceivedFFTHandler += theSummit_DataReceived_FFT_Right;
            }
            
            FFTChartLeftUnilateral.SeriesName = "FFT Left/Unilateral";
            FFTChartRight.SeriesName = "FFT Right";
            YAxesFFT.Add(new NumericAxisViewModel()
            {
                AutoRange = AutoRange.Always,
                VisibleRange = new DoubleRange(0, 0.5),
                GrowBy = new DoubleRange(0.1, 0.1),
                AxisTitle = "FFT Values",
                Id = "FFTID",
                FontSize = FONTSIZE,
                AxisAlignment = AxisAlignment.Left,
            });
            this._log = _log;
            this.senseLeftModelConfig = senseLeftModelConfig;
            this.senseRightModelConfig = senseRightModelConfig;
            UpdateFFTSettings(this.senseLeftModelConfig, this.senseRightModelConfig);
            FFTScaleOptions.Add(FFT_AUTOSCALE_CHART_OPTION);
            FFTScaleOptions.Add(FFT_NONE_CHART_OPTION);
            SelectedFFTScaleOption = FFT_AUTOSCALE_CHART_OPTION;

            FFTMean = userInputForFFTMean.ToString();
            FFTLog10Options.Add(FFT_LOG10_CHART_OPTION);
            FFTLog10Options.Add(FFT_NONE_CHART_OPTION);
            SelectedFFTLog10Option = FFT_NONE_CHART_OPTION;

            UpdateLeftUnilateralFFTChannelRadioButtons();
            if(theSummitRight != null)
            {
                UpdateRightFFTChannelRadioButtons();
            }
        }
        private void GetSubjectInfo(SummitSystem theSummit)
        {
            if (theSummit == null || theSummit.IsDisposed)
            {
                _log.Warn("Summit null or disposed when trying to get subject id");
                return;
            }
            //This loops until it gets the subjectInfo. Sometimes it comes back null so need to be sure I actually get it.
            _log.Info("Getting Subject info...");
            SubjectInfo subjectInfo = null;
            int         counter     = 10;

            while (subjectInfo == null && counter > 0)
            {
                try
                {
                    APIReturnInfo bufferReturnInfo;
                    bufferReturnInfo = theSummit.FlashReadSubjectInfo(out subjectInfo);
                    patientID        = subjectInfo.ID;
                    leadLocationOne  = subjectInfo.LeadTargets[0].ToString();
                    leadLocationTwo  = subjectInfo.LeadTargets[2].ToString();

                    _log.Info("Patient ID: " + patientID);
                    _log.Info("Lead Location 1: " + leadLocationOne);
                    _log.Info("Lead Location 2: " + leadLocationTwo);
                }
                catch (Exception e)
                {
                    //do nothing. Just keep looping until we actually get the patient id
                    _log.Error(e);
                }
                if (counter < 10)
                {
                    Thread.Sleep(300);
                }
                _log.Info("Attempt to get subject info: " + (10 - counter));
                counter--;
            }
            if (subjectInfo == null && counter == 0)
            {
                _log.Warn("Could not get subject info from medtronic");
            }
        }
示例#21
0
        private void LogLeadIntegrityAsEvent(SummitSystem theSummit, string pairs, string result)
        {
            APIReturnInfo bufferReturnInfo;

            try
            {
                bufferReturnInfo = theSummit.LogCustomEvent(DateTime.Now, DateTime.Now, "Lead Integrity", pairs + " --- " + result);
                if (bufferReturnInfo.RejectCode != 0)
                {
                    ShowMessageBox.Show("Could not log event. If you would like all lead integrity results logged, please try again.", "Error Logging");
                    _log.Warn("Could not log lead integrity event. Reject code: " + bufferReturnInfo.RejectCode + ". Reject description: " + bufferReturnInfo.Descriptor);
                }
            }
            catch (Exception e)
            {
                ShowMessageBox.Show("Could not log event. If you would like all lead integrity results logged, please try again.", "Error Logging");
                _log.Error(e);
            }
        }
        public ReportWindowViewModel(ref SummitSystem theSummitLeft, ref SummitSystem theSummitRight, ILog _log)
        {
            this._log           = _log;
            this.theSummitLeft  = theSummitLeft;
            this.theSummitRight = theSummitRight;

            jSONService = new JSONService(_log);
            //Medication and Condition list for report window.
            //Both of these collection data come from the same json file
            MedicationList = new ObservableCollection <MedicationCheckBoxClass>();
            ConditionList  = new ObservableCollection <ConditionCheckBoxClass>();
            //These two methods are implemented in ReportViewModel.cs
            reportModel = jSONService?.GetReportModelFromFile(reportFilePath);
            if (reportModel == null)
            {
                return;
            }
            GetListOfMedicationsConditionsFromModel();
        }
        /// <summary>
        /// Gets the battery level for the CTM
        /// </summary>
        /// <param name="theSummit">Summit System</param>
        /// <param name="_log">Caliburn Micro logger</param>
        /// <returns>String that tells the battery status of the CTM</returns>
        public string GetCTMBatteryLevel(ref SummitSystem theSummit, ILog _log)
        {
            TelemetryModuleInfo telem_info      = null;
            APIReturnInfo       ctm_return_info = new APIReturnInfo();

            if (theSummit == null)
            {
                return(CTMBatteryLevel);
            }

            try
            {
                //Get info from summit
                ctm_return_info = theSummit.ReadTelemetryModuleInfo(out telem_info);
            }
            catch (Exception e)
            {
                _log.Error(e);
            }

            try
            {
                //Make sure reject code was successful and write string to CTMBatteryLevel string
                if (ctm_return_info.RejectCode == 0)
                {
                    if (telem_info != null)
                    {
                        CTMBatteryLevel = Convert.ToString(telem_info.BatteryLevel);
                    }
                }
                else
                {
                    CTMBatteryLevel = "";
                }
            }
            catch (Exception e)
            {
                CTMBatteryLevel = "";
                _log.Error(e);
            }
            return(CTMBatteryLevel);
        }
        /// <summary>
        /// Resets the POR bit if it was set
        /// </summary>
        /// <param name="localSummit">SummitSystem for the api call</param>
        private void ResetPOR(SummitSystem localSummit)
        {
            if (localSummit == null || localSummit.IsDisposed)
            {
                _log.Warn("Summit Disposed");
                return;
            }
            _log.Info("POR was set, resetting...");
            APIReturnInfo bufferReturnInfo;

            try
            {
                // reset POR
                bufferReturnInfo = localSummit.ResetErrorFlags(Medtronic.NeuroStim.Olympus.DataTypes.Core.StatusBits.Por);
                if (bufferReturnInfo.RejectCode != 0)
                {
                    return;
                }

                // check battery
                BatteryStatusResult theStatus;
                localSummit.ReadBatteryLevel(out theStatus);
                if (bufferReturnInfo.RejectCode != 0)
                {
                    return;
                }
                // perform interrogate command and check if therapy is enabled.s
                GeneralInterrogateData interrogateBuffer;
                localSummit.ReadGeneralInfo(out interrogateBuffer);
                if (interrogateBuffer.IsTherapyUnavailable)
                {
                    _log.Warn("Therapy still unavailable after POR reset");
                    return;
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
            }
        }
        public MontageViewModel(ref SummitSystem theSummitLeft, ref SummitSystem theSummitRight, ILog _log, AppModel appModel)
        {
            this.theSummitLeft  = theSummitLeft;
            this.theSummitRight = theSummitRight;
            this.isBilateral    = appModel.Bilateral;
            this._log           = _log;
            this.appModel       = appModel;
            IsMontageEnabled    = true;

            summitSensing      = new SummitSensing(_log);
            jSONService        = new JSONService(_log);
            stimParameterLeft  = new StimParameterModel("", "", "", "", null);
            stimParameterRight = new StimParameterModel("", "", "", "", null);

            montageModel = jSONService.GetMontageModelFromFile(MONTAGE_FILEPATH);
            if (montageModel == null)
            {
                MessageBox.Show("The montage config file could not be read from the file. Please check that it exists.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            montageSweepConfigListLeft = montageSweepConfigListRight = LoadSenseJSONFilesForMontage(MONTAGE_BASEFILEPATH, MONTAGE_FILETYPE, montageModel);
            if (montageSweepConfigListLeft == null || montageSweepConfigListRight == null)
            {
                IsMontageEnabled = false;
                return;
            }

            //Get total time left and total time for montage. Display on progress bar
            timeLeftForMontage = totalTimeForMontage = GetTotalTimeForMontage(montageModel);
            TimeSpan time = TimeSpan.FromSeconds(timeLeftForMontage);
            //here backslash is must to tell that colon is
            //not the part of format, it just a character that we want in output
            string str = time.ToString(@"hh\:mm\:ss");

            MontageTimeTextBox  = "Total Montage Time: " + str;
            InstructionsTextBox = montageModel?.Instructions;
        }
        /// <summary>
        /// Changes the active group to the group specified.
        /// </summary>
        /// <param name="localSummit">Summit System</param>
        /// <param name="groupToChangeTo">Medtronic Active Group Format to change to</param>
        /// <param name="localSenseModel">Sense Model that uses the streaming parameters for turning stream on and off</param>
        /// <returns>Tuple with bool true if success or false if not. string give error message</returns>
        public async Task <Tuple <bool, string> > ChangeActiveGroup(SummitSystem localSummit, ActiveGroup groupToChangeTo, SenseModel localSenseModel)
        {
            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, "Error: Summit null or disposed."));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                int counter = 5;
                summitSensing.StopStreaming(localSummit, true);
                do
                {
                    bufferReturnInfo = await Task.Run(() => localSummit.StimChangeActiveGroup(groupToChangeTo));

                    if (counter < 5)
                    {
                        Thread.Sleep(400);
                    }
                    counter--;
                } while ((bufferReturnInfo.RejectCode != 0) && counter > 0);
                //Start streaming
                summitSensing.StartStreaming(localSummit, localSenseModel, true);
                if ((bufferReturnInfo.RejectCode != 0) && counter == 0)
                {
                    _log.Warn(":: Error: Medtronic API return error changing active group: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);

                    return(Tuple.Create(false, "Error: Medtronic API return error changing active group: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, "Error: Could not change groups"));
            }
            return(Tuple.Create(true, "Successfully changed groups"));
        }
        /// <summary>
        /// Gets the Active group from the api
        /// </summary>
        /// <param name="theSummit">SummitSystem to make api calls to INS</param>
        /// <returns>The active group in the format Group A instead of the format returned from medtonic such as Group0</returns>
        public string GetActiveGroup(ref SummitSystem theSummit)
        {
            if (theSummit == null || theSummit.IsDisposed)
            {
                return("");
            }
            GeneralInterrogateData insGeneralInfo = null;

            try
            {
                //Get the group from the api call
                bufferInfo = theSummit.ReadGeneralInfo(out insGeneralInfo);
                if (insGeneralInfo != null)
                {
                    activeGroup = insGeneralInfo.TherapyStatusData.ActiveGroup.ToString();
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
            }
            //This returns the converted group from something like Group0 to Group A
            return(ConvertActiveGroupToReadableForm(activeGroup));
        }
        /// <summary>
        /// Increment or decrement the stim rate by step value
        /// </summary>
        /// <param name="localSummit">Summit system</param>
        /// <param name="senseFriendly">True for sense friendly values or false for not</param>
        /// <param name="rateStepValue">Value to adjust. Plus for increment or minus for decrement</param>
        /// <returns>bool for success/failure and double for new stim rate. string give error message</returns>
        public async Task <Tuple <bool, double?, string> > ChangeStimRateStep(SummitSystem localSummit, bool senseFriendly, double rateStepValue)
        {
            double?updatedStimRate = 0;

            if (localSummit == null || localSummit.IsDisposed)
            {
                return(Tuple.Create(false, updatedStimRate, "Summit Disposed"));
            }
            APIReturnInfo bufferReturnInfo;

            try
            {
                int counter = 5;
                do
                {
                    bufferReturnInfo = await Task.Run(() => localSummit.StimChangeStepFrequency(rateStepValue, senseFriendly, out updatedStimRate));

                    if (counter < 5)
                    {
                        Thread.Sleep(400);
                    }
                    counter--;
                } while ((bufferReturnInfo.RejectCode != 0) && counter > 0);
                if ((bufferReturnInfo.RejectCode != 0) && counter == 0)
                {
                    _log.Warn(":: Error: Medtronic API return error changing stim step rate: " + bufferReturnInfo.Descriptor + ". Reject Code: " + bufferReturnInfo.RejectCode);
                    return(Tuple.Create(false, updatedStimRate, "Error: Medtronic API return error changing stim step rate: " + bufferReturnInfo.Descriptor + ".Reject Code: " + bufferReturnInfo.RejectCode));
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(Tuple.Create(false, updatedStimRate, "Error changing stim step rate"));
            }
            return(Tuple.Create(true, updatedStimRate, "Success"));
        }
示例#29
0
        private void RunLeadIntegrity(SummitSystem theSummit)
        {
            if (theSummit != null && !theSummit.IsDisposed)
            {
                try
                {
                    LeadIntegrityTestResult testResultBuffer;
                    APIReturnInfo           testReturnInfo;
                    testReturnInfo = theSummit.LeadIntegrityTest(
                        new List <Tuple <byte, byte> > {
                        new Tuple <byte, byte>(0, caseValue),
                        new Tuple <byte, byte>(1, caseValue),
                        new Tuple <byte, byte>(2, caseValue),
                        new Tuple <byte, byte>(3, caseValue),
                        new Tuple <byte, byte>(0, 1),
                        new Tuple <byte, byte>(0, 2),
                        new Tuple <byte, byte>(0, 3),
                        new Tuple <byte, byte>(1, 2),
                        new Tuple <byte, byte>(1, 3),
                        new Tuple <byte, byte>(2, 3)
                    },
                        out testResultBuffer);
                    // Make sure returned structure isn't null
                    if (testResultBuffer != null && testReturnInfo.RejectCode == 0)
                    {
                        // Write out result to the console
                        //Messages.Add("Test Result Impedance (0, " + caseValue + "): " + testResultBuffer.PairResults[0].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(0," + caseValue + ")", testResultBuffer.PairResults[0].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (1, " + caseValue + "): " + testResultBuffer.PairResults[1].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(1," + caseValue + ")", testResultBuffer.PairResults[1].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (2, " + caseValue + "): " + testResultBuffer.PairResults[2].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(2," + caseValue + ")", testResultBuffer.PairResults[2].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (3, " + caseValue + "): " + testResultBuffer.PairResults[3].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(3," + caseValue + ")", testResultBuffer.PairResults[3].Impedance.ToString());
                        //Messages.Add("Test Result Impedance (0, 1): " + testResultBuffer.PairResults[4].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(0,1)", testResultBuffer.PairResults[4].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (0, 2): " + testResultBuffer.PairResults[5].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(0,2)", testResultBuffer.PairResults[5].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (0, 3): " + testResultBuffer.PairResults[6].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(0,3)", testResultBuffer.PairResults[6].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (1, 2): " + testResultBuffer.PairResults[7].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(1,2)", testResultBuffer.PairResults[7].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (1, 3): " + testResultBuffer.PairResults[8].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(1,3)", testResultBuffer.PairResults[8].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (2, 3): " + testResultBuffer.PairResults[9].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(2,3)", testResultBuffer.PairResults[9].Impedance.ToString());
                    }
                    else
                    {
                        ShowMessageBox.Show("ERROR from Medtronic API. Reject Description: " + testReturnInfo.Descriptor + ". Reject Code: " + testReturnInfo.RejectCode);
                    }
                }
                catch (Exception e)
                {
                    ShowMessageBox.Show("ERROR: Could not run Lead Integrity Test. Please try again");
                    _log.Error(e);
                    return;
                }

                try
                {
                    LeadIntegrityTestResult testResultBuffer;
                    APIReturnInfo           testReturnInfo;
                    testReturnInfo = theSummit.LeadIntegrityTest(
                        new List <Tuple <byte, byte> > {
                        new Tuple <byte, byte>(8, caseValue),
                        new Tuple <byte, byte>(9, caseValue),
                        new Tuple <byte, byte>(10, caseValue),
                        new Tuple <byte, byte>(11, caseValue),
                        new Tuple <byte, byte>(8, 9),
                        new Tuple <byte, byte>(8, 10),
                        new Tuple <byte, byte>(8, 11),
                        new Tuple <byte, byte>(9, 10),
                        new Tuple <byte, byte>(9, 11),
                        new Tuple <byte, byte>(10, 11)
                    },
                        out testResultBuffer);
                    // Make sure returned structure isn't null
                    if (testResultBuffer != null && testReturnInfo.RejectCode == 0)
                    {
                        // Write out result to the console
                        //Messages.Add("Test Result Impedance: (8, " + caseValue + "): " + testResultBuffer.PairResults[0].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(8," + caseValue + ")", testResultBuffer.PairResults[0].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (9, " + caseValue + "): " + testResultBuffer.PairResults[1].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(9," + caseValue + ")", testResultBuffer.PairResults[1].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (10, " + caseValue + "): " + testResultBuffer.PairResults[2].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(10," + caseValue + ")", testResultBuffer.PairResults[2].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (11, " + caseValue + "): " + testResultBuffer.PairResults[3].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(11," + caseValue + ")", testResultBuffer.PairResults[3].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (8, 9): " + testResultBuffer.PairResults[4].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(8,9)", testResultBuffer.PairResults[4].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (8, 10): " + testResultBuffer.PairResults[5].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(8,10)", testResultBuffer.PairResults[5].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (8, 11): " + testResultBuffer.PairResults[6].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(8,11)", testResultBuffer.PairResults[6].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (9, 10): " + testResultBuffer.PairResults[7].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(9,10)", testResultBuffer.PairResults[7].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (9, 11): " + testResultBuffer.PairResults[8].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(9,11)", testResultBuffer.PairResults[8].Impedance.ToString());
                        //Messages.Add("Test Result Impedance: (10, 11): " + testResultBuffer.PairResults[9].Impedance.ToString());
                        LogLeadIntegrityAsEvent(theSummit, "(10,11)", testResultBuffer.PairResults[9].Impedance.ToString());
                    }
                    else
                    {
                        ShowMessageBox.Show("ERROR from Medtronic API. Reject Description: " + testReturnInfo.Descriptor + ". Reject Code: " + testReturnInfo.RejectCode);
                    }
                }
                catch (Exception e)
                {
                    ShowMessageBox.Show("ERROR: Could not run Lead Integrity Test. Please try again");
                    _log.Error(e);
                    return;
                }
            }
        }
示例#30
0
 /// <summary>
 /// Run a flattened lead integrity test
 /// </summary>
 public async Task RunLeadIntegrityTest(SummitSystem theSummit)
 {
     await Task.Run(() => RunLeadIntegrity(theSummit));
 }