diff --git a/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp b/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp
index 5f2c8e7..2058247 100644
--- a/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp
+++ b/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp
@@ -1,128 +1,138 @@
-///-------------------------------------------------------------------------------------------------
-///
-/// \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"
-#include
-
-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_NumberofTactilos = 6; //if this value is specified via box settings this line is not needed
- //NumberofTactilos = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); //used if this value is set in box settings
-
- //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 StimulationID = 0;
- 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
- IStimulationSet* StimSet = m_StimDecoder.getOutputStimulationSet();
- for(uint64_t j=0; jgetStimulationCount(); j++)
- {
- StimulationID = StimSet->getStimulationIdentifier(j);
-
- if(StimulationID >= m_RowBase && StimulationID < (m_RowBase + m_NumberofTactilos))
- {
- m_TactiloNr = StimulationID-m_RowBase+1;
- }
- if(StimulationID == OVTK_StimulationId_VisualStimulationStart)
- {
- this->getLogManager() << LogLevel_Info << "Tactilo Nr. " << m_TactiloNr << " ON\n";
- m_Port.write_some(boost::asio::buffer(std::to_string(m_TactiloNr)));
- }
- if(StimulationID == OVTK_StimulationId_VisualStimulationStop)
- {
- this->getLogManager() << LogLevel_Info << "Tactilo Nr. " << m_TactiloNr << " OFF\n";
- m_Port.write_some(boost::asio::buffer(std::to_string(m_TactiloNr)));
- }
- }
- }
- // 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;
-}
-
+///-------------------------------------------------------------------------------------------------
+///
+/// \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"
+#include
+
+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(), 3);
+
+ //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 StimulationID = 0;
+ 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
+ IStimulationSet* StimSet = m_StimDecoder.getOutputStimulationSet();
+ for(uint64_t j=0; jgetStimulationCount(); j++)
+ {
+ StimulationID = StimSet->getStimulationIdentifier(j);
+
+ if(StimulationID >= m_RowBase && StimulationID < (m_RowBase + m_nTactilos))
+ {
+ m_currTactiloNr = StimulationID-m_RowBase+1;
+ }
+ if(StimulationID == OVTK_StimulationId_VisualStimulationStart)
+ {
+ this->getLogManager() << LogLevel_Info << "Tactilo Nr. " << m_currTactiloNr << " ON\n";
+ m_Port.write_some(boost::asio::buffer(std::to_string(m_currTactiloNr)));
+ }
+ if(StimulationID == OVTK_StimulationId_VisualStimulationStop)
+ {
+ this->getLogManager() << LogLevel_Info << "Tactilo Nr. " << m_currTactiloNr << " OFF\n";
+ m_Port.write_some(boost::asio::buffer(std::to_string(m_currTactiloNr)));
+ }
+ }
+ }
+ // 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;
+}
+
/*******************************************************************************/
\ No newline at end of file
diff --git a/src/TactiloController/ovpCBoxAlgorithmTactiloController.h b/src/TactiloController/ovpCBoxAlgorithmTactiloController.h
index 34b3641..14e1704 100644
--- a/src/TactiloController/ovpCBoxAlgorithmTactiloController.h
+++ b/src/TactiloController/ovpCBoxAlgorithmTactiloController.h
@@ -1,113 +1,109 @@
-///-------------------------------------------------------------------------------------------------
-///
-/// \file ovpCBoxAlgorithmTactiloController.h
-/// \brief Classes 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
-#pragma once
-
-#include "../ovp_defines.h"
-
-#include
-#include
-#include
-#include
-
-namespace OpenViBE
-{
- namespace Plugins
- {
- namespace Tactilebci
- {
- /// The class CBoxAlgorithmTactiloController describes the box Tactilo Controller.
- class CBoxAlgorithmTactiloController final : virtual public Toolkit::TBoxAlgorithm
- {
- public:
- void release() override { delete this; }
-
- bool initialize() override;
- bool uninitialize() override;
- bool processInput(const size_t index) override;
- bool process() override;
-
- // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier.
- // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm >
- _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TactiloController)
-
- protected:
- // Input decoder:
- Toolkit::TStimulationDecoder m_StimDecoder;
- // Output decoder:
- Toolkit::TStimulationEncoder m_StimEncoder;
-
- private:
- //variable to store the current TactiloNr
- uint64_t m_TactiloNr = 0;
- //Box Settings
- CString m_PortName = "";
- uint64_t m_RowBase = 0;
- uint64_t m_NumberofTactilos = 0;
-
- //Serial Port
- boost::asio::io_service m_IO;
- boost::asio::serial_port m_Port{m_IO};
- };
-
- /// Descriptor of the box Tactilo Controller.
- class CBoxAlgorithmTactiloControllerDesc final : virtual public IBoxAlgorithmDesc
- {
- public:
-
- void release() override { }
-
- CString getName() const override { return CString("Tactilo Controller"); }
- CString getAuthorName() const override { return CString("Tobias Baumann"); }
- CString getAuthorCompanyName() const override { return CString("TH-Nürnberg"); }
- CString getShortDescription() const override { return CString("Controls the Tactilos on the Lattepandas GPIOs"); }
- CString getDetailedDescription() const override { return CString("Communicates with the Arduino Coprocessor of the Lattepanda over a Serial Inteface, to control the Tactilos connected to the Arduinos GPIOs"); }
- CString getCategory() const override { return CString("TactileBCI"); }
- CString getVersion() const override { return CString("1.0"); }
- CString getStockItemName() const override { return CString("gtk-network"); }
-
- CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TactiloController; }
- IPluginObject* create() override { return new CBoxAlgorithmTactiloController; }
-
- /*
- IBoxListener* createBoxListener() const override { return new CBoxAlgorithmTactiloControllerListener; }
- void releaseBoxListener(IBoxListener* listener) const override { delete listener; }
- */
- bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
- {
- prototype.addInput("StimInput",OV_TypeId_Stimulations);
-
- //prototype.addFlag(Kernel::BoxFlag_CanModifyInput);
- //prototype.addFlag(Kernel::BoxFlag_CanAddInput);
-
- prototype.addOutput("StimOutput",OV_TypeId_Stimulations);
-
- //prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);
- //prototype.addFlag(Kernel::BoxFlag_CanAddOutput);
-
- //Box Settings
- prototype.addSetting("Serial Port Name",OV_TypeId_String,"/dev/ttyACM0");
- prototype.addSetting("Row Stimulation Base",OV_TypeId_Stimulation,"OVTK_StimulationId_Label_01");
- //prototype.addSetting("Number of Tactilos",OV_TypeId_Integer,"6"); //used to make this setting accessable in the box settings
-
- //prototype.addFlag(Kernel::BoxFlag_CanModifySetting);
- //prototype.addFlag(Kernel::BoxFlag_CanAddSetting);
-
- prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable);
-
- return true;
- }
- _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TactiloControllerDesc)
- };
- } // namespace Tactilebci
- } // namespace Plugins
-} // namespace OpenViBE
+///-------------------------------------------------------------------------------------------------
+///
+/// \file ovpCBoxAlgorithmTactiloController.h
+/// \brief Classes 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
+#pragma once
+
+#include "../ovp_defines.h"
+
+#include
+#include
+#include
+#include
+
+namespace OpenViBE
+{
+ namespace Plugins
+ {
+ namespace Tactilebci
+ {
+ /// The class CBoxAlgorithmTactiloController describes the box Tactilo Controller.
+ class CBoxAlgorithmTactiloController final : virtual public Toolkit::TBoxAlgorithm
+ {
+ public:
+ void release() override { delete this; }
+
+ bool initialize() override;
+ bool uninitialize() override;
+ bool processInput(const size_t index) override;
+ bool process() override;
+
+ // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier.
+ // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm >
+ _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TactiloController)
+
+ protected:
+ // Input decoder:
+ Toolkit::TStimulationDecoder m_StimDecoder;
+ // Output decoder:
+ Toolkit::TStimulationEncoder m_StimEncoder;
+
+ private:
+ //variable to store the current TactiloNr
+ uint64_t m_currTactiloNr = 0;
+ //Box Settings
+ CString m_PortName = "";
+ uint64_t m_RowBase = 0;
+ uint64_t m_nTactilos = 0;
+
+ //Serial Port
+ boost::asio::io_service m_IOService;
+ boost::asio::serial_port m_Port{m_IOService};
+ };
+
+ /// Descriptor of the box Tactilo Controller.
+ class CBoxAlgorithmTactiloControllerDesc final : virtual public IBoxAlgorithmDesc
+ {
+ public:
+
+ void release() override { }
+
+ CString getName() const override { return CString("Tactilo Controller"); }
+ CString getAuthorName() const override { return CString("Tobias Baumann"); }
+ CString getAuthorCompanyName() const override { return CString("TH-Nürnberg"); }
+ CString getShortDescription() const override { return CString("Controls the Tactilos on the Lattepandas GPIOs"); }
+ CString getDetailedDescription() const override { return CString("Communicates with the Arduino Coprocessor of the Lattepanda over a Serial Inteface, to control the Tactilos connected to the Arduinos GPIOs"); }
+ CString getCategory() const override { return CString("TactileBCI"); }
+ CString getVersion() const override { return CString("1.0"); }
+ CString getStockItemName() const override { return CString("gtk-network"); }
+
+ CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TactiloController; }
+ IPluginObject* create() override { return new CBoxAlgorithmTactiloController; }
+
+ bool getBoxPrototype(Kernel::IBoxProto& prototype) const override
+ {
+ prototype.addInput("StimInput",OV_TypeId_Stimulations);
+
+ //prototype.addFlag(Kernel::BoxFlag_CanModifyInput);
+ //prototype.addFlag(Kernel::BoxFlag_CanAddInput);
+
+ prototype.addOutput("StimOutput",OV_TypeId_Stimulations);
+
+ //prototype.addFlag(Kernel::BoxFlag_CanModifyOutput);
+ //prototype.addFlag(Kernel::BoxFlag_CanAddOutput);
+
+ //Box Settings
+ prototype.addSetting("Serial Port Name",OV_TypeId_String,"/dev/ttyACM0");
+ prototype.addSetting("Row Stimulation Base",OV_TypeId_Stimulation,"OVTK_StimulationId_Label_01");
+ prototype.addSetting("Number of Tactilos",OV_TypeId_Integer,"6");
+
+ //prototype.addFlag(Kernel::BoxFlag_CanModifySetting);
+ //prototype.addFlag(Kernel::BoxFlag_CanAddSetting);
+
+ prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable);
+
+ return true;
+ }
+ _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TactiloControllerDesc)
+ };
+ } // namespace Tactilebci
+ } // namespace Plugins
+} // namespace OpenViBE