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 ShowTimebaseProperties();
135 void ShowTriggerProperties();
136 void ShowManageInstruments();
137 void ShowSyncWizard(std::shared_ptr<TriggerGroup> group, std::shared_ptr<Oscilloscope> secondary);
143 int64_t duration = 0,
166 void RenderWaveformTextures(
167 vk::raii::CommandBuffer& cmdbuf,
168 std::vector<std::shared_ptr<DisplayedChannel> >& channels);
173 void ClearPersistence()
179 virtual void Render();
181 void QueueCloseSession()
187 float GetTraceAlpha()
190 float GetPersistDecay()
193 void SetPersistDecay(
float f)
197 const std::string& name,
200 bool showProperties =
true,
201 bool addToArea =
true);
206 const std::vector<std::string>& GetEyeGradients()
207 {
return m_eyeGradients; }
209 std::string GetEyeGradientFriendlyName(std::string internalName)
210 {
return m_eyeGradientFriendlyNames[internalName]; }
226 virtual void DoRender(vk::raii::CommandBuffer& cmdBuf);
234 virtual void RenderUI();
241 std::vector<time_t>& timestamps,
242 std::map<time_t, std::vector<std::string> >& reverseMap,
243 const std::string& typePretty,
244 const std::string& defaultName,
245 const std::string& typeInternal
261 void ToolbarButtons();
262 void TriggerStartDropdown(
float buttonsize);
263 void TriggerSingleDropdown(
float buttonsize);
264 void TriggerForceDropdown(
float buttonsize);
265 void TriggerStopDropdown(
float buttonsize);
266 void DoTriggerDropdown(
const char* action, std::shared_ptr<TriggerGroup>& group,
bool& all);
268 void StatusBar(
float height);
271 void LoadGradient(
const std::string& friendlyName,
const std::string& internalName);
272 std::map<std::string, std::string> m_eyeGradientFriendlyNames;
273 std::vector<std::string> m_eyeGradients;
295 std::map<std::shared_ptr<SCPIMultimeter>, std::shared_ptr<Dialog> >
m_meterDialogs;
298 std::map<std::shared_ptr<SCPIPowerSupply>, std::shared_ptr<Dialog> >
m_psuDialogs;
304 std::map<std::shared_ptr<SCPIBERT>, std::shared_ptr<Dialog> >
m_bertDialogs;
310 std::map<std::shared_ptr<SCPILoad>, std::shared_ptr<Dialog> >
m_loadDialogs;
333 std::string NameNewWaveformGroup();
380 void OnDialogClosed(
const std::shared_ptr<Dialog>& dlg);
420 void DoOpenFile(
const std::string& sessionPath,
bool online);
424 bool LoadUIConfiguration(
int version,
const YAML::Node& node);
426 void OnGraphEditorConfigModified(
const std::string& blob)
429 const std::string& GetGraphEditorConfigBlob()
467 std::string GetDataDir()
485 void LoadRecentInstrumentList();
486 void SaveRecentInstrumentList();
493 void LoadRecentFileList();
494 void SaveRecentFileList();
497 void AddToRecentInstrumentList(std::shared_ptr<SCPIInstrument> inst);
504 std::string m_errorPopupTitle;
505 std::string m_errorPopupMessage;
507 bool m_showingLoadWarnings;
508 bool m_loadConfirmationChecked;
513 void ShowErrorPopup(
const std::string& title,
const std::string& msg);
539 bool DropdownButton(
const char*
id,
float height);
547 {
return m_fontmgr.
GetFont(
m_session.GetPreferences().GetFont(name.c_str())); }
549 ImU32 GetColorPref(
const std::string& name)
550 {
return m_session.GetPreferences().GetColor(name); }
552 ImTextureID GetTexture(
const std::string& name)
553 {
return m_texmgr.GetTexture(name); }
556 {
return &m_texmgr; }
577 void AddStatusHelp(
const std::string& icon,
const std::string& text)
578 { m_statusHelp[icon] = text; }
581 std::map<std::string, std::string> m_statusHelp;
587 int64_t m_toneMapTime;
590 int64_t GetToneMapTime()
591 {
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 TimebasePropertiesDialog.
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:46
ImFont * GetFont(FontDescription desc)
Gets the font, if any, for the provided description.
Definition: FontManager.h:56
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:814
std::vector< YAML::Node > m_fileBeingLoaded
YAML structure for file we're currently loading.
Definition: MainWindow.h:455
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:331
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:304
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:2352
bool m_fileLoadInProgress
True if we're actively loading a file.
Definition: MainWindow.h:458
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:1895
std::string m_sessionDataDir
Current session data directory.
Definition: MainWindow.h:464
void RemoveFunctionGenerator(std::shared_ptr< SCPIFunctionGenerator > gen)
Closes the function generator dialog, if we have one.
Definition: MainWindow.cpp:1851
void OnOpenFile(bool online)
Handler for file | open menu. Spawns the browser dialog.
Definition: MainWindow.cpp:2168
std::vector< std::shared_ptr< WaveformGroup > > m_newWaveformGroups
Set of newly created waveform groups that aren't yet docked.
Definition: MainWindow.h:328
std::string m_sessionFileName
Current session file path.
Definition: MainWindow.h:461
std::map< uintptr_t, std::string > GetGraphEditorGroups()
Returns the groups we have configured for our graph editor.
Definition: MainWindow.h:222
YAML::Node SerializeUIConfiguration()
Serialize waveform areas etc to a YAML::Node.
Definition: MainWindow.cpp:3138
void OnCursorMoved(int64_t offset)
Called when a cursor is moved, so protocol analyzers can move highlights as needed.
Definition: MainWindow.cpp:2156
int m_nextWaveformGroup
Name for next autogenerated waveform group.
Definition: MainWindow.h:331
std::shared_ptr< Dialog > m_logViewerDialog
Logfile viewer.
Definition: MainWindow.h:336
Session m_session
Our session object.
Definition: MainWindow.h:409
std::atomic< bool > m_clearPersistence
True if we should clear persistence on the next render pass.
Definition: MainWindow.h:531
bool m_openOnline
True if the pending file is to be opened online.
Definition: MainWindow.h:473
void WindowPSUMenu()
Run the Window | Power Supply menu.
Definition: MainWindow_Menus.cpp:758
std::string GetIconForFilter(Filter *f)
Gets the icon to use for a filter.
Definition: MainWindow_Icons.cpp:608
std::set< std::shared_ptr< Dialog > > m_dialogs
All dialogs and other pop-up UI elements.
Definition: MainWindow.h:292
void LoadStatusBarIcons()
Load icons for the status bar.
Definition: MainWindow_Icons.cpp:227
std::map< std::string, time_t > m_recentInstruments
List of recently used instruments.
Definition: MainWindow.h:483
void LoadToolbarIcons()
Load toolbar icons from disk if preferences changed.
Definition: MainWindow_Icons.cpp:770
static bool OnMemoryPressureStatic(MemoryPressureLevel level, MemoryPressureType type, size_t requestedSize)
Static wrapper for calling OnMemoryPressure.
Definition: MainWindow.cpp:3473
void WindowMenu()
Run the Window menu.
Definition: MainWindow_Menus.cpp:559
void DebugMenu()
Run the Debug menu.
Definition: MainWindow_Menus.cpp:840
void WindowGeneratorMenu()
Run the Window | Generator menu.
Definition: MainWindow_Menus.cpp:723
void RefreshTriggerPropertiesDialog()
Update the trigger properties dialog.
Definition: MainWindow.h:158
std::map< InstrumentChannel *, std::shared_ptr< Dialog > > m_channelPropertiesDialogs
Map of channels to properties dialogs.
Definition: MainWindow.h:316
std::shared_ptr< FileBrowser > m_fileBrowser
Browser for pending file loads.
Definition: MainWindow.h:452
std::string GetIconForWaveformShape(FunctionGenerator::WaveShape shape)
Gets the icon to use for a given wave shape.
Definition: MainWindow_Icons.cpp:758
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:249
std::vector< std::shared_ptr< WaveformGroup > > m_waveformGroups
Waveform groups.
Definition: MainWindow.h:322
std::map< std::shared_ptr< SCPIRFSignalGenerator >, std::shared_ptr< Dialog > > m_rfgeneratorDialogs
Map of RF generators to generator control dialogs.
Definition: MainWindow.h:307
ImVec2 m_workPos
Start position of the viewport minus the menu and toolbar.
Definition: MainWindow.h:283
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:566
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:1370
void FileRecentMenu()
Runs the File | Recent menu.
Definition: MainWindow_Menus.cpp:174
void AddImportMenu()
Run the Add | Import menu.
Definition: MainWindow_Menus.cpp:439
void RenderErrorPopup()
Popup message when something big goes wrong.
Definition: MainWindow.cpp:1668
std::shared_ptr< MeasurementsDialog > m_measurementsDialog
Measurements dialog.
Definition: MainWindow.h:378
std::shared_ptr< Dialog > m_preferenceDialog
Preferences.
Definition: MainWindow.h:342
std::map< std::shared_ptr< SCPIPowerSupply >, std::shared_ptr< Dialog > > m_psuDialogs
Map of PSUs to power supply control dialogs.
Definition: MainWindow.h:298
std::shared_ptr< Dialog > m_persistenceDialog
Persistence settings.
Definition: MainWindow.h:357
void RefreshTimebasePropertiesDialog()
Update the timebase properties dialog.
Definition: MainWindow.h:149
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:534
std::unique_ptr< vk::raii::CommandBuffer > m_cmdBuffer
Command buffer used during rendering operations.
Definition: MainWindow.h:537
bool SetupDataDirectory(const std::string &dataDir)
Make sure the data directory exists.
Definition: MainWindow.cpp:3052
void WindowAnalyzerMenu()
Run the Window | Analyzer menu.
Definition: MainWindow_Menus.cpp:676
void LoadWaveformShapeIcons()
Load icons for wave shape preview.
Definition: MainWindow_Icons.cpp:661
std::map< std::shared_ptr< SCPIInstrument >, std::shared_ptr< Dialog > > m_scpiConsoleDialogs
Map of instruments to SCPI console dialogs.
Definition: MainWindow.h:313
void LoadLabNotes(const std::string &dataDir)
Loads the lab notes from Markdown files in the data directory.
Definition: MainWindow.cpp:2954
void OnSaveAs()
Handler for file | save as menu. Spawns the browser dialog.
Definition: MainWindow.cpp:2184
std::map< PacketDecoder *, std::shared_ptr< ProtocolAnalyzerDialog > > m_protocolAnalyzerDialogs
Map of filters to analyzer dialogs.
Definition: MainWindow.h:319
std::map< FunctionGenerator::WaveShape, std::string > m_waveformShapeIconMap
Map of Waveform Shapes to icons.
Definition: MainWindow.h:569
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:2318
void UpdateFonts()
Font.
Definition: MainWindow.cpp:1867
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:310
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:2851
void FindAreaForStream(WaveformArea *area, StreamDescriptor stream)
Given a stream and optionally a WaveformArea, adds the stream to some area.
Definition: MainWindow.cpp:1971
float m_persistenceDecay
Persistence decay factor.
Definition: MainWindow.h:400
ImFont * GetFontPref(const std::string &name)
Returns a font, given the name of a preference setting.
Definition: MainWindow.h:546
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:1616
void HelpMenu()
Run the Help menu.
Definition: MainWindow_Menus.cpp:864
std::shared_ptr< TimebasePropertiesDialog > m_timebaseDialog
Timebase properties.
Definition: MainWindow.h:348
std::map< std::shared_ptr< SCPIFunctionGenerator >, std::shared_ptr< Dialog > > m_generatorDialogs
Map of generators to generator control dialogs.
Definition: MainWindow.h:301
void ToneMapAllWaveforms(vk::raii::CommandBuffer &cmdbuf)
Run the tone-mapping shader on all of our waveforms.
Definition: MainWindow.cpp:549
std::shared_ptr< StreamBrowserDialog > m_streamBrowser
Stream browser.
Definition: MainWindow.h:366
bool LoadDialogs(const YAML::Node &node)
Load dialog configuration.
Definition: MainWindow.cpp:2622
ImVec2 m_workSize
Size position of the viewport minus the menu and toolbar.
Definition: MainWindow.h:286
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:355
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:2228
void AddGenerateMenu()
Run the Add | Generate menu.
Definition: MainWindow_Menus.cpp:474
void ShowErrorPopup(const std::string &title, const std::string &msg)
Opens the error popup.
Definition: MainWindow.cpp:1659
void LoadGradient(const std::string &friendlyName, const std::string &internalName)
Load a single gradient.
Definition: MainWindow.cpp:817
std::map< std::string, time_t > m_recentFiles
List of recently used files.
Definition: MainWindow.h:491
void InitializeDefaultSession()
Creates a new session initialized with some default windows.
Definition: MainWindow.cpp:203
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:511
void SaveLabNotes(const std::string &dataDir)
Saves the lab notes to Markdown files in the data directory.
Definition: MainWindow.cpp:2906
std::map< std::shared_ptr< SCPIMultimeter >, std::shared_ptr< Dialog > > m_meterDialogs
Map of multimeters to meter control dialogs.
Definition: MainWindow.h:295
void LoadGradients()
Load gradient images.
Definition: MainWindow.cpp:798
std::shared_ptr< Dialog > m_metricsDialog
Performance metrics.
Definition: MainWindow.h:339
YAML::Node SerializeDialogs()
Serializes the list of open dialogs.
Definition: MainWindow.cpp:3217
void MainMenu()
Run the top level menu bar.
Definition: MainWindow_Menus.cpp:103
void WindowMultimeterMenu()
Run the Window | Multimeter menu.
Definition: MainWindow_Menus.cpp:786
bool SaveSessionToYaml(YAML::Node &node, const std::string &dataDir)
Serialize the current session to a YAML::Node.
Definition: MainWindow.cpp:3004
bool m_showDemo
Enable flag for main imgui demo window.
Definition: MainWindow.h:280
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:412
void OnScopeAdded(std::shared_ptr< Oscilloscope > scope, bool createViews)
Handles creation of a new oscilloscope.
Definition: MainWindow.cpp:383
void OnFilterReconfigured(Filter *f)
Handle a filter being reconfigured.
Definition: MainWindow.cpp:2136
std::shared_ptr< HistoryDialog > m_historyDialog
History.
Definition: MainWindow.h:345
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:325
bool m_needRender
True if a resize or other event this frame requires we re-rasterize waveforms.
Definition: MainWindow.h:526
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:1642
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:289
void RenderFileBrowser()
Runs the file browser dialog.
Definition: MainWindow.cpp:2199
void RenderLoadWarningPopup()
Popup message when loading a file that might not match the current hardware setup.
Definition: MainWindow.cpp:1690
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:102
A GLFW window containing a Vulkan surface.
Definition: VulkanWindow.h:44