/*******************************************************************************
*                                                                              *
* Société de Transports de Montréal.                                    	   *
* 2012                                                                         *
*                                                                              *
* Projet Zones Tests                                                           *
*                                                                              *
*                                                                              *
*                                                                              *
*******************************************************************************/
/*
	Description:
	Classe instantiable d'un module d'entrées externe simulé.  Dérivée de COutputModule, elle
	permet d'émuler les sorties du module externe en réimplémentant les fonctions
	génériques de sa classe de base.  La classe notifie le simulateur d'un changement
	d'état des sorties afin que ce dernier puisse les afficher visuellement.
*/

/* ************************************************************************** */
/* Revision:
### YYYMMDD JFM
	Verision d'origine.
	
### YYYYMMDD Description du besoin ou du bug
	Description du changement.
 */

/* ************************************************************************** */

#include "SImulatorOutputModule.h"
#include "ZTSimulator.h"

CSImulatorOutputModule::CSImulatorOutputModule()
{
    mOutputBuffer = 0;
    mSimulatorPtr = 0;
}

unsigned int CSImulatorOutputModule::SetOutput(unsigned char *buffer)
{
//    quint32 temp;
//    mRdWrLock.lockForWrite();
//    mOutputBuffer |= FlagMask;
//    temp = mOutputBuffer;
//    mRdWrLock.unlock();
	Q_UNUSED(buffer)

	return RET_OK;
}

unsigned int CSImulatorOutputModule::SetOutput(quint32 buffer)
{
    quint32 temp;
    mRdWrLock.lockForWrite();
    mOutputBuffer = buffer;
    temp = mOutputBuffer;
    mRdWrLock.unlock();


//     mSimulatorPtr->UpdateOutputsDisplay(temp);
	emit UpdateOutputsDisplay(temp);

     return RET_OK;
}

unsigned int CSImulatorOutputModule::SetOutputFlags(quint32 FlagMask)
{
    quint32 temp;
    mRdWrLock.lockForWrite();
    mOutputBuffer |= FlagMask;
    temp = mOutputBuffer;
    mRdWrLock.unlock();

	emit UpdateOutputsDisplay(temp);
//    mSimulatorPtr->UpdateOutputsDisplay(temp);

    return RET_OK;
}

unsigned int CSImulatorOutputModule::ClearOutputFlags(quint32 FlagMask)
{
    unsigned int temp;
    mRdWrLock.lockForWrite();
    mOutputBuffer &= ~FlagMask;
    temp = mOutputBuffer;
    mRdWrLock.unlock();

   /* mSimulatorPtr->UpdateOutputsDisplay(temp)*/;
	emit UpdateOutputsDisplay(temp);

    return RET_OK;
}


unsigned int CSImulatorOutputModule::ToggleOutputFlags(quint32 FlagMask)
{
    unsigned int temp;
    mRdWrLock.lockForWrite();
    mOutputBuffer ^= FlagMask;
    temp = mOutputBuffer;
    mRdWrLock.unlock();

//    mSimulatorPtr->UpdateOutputsDisplay(temp);
	emit UpdateOutputsDisplay(temp);

    return RET_OK;
}
