#ifndef __OpenViBEPlugins_BoxAlgorithm_Python_H__ #define __OpenViBEPlugins_BoxAlgorithm_Python_H__ #if defined TARGET_HAS_ThirdPartyPython #include <Python.h> #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) #include "../ovp_defines.h" #include <openvibe/ov_all.h> #include <toolkit/ovtk_all.h> #include <string.h> #include <string> #include <vector> //#include <map> namespace OpenViBEPlugins { namespace Python { class CBoxAlgorithmPython : virtual public OpenViBEToolkit::TBoxAlgorithm < OpenViBE::Plugins::IBoxAlgorithm > { public: virtual void release(void) { delete this; } virtual OpenViBE::uint64 getClockFrequency(void); virtual OpenViBE::boolean initialize(void); virtual OpenViBE::boolean uninitialize(void); virtual OpenViBE::boolean processClock(OpenViBE::CMessageClock& rMessageClock); virtual OpenViBE::boolean processInput(OpenViBE::uint32 ui32InputIndex); virtual OpenViBE::boolean process(void); _IsDerivedFromClass_Final_(OpenViBEToolkit::TBoxAlgorithm < OpenViBE::Plugins::IBoxAlgorithm >, OVP_ClassId_BoxAlgorithm_Python); protected: OpenViBE::uint64 m_ui64ClockFrequency; OpenViBE::CString m_sScriptFilename; std::vector < OpenViBEToolkit::TDecoder < CBoxAlgorithmPython >* > m_vDecoders; std::vector < OpenViBEToolkit::TEncoder < CBoxAlgorithmPython >* > m_vEncoders; //std::map<char,PyObject *> m_PyObjectMap; PyObject *m_pBox, *m_pBoxInput, *m_pBoxOutput, *m_pBoxSetting, *m_pBoxCurrentTime; PyObject *m_pBoxInitialize, *m_pBoxProcess, *m_pBoxUninitialize; OpenViBE::boolean m_bInitializeSucceeded ; OpenViBE::boolean logSysStdout(void); OpenViBE::boolean logSysStderr(void); void buildPythonSettings(void); OpenViBE::boolean initializePythonSafely(); OpenViBE::boolean clearPyObjectMap(); OpenViBE::boolean transferStreamedMatrixInputChunksToPython(const OpenViBE::uint32 input_index); OpenViBE::boolean transferStreamedMatrixOutputChunksFromPython(const OpenViBE::uint32 output_index); OpenViBE::boolean transferSignalInputChunksToPython(const OpenViBE::uint32 input_index); OpenViBE::boolean transferSignalOutputChunksFromPython(const OpenViBE::uint32 output_index); OpenViBE::boolean transferStimulationInputChunksToPython(const OpenViBE::uint32 input_index); OpenViBE::boolean transferStimulationOutputChunksFromPython(const OpenViBE::uint32 output_index); static OpenViBE::boolean m_bPythonInitialized; // These are all borrowed references in python v2.7. Do not free them. static PyObject *m_pMainModule, *m_pMainDictionnary; static PyObject *m_pOVStreamedMatrixHeader, *m_pOVStreamedMatrixBuffer, *m_pOVStreamedMatrixEnd; static PyObject *m_pOVSignalHeader, *m_pOVSignalBuffer, *m_pOVSignalEnd; static PyObject *m_pOVStimulationHeader, *m_pOVStimulation, *m_pOVStimulationSet, *m_pOVStimulationEnd; static PyObject *m_pOVBuffer; static PyObject *m_pExecFileFunction ; static PyObject *m_pSysStdout, *m_pSysStderr; }; class CBoxAlgorithmPythonListener : public OpenViBEToolkit::TBoxListener < OpenViBE::Plugins::IBoxListener > { public: virtual OpenViBE::boolean onInputAdded(OpenViBE::Kernel::IBox& rBox, const OpenViBE::uint32 ui32Index) { rBox.setInputType(ui32Index, OV_TypeId_StreamedMatrix); return true; }; virtual OpenViBE::boolean onOutputAdded(OpenViBE::Kernel::IBox& rBox, const OpenViBE::uint32 ui32Index) { rBox.setOutputType(ui32Index, OV_TypeId_StreamedMatrix); return true; }; _IsDerivedFromClass_Final_(OpenViBEToolkit::TBoxListener < OpenViBE::Plugins::IBoxListener >, OV_UndefinedIdentifier); }; class CBoxAlgorithmPythonDesc : virtual public OpenViBE::Plugins::IBoxAlgorithmDesc { public: virtual void release(void) { } virtual OpenViBE::CString getName(void) const { return OpenViBE::CString("Python scripting"); } virtual OpenViBE::CString getAuthorName(void) const { return OpenViBE::CString("Aurelien Van Langhenhove and Laurent George"); } virtual OpenViBE::CString getAuthorCompanyName(void) const { return OpenViBE::CString("CICIT Garches, Inria"); } virtual OpenViBE::CString getShortDescription(void) const { return OpenViBE::CString("This box executes a python script."); } virtual OpenViBE::CString getDetailedDescription(void) const { return OpenViBE::CString(""); } virtual OpenViBE::CString getCategory(void) const { return OpenViBE::CString("Scripting"); } virtual OpenViBE::CString getVersion(void) const { return OpenViBE::CString("0.1"); } virtual OpenViBE::CString getStockItemName(void) const { return OpenViBE::CString("gtk-missing-image"); } virtual OpenViBE::CIdentifier getCreatedClass(void) const { return OVP_ClassId_BoxAlgorithm_Python; } virtual OpenViBE::Plugins::IPluginObject* create(void) { return new OpenViBEPlugins::Python::CBoxAlgorithmPython; } virtual OpenViBE::Plugins::IBoxListener* createBoxListener(void) const { return new CBoxAlgorithmPythonListener; } virtual void releaseBoxListener(OpenViBE::Plugins::IBoxListener* pBoxListener) const { delete pBoxListener; } virtual OpenViBE::boolean getBoxPrototype(OpenViBE::Kernel::IBoxProto& rBoxAlgorithmPrototype) const { //rBoxAlgorithmPrototype.addInput ("Input", OV_TypeId_StreamedMatrix); //rBoxAlgorithmPrototype.addInput ("Input stimulations", OV_TypeId_Stimulations); //rBoxAlgorithmPrototype.addOutput ("Output", OV_TypeId_StreamedMatrix); //rBoxAlgorithmPrototype.addOutput ("Output stimulations", OV_TypeId_Stimulations); rBoxAlgorithmPrototype.addSetting("Clock frequency (Hz)", OV_TypeId_Integer, "64"); rBoxAlgorithmPrototype.addSetting("Script", OV_TypeId_Script, ""); //rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_IsUnstable); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanAddInput); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanModifyInput); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanAddOutput); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanModifyOutput); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanAddSetting); rBoxAlgorithmPrototype.addFlag(OpenViBE::Kernel::BoxFlag_CanModifySetting); rBoxAlgorithmPrototype.addInputSupport(OV_TypeId_Signal); rBoxAlgorithmPrototype.addInputSupport(OV_TypeId_Stimulations); rBoxAlgorithmPrototype.addInputSupport(OV_TypeId_StreamedMatrix); rBoxAlgorithmPrototype.addOutputSupport(OV_TypeId_Signal); rBoxAlgorithmPrototype.addOutputSupport(OV_TypeId_Stimulations); rBoxAlgorithmPrototype.addOutputSupport(OV_TypeId_StreamedMatrix); return true; } _IsDerivedFromClass_Final_(OpenViBE::Plugins::IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_PythonDesc); }; }; }; #endif // #if defined(PY_MAJOR_VERSION) && (PY_MAJOR_VERSION == 2) #endif // TARGET_HAS_ThirdPartyPython #endif // __OpenViBEPlugins_BoxAlgorithm_Python_H__