1
0
Fork 0
mirror of https://github.com/gwm17/Specter.git synced 2024-11-22 18:28:52 -05:00

Fixed gross code for creating data sources. Now much cleaner, easier to understand.

This commit is contained in:
Gordon McCann 2022-11-06 09:59:18 -05:00
parent cfb7c7cd76
commit 632004b52e
9 changed files with 90 additions and 108 deletions

View File

@ -226,7 +226,11 @@ namespace Specter {
m_scalerPanel.OnImGuiRender(m_manager, m_scalerList, m_graphList); m_scalerPanel.OnImGuiRender(m_manager, m_scalerList, m_graphList);
m_sourceDialog.ImGuiRenderSourceDialog(); if (m_sourceDialog.ImGuiRenderSourceDialog())
{
PhysicsStartEvent event(m_sourceDialog.GetArgs());
m_callbackFunc(event);
}
RemoveHistogramDialog(); RemoveHistogramDialog();

View File

@ -18,7 +18,7 @@
namespace Specter { namespace Specter {
SourceDialog::SourceDialog() : SourceDialog::SourceDialog() :
m_openFlag(false), m_chosenPort("51489"), m_chosenWindow(2000000) m_openFlag(false)
{ {
} }
@ -26,63 +26,60 @@ namespace Specter {
{ {
} }
void SourceDialog::ImGuiRenderSourceDialog() bool SourceDialog::ImGuiRenderSourceDialog()
{ {
SPEC_PROFILE_FUNCTION(); SPEC_PROFILE_FUNCTION();
static bool onlineFlag = false; static bool result = false;
static bool offlineFlag = false;
static std::vector<DataSource::SourceType> availTypes = { DataSource::SourceType::CompassOnline, DataSource::SourceType::CompassOffline, DataSource::SourceType::DaqromancyOnline, static std::vector<DataSource::SourceType> availTypes = { DataSource::SourceType::CompassOnline, DataSource::SourceType::CompassOffline, DataSource::SourceType::DaqromancyOnline,
DataSource::SourceType::DaqromancyOffline, DataSource::SourceType::CharonOnline }; DataSource::SourceType::DaqromancyOffline, DataSource::SourceType::CharonOnline };
result = false;
if (m_openFlag) if (m_openFlag)
{ {
onlineFlag = false;
offlineFlag = false;
m_openFlag = false; m_openFlag = false;
m_chosenType = DataSource::SourceType::None; m_args.type = DataSource::SourceType::None;
m_chosenLocation = ""; m_args.location = "";
m_chosenPort = "51489"; m_args.port = "52324";
m_chosenWindow = 3000000; m_args.coincidenceWindow = 3000000;
m_bitflags = 0; m_args.bitflags = 0;
ImGui::OpenPopup(ICON_FA_LINK " Attach Source"); ImGui::OpenPopup(ICON_FA_LINK " Attach Source");
} }
if (ImGui::BeginPopupModal(ICON_FA_LINK " Attach Source")) if (ImGui::BeginPopupModal(ICON_FA_LINK " Attach Source"))
{ {
if (ImGui::BeginCombo("Source Type", ConvertDataSourceTypeToString(m_chosenType).c_str())) if (ImGui::BeginCombo("Source Type", ConvertDataSourceTypeToString(m_args.type).c_str()))
{ {
for (auto& type : availTypes) for (auto& type : availTypes)
{ {
if (ImGui::Selectable(ConvertDataSourceTypeToString(type).c_str(), type == m_chosenType, ImGuiSelectableFlags_DontClosePopups)) if (ImGui::Selectable(ConvertDataSourceTypeToString(type).c_str(), type == m_args.type, ImGuiSelectableFlags_DontClosePopups))
{ {
m_chosenType = type; m_args.type = type;
} }
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
if (m_chosenType == DataSource::SourceType::CompassOnline) if (m_args.type == DataSource::SourceType::CompassOnline)
{ {
ImGui::InputText("Hostname", &m_chosenLocation); ImGui::InputText("Hostname", &m_args.location);
ImGui::InputText("Port", &m_chosenPort); ImGui::InputText("Port", &m_args.port);
if (ImGui::RadioButton("Energy", (m_bitflags & CompassHeaders::Energy) != 0)) if (ImGui::RadioButton("Energy", (m_args.bitflags & CompassHeaders::Energy) != 0))
{ {
m_bitflags = m_bitflags ^ CompassHeaders::Energy; m_args.bitflags = m_args.bitflags ^ CompassHeaders::Energy;
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::RadioButton("Energy Short", (m_bitflags & CompassHeaders::EnergyShort) != 0)) if (ImGui::RadioButton("Energy Short", (m_args.bitflags & CompassHeaders::EnergyShort) != 0))
{ {
m_bitflags = m_bitflags ^ CompassHeaders::EnergyShort; m_args.bitflags = m_args.bitflags ^ CompassHeaders::EnergyShort;
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::RadioButton("Energy Calibrated", (m_bitflags & CompassHeaders::EnergyCalibrated) != 0)) if (ImGui::RadioButton("Energy Calibrated", (m_args.bitflags & CompassHeaders::EnergyCalibrated) != 0))
{ {
m_bitflags = m_bitflags ^ CompassHeaders::EnergyCalibrated; m_args.bitflags = m_args.bitflags ^ CompassHeaders::EnergyCalibrated;
} }
ImGui::InputInt("Coinc. Window (ps)", &m_chosenWindow); ImGui::InputScalar("Coinc. Window (ps)", ImGuiDataType_U64, &m_args.coincidenceWindow);
} }
else if (m_chosenType == DataSource::SourceType::CompassOffline) else if (m_args.type == DataSource::SourceType::CompassOffline)
{ {
ImGui::InputText("Run Directory", &m_chosenLocation); ImGui::InputText("Run Directory", &m_args.location);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Choose Location")) if (ImGui::Button("Choose Location"))
{ {
@ -90,18 +87,18 @@ namespace Specter {
} }
auto temp = m_fileDialog.RenderFileDialog(); auto temp = m_fileDialog.RenderFileDialog();
if (!temp.first.empty() && temp.second == FileDialog::Type::OpenDir) if (!temp.first.empty() && temp.second == FileDialog::Type::OpenDir)
m_chosenLocation = temp.first; m_args.location = temp.first;
ImGui::InputInt("Coinc. Window (ps)", &m_chosenWindow); ImGui::InputScalar("Coinc. Window (ps)", ImGuiDataType_U64, &m_args.coincidenceWindow);
} }
else if (m_chosenType == DataSource::SourceType::DaqromancyOnline) else if (m_args.type == DataSource::SourceType::DaqromancyOnline)
{ {
ImGui::InputText("Hostname", &m_chosenLocation); ImGui::InputText("Hostname", &m_args.location);
ImGui::InputText("Port", &m_chosenPort); ImGui::InputText("Port", &m_args.port);
ImGui::InputInt("Coinc. Window (ps)", &m_chosenWindow); ImGui::InputScalar("Coinc. Window (ps)", ImGuiDataType_U64, &m_args.coincidenceWindow);
} }
else if (m_chosenType == DataSource::SourceType::DaqromancyOffline) else if (m_args.type == DataSource::SourceType::DaqromancyOffline)
{ {
ImGui::InputText("Run Directory", &m_chosenLocation); ImGui::InputText("Run Directory", &m_args.location);
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Choose Location")) if (ImGui::Button("Choose Location"))
{ {
@ -109,29 +106,29 @@ namespace Specter {
} }
auto temp = m_fileDialog.RenderFileDialog(); auto temp = m_fileDialog.RenderFileDialog();
if (!temp.first.empty() && temp.second == FileDialog::Type::OpenDir) if (!temp.first.empty() && temp.second == FileDialog::Type::OpenDir)
m_chosenLocation = temp.first; m_args.location = temp.first;
ImGui::InputInt("Coinc. Window (ps)", &m_chosenWindow); ImGui::InputScalar("Coinc. Window (ps)", ImGuiDataType_U64, &m_args.coincidenceWindow);
} }
else if (m_chosenType == DataSource::SourceType::CharonOnline) else if (m_args.type == DataSource::SourceType::CharonOnline)
{ {
ImGui::InputText("Hostname", &m_chosenLocation); ImGui::InputText("Hostname", &m_args.location);
ImGui::InputText("Port", &m_chosenPort); ImGui::InputText("Port", &m_args.port);
} }
if (ImGui::Button("Ok")) if (ImGui::Button("Ok"))
{ {
PhysicsStartEvent event(m_chosenLocation, m_chosenType, m_chosenWindow, m_chosenPort, m_bitflags); result = true;
Application::Get().OnEvent(event);
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} }
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Cancel")) if (ImGui::Button("Cancel"))
{ {
result = false;
ImGui::CloseCurrentPopup(); ImGui::CloseCurrentPopup();
} }
ImGui::EndPopup(); ImGui::EndPopup();
} }
return result;
} }
} }

View File

@ -19,17 +19,15 @@ namespace Specter {
SourceDialog(); SourceDialog();
~SourceDialog(); ~SourceDialog();
void ImGuiRenderSourceDialog(); bool ImGuiRenderSourceDialog();
inline const SourceArgs& GetArgs() const { return m_args; }
inline void OpenSourceDialog() { m_openFlag = true; } inline void OpenSourceDialog() { m_openFlag = true; }
private: private:
bool m_openFlag; bool m_openFlag;
DataSource::SourceType m_chosenType; SourceArgs m_args;
std::string m_chosenLocation;
std::string m_chosenPort;
FileDialog m_fileDialog; FileDialog m_fileDialog;
uint16_t m_bitflags;
int m_chosenWindow;
}; };
} }

View File

@ -21,30 +21,22 @@ namespace Specter {
{ {
public: public:
//Bitflags is a final option for random crap needed for a source. Currently used for compass online to indicate header state. //Bitflags is a final option for random crap needed for a source. Currently used for compass online to indicate header state.
PhysicsStartEvent(const std::string& loc, DataSource::SourceType type, uint64_t window, const std::string& port = "51489", uint16_t bitflags = 0) : PhysicsStartEvent(const SourceArgs& args) :
m_sourceLocation(loc), m_port(port), m_sourceType(type), m_coincidenceWindow(window), m_bitflags(bitflags) m_args(args)
{} {}
inline const std::string GetSourceLocation() const { return m_sourceLocation; } const SourceArgs& GetSourceArgs() const { return m_args; }
inline const std::string GetSourcePort() const { return m_port; }
inline const DataSource::SourceType GetSourceType() const { return m_sourceType; }
inline const uint64_t GetCoincidenceWindow() const { return m_coincidenceWindow; }
inline const uint16_t GetBitFlags() const { return m_bitflags; }
std::string ToString() const override std::string ToString() const override
{ {
return "Starting PhysicsEventBuilder with DataSource of type {0} at location {1}" + m_sourceLocation + ConvertDataSourceTypeToString(m_sourceType); return "Starting PhysicsEventBuilder with DataSource of type " + ConvertDataSourceTypeToString(m_args.type) + " at location " + m_args.location;
} }
EVENT_CATEGORY_SETUP(EventCategoryPhysics); EVENT_CATEGORY_SETUP(EventCategoryPhysics);
EVENT_TYPE_SETUP(PhysicsStart); EVENT_TYPE_SETUP(PhysicsStart);
private: private:
std::string m_sourceLocation; SourceArgs m_args;
std::string m_port;
DataSource::SourceType m_sourceType;
uint64_t m_coincidenceWindow;
uint16_t m_bitflags;
}; };
class PhysicsStopEvent : public Event class PhysicsStopEvent : public Event

View File

@ -16,15 +16,15 @@
namespace Specter { namespace Specter {
//loc=either an ip address or a file location, port=address port, or unused in case of file //loc=either an ip address or a file location, port=address port, or unused in case of file
DataSource* CreateDataSource(const std::string& location, const std::string& port, uint16_t header, DataSource::SourceType type, uint64_t coincidenceWindow) DataSource* CreateDataSource(const SourceArgs& args)
{ {
switch(type) switch(args.type)
{ {
case DataSource::SourceType::CompassOffline: return new CompassRun(location, coincidenceWindow); case DataSource::SourceType::CompassOffline: return new CompassRun(args.location, args.coincidenceWindow);
case DataSource::SourceType::CompassOnline: return new CompassOnlineSource(location, port, header, coincidenceWindow); case DataSource::SourceType::CompassOnline: return new CompassOnlineSource(args.location, args.port, args.bitflags, args.coincidenceWindow);
case DataSource::SourceType::DaqromancyOffline: return new DYFileSource(location, coincidenceWindow); case DataSource::SourceType::DaqromancyOffline: return new DYFileSource(args.location, args.coincidenceWindow);
case DataSource::SourceType::DaqromancyOnline: return new DYOnlineSource(location, port, coincidenceWindow); case DataSource::SourceType::DaqromancyOnline: return new DYOnlineSource(args.location, args.port, args.coincidenceWindow);
case DataSource::SourceType::CharonOnline: return new CharonOnlineSource(location, port); case DataSource::SourceType::CharonOnline: return new CharonOnlineSource(args.location, args.port);
case DataSource::SourceType::None: return nullptr; case DataSource::SourceType::None: return nullptr;
} }
SPEC_WARN("Invalid DataSourceType at CreateDataSource!"); SPEC_WARN("Invalid DataSourceType at CreateDataSource!");

View File

@ -46,7 +46,16 @@ namespace Specter {
PhysicsEventBuilder m_eventBuilder; PhysicsEventBuilder m_eventBuilder;
}; };
DataSource* CreateDataSource(const std::string& location, const std::string& port, uint16_t bitflags, DataSource::SourceType type, uint64_t coincidenceWindow); struct SourceArgs
{
DataSource::SourceType type = DataSource::SourceType::None;
std::string location = "";
std::string port = "";
uint64_t coincidenceWindow = 0;
uint16_t bitflags = 0;
};
DataSource* CreateDataSource(const SourceArgs& args);
std::string ConvertDataSourceTypeToString(DataSource::SourceType type); std::string ConvertDataSourceTypeToString(DataSource::SourceType type);
} }

View File

@ -23,7 +23,6 @@ namespace Specter {
if (m_activeFlag) if (m_activeFlag)
{ {
DetachDataSource(); DetachDataSource();
DestroyPhysThread();
} }
} }
@ -50,17 +49,10 @@ namespace Specter {
if(m_activeFlag) if(m_activeFlag)
{ {
DetachDataSource(); DetachDataSource();
DestroyPhysThread();
} }
AttachDataSource(event); AttachDataSource(event.GetSourceArgs());
//If we succesfully attached, fire up a new phys thread
if(m_activeFlag)
{
SPEC_INFO("Starting new analysis thread...");
m_physThread = new std::thread(&PhysicsLayer::RunSource, std::ref(*this));
}
return true; return true;
} }
@ -70,7 +62,6 @@ namespace Specter {
if (m_activeFlag) if (m_activeFlag)
{ {
DetachDataSource(); DetachDataSource();
DestroyPhysThread();
} }
return true; return true;
} }
@ -85,34 +76,17 @@ namespace Specter {
/*Threaded functions*/ /*Threaded functions*/
void PhysicsLayer::DestroyPhysThread() void PhysicsLayer::AttachDataSource(const SourceArgs& args)
{
SPEC_PROFILE_FUNCTION();
SPEC_INFO("Destroying the analysis thread...");
//Join the thread back to the parent (finish up the thread)
if(m_physThread != nullptr && m_physThread->joinable())
{
m_physThread->join();
}
//Free the thread memory
if(m_physThread != nullptr)
{
delete m_physThread;
m_physThread = nullptr;
}
SPEC_INFO("Thread destroyed.");
}
void PhysicsLayer::AttachDataSource(PhysicsStartEvent& event)
{ {
SPEC_PROFILE_FUNCTION(); SPEC_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_sourceMutex); //Shouldn't matter for this, but safety first std::scoped_lock<std::mutex> guard(m_sourceMutex); //Shouldn't matter for this, but safety first
m_source.reset(CreateDataSource(event.GetSourceLocation(), event.GetSourcePort(), event.GetBitFlags(), event.GetSourceType(), event.GetCoincidenceWindow())); m_source.reset(CreateDataSource(args));
if (m_source->IsValid()) if (m_source->IsValid())
{ {
SPEC_INFO("Attach successful. Enabling data pull..."); SPEC_INFO("Source attached... Starting new analysis thread...");
m_activeFlag = true; m_activeFlag = true;
m_physThread = new std::thread(&PhysicsLayer::RunSource, std::ref(*this));
} }
else else
{ {
@ -124,10 +98,18 @@ namespace Specter {
void PhysicsLayer::DetachDataSource() void PhysicsLayer::DetachDataSource()
{ {
SPEC_PROFILE_FUNCTION(); SPEC_PROFILE_FUNCTION();
std::scoped_lock<std::mutex> guard(m_sourceMutex);
SPEC_INFO("Detaching physics data source..."); SPEC_INFO("Detaching physics data source...");
std::scoped_lock<std::mutex> guard(m_sourceMutex);
m_activeFlag = false; m_activeFlag = false;
m_source.reset(nullptr); m_source.reset(nullptr);
if (m_physThread != nullptr && m_physThread->joinable())
{
m_physThread->join();
}
delete m_physThread;
m_physThread = nullptr;
SPEC_INFO("Detach succesful."); SPEC_INFO("Detach succesful.");
} }

View File

@ -42,8 +42,7 @@ namespace Specter {
void PushStage(AnalysisStage* stage); void PushStage(AnalysisStage* stage);
private: private:
void DestroyPhysThread(); void AttachDataSource(const SourceArgs& args);
void AttachDataSource(PhysicsStartEvent& event);
void DetachDataSource(); void DetachDataSource();
void RunSource(); void RunSource();

View File

@ -30,7 +30,7 @@ namespace Specter {
asio::ip::tcp::resolver resolver(m_context); asio::ip::tcp::resolver resolver(m_context);
auto end_points = resolver.resolve(hostname, port); auto end_points = resolver.resolve(hostname, port);
m_deadline.expires_after(std::chrono::seconds(60)); m_deadline.expires_after(std::chrono::seconds(30));
asio::async_connect(m_socket, end_points, asio::async_connect(m_socket, end_points,
[this, hostname, port](std::error_code ec, asio::ip::tcp::endpoint endpoint) [this, hostname, port](std::error_code ec, asio::ip::tcp::endpoint endpoint)
{ {
@ -44,6 +44,7 @@ namespace Specter {
else else
{ {
SPEC_WARN("Unable to connect to CharonClient {0}:{1}" , hostname, port); SPEC_WARN("Unable to connect to CharonClient {0}:{1}" , hostname, port);
m_socket.close();
} }
} }
); );