///------------------------------------------------------------------------------------------------- /// /// \file ovpCBoxAlgorithmTactiloController.cpp /// \brief Functions of the Box Tactilo Controller. /// \author Tobias Baumann (TH-Nürnberg). /// \version 1.0. /// \date Mon Feb 21 14:59:56 2022. /// \copyright GNU Affero General Public License v3.0. /// ///------------------------------------------------------------------------------------------------- //includes #include "ovpCBoxAlgorithmTactiloController.h" using namespace OpenViBE; using namespace /*OpenViBE::*/Kernel; using namespace /*OpenViBE::*/Plugins; using namespace /*OpenViBE::Plugins::*/Tactilebci; /*******************************************************************************/ bool CBoxAlgorithmTactiloController::initialize() { m_StimDecoder.initialize(*this, 0); m_StimEncoder.initialize(*this, 0); //get Box Settings m_PortName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); m_RowBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); m_nTactilos = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); //set m_nTactilos to 2 if lower than 2 if(m_nTactilos < 2) { m_nTactilos = 2; } //set m_nTactilos to MAX if greater than MAX_TACTILOS if(m_nTactilos > MAX_TACTILOS) { m_nTactilos = MAX_TACTILOS; } //open serial port and set baudrate to 115200 m_Port.open(m_PortName.toASCIIString()); m_Port.set_option(boost::asio::serial_port::baud_rate(115200)); if(m_Port.is_open()) { this->getLogManager() << LogLevel_Info << "Connected to Serial Port: " << m_PortName << "\n"; m_Port.write_some(boost::asio::buffer("b")); } return true; } /*******************************************************************************/ bool CBoxAlgorithmTactiloController::uninitialize() { this->getLogManager() << LogLevel_Info << "Disconnect from Serial Port: " << m_PortName << "\n"; m_Port.write_some(boost::asio::buffer("e")); m_Port.close(); m_StimDecoder.uninitialize(); m_StimEncoder.uninitialize(); return true; } /*******************************************************************************/ bool CBoxAlgorithmTactiloController::processInput(const size_t index) { // some pre-processing code if needed... // ready to process ! getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); return true; } /*******************************************************************************/ bool CBoxAlgorithmTactiloController::process() { // the static box context describes the box inputs, outputs, settings structures const IBox& staticBoxContext = this->getStaticBoxContext(); // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) IBoxIO& boxContext = this->getDynamicBoxContext(); uint64_t ChunkStartTime = 0; uint64_t ChunkEndTime = 0; uint64_t Size = 0; const uint8_t* Buffer = nullptr; //iterate over all chunk on input 0 for (uint64_t i = 0; i < boxContext.getInputChunkCount(0); ++i) { // decode the chunk i m_StimDecoder.decode(i); if(m_StimDecoder.isBufferReceived()) { //check received stimulations CStimulationSet* StimSet = m_StimDecoder.getOutputStimulationSet(); for(uint64_t j=0; jsize(); j++) { uint64_t StimulationID = StimSet->getId(j); if(StimulationID >= m_RowBase && StimulationID < (m_RowBase + m_nTactilos)) { m_currTactiloID = StimulationID-m_RowBase; } if(StimulationID == OVTK_StimulationId_VisualStimulationStart || StimulationID == OVTK_StimulationId_VisualStimulationStop) { boost::asio::async_write(m_Port, boost::asio::buffer(std::to_string(m_currTactiloID), 1), boost::bind(&CBoxAlgorithmTactiloController::handler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } } } // forward input chunks boxContext.getInputChunk(0, i, ChunkStartTime, ChunkEndTime, Size, Buffer); boxContext.appendOutputChunkData(0, Buffer, Size); boxContext.markOutputAsReadyToSend(0, ChunkStartTime, ChunkEndTime); boxContext.markInputAsDeprecated(0, i); } return true; } /*******************************************************************************/ void CBoxAlgorithmTactiloController::handler(const boost::system::error_code& error, std::size_t bytes_transferred) { if(error) { this->getLogManager() << LogLevel_Warning << error.message() << "\n"; } }