
#include "iwear/debugstream.h"
#include "iwear/thread.h"
#include <iostream>
#include "iwear/configuration.h"
#include "iwear/servicemanager.h"
#include "iwear/eventdispatcher.h"
#include "iwear/autoloader.h"

using namespace std;
using namespace iwear;

class DebugareaAlternatorThread : public Thread
{
public:
    DebugareaAlternatorThread( EventDispatcher& e ) : Thread(e) { }
    volatile bool runme;
    virtual void Run ( void );
};

void DebugareaAlternatorThread::Run( void )
{
//    runme = true;
/*
    int i = 0;
    while( runme )
    {
	i++;
	i %= 5;
	debuglevel si = error;
	switch(i)
	{
	    case 0:
		si = error;
		break;
	    case 1:
		si = warning;
		break;
	    case 2:
		si = info;
		break;
	    case 3:
		si = debug;
		break;
	    case 4:
		si = nonsens;
		break;
	}

	d_err.set_debuglevel(si,debugarea::iwear_core);
	Yield();
    }*/

    while( runme )
    {
/*	cerr << (void*)(&runme) << endl;
	cerr << *((long*)(&runme)) << endl;
	if( runme )
	{
	    cerr << ".";
	}
	else
	{
	    cerr << "_";
	}*/
	d_inf << debugarea::iwear_core;
	Yield();
    }
}

void single_test( void )
{

    d_err << debugarea::iwear_core << "ERR" << " CORE" << endl;
    d_warn << debugarea::iwear_core << "WARN" << " CORE" << endl;
    d_inf << debugarea::iwear_core << "INFO" << " CORE" << endl;
    d_dbg << debugarea::iwear_core << "DEBUG" << " CORE" << endl;
    d_nons << debugarea::iwear_core << "NONSENS" << " CORE" << endl;

    d_err << debugarea::iwear_sensor << "ERR" << " SENSOR" << endl;
    d_warn << debugarea::iwear_sensor << "WARN" << " SENSOR" << endl;
    d_inf << debugarea::iwear_sensor << "INFO" << " SENSOR" << endl;
    d_dbg << debugarea::iwear_sensor << "DEBUG" << " SENSOR" << endl;
    d_nons << debugarea::iwear_sensor << "NONSENS" << " SENSOR" << endl;
}

void level_test( const debugarea& da )
{
    single_test();
    cout << "=============================================================================" << endl;
    cout << "Setting " << da.value << " to warning" << endl;
    d_err.set_debuglevel( warning, da );
    single_test();
    cout << "=============================================================================" << endl;
    cout << "Setting " << da.value << " to info" << endl;
    d_warn.set_debuglevel(info,da);
    single_test();
    cout << "=============================================================================" << endl;
    cout << "Setting " << da.value << " to debug" << endl;
    d_inf.set_debuglevel(debug,da);
    single_test();
    cout << "=============================================================================" << endl;
    cout << "Setting " << da.value << " to nonsens" << endl;
    d_dbg.set_debuglevel(nonsens,da);
    single_test();
    cout << "=============================================================================" << endl;
}

int main ( void )
{
    AutoLoader alo("debugstreamtest","debugstreamtest");
    DebugareaAlternatorThread tr(*alo.get_eventdispatcher());
    tr.runme = true; // if its set in Run() it could start after we set it to false below
    tr.Start();

    cout << "All, reset (level == error)" << endl;
    cout << "testing for debugarea::iwear_core ( " << debugarea::iwear_core.value << ")" << endl;
    level_test( debugarea::iwear_core );
    cout << "testing for debugarea::iwear_net ( " << debugarea::iwear_net.value << ")" << endl;
    level_test( debugarea::iwear_net);
    cout << "testing for debugarea::iwear_sensor ( " << debugarea::iwear_sensor.value << ")" << endl;
    level_test( debugarea::iwear_sensor );
    cout << "re-testing for debugarea::iwear_core ( " << debugarea::iwear_core.value << ")" << endl;
    d_err.set_debuglevel(error,debugarea::iwear_core);
    level_test( debugarea::iwear_core );
    cout << "Testings done" << endl;
    tr.runme = false;
//    cerr << (void*)(&tr.runme) << endl;
//    cerr << *((long*)(&tr.runme)) << endl;
    tr.Join();
}
