diff --git a/src/cab/CabinetOutputList.cpp b/src/cab/CabinetOutputList.cpp index aa7482b..d50c237 100644 --- a/src/cab/CabinetOutputList.cpp +++ b/src/cab/CabinetOutputList.cpp @@ -43,26 +43,23 @@ const IOutput* CabinetOutputList::GetByName(const std::string& name) const if (dotParts.size() == 2) { OutputControllerList* controllers = GetOutputControllers(); - if (controllers && controllers->Contains(dotParts[0])) + int nr = 0; + if (controllers && controllers->Contains(dotParts[0]) && StringExtensions::TryParseInt(dotParts[1], nr)) { - try + for (IOutputController* controller : *controllers) { - int number = std::stoi(dotParts[1]); - for (IOutputController* controller : *controllers) + if (controller && controller->GetName() == dotParts[0]) { - if (controller && controller->GetName() == dotParts[0]) + const OutputList* outputs = controller->GetOutputs(); + if (outputs) { - const OutputList* outputs = controller->GetOutputs(); - if (outputs) - { - return outputs->FindByNumber(number); - } + const IOutput* o = outputs->FindByNumber(nr); + if (o != nullptr) + return o; } + break; } } - catch (const std::exception&) - { - } } } diff --git a/src/cab/out/dudescab/DudesCabAutoConfigurator.cpp b/src/cab/out/dudescab/DudesCabAutoConfigurator.cpp index 2c3ecb6..ecf905a 100644 --- a/src/cab/out/dudescab/DudesCabAutoConfigurator.cpp +++ b/src/cab/out/dudescab/DudesCabAutoConfigurator.cpp @@ -55,7 +55,7 @@ void DudesCabAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int outputIndex = 1; outputIndex <= device->NumOutputs(); outputIndex++) { LedWizEquivalentOutput* lweo = new LedWizEquivalentOutput(); - lweo->SetOutputName(StringExtensions::Build("{0}.{1:00}", controllerName, std::to_string(outputIndex))); + lweo->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", controllerName, std::to_string(outputIndex))); lweo->SetLedWizEquivalentOutputNumber(outputIndex); lwe->GetOutputs().AddOutput(lweo); } diff --git a/src/cab/out/ftdichip/FT245RBitbangControllerAutoConfigurator.cpp b/src/cab/out/ftdichip/FT245RBitbangControllerAutoConfigurator.cpp index 5be5c2a..3b4a24c 100644 --- a/src/cab/out/ftdichip/FT245RBitbangControllerAutoConfigurator.cpp +++ b/src/cab/out/ftdichip/FT245RBitbangControllerAutoConfigurator.cpp @@ -84,7 +84,7 @@ void FT245RBitbangControllerAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int outputIndex = 1; outputIndex <= 8; outputIndex++) { LedWizEquivalentOutput* lweo = new LedWizEquivalentOutput(); - lweo->SetOutputName(StringExtensions::Build("{0}\\{1}.{2:00}", ftDevice->GetName(), ftDevice->GetName(), std::to_string(outputIndex))); + lweo->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", ftDevice->GetName(), std::to_string(outputIndex))); lweo->SetLedWizEquivalentOutputNumber(outputIndex); lwe->GetOutputs().AddOutput(lweo); } diff --git a/src/cab/out/lw/LedWizAutoConfigurator.cpp b/src/cab/out/lw/LedWizAutoConfigurator.cpp index 8df36d3..8662b3d 100644 --- a/src/cab/out/lw/LedWizAutoConfigurator.cpp +++ b/src/cab/out/lw/LedWizAutoConfigurator.cpp @@ -56,7 +56,7 @@ void LedWizAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int i = 1; i < 33; i++) { auto lweo = new LedWizEquivalentOutput(); - lweo->SetOutputName(StringExtensions::Build("{0}.{1:00}", lw->GetName(), std::to_string(i))); + lweo->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", lw->GetName(), std::to_string(i))); lweo->SetLedWizEquivalentOutputNumber(i); lwe->GetOutputs().AddOutput(lweo); } diff --git a/src/cab/out/pac/PacLed64.cpp b/src/cab/out/pac/PacLed64.cpp index 894344c..88f294e 100644 --- a/src/cab/out/pac/PacLed64.cpp +++ b/src/cab/out/pac/PacLed64.cpp @@ -18,6 +18,19 @@ namespace DOF { std::map PacLed64::s_pacLed64Units; +bool PacLed64::s_unitsInitialized = false; + +void PacLed64::InitializeUnits() +{ + if (!s_unitsInitialized) + { + for (int i = 1; i <= 4; i++) + { + s_pacLed64Units[i] = new PacLed64Unit(i); + } + s_unitsInitialized = true; + } +} PacLed64::PacLed64() : m_id(-1) @@ -39,8 +52,7 @@ void PacLed64::SetId(int value) { if (value < 1 || value > 4) { - Log::Exception(StringExtensions::Build("PacLed64 Ids must be between 1-4. The supplied Id {0} is out of range.", std::to_string(value))); - return; + throw std::runtime_error(StringExtensions::Build("PacLed64 Ids must be between 1-4. The supplied Id {0} is out of range.", std::to_string(value))); } std::lock_guard lock(m_idUpdateLocker); @@ -79,28 +91,10 @@ void PacLed64::Init(Cabinet* cabinet) } } - // Initialize static units map if needed - static bool initialized = false; - static std::mutex initMutex; - if (!initialized) - { - std::lock_guard lock(initMutex); - if (!initialized) - { - for (int i = 1; i <= 4; i++) - { - s_pacLed64Units[i] = new PacLed64Unit(i); - } - initialized = true; - } - } - - if (s_pacLed64Units.find(m_id) != s_pacLed64Units.end()) - { - s_pacLed64Units[m_id]->SetFullUpdateThreshold(m_fullUpdateThreshold); - s_pacLed64Units[m_id]->SetMinUpdateInterval(std::chrono::milliseconds(m_minUpdateIntervalMs)); - s_pacLed64Units[m_id]->Init(cabinet); - } + InitializeUnits(); + s_pacLed64Units.at(m_id)->SetFullUpdateThreshold(m_fullUpdateThreshold); + s_pacLed64Units.at(m_id)->SetMinUpdateInterval(std::chrono::milliseconds(m_minUpdateIntervalMs)); + s_pacLed64Units.at(m_id)->Init(cabinet); Log::Write(StringExtensions::Build("PacLed64 Id:{0} initialized and updater thread started.", std::to_string(m_id))); } @@ -117,10 +111,8 @@ void PacLed64::Finish() void PacLed64::Update() { - if (s_pacLed64Units.find(m_id) != s_pacLed64Units.end()) - { - s_pacLed64Units[m_id]->TriggerPacLed64UpdaterThread(); - } + InitializeUnits(); + s_pacLed64Units.at(m_id)->TriggerPacLed64UpdaterThread(); } void PacLed64::AddOutputs() @@ -160,9 +152,9 @@ void PacLed64::OnOutputValueChanged(IOutput* output) return; } - auto it = s_pacLed64Units.find(m_id); - if (it != s_pacLed64Units.end()) - it->second->UpdateValue(on); + InitializeUnits(); + PacLed64Unit* s = s_pacLed64Units.at(m_id); + s->UpdateValue(on); } tinyxml2::XMLElement* PacLed64::ToXml(tinyxml2::XMLDocument& doc) const diff --git a/src/cab/out/pac/PacLed64.h b/src/cab/out/pac/PacLed64.h index 16a6fc0..640daa8 100644 --- a/src/cab/out/pac/PacLed64.h +++ b/src/cab/out/pac/PacLed64.h @@ -53,6 +53,8 @@ class PacLed64 : public OutputControllerBase int m_fullUpdateThreshold; static std::map s_pacLed64Units; + static bool s_unitsInitialized; + static void InitializeUnits(); void AddOutputs(); diff --git a/src/cab/out/pac/PacLed64AutoConfigurator.cpp b/src/cab/out/pac/PacLed64AutoConfigurator.cpp index d05e69b..789174e 100644 --- a/src/cab/out/pac/PacLed64AutoConfigurator.cpp +++ b/src/cab/out/pac/PacLed64AutoConfigurator.cpp @@ -67,7 +67,7 @@ void PacLed64AutoConfigurator::AutoConfig(Cabinet* cabinet) for (int i = 1; i <= 64; i++) { LedWizEquivalentOutput* lweo = new LedWizEquivalentOutput(); - lweo->SetOutputName(StringExtensions::Build("{0}.{1:00}", pacLed->GetName(), std::to_string(i))); + lweo->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", pacLed->GetName(), std::to_string(i))); lweo->SetLedWizEquivalentOutputNumber(i); lwe->GetOutputs().AddOutput(lweo); } diff --git a/src/cab/out/pac/PacUIO.cpp b/src/cab/out/pac/PacUIO.cpp index ab609c1..1535665 100644 --- a/src/cab/out/pac/PacUIO.cpp +++ b/src/cab/out/pac/PacUIO.cpp @@ -13,7 +13,7 @@ namespace DOF { -std::vector PacUIO::s_pacUIOUnits; +std::map PacUIO::s_pacUIOUnits; bool PacUIO::s_unitsInitialized = false; void PacUIO::InitializeUnits() @@ -22,7 +22,7 @@ void PacUIO::InitializeUnits() { for (int i = 0; i <= 2; i++) { - s_pacUIOUnits.push_back(new PacUIOUnit(i)); + s_pacUIOUnits[i] = new PacUIOUnit(i); } s_unitsInitialized = true; } @@ -49,24 +49,22 @@ void PacUIO::SetId(int value) void PacUIO::Update() { InitializeUnits(); - s_pacUIOUnits[m_id]->TriggerPacUIOUpdaterThread(); + s_pacUIOUnits.at(m_id)->TriggerPacUIOUpdaterThread(); } void PacUIO::Init(Cabinet* cabinet) { AddOutputs(); InitializeUnits(); - s_pacUIOUnits[m_id]->Init(cabinet); + s_pacUIOUnits.at(m_id)->Init(cabinet); Log::Write(StringExtensions::Build("PacUIO Id:{0} initialized and updater thread started.", std::to_string(m_id))); } void PacUIO::Finish() { - if (s_unitsInitialized && m_id >= 0 && m_id < static_cast(s_pacUIOUnits.size())) - { - s_pacUIOUnits[m_id]->Finish(); - s_pacUIOUnits[m_id]->ShutdownLighting(); - } + InitializeUnits(); + s_pacUIOUnits.at(m_id)->Finish(); + s_pacUIOUnits.at(m_id)->ShutdownLighting(); Log::Write(StringExtensions::Build("PacUIO Id:{0} finished and updater thread stopped.", std::to_string(m_id))); } @@ -90,7 +88,7 @@ void PacUIO::AddOutputs() Output* newOutput = new Output(); newOutput->SetName(StringExtensions::Build("{0}.{1:00}", GetName(), std::to_string(i))); newOutput->SetNumber(i); - outputs->push_back(newOutput); + outputs->Add(newOutput); } } } @@ -107,7 +105,7 @@ void PacUIO::OnOutputValueChanged(IOutput* output) } InitializeUnits(); - PacUIOUnit* s = s_pacUIOUnits[m_id]; + PacUIOUnit* s = s_pacUIOUnits.at(m_id); s->UpdateValue(on); } diff --git a/src/cab/out/pac/PacUIO.h b/src/cab/out/pac/PacUIO.h index 5e7c01d..0da2310 100644 --- a/src/cab/out/pac/PacUIO.h +++ b/src/cab/out/pac/PacUIO.h @@ -1,7 +1,7 @@ #pragma once #include "../OutputControllerBase.h" -#include +#include #include #include #include @@ -91,7 +91,7 @@ class PacUIO : public OutputControllerBase void OnPacRemoved(int index); }; - static std::vector s_pacUIOUnits; + static std::map s_pacUIOUnits; static bool s_unitsInitialized; static void InitializeUnits(); }; diff --git a/src/cab/out/pac/PacUIOAutoConfigurator.cpp b/src/cab/out/pac/PacUIOAutoConfigurator.cpp index 3fc571c..6c87601 100644 --- a/src/cab/out/pac/PacUIOAutoConfigurator.cpp +++ b/src/cab/out/pac/PacUIOAutoConfigurator.cpp @@ -68,7 +68,7 @@ void PacUIOAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int i = 1; i <= 96; i++) { LedWizEquivalentOutput* lweo = new LedWizEquivalentOutput(); - lweo->SetOutputName(StringExtensions::Build("{0}.{1:00}", pacUIO->GetName(), std::to_string(i))); + lweo->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", pacUIO->GetName(), std::to_string(i))); lweo->SetLedWizEquivalentOutputNumber(i); lwe->GetOutputs().AddOutput(lweo); } diff --git a/src/cab/out/pinone/NamedPipeServer.cpp b/src/cab/out/pinone/NamedPipeServer.cpp index 8c40d2a..28826da 100644 --- a/src/cab/out/pinone/NamedPipeServer.cpp +++ b/src/cab/out/pinone/NamedPipeServer.cpp @@ -9,6 +9,7 @@ #include #else #include +#include #include #include #include @@ -22,29 +23,29 @@ const std::string NamedPipeServer::s_pipeName = "ComPortServerPipe"; NamedPipeServer::NamedPipeServer(const std::string& comPort) : m_comPort(comPort) { - sp_get_port_by_name(comPort.c_str(), &m_serialPort); - if (m_serialPort) + if (sp_get_port_by_name(comPort.c_str(), &m_serialPort) != SP_OK || !m_serialPort) { - sp_open(m_serialPort, SP_MODE_READ_WRITE); - sp_set_baudrate(m_serialPort, 2000000); - sp_set_bits(m_serialPort, 8); - sp_set_parity(m_serialPort, SP_PARITY_NONE); - sp_set_stopbits(m_serialPort, 1); - sp_set_rts(m_serialPort, SP_RTS_ON); - sp_set_dtr(m_serialPort, SP_DTR_ON); + m_serialPort = nullptr; + throw std::runtime_error(StringExtensions::Build("Serial port {0} not found", comPort)); } -} -NamedPipeServer::~NamedPipeServer() -{ - StopServer(); - if (m_serialPort) + if (sp_open(m_serialPort, SP_MODE_READ_WRITE) != SP_OK) { - sp_close(m_serialPort); sp_free_port(m_serialPort); + m_serialPort = nullptr; + throw std::runtime_error(StringExtensions::Build("Could not open serial port {0}", comPort)); } + + sp_set_baudrate(m_serialPort, 2000000); + sp_set_bits(m_serialPort, 8); + sp_set_parity(m_serialPort, SP_PARITY_NONE); + sp_set_stopbits(m_serialPort, 1); + sp_set_rts(m_serialPort, SP_RTS_ON); + sp_set_dtr(m_serialPort, SP_DTR_ON); } +NamedPipeServer::~NamedPipeServer() { StopServer(); } + void NamedPipeServer::StartServer() { m_serverThread = std::thread( @@ -94,7 +95,25 @@ void NamedPipeServer::StartServer() continue; } - int clientSock = accept(serverSock, nullptr, nullptr); + int clientSock = -1; + while (m_isRunning) + { + fd_set readFds; + FD_ZERO(&readFds); + FD_SET(serverSock, &readFds); + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 200000; + int selectResult = select(serverSock + 1, &readFds, nullptr, nullptr, &timeout); + if (selectResult > 0) + { + clientSock = accept(serverSock, nullptr, nullptr); + break; + } + if (selectResult < 0) + break; + } + if (clientSock >= 0) { HandleClientConnection(reinterpret_cast(static_cast(clientSock))); @@ -129,6 +148,26 @@ void NamedPipeServer::HandleClientConnection(void* serverStream) bytesRead = static_cast(dwBytesRead); #else int sock = static_cast(reinterpret_cast(serverStream)); + bool readReady = false; + while (m_isRunning && !readReady) + { + fd_set readFds; + FD_ZERO(&readFds); + FD_SET(sock, &readFds); + struct timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 200000; + int selectResult = select(sock + 1, &readFds, nullptr, nullptr, &timeout); + if (selectResult > 0) + readReady = true; + else if (selectResult < 0) + break; + } + if (!readReady) + { + break; + } + bytesRead = static_cast(read(sock, request.data(), request.size())); if (bytesRead <= 0) { @@ -261,6 +300,8 @@ void NamedPipeServer::StopServer() if (m_serialPort) { sp_close(m_serialPort); + sp_free_port(m_serialPort); + m_serialPort = nullptr; } std::this_thread::sleep_for(std::chrono::milliseconds(300)); diff --git a/src/cab/out/pinone/PinOne.cpp b/src/cab/out/pinone/PinOne.cpp index d289671..fea42a6 100644 --- a/src/cab/out/pinone/PinOne.cpp +++ b/src/cab/out/pinone/PinOne.cpp @@ -159,19 +159,19 @@ void PinOne::ConnectToController() if (m_pinOneCommunication->CreateServer()) { if (!m_pinOneCommunication->ConnectToServer()) - throw std::runtime_error(StringExtensions::Build("Unable to connect to PinOne on comport {0} after server creation", m_comPort)); + throw std::runtime_error("Unable to connect to server after new creation"); } else { - throw std::runtime_error(StringExtensions::Build("Unable to create PinOne server for comport {0}", m_comPort)); + throw std::runtime_error("Unable to create server"); } } } catch (const std::exception& e) { - std::string msg = StringExtensions::Build("A exception occurred while opening comport {0} for {1}.", m_comPort, GetName()); - Log::Warning(msg); - throw; + std::string msg = StringExtensions::Build("A exception occurred while opening comport {2} for {0} {1}.", "PinOne", GetName(), m_comPort); + Log::Exception(StringExtensions::Build("{0}: {1}", msg, e.what())); + throw std::runtime_error(msg); } } diff --git a/src/cab/out/ps/PinscapeAutoConfigurator.cpp b/src/cab/out/ps/PinscapeAutoConfigurator.cpp index 76610aa..6a8af4c 100644 --- a/src/cab/out/ps/PinscapeAutoConfigurator.cpp +++ b/src/cab/out/ps/PinscapeAutoConfigurator.cpp @@ -65,7 +65,7 @@ void PinscapeAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int i = 1; i <= p->GetNumberOfOutputs(); i++) { auto output = new LedWizEquivalentOutput(); - output->SetOutputName(StringExtensions::Build("{0}.{1:00}", p->GetName(), std::to_string(i))); + output->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", p->GetName(), std::to_string(i))); output->SetLedWizEquivalentOutputNumber(i); lwe->GetOutputs().AddOutput(output); } diff --git a/src/cab/out/pspico/PinscapePico.cpp b/src/cab/out/pspico/PinscapePico.cpp index b38abf1..0687a18 100644 --- a/src/cab/out/pspico/PinscapePico.cpp +++ b/src/cab/out/pspico/PinscapePico.cpp @@ -117,7 +117,7 @@ void PinscapePico::ConnectToController() { m_dev = device; Log::Write(StringExtensions::Build("PinscapePico {0} connected successfully", GetName())); - m_oldOutputValues.resize(GetNumberOfOutputs(), 0); + m_oldOutputValues.assign(GetNumberOfOutputs(), 255); return; } } diff --git a/src/cab/out/pspico/PinscapePicoAutoConfigurator.cpp b/src/cab/out/pspico/PinscapePicoAutoConfigurator.cpp index df58bc7..996596d 100644 --- a/src/cab/out/pspico/PinscapePicoAutoConfigurator.cpp +++ b/src/cab/out/pspico/PinscapePicoAutoConfigurator.cpp @@ -78,7 +78,7 @@ void PinscapePicoAutoConfigurator::AutoConfig(Cabinet* cabinet) for (int i = 1; i <= p->GetNumberOfOutputs(); i++) { auto output = new LedWizEquivalentOutput(); - output->SetOutputName(StringExtensions::Build("{0}.{1:00}", p->GetName(), std::to_string(i))); + output->SetOutputName(StringExtensions::Build("{0}\\{0}.{1:00}", p->GetName(), std::to_string(i))); output->SetLedWizEquivalentOutputNumber(i); lwe->GetOutputs().AddOutput(output); } diff --git a/src/cab/toys/lwequivalent/LedWizEquivalent.cpp b/src/cab/toys/lwequivalent/LedWizEquivalent.cpp index 92394e7..9745a00 100644 --- a/src/cab/toys/lwequivalent/LedWizEquivalent.cpp +++ b/src/cab/toys/lwequivalent/LedWizEquivalent.cpp @@ -2,9 +2,6 @@ #include "../../Cabinet.h" #include "../../CabinetOutputList.h" #include "../ToyList.h" -#include "../../out/OutputControllerList.h" -#include "../../out/IOutputController.h" -#include "../../out/OutputControllerBase.h" #include "../../out/OutputList.h" #include "../../out/Output.h" #include "../../../Log.h" @@ -172,9 +169,6 @@ void LedWizEquivalent::ResolveOutputs(Cabinet* cabinet) if (outputName.empty()) continue; - // Resolve the same way the C# original does (Cabinet.Outputs[OutputName]). - // CabinetOutputList::GetByName understands the "{controller}\{output}" path - // form the auto-configurators emit, so hierarchical names resolve here too. CabinetOutputList* cabinetOutputs = cabinet->GetOutputs(); IOutput* physicalOutput = cabinetOutputs != nullptr ? cabinetOutputs->GetByName(outputName) : nullptr; diff --git a/src/general/StringExtensions.cpp b/src/general/StringExtensions.cpp index 5d9ba33..da2aed6 100644 --- a/src/general/StringExtensions.cpp +++ b/src/general/StringExtensions.cpp @@ -239,9 +239,19 @@ std::string StringExtensions::GetFileNameWithoutExtension(const std::string& ful bool StringExtensions::TryParseInt(const std::string& str, int& value) { - if (str.empty()) + std::string s = Trim(str); + if (s.empty()) return false; - return (std::from_chars(str.c_str(), str.c_str() + str.length(), value).ec == std::errc { }); + const char* first = s.c_str(); + const char* last = s.c_str() + s.length(); + if (*first == '+') + { + ++first; + if (first == last || *first == '-' || *first == '+') + return false; + } + std::from_chars_result result = std::from_chars(first, last, value); + return result.ec == std::errc { } && result.ptr == last; } bool StringExtensions::IsHexString(const std::string& s) diff --git a/src/pinballsupport/AlarmHandler.cpp b/src/pinballsupport/AlarmHandler.cpp index aab99ea..a9afb5a 100644 --- a/src/pinballsupport/AlarmHandler.cpp +++ b/src/pinballsupport/AlarmHandler.cpp @@ -22,12 +22,15 @@ void AlarmHandler::Finish() m_intervalAlarmList.clear(); } -void AlarmHandler::RegisterAlarm(int durationMs, AlarmCallback alarmHandler, bool dontUnregister) +void AlarmHandler::RegisterAlarm(int durationMs, AlarmCallback alarmHandler, bool doNotUnregister) { std::lock_guard lock(m_alarmMutex); + if (!doNotUnregister) + UnregisterAlarm(alarmHandler); + TimePoint alarmTime = std::chrono::steady_clock::now() + std::chrono::milliseconds(durationMs); - m_alarmList.emplace_back(alarmTime, alarmHandler, dontUnregister); + m_alarmList.emplace_back(alarmTime, alarmHandler); } void AlarmHandler::UnregisterAlarm(AlarmCallback alarmHandler) @@ -200,35 +203,15 @@ bool AlarmHandler::ProcessIntervalAlarms(TimePoint alarmTime) return alarmsExecuted; } -void AlarmHandler::RegisterAlarm(int durationMs, AlarmCallback alarmHandler, void* parameter, bool dontUnregister) +void AlarmHandler::RegisterAlarm(int durationMs, AlarmCallback alarmHandler, void* parameter, bool doNotUnregister) { std::lock_guard lock(m_alarmMutex); - if (!dontUnregister) - { - UnregisterAlarm(alarmHandler, parameter); - } + if (!doNotUnregister) + UnregisterAlarm(alarmHandler); TimePoint alarmTime = std::chrono::steady_clock::now() + std::chrono::milliseconds(durationMs); - m_alarmList.emplace_back(alarmTime, alarmHandler, parameter, dontUnregister); -} - -void AlarmHandler::UnregisterAlarm(AlarmCallback alarmHandler, void* parameter) -{ - std::lock_guard lock(m_alarmMutex); - - auto it = m_alarmList.begin(); - while (it != m_alarmList.end()) - { - if (it->alarmHandler == alarmHandler && it->hasParameter && it->parameter == parameter) - { - it = m_alarmList.erase(it); - } - else - { - ++it; - } - } + m_alarmList.emplace_back(alarmTime, alarmHandler, parameter); } } \ No newline at end of file diff --git a/src/pinballsupport/AlarmHandler.h b/src/pinballsupport/AlarmHandler.h index 235c4ec..a21e29e 100644 --- a/src/pinballsupport/AlarmHandler.h +++ b/src/pinballsupport/AlarmHandler.h @@ -26,10 +26,9 @@ class AlarmHandler void Init(Pinball* pPinball); void Finish(); - void RegisterAlarm(int durationMs, AlarmCallback alarmHandler, bool dontUnregister = false); + void RegisterAlarm(int durationMs, AlarmCallback alarmHandler, bool doNotUnregister = false); void UnregisterAlarm(AlarmCallback alarmHandler); - void RegisterAlarm(int durationMs, AlarmCallback alarmHandler, void* parameter, bool dontUnregister = false); - void UnregisterAlarm(AlarmCallback alarmHandler, void* parameter); + void RegisterAlarm(int durationMs, AlarmCallback alarmHandler, void* parameter, bool doNotUnregister = false); void RegisterIntervalAlarm(int intervalMs, AlarmCallback intervalAlarmHandler); void UnregisterIntervalAlarm(AlarmCallback intervalAlarmHandler); @@ -43,23 +42,20 @@ class AlarmHandler AlarmCallback alarmHandler; void* parameter; bool hasParameter; - bool dontUnregister; - AlarmSetting(TimePoint time, AlarmCallback handler, bool dontUnreg = false) + AlarmSetting(TimePoint time, AlarmCallback handler) : alarmTime(time) , alarmHandler(handler) , parameter(nullptr) , hasParameter(false) - , dontUnregister(dontUnreg) { } - AlarmSetting(TimePoint time, AlarmCallback handler, void* param, bool dontUnreg = false) + AlarmSetting(TimePoint time, AlarmCallback handler, void* param) : alarmTime(time) , alarmHandler(handler) , parameter(param) , hasParameter(true) - , dontUnregister(dontUnreg) { }