/// <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)); }
/// <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); }
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); }
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); }
/// <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); }
/// <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); }
/// <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); }
/// <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; }
/// <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"); } }
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")); }
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; } } }
/// <summary> /// Run a flattened lead integrity test /// </summary> public async Task RunLeadIntegrityTest(SummitSystem theSummit) { await Task.Run(() => RunLeadIntegrity(theSummit)); }