/*=====================================================================================
 File name:        RMP3CNTL.C  (IQ version)                  
                    
 Originator:	Digital Control Systems Group
			Texas Instruments

 Description:  The ramp3 down control                   

=====================================================================================
 History:
-------------------------------------------------------------------------------------
 04-15-2005	Version 3.20
-------------------------------------------------------------------------------------*/
#include "dmctype.h"
#include "IQmathLib.h"         // Include header for IQmath library

#include "rmp_cntl_v2.h"

/*
 * PosRampPlus
 * PosRampMinus
 * NegRampPlus
 * NegRampMinus
 */

#pragma CODE_SECTION(rmp_cntl_v2_calc,".fast_run");
void rmp_cntl_v2_calc(RMP_V2 *v)
{
	_iq tmp;
	
	tmp = v->DesiredInput - v->Out;

	if (v->Out>=0)
	{
	// для положительной части


	    if (v->Out >= v->RampHighLimit1)
	    {
	        // мы на втором уровне
	        if (tmp > (_iq)v->PosRampPlus2)
	        {
	            v->Out += v->PosRampPlus2;
	            if (v->Out > v->RampHighLimit)
	                v->Out = v->RampHighLimit;
	        }
	        else
	        {
	            if (tmp < (_iq)v->PosRampMinus2)
	            {
	                v->Out += (_iq)v->PosRampMinus2;
	                if (v->Out < v->RampLowLimit)
	                    v->Out = v->RampLowLimit;
	            }
	            else
	            {
	                v->Out  = v->DesiredInput;
	            }
	        }


	    }
	    else
	    {
	        // мы на первом уровне
            if (tmp > (_iq)v->PosRampPlus1)
            {
                v->Out += v->PosRampPlus1;
                if (v->Out > v->RampHighLimit)
                    v->Out = v->RampHighLimit;
            }
            else
            {
                if (tmp < (_iq)v->PosRampMinus1)
                {
                    v->Out += (_iq)v->PosRampMinus1;
                    if (v->Out < v->RampLowLimit)
                        v->Out = v->RampLowLimit;
                }
                else
                {
                    v->Out  = v->DesiredInput;
                }
            }

	    }

//        if (tmp > (_iq)v->PosRampPlus)
//        {
//            //v->RampDoneFlag = 0;
//            v->Out += v->PosRampPlus;
//            if (v->Out > v->RampHighLimit)
//                v->Out = v->RampHighLimit;
//        }
//        else
//        {
//            if (tmp < (_iq)v->PosRampMinus)
//            {
//                //v->RampDoneFlag = 0;
//                v->Out += (_iq)v->PosRampMinus;
//                if (v->Out < v->RampLowLimit)
//                    v->Out = v->RampLowLimit;
//            }
//            else
//            {
//                v->Out  = v->DesiredInput;
//                //v->RampDoneFlag = 0x7FFFFFFF;
//            }
//        }

	}
	else
	{
	    // для отриц. части


	    if (v->Out <= v->RampLowLimit1)
	    {
	        // мы на втором уровне
            if (tmp > (_iq)v->NegRampPlus2)
            {
                v->Out += v->NegRampPlus2;
                if (v->Out > v->RampHighLimit)
                    v->Out = v->RampHighLimit;
            }
            else
            {
                if (tmp < (_iq)v->NegRampMinus2)
                {
                    v->Out += (_iq)v->NegRampMinus2;
                    if (v->Out < v->RampLowLimit)
                        v->Out = v->RampLowLimit;
                }
                else
                {
                    v->Out  = v->DesiredInput;
                }
            }

	    }
	    else
	    {
	        // мы на первом уровне
            if (tmp > (_iq)v->NegRampPlus1)
            {
                v->Out += v->NegRampPlus1;
                if (v->Out > v->RampHighLimit)
                    v->Out = v->RampHighLimit;
            }
            else
            {
                if (tmp < (_iq)v->NegRampMinus1)
                {
                    v->Out += (_iq)v->NegRampMinus1;
                    if (v->Out < v->RampLowLimit)
                        v->Out = v->RampLowLimit;
                }
                else
                {
                    v->Out  = v->DesiredInput;
                }
            }

	    }

//	        if (tmp > (_iq)v->NegRampPlus)
//	        {
//	            //v->RampDoneFlag = 0;
//	            v->Out += v->NegRampPlus;
//	            if (v->Out > v->RampHighLimit)
//	                v->Out = v->RampHighLimit;
//	        }
//	        else
//	        {
//	            if (tmp < (_iq)v->NegRampMinus)
//	            {
//	                //v->RampDoneFlag = 0;
//	                v->Out += (_iq)v->NegRampMinus;
//	                if (v->Out < v->RampLowLimit)
//	                    v->Out = v->RampLowLimit;
//	            }
//	            else
//	            {
//	                v->Out  = v->DesiredInput;
//	                //v->RampDoneFlag = 0x7FFFFFFF;
//	            }
//	        }

	}

}


