51#include "imgui_markdown.h"
53#include "../scopehal/PacketDecoder.h"
66 , m_direction(direction)
75 : m_group(rhs.m_group)
76 , m_direction(rhs.m_direction)
77 , m_stream(rhs.m_stream)
93 std::shared_ptr<WaveformGroup> m_group;
108 std::shared_ptr<Dialog> m_dlg;
117 MainWindow(std::shared_ptr<QueueHandle> queue);
122 void LogMemoryUsage();
124 void AddDialog(std::shared_ptr<Dialog> dlg);
127 void OnScopeAdded(std::shared_ptr<Oscilloscope> scope,
bool createViews);
129 void QueueSplitGroup(std::shared_ptr<WaveformGroup> group, ImGuiDir direction,
StreamDescriptor stream)
133 void ShowInstrumentProperties(std::shared_ptr<Instrument> instrumet);
134 void ShowTriggerProperties();
135 void ShowManageInstruments();
136 void ShowSyncWizard(std::shared_ptr<TriggerGroup> group, std::shared_ptr<Oscilloscope> secondary);
142 int64_t duration = 0,
165 void RenderWaveformTextures(
166 vk::raii::CommandBuffer& cmdbuf,
167 std::vector<std::shared_ptr<DisplayedChannel> >& channels);
172 void ClearPersistence()
178 virtual void Render();
180 void QueueCloseSession()
186 float GetTraceAlpha()
189 float GetPersistDecay()
192 void SetPersistDecay(
float f)
196 const std::string& name,
199 bool showProperties =
true,
200 bool addToArea =
true);
205 const std::vector<std::string>& GetEyeGradients()
206 {
return m_eyeGradients; }
208 std::string GetEyeGradientFriendlyName(std::string internalName)
209 {
return m_eyeGradientFriendlyNames[internalName]; }
224 void SetStartupSession(
const std::string& path)
228 virtual void DoRender(vk::raii::CommandBuffer& cmdBuf);
236 virtual void RenderUI();
243 std::vector<time_t>& timestamps,
244 std::map<time_t, std::vector<std::string> >& reverseMap,
245 const std::string& typePretty,
246 const std::string& defaultName,
247 const std::string& typeInternal
263 void ToolbarButtons();
264 void TriggerStartDropdown(
float buttonsize);
265 void TriggerSingleDropdown(
float buttonsize);
266 void TriggerForceDropdown(
float buttonsize);
267 void TriggerStopDropdown(
float buttonsize);
268 void DoTriggerDropdown(
const char* action, std::shared_ptr<TriggerGroup>& group,
bool& all);
270 void StatusBar(
float height);
273 void LoadGradient(
const std::string& friendlyName,
const std::string& internalName);
274 std::map<std::string, std::string> m_eyeGradientFriendlyNames;
275 std::vector<std::string> m_eyeGradients;
298 std::map<std::shared_ptr<SCPIMultimeter>, std::shared_ptr<Dialog> >
m_meterDialogs;
301 std::map<std::shared_ptr<SCPIPowerSupply>, std::shared_ptr<Dialog> >
m_psuDialogs;
307 std::map<std::shared_ptr<SCPIBERT>, std::shared_ptr<Dialog> >
m_bertDialogs;
313 std::map<std::shared_ptr<SCPILoad>, std::shared_ptr<Dialog> >
m_loadDialogs;
336 std::string NameNewWaveformGroup();
380 void OnDialogClosed(
const std::shared_ptr<Dialog>& dlg);
423 void DoOpenFile(
const std::string& sessionPath,
bool online);
427 bool LoadUIConfiguration(
int version,
const YAML::Node& node);
429 void OnGraphEditorConfigModified(
const std::string& blob)
432 const std::string& GetGraphEditorConfigBlob()
473 std::string GetDataDir()
491 void LoadRecentInstrumentList();
492 void SaveRecentInstrumentList();
499 void LoadRecentFileList();
500 void SaveRecentFileList();
503 void AddToRecentInstrumentList(std::shared_ptr<SCPIInstrument> inst);
510 std::string m_errorPopupTitle;
511 std::string m_errorPopupMessage;
513 bool m_showingLoadWarnings;
514 bool m_loadConfirmationChecked;
520 void ShowErrorPopup(
const std::string& title,
const std::string& msg);
546 bool DropdownButton(
const char*
id,
float height);
557 auto desc =
m_session.GetPreferences().GetFont(name.c_str());
558 return std::pair<ImFont*, float>(m_fontmgr.
GetFont(desc), desc.second);
561 ImU32 GetColorPref(
const std::string& name)
562 {
return m_session.GetPreferences().GetColor(name); }
564 ImTextureID GetTexture(
const std::string& name)
565 {
return m_texmgr.GetTexture(name); }
568 {
return &m_texmgr; }
574 ImGui::MarkdownConfig GetMarkdownConfig();
591 void AddStatusHelp(
const std::string& icon,
const std::string& text)
592 { m_statusHelp[icon] = text; }
595 std::map<std::string, std::string> m_statusHelp;
601 int64_t m_toneMapTime;
604 int64_t GetToneMapTime()
605 {
return m_toneMapTime; }
MemoryPressureLevel
Levels of memory pressure.
Definition: AcceleratorBuffer.h:67
MemoryPressureType
Types of memory pressure.
Definition: AcceleratorBuffer.h:84
Declaration of FilterGraphEditor.
Declaration of FontManager.
Declaration of ManageInstrumentsDialog.
Declaration of ProtocolAnalyzerDialog.
Declaration of StreamBrowserDialog.
Declaration of TextureManager.
Declaration of TriggerPropertiesDialog.
Declaration of VulkanWindow.
Declaration of Workspace.
Definition: CreateFilterBrowser.h:44
Pending request to dock a dialog as a top level tab (TODO other options)
Definition: MainWindow.h:102
Abstract base class for a dialog that displays a file picker window.
Definition: FileBrowser.h:44
Abstract base class for all filter graph blocks which are not physical instrument channels.
Definition: Filter.h:95
Definition: FontManager.h:49
ImFont * GetFont(FontDescription desc)
Gets the font, if any, for the provided description.
Definition: FontManager.h:59
WaveShape
Predefined waveform shapes.
Definition: FunctionGenerator.h:55
UI for the history system.
Definition: HistoryDialog.h:47
Top level application window.
Definition: MainWindow.h:115
void DebugSCPIConsoleMenu()
Runs the Debug | SCPI Console menu.
Definition: MainWindow_Menus.cpp:815
std::string m_lastWindowTitle
Last window title set (glfw doesnt let us get this)
Definition: MainWindow.h:470
std::vector< YAML::Node > m_fileBeingLoaded
YAML structure for file we're currently loading.
Definition: MainWindow.h:458
void AddChannelsMenu()
Run the Add | Channels menu.
Definition: MainWindow_Menus.cpp:368
void AddAreaForStreamIfNotAlreadyVisible(StreamDescriptor stream)
Makes sure we have at least one waveform area displaying a given stream.
Definition: MainWindow.cpp:342
std::shared_ptr< CreateFilterBrowser > m_filterPalette
Filter palette.
Definition: MainWindow.h:369
std::map< std::shared_ptr< SCPIBERT >, std::shared_ptr< Dialog > > m_bertDialogs
Map of BERTs to BERT control dialogs.
Definition: MainWindow.h:307
std::vector< SplitGroupRequest > m_splitRequests
Pending requests to split waveform groups.
Definition: MainWindow.h:383
bool LoadSessionFromYaml(const YAML::Node &node, const std::string &dataDir, bool online)
Deserialize a YAML::Node (and associated data directory) to the current session.
Definition: MainWindow.cpp:2456
bool m_fileLoadInProgress
True if we're actively loading a file.
Definition: MainWindow.h:461
Filter * CreateFilter(const std::string &name, WaveformArea *area, StreamDescriptor initialStream, bool showProperties=true, bool addToArea=true)
Creates a filter optionally and adds all of its streams to the best waveform area.
Definition: MainWindow.cpp:1999
std::string m_sessionDataDir
Current session data directory.
Definition: MainWindow.h:467
void RemoveFunctionGenerator(std::shared_ptr< SCPIFunctionGenerator > gen)
Closes the function generator dialog, if we have one.
Definition: MainWindow.cpp:1959
void OnOpenFile(bool online)
Handler for file | open menu. Spawns the browser dialog.
Definition: MainWindow.cpp:2272
std::vector< std::shared_ptr< WaveformGroup > > m_newWaveformGroups
Set of newly created waveform groups that aren't yet docked.
Definition: MainWindow.h:331
std::string m_sessionFileName
Current session file path.
Definition: MainWindow.h:464
std::map< uintptr_t, std::string > GetGraphEditorGroups()
Returns the groups we have configured for our graph editor.
Definition: MainWindow.h:221
YAML::Node SerializeUIConfiguration()
Serialize waveform areas etc to a YAML::Node.
Definition: MainWindow.cpp:3236
void OnCursorMoved(int64_t offset)
Called when a cursor is moved, so protocol analyzers can move highlights as needed.
Definition: MainWindow.cpp:2260
int m_nextWaveformGroup
Name for next autogenerated waveform group.
Definition: MainWindow.h:334
std::shared_ptr< Dialog > m_logViewerDialog
Logfile viewer.
Definition: MainWindow.h:339
Session m_session
Our session object.
Definition: MainWindow.h:412
std::atomic< bool > m_clearPersistence
True if we should clear persistence on the next render pass.
Definition: MainWindow.h:538
bool m_openOnline
True if the pending file is to be opened online.
Definition: MainWindow.h:479
void WindowPSUMenu()
Run the Window | Power Supply menu.
Definition: MainWindow_Menus.cpp:741
std::string GetIconForFilter(Filter *f)
Gets the icon to use for a filter.
Definition: MainWindow_Icons.cpp:637
std::set< std::shared_ptr< Dialog > > m_dialogs
All dialogs and other pop-up UI elements.
Definition: MainWindow.h:295
void LoadStatusBarIcons()
Load icons for the status bar.
Definition: MainWindow_Icons.cpp:256
std::map< std::string, time_t > m_recentInstruments
List of recently used instruments.
Definition: MainWindow.h:489
void LoadToolbarIcons()
Load toolbar icons from disk if preferences changed.
Definition: MainWindow_Icons.cpp:799
void RefreshStreamBrowserDialog()
Update the timebase properties dialog.
Definition: MainWindow.h:148
static bool OnMemoryPressureStatic(MemoryPressureLevel level, MemoryPressureType type, size_t requestedSize)
Static wrapper for calling OnMemoryPressure.
Definition: MainWindow.cpp:3570
void WindowMenu()
Run the Window menu.
Definition: MainWindow_Menus.cpp:533
void DebugMenu()
Run the Debug menu.
Definition: MainWindow_Menus.cpp:850
void WindowGeneratorMenu()
Run the Window | Generator menu.
Definition: MainWindow_Menus.cpp:697
void RefreshTriggerPropertiesDialog()
Update the trigger properties dialog.
Definition: MainWindow.h:157
std::map< InstrumentChannel *, std::shared_ptr< Dialog > > m_channelPropertiesDialogs
Map of channels to properties dialogs.
Definition: MainWindow.h:319
std::shared_ptr< FileBrowser > m_fileBrowser
Browser for pending file loads.
Definition: MainWindow.h:455
std::string GetIconForWaveformShape(FunctionGenerator::WaveShape shape)
Gets the icon to use for a given wave shape.
Definition: MainWindow_Icons.cpp:787
std::shared_ptr< Workspace > m_initialWorkspaceDockRequest
Pending requests to dock initial stuff.
Definition: MainWindow.h:386
void ViewMenu()
Run the View menu.
Definition: MainWindow_Menus.cpp:225
void LoadFilterIcons()
Load icons for the filter graph.
Definition: MainWindow_Icons.cpp:278
std::vector< std::shared_ptr< WaveformGroup > > m_waveformGroups
Waveform groups.
Definition: MainWindow.h:325
std::map< std::shared_ptr< SCPIRFSignalGenerator >, std::shared_ptr< Dialog > > m_rfgeneratorDialogs
Map of RF generators to generator control dialogs.
Definition: MainWindow.h:310
ImVec2 m_workPos
Start position of the viewport minus the menu and toolbar.
Definition: MainWindow.h:286
void AddMenu()
Run the Add menu.
Definition: MainWindow_Menus.cpp:247
std::map< std::type_index, std::string > m_filterIconMap
Map of filter types to class names.
Definition: MainWindow.h:580
std::shared_ptr< Dialog > m_notesDialog
Lab notes.
Definition: MainWindow.h:360
void NavigateToTimestamp(int64_t stamp, int64_t duration=0, StreamDescriptor target=StreamDescriptor(nullptr, 0))
Scrolls all waveform groups so that the specified timestamp is visible.
Definition: MainWindow.cpp:1417
void FileRecentMenu()
Runs the File | Recent menu.
Definition: MainWindow_Menus.cpp:174
void AddImportMenu()
Run the Add | Import menu.
Definition: MainWindow_Menus.cpp:421
void RenderErrorPopup()
Popup message when something big goes wrong.
Definition: MainWindow.cpp:1763
std::shared_ptr< MeasurementsDialog > m_measurementsDialog
Measurements dialog.
Definition: MainWindow.h:378
std::shared_ptr< Dialog > m_preferenceDialog
Preferences.
Definition: MainWindow.h:345
FontWithSize GetFontPref(const std::string &name)
Returns a font, given the name of a preference setting.
Definition: MainWindow.h:555
std::map< std::shared_ptr< SCPIPowerSupply >, std::shared_ptr< Dialog > > m_psuDialogs
Map of PSUs to power supply control dialogs.
Definition: MainWindow.h:301
std::shared_ptr< Dialog > m_persistenceDialog
Persistence settings.
Definition: MainWindow.h:357
void RenderReconnectPopup()
Popup message when reconnecting to a session.
Definition: MainWindow.cpp:1722
std::map< uintptr_t, std::string > m_graphEditorGroups
Group IDs and names for the graph editor.
Definition: MainWindow.h:375
std::unique_ptr< vk::raii::CommandPool > m_cmdPool
Command pool for allocating our command buffers.
Definition: MainWindow.h:541
std::unique_ptr< vk::raii::CommandBuffer > m_cmdBuffer
Command buffer used during rendering operations.
Definition: MainWindow.h:544
bool SetupDataDirectory(const std::string &dataDir)
Make sure the data directory exists.
Definition: MainWindow.cpp:3150
void WindowAnalyzerMenu()
Run the Window | Analyzer menu.
Definition: MainWindow_Menus.cpp:650
void LoadWaveformShapeIcons()
Load icons for wave shape preview.
Definition: MainWindow_Icons.cpp:690
std::map< std::shared_ptr< SCPIInstrument >, std::shared_ptr< Dialog > > m_scpiConsoleDialogs
Map of instruments to SCPI console dialogs.
Definition: MainWindow.h:316
void LoadLabNotes(const std::string &dataDir)
Loads the lab notes from Markdown files in the data directory.
Definition: MainWindow.cpp:3052
void OnSaveAs()
Handler for file | save as menu. Spawns the browser dialog.
Definition: MainWindow.cpp:2288
std::map< PacketDecoder *, std::shared_ptr< ProtocolAnalyzerDialog > > m_protocolAnalyzerDialogs
Map of filters to analyzer dialogs.
Definition: MainWindow.h:322
std::map< FunctionGenerator::WaveShape, std::string > m_waveformShapeIconMap
Map of Waveform Shapes to icons.
Definition: MainWindow.h:583
bool PreLoadSessionFromYaml(const YAML::Node &node, const std::string &dataDir, bool online)
Sanity check a YAML::Node (and associated data directory) to the current session without fully loadin...
Definition: MainWindow.cpp:2422
void UpdateFonts()
Font.
Definition: MainWindow.cpp:1975
std::string m_graphEditorConfigBlob
Config blob for filter graph editor.
Definition: MainWindow.h:372
std::map< std::shared_ptr< SCPILoad >, std::shared_ptr< Dialog > > m_loadDialogs
Map of loads to control dialogs.
Definition: MainWindow.h:313
std::shared_ptr< TriggerPropertiesDialog > m_triggerDialog
Trigger properties.
Definition: MainWindow.h:351
float m_traceAlpha
Trace alpha.
Definition: MainWindow.h:397
std::shared_ptr< ManageInstrumentsDialog > m_manageInstrumentsDialog
Manage instruments.
Definition: MainWindow.h:354
void DoSaveFile(std::string sessionPath)
Actually save a file (may be triggered by file|save or file|save as)
Definition: MainWindow.cpp:2949
void FindAreaForStream(WaveformArea *area, StreamDescriptor stream)
Given a stream and optionally a WaveformArea, adds the stream to some area.
Definition: MainWindow.cpp:2075
float m_persistenceDecay
Persistence decay factor.
Definition: MainWindow.h:400
SCPITransport * MakeTransport(const std::string &trans, const std::string &args)
Helper function for creating a transport and printing an error if the connection is unsuccessful.
Definition: MainWindow.cpp:1670
void HelpMenu()
Run the Help menu.
Definition: MainWindow_Menus.cpp:874
std::map< std::shared_ptr< SCPIFunctionGenerator >, std::shared_ptr< Dialog > > m_generatorDialogs
Map of generators to generator control dialogs.
Definition: MainWindow.h:304
void ToneMapAllWaveforms(vk::raii::CommandBuffer &cmdbuf)
Run the tone-mapping shader on all of our waveforms.
Definition: MainWindow.cpp:560
std::shared_ptr< StreamBrowserDialog > m_streamBrowser
Stream browser.
Definition: MainWindow.h:366
bool LoadDialogs(const YAML::Node &node)
Load dialog configuration.
Definition: MainWindow.cpp:2729
ImVec2 m_workSize
Size position of the viewport minus the menu and toolbar.
Definition: MainWindow.h:289
std::shared_ptr< WaveformGroup > GetBestGroupForWaveform(StreamDescriptor stream)
Figure out what group to use for a newly added stream, based on unit compatibility etc.
Definition: MainWindow.cpp:366
void DoOpenFile(const std::string &sessionPath, bool online)
Actually open a file (may be triggered by dialog, command line request, or recent file menu)
Definition: MainWindow.cpp:2332
void AddGenerateMenu()
Run the Add | Generate menu.
Definition: MainWindow_Menus.cpp:456
void ShowErrorPopup(const std::string &title, const std::string &msg)
Opens the error popup.
Definition: MainWindow.cpp:1713
void LoadGradient(const std::string &friendlyName, const std::string &internalName)
Load a single gradient.
Definition: MainWindow.cpp:863
std::map< std::string, time_t > m_recentFiles
List of recently used files.
Definition: MainWindow.h:497
void InitializeDefaultSession()
Creates a new session initialized with some default windows.
Definition: MainWindow.cpp:215
std::set< std::pair< OscilloscopeChannel *, WaveformArea * > > m_pendingChannelDisplayRequests
Pending requests to display a channel in a waveform area (from CreateFilter())
Definition: MainWindow.h:403
void SetupMenu()
Run the Setup menu.
Definition: MainWindow_Menus.cpp:493
void SaveLabNotes(const std::string &dataDir)
Saves the lab notes to Markdown files in the data directory.
Definition: MainWindow.cpp:3004
std::map< std::shared_ptr< SCPIMultimeter >, std::shared_ptr< Dialog > > m_meterDialogs
Map of multimeters to meter control dialogs.
Definition: MainWindow.h:298
void LoadGradients()
Load gradient images.
Definition: MainWindow.cpp:844
std::shared_ptr< Dialog > m_metricsDialog
Performance metrics.
Definition: MainWindow.h:342
YAML::Node SerializeDialogs()
Serializes the list of open dialogs.
Definition: MainWindow.cpp:3318
std::string m_startupSession
Pending request to open a session.
Definition: MainWindow.h:406
void MainMenu()
Run the top level menu bar.
Definition: MainWindow_Menus.cpp:103
void WindowMultimeterMenu()
Run the Window | Multimeter menu.
Definition: MainWindow_Menus.cpp:778
bool SaveSessionToYaml(YAML::Node &node, const std::string &dataDir)
Serialize the current session to a YAML::Node.
Definition: MainWindow.cpp:3102
bool m_showDemo
Enable flag for main imgui demo window.
Definition: MainWindow.h:283
void DoAddSubMenu(std::vector< time_t > ×tamps, std::map< time_t, std::vector< std::string > > &reverseMap, const std::string &typePretty, const std::string &defaultName, const std::string &typeInternal)
Run the Add | (instrument type) submenu.
Definition: MainWindow_Menus.cpp:290
bool m_sessionClosing
True if a close-session request came in this frame.
Definition: MainWindow.h:415
void OnScopeAdded(std::shared_ptr< Oscilloscope > scope, bool createViews)
Handles creation of a new oscilloscope.
Definition: MainWindow.cpp:394
void OnFilterReconfigured(Filter *f)
Handle a filter being reconfigured.
Definition: MainWindow.cpp:2240
std::shared_ptr< HistoryDialog > m_historyDialog
History.
Definition: MainWindow.h:348
std::vector< size_t > m_groupsToClose
Pending requests to close waveform groups.
Definition: MainWindow.h:389
std::recursive_mutex m_waveformGroupsMutex
Mutex for controlling access to m_waveformGroups.
Definition: MainWindow.h:328
bool m_needRender
True if a resize or other event this frame requires we re-rasterize waveforms.
Definition: MainWindow.h:533
int m_toolbarIconSize
Cached toolbar icon size.
Definition: MainWindow.h:394
std::shared_ptr< MeasurementsDialog > GetMeasurementsDialog(bool createIfNotExisting)
Return the measurements dialog, if we have one.
Definition: MainWindow.cpp:1696
std::shared_ptr< FilterGraphEditor > m_graphEditor
Filter graph editor.
Definition: MainWindow.h:363
std::set< std::shared_ptr< Workspace > > m_workspaces
Workspaces (can't be with other dialogs because they can contain other stuff)
Definition: MainWindow.h:292
void RenderFileBrowser()
Runs the file browser dialog.
Definition: MainWindow.cpp:2303
void RenderLoadWarningPopup()
Popup message when loading a file that might not match the current hardware setup.
Definition: MainWindow.cpp:1811
void FileMenu()
Run the File menu.
Definition: MainWindow_Menus.cpp:121
Definition: MeasurementsDialog.h:42
Definition: MultimeterDialog.h:42
A single channel on an oscilloscope.
Definition: OscilloscopeChannel.h:49
Abstraction of a transport layer for moving SCPI data between endpoints.
Definition: SCPITransport.h:47
A Session stores all of the instrument configuration and other state the user has open.
Definition: Session.h:95
Definition: MainWindow.h:62
Descriptor for a single stream coming off a channel.
Definition: StreamDescriptor.h:46
Manages loading and saving texture resources to files.
Definition: TextureManager.h:105
A GLFW window containing a Vulkan surface.
Definition: VulkanWindow.h:44