Skip to content
23 changes: 10 additions & 13 deletions src/cab/CabinetOutputList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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&)
{
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/cab/out/dudescab/DudesCabAutoConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/cab/out/lw/LedWizAutoConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
54 changes: 23 additions & 31 deletions src/cab/out/pac/PacLed64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ namespace DOF
{

std::map<int, PacLed64::PacLed64Unit*> 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)
Expand All @@ -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<std::mutex> lock(m_idUpdateLocker);
Expand Down Expand Up @@ -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<std::mutex> 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)));
}
Expand All @@ -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()
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/cab/out/pac/PacLed64.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class PacLed64 : public OutputControllerBase
int m_fullUpdateThreshold;

static std::map<int, PacLed64Unit*> s_pacLed64Units;
static bool s_unitsInitialized;
static void InitializeUnits();

void AddOutputs();

Expand Down
2 changes: 1 addition & 1 deletion src/cab/out/pac/PacLed64AutoConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
20 changes: 9 additions & 11 deletions src/cab/out/pac/PacUIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace DOF
{

std::vector<PacUIO::PacUIOUnit*> PacUIO::s_pacUIOUnits;
std::map<int, PacUIO::PacUIOUnit*> PacUIO::s_pacUIOUnits;
bool PacUIO::s_unitsInitialized = false;

void PacUIO::InitializeUnits()
Expand All @@ -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;
}
Expand All @@ -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<int>(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)));
}

Expand All @@ -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);
}
}
}
Expand All @@ -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);
}

Expand Down
4 changes: 2 additions & 2 deletions src/cab/out/pac/PacUIO.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#pragma once

#include "../OutputControllerBase.h"
#include <vector>
#include <map>
#include <thread>
#include <mutex>
#include <condition_variable>
Expand Down Expand Up @@ -91,7 +91,7 @@ class PacUIO : public OutputControllerBase
void OnPacRemoved(int index);
};

static std::vector<PacUIOUnit*> s_pacUIOUnits;
static std::map<int, PacUIOUnit*> s_pacUIOUnits;
static bool s_unitsInitialized;
static void InitializeUnits();
};
Expand Down
2 changes: 1 addition & 1 deletion src/cab/out/pac/PacUIOAutoConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
73 changes: 57 additions & 16 deletions src/cab/out/pinone/NamedPipeServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <windows.h>
#else
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/un.h>
#include <unistd.h>
#include <cstring>
Expand All @@ -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(
Expand Down Expand Up @@ -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<void*>(static_cast<intptr_t>(clientSock)));
Expand Down Expand Up @@ -129,6 +148,26 @@ void NamedPipeServer::HandleClientConnection(void* serverStream)
bytesRead = static_cast<int>(dwBytesRead);
#else
int sock = static_cast<int>(reinterpret_cast<intptr_t>(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<int>(read(sock, request.data(), request.size()));
if (bytesRead <= 0)
{
Expand Down Expand Up @@ -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));
Expand Down
Loading
Loading