/*
g++ -Wall -o testQuittingNonPeriodicComponents testQuittingNonPeriodicComponents.cpp \
-I /opt/install/include/ -I /opt/local/include -DOROCOS_TARGET=macosx \
-L/opt/install/lib -lorocos-rtt-macosx -lorocos-taskbrowser-macosx
 */
#include <stdio.h>
#include <unistd.h>
#include <rtt/os/main.h>
#include <rtt/NonPeriodicActivity.hpp>
#include <rtt/TaskContext.hpp>
#include <ocl/TaskBrowser.hpp>

using namespace RTT;
using namespace OCL;

class NPComponent : public RTT::TaskContext
{
public:
	NPComponent(const std::string& 	name) :
			RTT::TaskContext(name)
	{}
	virtual ~NPComponent()
	{}

	bool	quit;

	virtual bool breakLoop()
	{
		printf("\nbreaking loop\n"); fflush(stdout);
		quit = true;
		return true;
	}

	virtual void updateHook()
	{
		quit = false;
		printf("starting "); fflush(stdout);
		while (!quit)
		{
			usleep(500 * 1000);
			printf("."); fflush(stdout);
		}
		printf("quitting\n"); fflush(stdout);
	}

};

class MyActivity : public NonPeriodicActivity
{
	NPComponent&	comp;
public:
	MyActivity(NPComponent& c, int scheduler, int priority, RunnableInterface* _r) :
			NonPeriodicActivity(scheduler, priority, _r),
			comp(c)
	{
	}
	virtual ~MyActivity()
	{}
	virtual bool breakLoop()
	{
		printf("\nQuitting activity\n"); fflush(stdout);
		comp.breakLoop();
		return NonPeriodicActivity::breakLoop();
	}
};

int ORO_main(int argc, char* argv[])
{
	NPComponent					npComponent("NPComponent");
//	NonPeriodicActivity			an(
	MyActivity			an(
		npComponent,
		ORO_SCHED_OTHER, RTT::OS::HighestPriority, npComponent.engine());

	an.start();

    TaskBrowser browser( &npComponent  );
    browser.setColorTheme( TaskBrowser::whitebg );
    browser.loop();

	an.stop();

	return 0;
}

