public TimestepEditor() { InitializeComponent(); stepData = new TimeStep(); analogSelector.Items.Add("Continue"); analogSelector.SelectedItem = "Continue"; gpibSelector.Items.Add("Continue"); gpibSelector.SelectedItem = "Continue"; rs232Selector.Items.Add("Continue"); rs232Selector.SelectedItem = "Continue"; // If we are using Windows 7, // then the combo boxes must have a non-default // style in order to support background colors if (WordGenerator.GlobalInfo.usingWindows7) { analogSelector.FlatStyle = FlatStyle.Popup; gpibSelector.FlatStyle = FlatStyle.Popup; rs232Selector.FlatStyle = FlatStyle.Popup; } durationEditor.setMinimumAllowableManualValue(0); this.Width = TimestepEditorWidth; this.Height = TimestepEditorHeight; }
/// <summary> /// Duplicate creation constructor for Timesteps. Creates an independently editable copy of the timestep /// </summary> /// <param name="duplicateMe"></param> public TimeStep(TimeStep duplicateMe) : this() { this.AnalogGroup = duplicateMe.AnalogGroup; foreach (int id in duplicateMe.DigitalData.Keys) { this.DigitalData.Add(id, new DigitalDataPoint(duplicateMe.DigitalData[id])); } this.GpibGroup = duplicateMe.GpibGroup; this.rs232Group = duplicateMe.rs232Group; this.StepDuration = new DimensionedParameter(duplicateMe.stepDuration); this.StepEnabled = duplicateMe.StepEnabled; this.StepHidden = duplicateMe.StepHidden; this.StepName = "Copy of " + duplicateMe.StepName; this.MyTimestepGroup = duplicateMe.MyTimestepGroup; this.Description = duplicateMe.Description; this.LoopCopy = duplicateMe.LoopCopy; this.RetriggerOptions = new RetriggerOptions(duplicateMe.RetriggerOptions); }
public SingleOutputFrame getSingleOutputFrameAtEndOfTimestep(TimeStep step, SettingsData settings, bool outputAnalogDwellValues) { int analogStepID; if (outputAnalogDwellValues) { analogStepID = TimeSteps.IndexOf(dwellWord()); } else { analogStepID = TimeSteps.IndexOf(step); } TimeStep analogStep = TimeSteps[analogStepID]; int timeStepID = TimeSteps.IndexOf(step); SingleOutputFrame ans = new SingleOutputFrame(); foreach (int analogID in settings.logicalChannelManager.Analogs.Keys) { if (settings.logicalChannelManager.Analogs[analogID].TogglingChannel) { ans.analogValues.Add(analogID, 0); } else if (settings.logicalChannelManager.Analogs[analogID].overridden) { ans.analogValues.Add(analogID, settings.logicalChannelManager.Analogs[analogID].analogOverrideValue); } else { if (settings.logicalChannelManager.Analogs[analogID].AnalogChannelOutputNowUsesDwellWord) { ans.analogValues.Add(analogID, getAnalogValueAtEndOfTimestep(TimeSteps.IndexOf(dwellWord()), analogID, Variables)); } else { ans.analogValues.Add(analogID, getAnalogValueAtEndOfTimestep(analogStepID, analogID, Variables)); } } } foreach (int digitalID in settings.logicalChannelManager.Digitals.Keys) { bool val = false; if (settings.logicalChannelManager.Digitals[digitalID].TogglingChannel) { val = false; } else if (settings.logicalChannelManager.Digitals[digitalID].overridden) { val = settings.logicalChannelManager.Digitals[digitalID].digitalOverrideValue; } else { if (step.DigitalData.ContainsKey(digitalID)) { DigitalDataPoint dp = step.DigitalData[digitalID]; if (!dp.DigitalContinue) { val = step.DigitalData[digitalID].getValue(); } else // this digital value is a "continue" value, so, we have to go backwards in time until we find // what value to continue from { int checkStep = timeStepID - 1; val = false; // if we hunt all the way to the first timestep with no answer, the default answer is false while (checkStep >= 0) { if (TimeSteps[checkStep].StepEnabled) { if (TimeSteps[checkStep].DigitalData.ContainsKey(digitalID)) { if (TimeSteps[checkStep].DigitalData[digitalID].DigitalContinue) { checkStep--; // timestep had another continue keep hunting backwards... } else { val = TimeSteps[checkStep].DigitalData[digitalID].getValue(); break; } } else { break; } } else { checkStep--; // timestep was disabled, keep looking } } } } } ans.digitalValues.Add(digitalID, val); } return ans; }
public int getSamplesAtTimestep(TimeStep step, double timeStepSize) { int count = 0; double remainderTime = 0; foreach (TimeStep ts in TimeSteps) { if (ts == step) return count; if (ts.StepEnabled) { int temp = 0; computeNSamplesAndRemainderTime(ref temp, ref remainderTime, ts.StepDuration.getBaseValue(), timeStepSize); count += temp; } } return -1; }
public TimeStep getLoopCopy(int loopNum, int totalLoops) { TimeStep ans = new TimeStep(this); ans.LoopCopy = true; ans.loopOriginalCopy = this; ans.StepName = this.StepName + " Loop #" + loopNum + "/" + totalLoops; return ans; }
/// <summary> /// Returns false if step is null. /// </summary> /// <param name="step"></param> /// <returns></returns> public static bool isEnabled(TimeStep step) { if (step == null) return false; return step.StepEnabled; }
public void scrollToTimestep(TimeStep step) { foreach (Control con in timeStepsFlowPanel.Controls) { TimestepEditor ed = con as TimestepEditor; if (ed != null) { if (ed.StepData == step) { timeStepsPanel.ScrollControlIntoView(ed); forceUpdateAllScrollbars(); return; } } } }
/// <summary> /// Used to register timestep hotkeys. Ctrl + key. /// /// returns true if successful, /// false if key was already in use /// </summary> /// <param name="key"></param> /// <param name="timeStep"></param> public bool registerTimestepHotkey(char key, TimeStep timeStep) { if (hotKeyBindings == null) hotKeyBindings = new List<object>(); if (usedTimestepHotkeys == null) usedTimestepHotkeys = new List<char>(); if (usedTimestepHotkeys.Contains(key)) return false; // convert the character to a Keys enum element. This is weird but necessary. string keyStr = "" + char.ToUpper(key); Keys myKey = (Keys)Enum.Parse(typeof(Keys), keyStr); RegisterHotKey(Handle, hotKeyBindings.Count, KeyModifiers.Control, myKey); hotKeyBindings.Add(timeStep); return false; }
private void updateDescriptionTooltip(TimeStep stepData) { toolTip1.SetToolTip(this.timeStepNumber, stepData.Description); toolTip1.SetToolTip(this.timestepName, stepData.Description); }
public TimestepEditor(TimeStep stepData, int timeStepNumber) : this() { if (stepData!=null) this.stepData = stepData; updateDescriptionTooltip(stepData); descriptionTextBox.Text = stepData.Description; this.stepNumber = timeStepNumber; timestepName.Text = stepData.StepName; this.durationEditor.setParameterData(stepData.StepDuration); redrawStepNumberLabel(); analogSelector.Items.AddRange(Storage.sequenceData.AnalogGroups.ToArray()); gpibSelector.Items.AddRange(Storage.sequenceData.GpibGroups.ToArray()); rs232Selector.Items.AddRange(Storage.sequenceData.RS232Groups.ToArray()); if (stepData.AnalogGroup != null) { this.analogSelector.SelectedItem = stepData.AnalogGroup; this.analogSelector.BackColor = Color.White; this.analogSelector.Visible = true; } else { this.analogSelector.SelectedItem = "Continue"; this.analogSelector.BackColor = Color.Green; } if (stepData.GpibGroup != null) { this.gpibSelector.SelectedItem = stepData.GpibGroup; this.gpibSelector.BackColor = Color.White; this.gpibSelector.Visible = true; } else { this.gpibSelector.SelectedItem = "Continue"; this.gpibSelector.BackColor = Color.Green; } if (stepData.rs232Group != null) { rs232Selector.SelectedItem = stepData.rs232Group; rs232Selector.BackColor = Color.White; this.rs232Selector.Visible = true; } else { rs232Selector.SelectedItem = "Continue"; rs232Selector.BackColor = Color.Green; } this.negativeRetriggerEdgeOrValueToolStripMenuItem.Checked = stepData.RetriggerOptions.RetriggerOnNegativeValueOrEdge; this.edgeRetriggerToolStripMenuItem.Checked = stepData.RetriggerOptions.RetriggerOnEdge; layoutEnableButton(); layoutShowhideButton(); updatePulsesIndicator(); layoutGroupIndicatorLabel(); updateWaitForRetriggerIndicator(); }
private void insertTimestepBeforeToolStripMenuItem_Click(object sender, EventArgs e) { TimeStep newStep = new TimeStep("New timestep."); Storage.sequenceData.TimeSteps.Insert(stepNumber-1, newStep ); Storage.sequenceData.populateWithChannels(Storage.settingsData); Storage.sequenceData.timestepsInsertedOrMoved(); TimestepEditor te = new TimestepEditor(newStep, stepNumber); WordGenerator.MainClientForm.instance.sequencePage.insertTimestepEditor(te, stepNumber - 1); // WordGenerator.mainClientForm.instance.RefreshSequenceDataToUI(Storage.sequenceData); // WordGenerator.mainClientForm.instance.sequencePage1.scrollToTimestep(newStep); }
private void insertTimestepAfterToolStripMenuItem_Click(object sender, EventArgs e) { TimeStep newStep = new TimeStep("New timestep."); Storage.sequenceData.TimeSteps.Insert(stepNumber, newStep); Storage.sequenceData.populateWithChannels(Storage.settingsData); Storage.sequenceData.timestepsInsertedOrMoved(); WordGenerator.MainClientForm.instance.sequencePage.insertTimestepEditor( new TimestepEditor(newStep, stepNumber + 1), stepNumber); }
private void duplicateToolStripMenuItem_Click(object sender, EventArgs e) { TimeStep newStep = new TimeStep(this.stepData); Storage.sequenceData.TimeSteps.Insert(stepNumber, newStep); Storage.sequenceData.timestepsInsertedOrMoved(); WordGenerator.MainClientForm.instance.sequencePage.insertTimestepEditor( new TimestepEditor(newStep, stepNumber + 1), stepNumber); }
private void redrawStepNumberLabel(TimeStep stepData, int timeStepNumber) { this.timeStepNumber.Text = timeStepNumber.ToString(); if (stepData.HotKeyCharacter != 0) this.timeStepNumber.Text += " {" + char.ToUpper(stepData.HotKeyCharacter) + "}"; }
public double getTimeAtTimestep(TimeStep step) { if (!TimeSteps.Contains(step)) return 0; double ans = 0; foreach (TimeStep st in TimeSteps) { if (st == step) return ans; if (st.StepEnabled) { ans += st.StepDuration.getBaseValue(); } } return ans; }
public TimestepEditor getTimestepEditor(TimeStep timeStep) { foreach (Control con in timeStepsFlowPanel.Controls) { TimestepEditor editor = con as TimestepEditor; if (editor != null) { if (editor.StepData == timeStep) { return editor; } } } return null; }
public string insertSequence(SequenceData insertMe, TimeStep insertAfter) { int index = -1; for (int i=0; i<TimeSteps.Count; i++) { if (insertAfter == TimeSteps[i]) { index = i; break; } } return insertSequence(insertMe, index + 1); }
/// <summary> /// outputs the editor's timestep. set silent to true if no message logs should be generated. /// </summary> /// <param name="silent"></param> /// <returns></returns> public bool outputTimestepNow(TimeStep timeStep, bool silent, bool showErrorDialog) { List<string> unconnectedServers = Storage.settingsData.unconnectedRequiredServers(); if (!Storage.sequenceData.Lists.ListLocked) { WordGenerator.MainClientForm.instance.variablesEditor.tryLockLists(); } if (!Storage.sequenceData.Lists.ListLocked) { if (!silent) messageLog(this, new MessageEvent("Unable to output timestep, lists not locked.")); if (showErrorDialog) { MessageBox.Show("Unable to output timestep, lists not locked."); } return false; } if (unconnectedServers.Count == 0) { WordGenerator.MainClientForm.instance.cursorWait(); ServerManager.ServerActionStatus actionStatus; try { actionStatus = Storage.settingsData.serverManager.outputSingleTimestepOnConnectedServers( Storage.settingsData, Storage.sequenceData.getSingleOutputFrameAtEndOfTimestep(timeStep, Storage.settingsData, Storage.settingsData.OutputAnalogDwellValuesOnOutputNow), messageLog); } finally { WordGenerator.MainClientForm.instance.cursorWaitRelease(); } if (actionStatus == ServerManager.ServerActionStatus.Success) { if (!silent) messageLog(this, new MessageEvent("Successfully output timestep " + timeStep.ToString())); WordGenerator.MainClientForm.instance.CurrentlyOutputtingTimestep = timeStep; return true; } else { if (!silent) messageLog(this, new MessageEvent("Communication or server error attempting to output this timestep: " + actionStatus.ToString())); if (showErrorDialog) { MessageBox.Show("Communication or server error attempting to output this timestep: " + actionStatus.ToString()); } } } else { string missingServerList = ServerManager.convertListOfServersToOneString(unconnectedServers); if (!silent) messageLog(this, new MessageEvent("Unable to output this timestep. The following required servers are not connected: " + missingServerList)); if (showErrorDialog) { MessageBox.Show("Unable to output this timestep. The following required servers are not connected: " + missingServerList); } } return false; }