diff --git a/hardware/cpp/src/dmxSender.cpp b/hardware/cpp/src/dmxSender.cpp index 9f372ca..eca2123 100644 --- a/hardware/cpp/src/dmxSender.cpp +++ b/hardware/cpp/src/dmxSender.cpp @@ -66,17 +66,6 @@ DMXError DMXDevice::connect(char* serialNumber){ return DMX_SET_FLOW_ERROR; } - std::cout << " [DMXSENDER] " << "DMXDevice set up!" << std::endl; - std::cout << " [DMXSENDER] " << "Preparing sending job..." << std::endl; - - // Send the DMX frames - std::thread updateThread([this]() { - this->sendDMX(ftHandle); - }); - - updateThread.detach(); - - std::cout << " [DMXSENDER] " << "Sending job executed!" << std::endl; std::cout << " [DMXSENDER] " << "DMXDevice connected!" << std::endl; return DMX_OK; } @@ -84,7 +73,15 @@ DMXError DMXDevice::connect(char* serialNumber){ // Activate the DMX flow DMXError DMXDevice::activate(){ std::cout << " [DMXSENDER] " << "Activating the DMXDevice..." << std::endl; + isOutputActivated.store(true); + // Send the DMX frames + std::thread updateThread([this]() { + this->sendDMX(ftHandle); + }); + + updateThread.detach(); + std::cout << " [DMXSENDER] " << "DMXDevice activated!" << std::endl; return DMX_OK; } @@ -142,32 +139,30 @@ FT_STATUS DMXDevice::sendBreak(FT_HANDLE ftHandle) { // Continuously send the DMX frame void DMXDevice::sendDMX(FT_HANDLE ftHandle) { - while (true) { - if(isOutputActivated){ - // Send the BREAK - ftStatus = sendBreak(ftHandle); - if (ftStatus != FT_OK) { - std::cout << " [DMXSENDER] " << "Unable to send break signal! Deactivating output..." << std::endl; - deactivate(); - continue; - } - - // Send the MAB - std::this_thread::sleep_for(std::chrono::microseconds(MAB_DURATION_US)); - - DWORD bytesWritten = 0; - - // Send the DMX frame - ftStatus = FT_Write(ftHandle, dmxData, DMX_CHANNELS, &bytesWritten); - if (ftStatus != FT_OK || bytesWritten != DMX_CHANNELS) { // Error detected when trying to send the frame. Deactivate the line. - std::cout << " [DMXSENDER] " << "Error when trying to send the DMX frame! Deactivating output..." << std::endl; - deactivate(); - continue; - } - - // Wait before sending the next frame - std::this_thread::sleep_for(std::chrono::microseconds(INTERVAL - BREAK_DURATION_US - MAB_DURATION_US)); + while (isOutputActivated) { + // Send the BREAK + ftStatus = sendBreak(ftHandle); + if (ftStatus != FT_OK) { + std::cout << " [DMXSENDER] " << "Unable to send break signal! Deactivating output..." << std::endl; + deactivate(); + continue; } + + // Send the MAB + std::this_thread::sleep_for(std::chrono::microseconds(MAB_DURATION_US)); + + DWORD bytesWritten = 0; + + // Send the DMX frame + ftStatus = FT_Write(ftHandle, dmxData, DMX_CHANNELS, &bytesWritten); + if (ftStatus != FT_OK || bytesWritten != DMX_CHANNELS) { // Error detected when trying to send the frame. Deactivate the line. + std::cout << " [DMXSENDER] " << "Error when trying to send the DMX frame! Deactivating output..." << std::endl; + deactivate(); + continue; + } + + // Wait before sending the next frame + std::this_thread::sleep_for(std::chrono::microseconds(INTERVAL - BREAK_DURATION_US - MAB_DURATION_US)); } }