/*******************************************************************************
*                                                                              *
* Société de Transports de Montréal.                                    	   *
* 2012                                                                         *
*                                                                              *
* Projet Zones Tests                                                           *
*                                                                              *
*                                                                              *
*                                                                              *
*******************************************************************************/
/*
    Description:
	Classe instantiable dérivée de la classe de base CStation.  Les paramètres
	physiques de la station sont définis et initialisés ici.  Ils sont ensuite
	accédés de manière générique à travers la classe CStation.
	Les paramètres dépend du câblage de l'armoire ZT et de la configuration
	particulière des CDVs de la station.
    
*/

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

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

#include "Montmorency.h"
#include <QtGlobal>
#include "SwitchCDV.h"

CMontmorencyStation::CMontmorencyStation()
{
    //All the inherited variables from base class must be initialized here
    //according to the physical implementation in the station.
    mNbExtInputModules430 = MONTMORENCY_NB_EXTERNAL_INPUT_430_MODULES;
    mNbExtOutputModules440 = MONTMORENCY_NB_EXTERNAL_OUTPUT_440_MODULES;
    mNbExtMixedModules470 = MONTMORENCY_NB_EXTERNAL_MIXED_470_MODULES;
    mStationPhysicalKey = MONTMORENCY_STATION_KEY;
    //Initialize mask structures
    //

    mStationInputMasks.InputZT1S1Mask = MONTMORENCY_ZT1_S1_MASK;
    mStationInputMasks.InputZT1S2Mask = MONTMORENCY_ZT1_S2_MASK;
    mStationInputMasks.InputZT1PIMask = MONTMORENCY_ZT1_PI_MASK;
    mStationInputMasks.InputZT1PEMask = MONTMORENCY_ZT1_PE_MASK;
    mStationInputMasks.InputZT1FNMask = MONTMORENCY_ZT1_FN_MASK;
    mStationInputMasks.InputZT2S1Mask = MONTMORENCY_ZT2_S1_MASK;
    mStationInputMasks.InputZT2PIMask = MONTMORENCY_ZT2_PI_MASK;
    mStationInputMasks.InputZT2PEMask = MONTMORENCY_ZT2_PE_MASK;

    //External (ethernet) input module masks
    mStationInputMasks.InputZT1ITIMask = MONTMORENCY_IN_ZT1_10_12_ITI_MASK;
    mStationInputMasks.InputZT1_AltITIMask = MONTMORENCY_IN_ZT1_10_22_ITI_MASK;
    mStationInputMasks.InputZT2ITIMask = MONTMORENCY_IN_ZT2_ITI_MASK;
	mStationInputMasks.InputZT1ANMask = MONTMORENCY_IN_10_12_AN1_MASK;
    mStationInputMasks.InputZT2ANMask = MONTMORENCY_IN_ZT2_AN_MASK;
    mStationInputMasks.InputZT1ARFMask = MONTMORENCY_IN_ZT1_ARF_MASK;
    mStationInputMasks.InputZT2ARFMask = MONTMORENCY_IN_ZT2_ARF_MASK;
    mStationInputMasks.InputStationIDMask = MONTMORENCY_IN_STATION_ID_MASK;


    //Logic input masks
    mStationInputMasks.InputCDVZT1ApproachMask = MONTMORENCY_IN_CDV_11A_MASK;
    mStationInputMasks.InputCDVZT1Mask = MONTMORENCY_IN_CDV_11B_MASK;
    mStationInputMasks.InputCDVZT2ApproachMask = MONTMORENCY_IN_CDV_12BC_MASK;
    mStationInputMasks.InputCDVZT2Mask = MONTMORENCY_IN_CDV_13A_MASK;

    //Output masks
    mStationOutputMasks.OutputVP1Mask = MONTMORENCY_OUT_VP1_MASK;
    mStationOutputMasks.OutputVP2Mask = MONTMORENCY_OUT_VP2_MASK;
    mStationOutputMasks.OutputVP3Mask = MONTMORENCY_OUT_VP3_MASK;
    mStationOutputMasks.OutputVP4Mask = MONTMORENCY_OUT_VP4_MASK;
    mStationOutputMasks.OutputVP5Mask = MONTMORENCY_OUT_VP5_MASK;
    mStationOutputMasks.OutputVP6Mask = MONTMORENCY_OUT_VP6_MASK;
    mStationOutputMasks.OutputVF1Mask = MONTMORENCY_OUT_VF1_MASK;
    mStationOutputMasks.OutputVF2Mask = MONTMORENCY_OUT_VF2_MASK;
    mStationOutputMasks.OutputVF3Mask = MONTMORENCY_OUT_VF3_MASK;
    mStationOutputMasks.OutputVF4Mask = MONTMORENCY_OUT_VF4_MASK;
    mStationOutputMasks.OutputVF5Mask = MONTMORENCY_OUT_VF5_MASK;
    mStationOutputMasks.OutputWP1Mask = MONTMORENCY_OUT_WP1_MASK;
    mStationOutputMasks.OutputWP2Mask = MONTMORENCY_OUT_WP2_MASK;
    mStationOutputMasks.OutputWP3Mask = MONTMORENCY_OUT_WP3_MASK;
    mStationOutputMasks.OutputWP4Mask = MONTMORENCY_OUT_WP4_MASK;
    mStationOutputMasks.OutputWP5Mask = MONTMORENCY_OUT_WP5_MASK;
    mStationOutputMasks.OutputWP6Mask = MONTMORENCY_OUT_WP6_MASK;
    mStationOutputMasks.OutputDPEMask = MONTMORENCY_OUT_DPE_MASK;
    mStationOutputMasks.OutputDPIMask = MONTMORENCY_OUT_DPI_MASK;
    mStationOutputMasks.OutputV00Mask = MONTMORENCY_OUT_V00_MASK;
    mStationOutputMasks.OutputDPGMask = MONTMORENCY_OUT_DPG_MASK;
    mStationOutputMasks.OutputDFRMask = MONTMORENCY_OUT_DFR_MASK;
    mStationOutputMasks.OutputRFMask = MONTMORENCY_OUT_RF_MASK;
    mStationOutputMasks.OutputRF2Mask = MONTMORENCY_OUT_RF2_MASK;
    mStationOutputMasks.OutputVELMask = MONTMORENCY_OUT_VEL_MASK;
    mStationOutputMasks.OutputVEL2Mask = MONTMORENCY_OUT_VEL2_MASK;
    mStationOutputMasks.OutputDPI2Mask = MONTMORENCY_OUT_DPI2_MASK;
    mStationOutputMasks.OutputDPE2Mask = MONTMORENCY_OUT_DPE2_MASK;
    mStationOutputMasks.OutputV002Mask = MONTMORENCY_OUT_V002_MASK;
    mStationOutputMasks.OutputPEQ1Mask = MONTMORENCY_OUT_PEQ1_MASK;
    mStationOutputMasks.OutputPEQ2Mask = MONTMORENCY_OUT_PEQ2_MASK;
    mStationOutputMasks.OutputWatchdogMask = MONTMORENCY_OUT_WATCHDOG_MASK;

	mAnalogAcqChannels.SDFAcquisitionChannel = MONTMORENCY_SDF_ACQUISITION_CHANNEL;

    mStationHasZT2 = true;
	mCurZT1Itinerary = MONTMORENCY_ZT1_NO_ITINERARY;
    mTextualStationName = "Montmorency";
    mTextualShortName = "MMO";
}

unsigned int CMontmorencyStation::UpdateStationMasks(unsigned int ExtInputData)
{
    mStationInputMasks.InputZT1_StdITIMask = MONTMORENCY_IN_ZT1_10_12_ITI_MASK;
	if((MONTMORENCY_IN_ZT1_10_12_ITI_MASK & ExtInputData) != 0)
	{
		if(mCurZT1Itinerary != MONTMORENCY_ZT1_10_12_ITINERARY)
		{	//Assign masks relative to 10/12 itinerary
			mStationInputMasks.InputZT1ITIMask = MONTMORENCY_IN_ZT1_10_12_ITI_MASK;
			mStationInputMasks.InputZT1ANMask = MONTMORENCY_IN_10_12_AN1_MASK;
			mCurZT1Itinerary = MONTMORENCY_ZT1_10_12_ITINERARY;
            mZT1AlarmAutoAcquireCDV = m10_12AlarmAutoAcquireCDV_2;  //Not used but it's better to assign it.
            mZT1SubsequentCDV = m10_12SubsequentCDV;
            qDebug("Itinéraire 10/12 configuré");
		}

	}
	else if((MONTMORENCY_IN_ZT1_10_22_ITI_MASK & ExtInputData) != 0)
	{
		if(mCurZT1Itinerary != MONTMORENCY_ZT1_10_22_ITINERARY)
		{	//Assign masks relative to 10/22 itinerary
			mStationInputMasks.InputZT1ITIMask = MONTMORENCY_IN_ZT1_10_22_ITI_MASK;
			mStationInputMasks.InputZT1ANMask = MONTMORENCY_IN_10_22_AN1_MASK;
			mCurZT1Itinerary = MONTMORENCY_ZT1_10_22_ITINERARY;
            mZT1AlarmAutoAcquireCDV = m10_22AlarmAutoAcquireCDV_2; //Not used but it's better to assign it.
            mZT1SubsequentCDV = m10_22SubsequentCDV;
            qDebug("Itinéraire 10/22 configuré");
		}
	}
	else
	{
		mCurZT1Itinerary = MONTMORENCY_ZT1_NO_ITINERARY;
	}

	return RET_OK;
}

int CMontmorencyStation::GetCurrentITI()
{
    if(mCurZT1Itinerary == MONTMORENCY_ZT1_NO_ITINERARY || mCurZT1Itinerary == MONTMORENCY_ZT1_10_12_ITINERARY)
    {
        return ZT_PRIMARY_ITI;
    }
    else if(mCurZT1Itinerary == MONTMORENCY_ZT1_10_22_ITINERARY)
    {
        return ZT_SECONDARY_ITI;
    }
    else
    {
        qDebug("Invalid mCurZT1Itinerary in CMontmorencyStation.  Weird stuff!");
        return ZT_PRIMARY_ITI;
    }
}

bool CMontmorencyStation::IsZT1AlarmAutoAcquireCDVOccupied()
{
    if(GetCurrentITI() == ZT_PRIMARY_ITI)   // itinéraire 10/12
    {
        if(m10_12AlarmAutoAcquireCDV_1->IsOccupied())
        {
            return true;
        }
        else if(m10_12AlarmAutoAcquireCDV_2->IsOccupied())
        {
            return true;
        }

        return false;
    }
    else        // Itinéraire 10/22
    {
        if(m10_22AlarmAutoAcquireCDV_1->IsOccupied())
        {
            return true;
        }
        else if(m10_22AlarmAutoAcquireCDV_2->IsOccupied())
        {
            return true;
        }

        return false;
    }
}


unsigned int CMontmorencyStation::BuildStationCDVList()
{
    CCDV *NewCDV;
    mCDVList.empty();

	NewCDV = new CCDV(MONTMORENCY_IN_ZT2_ITI_MASK,MONTMORENCY_IN_CDV_14B_MASK,CDV_NORMAL_TYPE,"14B",1,0);
    mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT2_ITI_MASK,MONTMORENCY_IN_CDV_14A_MASK,CDV_NORMAL_TYPE,"14A",1,1);
    mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT2_ITI_MASK,MONTMORENCY_IN_CDV_13B_MASK,CDV_NORMAL_TYPE,"13B",1,2);
	mZT2AlarmAutoAcquireCDV = NewCDV;

    mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT2_ITI_MASK,MONTMORENCY_IN_CDV_13A_MASK,CDV_NORMAL_TYPE,"13A ZT2",1,3);
	mZT2CDV = NewCDV;
	mZT2ApproachCDV = NewCDV;
	mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_12_ITI_MASK,MONTMORENCY_IN_CDV_12BC_MASK,CDV_NORMAL_TYPE,"12BC",1,4);
    mCDVList.append(NewCDV);
    NewCDV->SetCDVDeck(true);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_12_ITI_MASK,MONTMORENCY_IN_CDV_12A_MASK,CDV_NORMAL_TYPE,"12A",1,5);
	mZT1AlarmAutoAcquireCDV = NewCDV;
    m10_12AlarmAutoAcquireCDV_2 = NewCDV;	//Memorize it...
    mCDVList.append(NewCDV);
    NewCDV->SetCDVDeck(true);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_12_ITI_MASK,MONTMORENCY_IN_CDV_11B_MASK,CDV_NORMAL_TYPE,"11B",1,6);
    mCDVList.append(NewCDV);
    m10_12AlarmAutoAcquireCDV_1 = NewCDV;

	CSwitchCDV *NewSwitchCDV = new CSwitchCDV(MONTMORENCY_IN_ZT1_10_12_ITI_MASK,MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_11A_MASK,CDV_SWITCH_TYPE,"11A",1,7);
	mCDVList.append((CCDV*)NewSwitchCDV);
    mZT1SubsequentCDV = (CCDV*)NewSwitchCDV;
    m10_12SubsequentCDV = NewSwitchCDV;

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_12_ITI_MASK | MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_10B_MASK,CDV_NORMAL_TYPE,"10B ZT1",1,8);
	mZT1CDV = NewCDV;
    mZT1ApproachCDV = NewCDV;
	mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_22BC_MASK,CDV_NORMAL_TYPE,"22BC",2,4);
	mCDVList.append(NewCDV);

	NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_22A_MASK,CDV_NORMAL_TYPE,"22A",2,5);
    m10_22AlarmAutoAcquireCDV_2 = NewCDV; //Memorize it.
	mCDVList.append(NewCDV);



//	NewSwitchCDV = new CSwitchCDV(0,MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_21BC_MASK,CDV_SWITCH_TYPE,"21BC",2,6);
//	mCDVList.append((CCDV*)NewSwitchCDV);

    NewCDV = new CCDV(MONTMORENCY_IN_ZT1_10_22_ITI_MASK,MONTMORENCY_IN_CDV_21AB_MASK,CDV_NORMAL_TYPE,"21B",2,6);
    mCDVList.append(NewCDV);
    m10_22SubsequentCDV = NewCDV;
    m10_22AlarmAutoAcquireCDV_1 = NewCDV; //Memorize it.



    return RET_OK;
}

GenericInputMasks_t *CMontmorencyStation::GetInputMasks(void)
{
	return &mStationInputMasks;
}
