
/*------------------------------- includes --------------------------------*/
//#include "Global.h"
#include "Std_Types.h"
//#include "Timer.h"
#include "DiagnosticR/Comp_HAL_Autosar_Wrappers/Timer.h"
#include "Iso15765_3_Task.h"

#include "Iso15765_3.h"

#define SESSION_NO_REQUEST  ((UI_8)0)
#define SESSION_DEFAULT   ((UI_8)1)
#define SESSION_NOT_DEFAULT  ((UI_8)2)

BOOL session_expired;

static UI_8 active_session;
static UI_8 active_session_mask;
static UI_8 session_request;


/*------------------------------ user code --------------------------------*/


UI_8 Iso15765_3QueryActiveSessionMask(void)
{
switch(active_session){
case UDS_DEFAULT_SESSION:
active_session_mask = UDS_DEFAULT_SESSION_MASK;
break;
case UDS_PROGRAMMING_SESSION:
active_session_mask = UDS_PROGRAMMING_SESSION_MASK;
break;
case UDS_EXT_DIAG_SESSION:
active_session_mask = UDS_EXT_DIAG_SESSION_MASK;
break;  
case UDS_SYSTEM_SUPPLIER_SPECIFIC_SESSION_ID:
active_session_mask = UDS_SYSTEM_SUPPLIER_SPECIFIC_SESSION_MASK;
break; 
default:
active_session_mask = 0x00;/* There is an error in the session control */
break;
}

return active_session_mask;
}

void Iso15765_3ChangeActiveSession(UI_8 session_change) 
{
	active_session = session_change;
	if ((session_change & UDS_SUBFUNCTION_MASK) != UDS_DEFAULT_SESSION) 
	{
		session_request = SESSION_NOT_DEFAULT;
	} else 
	{
		session_request = UDS_DEFAULT_SESSION;
	}
}

UI_8 Iso15765_3QueryActiveSession(void)
{
return active_session;
}

/*-------------------------------- macros ---------------------------------*/





/*------------------------------- defines ---------------------------------*/
/* Maxim valor del compteig del temps */
#define MAX_COMPTADOR_TEMPS ((UI_16)65000)

/*---------------------------- tipus de dades -----------------------------*/

typedef enum {
    ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION = 1, 
    ESTAT_ISO15765_3_SESSIONCTRLTASK_NONDEFAULTSESSION = 2, 
    ESTAT_0_ISO15765_3_SESSIONCTRLTASK = 0
} t_estat_iso15765_3_sessionctrltask;


/*------------------------------ variables --------------------------------*/

/* Variables d estat */
static t_estat_iso15765_3_sessionctrltask estat_iso15765_3_sessionctrltask = ESTAT_0_ISO15765_3_SESSIONCTRLTASK;


/*------------------------- capcaleres de funcions ------------------------*/

static void Iso15765_3_SessionCtrlTask0(void);
static void DefaultSession(void);
static void NonDefaultSession(void);


/*----------------------- funcions d'inicialitzacio -----------------------*/
 
/**************************************************************************** 
| Funcionalitat:                                                              
|   Inicialitzacio del diagrama d estats Iso15765_3_SessionCtrlTask 
|---------------------------------------------------------------------------- 
| Interficie:                                                                 
|   Entrades: - 
|   Sortides:
|       estat_iso15765_3_sessionctrltask
|        
****************************************************************************/
void Iso15765_3_SessionCtrlTaskInicialitza(void)
{
    /* Inicialitzacio de la variable d estat */
    estat_iso15765_3_sessionctrltask = ESTAT_0_ISO15765_3_SESSIONCTRLTASK;

    /* Execucio del cicle inicial de la maquina d estats */
    Iso15765_3_SessionCtrlTask();
}


/*------------------------- rutines principals ---------------------------*/
 
/**************************************************************************** 
| Funcionalitat:                                                              
|   Rutina principal del diagrama d estats Iso15765_3_SessionCtrlTask. 
|   Invoca a la funcio corresponent a l estat actual. 
|---------------------------------------------------------------------------- 
| Interficie:                                                                 
|   Entrades:
|       estat_iso15765_3_sessionctrltask
|       
|       session_expired 
|   Sortides:
|       estat_iso15765_3_sessionctrltask
|        
****************************************************************************/
void Iso15765_3_SessionCtrlTask(void)
{
    /* Estudi per casos del estat actual */
    switch (estat_iso15765_3_sessionctrltask){
    case ESTAT_0_ISO15765_3_SESSIONCTRLTASK:
        Iso15765_3_SessionCtrlTask0();
        break;
    case ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION:
        DefaultSession();
        break;
    case ESTAT_ISO15765_3_SESSIONCTRLTASK_NONDEFAULTSESSION:
        NonDefaultSession();
        break;
    default:
        estat_iso15765_3_sessionctrltask = ESTAT_0_ISO15765_3_SESSIONCTRLTASK;
        break;
    }
}


/*------------------------- funcions d'estats -----------------------------*/

 
/**************************************************************************** 
| Funcionalitat: 
|   Funcio corresponent a l estat inicial del proces Iso15765_3_SessionCtrlTask 
|---------------------------------------------------------------------------- 
| Interficie: -                                                                
****************************************************************************/
static void Iso15765_3_SessionCtrlTask0(void)
{
    /* Transicio per defecte */

    /* -- entry de l estat -- */
    session_expired = FALSE;
    session_request = SESSION_NO_REQUEST;
	active_session = UDS_DEFAULT_SESSION;
	/* User Callback: Session being Initialized */
#ifdef UDS_INI_SESSION_CALLBACK 
	UDS_INI_SESSION_CALLBACK(); 
#endif 
#ifdef UDS_SERVICE_SECURITY_ACCESS
	//UDSSecurityTaskNotifySessionChanged();
#endif

    /* Canviem l estat inicial */
    estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION;
}
 
/**************************************************************************** 
| Funcionalitat:                                                              
|   Funcio corresponent a l estat DefaultSession.                              
|---------------------------------------------------------------------------- 
| Interficie:                                                                 
|   Entrades:
|       estat_iso15765_3_sessionctrltask
|       
|       session_expired 
|   Sortides:
|       estat_iso15765_3_sessionctrltask
|        
****************************************************************************/
static void DefaultSession(void)
{
    if (session_request == SESSION_NOT_DEFAULT) {
        /* Cas en que executem la transicio ChangeToNonDefSession */

        /* -- entry de l estat NonDefaultSession -- */
        session_expired = FALSE;
		session_request = SESSION_NO_REQUEST;
		/* User Callback: Session being Initialized */ 
#ifdef UDS_INI_SESSION_CALLBACK
		UDS_INI_SESSION_CALLBACK();
#endif 
#ifdef UDS_SERVICE_SECURITY_ACCESS
	//UDSSecurityTaskNotifySessionChanged();
#endif

        /* -- canviem l estat -- */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_NONDEFAULTSESSION;
    }
    else if (session_request == SESSION_DEFAULT) {
        /* Cas en que executem la transicio ReIniDefSession */

        /* -- entry de l estat DefaultSession -- */
        session_expired = FALSE; 
		session_request = SESSION_NO_REQUEST;
		active_session = UDS_DEFAULT_SESSION; 
		/* User Callback: Session being Initialized */ 
#ifdef UDS_INI_SESSION_CALLBACK
		UDS_INI_SESSION_CALLBACK();
#endif 
#ifdef UDS_SERVICE_SECURITY_ACCESS
		//UDSSecurityTaskNotifySessionChanged();
#endif

        /* -- canviem l estat -- */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION;
    }
    else {

        /* No s ha activat cap transicio: ens quedem a l estat actual */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION;
    }
}
 
/**************************************************************************** 
| Funcionalitat:                                                              
|   Funcio corresponent a l estat NonDefaultSession.                              
|---------------------------------------------------------------------------- 
| Interficie:                                                                 
|   Entrades:
|       estat_iso15765_3_sessionctrltask
|       
|       session_expired 
|   Sortides:
|       estat_iso15765_3_sessionctrltask
|        
****************************************************************************/
static void NonDefaultSession(void)
{
    if ((session_expired == TRUE) || (session_request == SESSION_DEFAULT)) {
        /* Cas en que executem la transicio ChangeToDefSession */

        /* -- entry de l estat DefaultSession -- */
        session_expired = FALSE;
		session_request = SESSION_NO_REQUEST;
		active_session = UDS_DEFAULT_SESSION;
		/* User Callback: Session being Initialized */
#ifdef UDS_INI_SESSION_CALLBACK
		UDS_INI_SESSION_CALLBACK();
#endif 
#ifdef UDS_SERVICE_SECURITY_ACCESS
		//UDSSecurityTaskNotifySessionChanged();
#endif

        /* -- canviem l estat -- */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_DEFAULTSESSION;
    }
    else if (session_request == SESSION_NOT_DEFAULT) {
        /* Cas en que executem la transicio ChangeBetweenNonDefSessions */

        /* -- entry de l estat NonDefaultSession -- */
        session_expired = FALSE;
		session_request = SESSION_NO_REQUEST;
		/* User Callback: Session being Initialized */
#ifdef UDS_INI_SESSION_CALLBACK
		UDS_INI_SESSION_CALLBACK();
#endif
#ifdef UDS_SERVICE_SECURITY_ACCESS
		//UDSSecurityTaskNotifySessionChanged();
#endif

        /* -- canviem l estat -- */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_NONDEFAULTSESSION;
    }
    else {

        /* No s ha activat cap transicio: ens quedem a l estat actual */
        estat_iso15765_3_sessionctrltask = ESTAT_ISO15765_3_SESSIONCTRLTASK_NONDEFAULTSESSION;
    }
}


/********************************** FI **************************************/
