|  | #pragma once
#ifdef OSC_ENABLE
#include "oscCommunicator.hpp"
#include "oscControl.hpp"
class OSCDriver
{
public:
	OSCDriver(Module *pmod, int scene)
	{
		m_scene = scene;
		pModule = pmod;
		comm = new oscCommunicator(m_scene);
		lastCheck = 0;
		initConnection(true);
	}
	~OSCDriver()
	{
		initConnection(false);
		for (std::map<int, oscControl *>::iterator it = m_bindings.begin(); it != m_bindings.end(); ++it)
		{
			if (it->second != NULL)
				delete it->second;
		}
		m_bindings.clear();
		delete comm;
	}
	bool Connected() { return comm->Connected(); }
	void Reset(int lp) { comm->Clear(); }
	void ProcessOSC()
	{
		if(Connected())
		{
			processGUI();
			processOSCMsg();
		} else if((GetTickCount() - lastCheck) >= 2000)
		{
			initConnection(true);
		}
	}
	void sendMsg(const char *address, float value)
	{
		OSCMsg msg;
		msg.set(m_scene, address, value);
		comm->Write(&msg);
	}
	void Add(oscControl *ctrl, ParamWidget *p)
	{
		ctrl->bindWidget(p);
		int id = ctrl->ID();
		m_bindings[id] = ctrl;
	}
	void Add(oscControl *ctrl, ModuleLightWidget *p)
	{
		ctrl->bindWidget(p);
		int id = ctrl->ID();
		m_bindings[0x8000 | id] = ctrl;
	}
private:
	oscCommunicator *comm;
	Module *pModule;
	int m_scene;
	uint32_t lastCheck;
	std::map<int, oscControl *>m_bindings;
	void initConnection(bool registr)
	{
		lastCheck = GetTickCount();
		comm->Open();
	}
	void redrawCache()
	{
		for (std::map<int, oscControl *>::iterator it = m_bindings.begin(); it != m_bindings.end(); ++it)
		{
			it->second->Draw(this, true);
		}
	}
	void processGUI()
	{
		for (std::map<int, oscControl *>::iterator it = m_bindings.begin(); it != m_bindings.end(); ++it)
		{
			if (it->second->DetectGUIChanges())
			{
				it->second->ChangeFromGUI(this);
			}
		}
	}
	void processOSCMsg()
	{
		OSCMsg msg;
		while (comm->Read(&msg))
		{
			for (std::map<int, oscControl *>::iterator it = m_bindings.begin(); it != m_bindings.end(); ++it)
			{
				if(msg.scene == m_scene && it->second->Intersect(msg.address))
				{
#ifdef DEBUG
					info("MSG: scene=%i, address= %s", msg.scene, msg.address);
#endif
					it->second->onOscMsg(pModule, msg);
					break;
				}
			}
		}
	}
};
#endif //OSC
 |