#ifndef __FICOSEKCOM_H
#define __FICOSEKCOM_H

/*-------------------------------- Includes ------------------------------*/
#include "Std_Types.h"
#include "DiagnosticL/Comp_HAL_Autosar_Wrappers/FicosarCAN.h"
#include "OsekCom/OsekCom.h"
/*-------------------------------- Defines -------------------------------*/


/*----------------------------- Data Types -------------------------------*/
typedef UI_8 t_sig_diagnosticreqprndl[8];
typedef UI_8 t_sig_diagnosticfuncaddrreq[8];



#ifndef _FICOSEKCOM_H
#define _FICOSEKCOM_H

/* Type definition of the symbolic names for signals */
typedef UI_16 t_symbolic_name;
typedef UI_16 t_symbolic_frm_name;

/* Return type of the calls OSEK COM */
typedef UI_8 t_status_type;

/* Structure of data type passed by reference in */
/* the calls of OSEK COM                         */
typedef void *t_application_data_ref;
typedef void *t_length_ref; 

/* Flag types of OSEK COM */
//typedef enum {
    //COM_FALSE = 0x00, /* Flag down  */
  //  COM_TRUE  = 0x01  /* Flag up */
//} t_flag_value;

/* Stop mode of OSEK COM */
//typedef enum {
  //  COM_SHUTDOWN_IMMEDIATE = 0 /* Apagat immediat */
//} t_com_shutdown_mode_type;

/* Initialize mode of OSEK COM */
//typedef enum {
  //  COM_NORMAL_MODE = 0 /* No es processen trames de COM de Debug */
//} t_com_application_mode_type;

#endif


	
/*--------------------------- Global Variables ---------------------------*/

/*----------- Prototypes of Callback Function Provided by User  ----------*/
    
/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
| * Notification Callbacks provided by user for class 1 (RxNotif), 3 (RxErrorNotif)
|   2 (TxNotif) and 4 (TxErrorNotif)
| ---------------------------------------------------------------------------
| Parameters description:
/ ------------------------------------------------- -------------------------- */
#define COMCallback(CallbackRoutineName) void CallbackRoutineName(void)

//COMCallback(VCU_RX_Timeout_Callback);
//COMCallback(CGW_BCM_Status1_Timeout_Callback);
COMCallback(SHIFT_Tx_Callback);
COMCallback(SHIFT_Tx_Error_Callback);


/* --------------------------- Routine Prototypes --------------------------- */

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Reception of a new frame notification callback
|  * This callback must be launched by the lower COM driver upon the reception
|    of a new frame.
|---------------------------------------------------------------------------
| Parameters description:
|  bhdl: Handler of the buffer where the received frame is stored.
/---------------------------------------------------------------------------*/
void OsekComRxNotifCallbackPRNDL(t_com_buf_hdl bhdl);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Available transmission buffer notification callback
|  * This callback must be launched by the lower COM driver upon a transmission
|    buffer will become available after requesting one to perform a transmission. 
|---------------------------------------------------------------------------
| Parameters description:
|  return: TRUE in case that after current transmission lower COM driver should
|          call again this callback to transmit a new frame.
|          FALSE otherwise.
/---------------------------------------------------------------------------*/
BOOL OsekComTxReqCallbackPRNDL(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Frame transmission confirmation notifying callback
|  * This callback must be launched by the lower COM driver upon the completion
|    of a frame transmission for which transmission confirmation has been requested
|---------------------------------------------------------------------------
| Parameters description:
|  bhdl: Handler of the buffer where the transmitted frame is stored.
/---------------------------------------------------------------------------*/
void OsekComTxNotifCallbackPRNDL(t_com_buf_hdl bhdl);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Service to initialize OsekCom stack
|
| ------------------------------------------------- --------------------------
| Parameters description:
|  app_mode: OsekCom initialization mode (See t_com_application_mode_type)
|  return: E_OK in case of no errors
|          Other (see t_status_type).
/---------------------------------------------------------------------------*/
//t_status_type StartCom(t_com_application_mode_type app_mode);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
| * Service to inquiry in which mode OsekCom has been initialized.
| * If this service is called before initializing the communications stack
|   a random mode will be returned.
| ---------------------------------------------------------------------------
| Parameters description:
|  return: OsekCom initialization mode(See t_com_application_mode_type)
/ --------------------------------------------------------------------------- */
//t_com_application_mode_type GetComApplicationMode(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
| * Service to close the OsekCom stack.
| * This service stops the transmission of periodic frames.
| * After calling this service communications could be re-established
|   calling again service StartCom.
| * This service does not change the state of any lower COM driver.
| ---------------------------------------------------------------------------
| Parameters description:
|  shtdwn_mode: OsekCom stop mode (See t_com_shutdown_mode_type)
|  return: E_OK in case of no errors
|          Other (see t_status_type).
/ --------------------------------------------------------------------------- */
//t_status_type StopCom(t_com_shutdown_mode_type shtdwn_mode);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Service to start the transmission of periodic or mixed frames.
|  * If this service is re-executed then transmission timers will be re-started.
|---------------------------------------------------------------------------
| Parameters description:
|  return: E_OK in case of no errors
|          Other (see t_status_type).
/---------------------------------------------------------------------------*/
t_status_type StartPeriodic(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Service to stop the transmission of periodic or mixed frames.
|  * To re-start the transmission of periodic or mixed frames service
|    StartPeriodic must be called.
|---------------------------------------------------------------------------
| Parameters description:
|  return: E_OK in case of no errors
|          Other (see t_status_type).
/---------------------------------------------------------------------------*/
t_status_type StopPeriodic(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * This service updates the application variable referenced by >data_ref< with
|    the data stored in the internal stack for the object identified by >message<.
|  * This service will reset the class 1 (RxNotif) and 3 (RxErrorNotif) flags
|    associated to >message<
|  * If >message< is an enqueued signal the service will return the data
|    stored in the internal stack (initial value / last received value / last value
|    set with InitMessage)
|    If >message< is a queued signal the service will return the first value
|    available in the queue or error if the queue is empty. (Mode not supported)
|  * The user is responsible of granting that the parameter >data_ref< 
|    points to a variable correctly allocated and compatible in size with the 
|    received signal type
|  * Usage example: 
|    t_vehicle_speed vehicle_speed;
|    (void)ReceiveMessage(SIG_VEHICLE_SPEED,&vehicle_speed); 
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal to be retrieved.
|   data_ref: Pointer to a variable where to store the requested signal. 
|   return: 
|     E_OK in case of no errors
|     E_COM_ID in case the parameter >message< is out of range or if it refers
|              to signal that is sent, dynamic length or zero-length
|     E_COM_NOMSG in case the queued signal identified by >message< is empty.
|     E_COM_LIMIT in case an overflow of the queue of the signal identified by >message<
|                 occurred since the last call to ReceiveMessage for >message<.
|                 E_COM_LIMIT indicates that at least one message has been discarded
|                 since the message queue filled. Nevertheless the service is 
|                 performed and a message is returned. The service ReceiveMessage
|                 clears the overflow condition for >message<.
|     other (see t_status_type).
/---------------------------------------------------------------------------*/
t_status_type ReceiveMessage(t_symbolic_name message,
                             t_application_data_ref data_ref);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * This service updates the application variable referenced by >data_ref< with
|    the data stored in the internal stack for the object identified by >message<.
|  * The length of the received signal data will be placed in the variable
|    referenced by >length_ref<.
|  * This service will reset the class 1 (RxNotif) and 3 (RxErrorNotif) flags
|    associated to >message<
|  * This service could be used with enqueued messages only. This service is
|    provided for external communication only.
|  * The service will return the data stored in the internal stack 
|    (initial value / last received value / last value set with InitMessage)
|  * The user is responsible of granting that the parameters >data_ref< 
|    and >lenght_ref< point to variables correctly allocated and compatible in 
|    size with the received signal type
|  * Usage example: 
|    t_vehicle_speed vehicle_speed;
|    t_length_ref length_ref;
|    (void)ReceiveDynamicMessage(SIG_VEHICLE_SPEED,&vehicle_speed,&length_ref); 
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal to be retrieved.
|   data_ref: Pointer to a variable where to store the requested signal. 
|   lenght_ref: Pointer to a variable where to store the retrieved signal size. 
|   return: 
|     E_OK in case of no errors
|     E_COM_ID in case the parameter >message< is out of range or if it refers
|              to a message that is sent, a queued message, a static-length 
|              message or a zero-length message.
|     other (see t_status_type).
/---------------------------------------------------------------------------*/
t_status_type ReceiveDynamicMessage(t_symbolic_name message,
                                    t_application_data_ref data_ref,
                                    t_length_ref length_ref);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * This service updates OsekCom internal data structure of the signal
|    identified by >message< with the data referenced by the variable
|    referenced by >data_ref< parameter.
|  * This service will reset the class 2 (TxNotif) and 4 (TxErrorNotif) flags
|    associated to >message<
|  * If >message< has the Triggered Transfer Property, the update will be
|    followed by immediate transmission of the I-PDU associated with the signal except
|    when the signal is packed into an I-PDU with Periodic Transmission Mode.
|    In this case, no transmission is initiated by the call to this service.
|  * If >message< has the Pending Transfer Property, no transmission is
|    triggered by the usage of this service.
|  * The user is responsible of granting that the parameter >data_ref< 
|    points to a variable correctly allocated and compatible in size with the 
|    transmitted signal type.
|  * Usage example: 
|    t_vehicle_speed vehicle_speed = 20;
|    (void)SendMessage(SIG_VEHICLE_SPEED,&vehicle_speed); 
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal to be transmitted.
|   data_ref: Pointer to a variable containing the data to be transmitted. 
|   return: 
|     E_OK in case of no errors
|     E_COM_ID is case the parameter >message< is out of range or if it refers
|              to a message that is received or to a dynamic-length or 
|              zero-length message.
|     other (see t_status_type).
/---------------------------------------------------------------------------*/
#define OSEK_SENDMESSAGE
t_status_type SendMessage(t_symbolic_name message,
                          t_application_data_ref data_ref);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * This service updates OsekCom internal data structure of the signal
|    identified by >message< with the data referenced by variables
|    referenced by >data_ref< and >lenght_ref<
|  * This service will reset the class 2 (TxNotif) and 4 (TxErrorNotif) flags
|    associated to >message<
|  * If >message< has the Triggered Transfer Property, the update is followed
|    by immediate transmission of the I-PDU associated with the signal except
|    when the signal is packed into an I-PDU with Periodic Transmission Mode.
|    In this case, no transmission is initiated by the call to this service.
|  * If >message< has the Pending Transfer Property, no transmission is
|    caused by the usage of this service.
|  * This service can be used with enqueued messages only. This service is
|    provided for external communication only.
|  * The user is responsible of granting that the parameters >data_ref<
|    and >lenght_ref< points to variables correctly allocated and 
|    compatible in size with the transmitted signal type.
|  * Usage example: 
|    t_vehicle_speed vehicle_speed = 20;
|    t_length_ref length_ref = 1;
|    (void)SendDynamicMessage(SIG_VEHICLE_SPEED, &vehicle_speed, &length_ref); 
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal to be transmitted.
|   data_ref: Pointer to a variable containing the data to be transmitted. 
|   lenght_ref: Pointer to a variable containing the size of the signal 
|               to be transmitted.
|   return: 
|     E_OK in case of no errors
|     E_COM_ID in case the parameter >message< is out of range or if it refers
|              to a received signal, a static-length signal or a zero-length signal.
|     E_COM_LENGTH in case the value to which >length_ref< points is not within
|                  the range 0 to the maximum length defined for >message<.
|     other (see t_status_type).
/---------------------------------------------------------------------------*/
#define OSEK_SENDDYNAMICMESSAGE
t_status_type SendDynamicMessage(t_symbolic_name message,
                                 t_application_data_ref data_ref,
                                 t_length_ref length_ref);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * This service updates OsekCom internal data structure of the signal
|    identified by >message< with the data referenced by the variable
|    referenced by >data_ref<
|  * This service will not reset any class flags associated to >message<
|  * This service will not initiate any transmission.
|  * The user is responsible of granting that the parameter 'data_ref' 
|    points to an address correctly allocated and compatible in size with the 
|    transmitted signal type.
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal.
|   data_ref: Pointer to a variable containing the data. 
|   return: 
|     E_OK in case of no errors
|     E_COM_ID if the message or signal to initialize don't exist
|     Other (see t_status_type).
/---------------------------------------------------------------------------*/
t_status_type InitMessage(t_symbolic_name message,
                          t_application_data_ref data_ref);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Consult service for the flag of COM traffic.
|---------------------------------------------------------------------------
| Parameters description:
|  return: 
|     COM_FALSE if has not been detected any communication activity since
|               last clear
|     COM_TRUE  if has been detected communication activity since last clear 
/---------------------------------------------------------------------------*/
t_flag_value ReadFlagComTrafficPRNDL(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Reset service for the flag of COM traffic.
|---------------------------------------------------------------------------
| Parameters description:
/---------------------------------------------------------------------------*/
void ResetFlagComTrafficPRNDL(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Consult service to retrieve the state of class 1 (RxNotif), 
|    class 3 (Rx_ErrorNotif), class 2 (TxNotif) and class 4 (Tx_ErrorNotif) flags
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal.
|   return: 
|     COM_FALSE if the flag is down
|     COM_TRUE  if the flag is up
/---------------------------------------------------------------------------*/
t_flag_value ReadFlagRxSig(t_symbolic_name message); 
t_flag_value ReadFlagTxSig(t_symbolic_name message);
t_flag_value ReadFlagTxSigDiagnosticRespPRNDL(void);
t_flag_value ReadFlagTxErrorSig(t_symbolic_name message);
t_flag_value ReadFlagTxErrorSigDiagnosticRespPRNDL(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Consult service to enable tx message flag
|---------------------------------------------------------------------------
| Parameters description:
/---------------------------------------------------------------------------*/
void EnableTxFrm_diag_physresp_prndl(void);
void DisableTxFrm_diag_physresp_prndl(void);
void EnableTxFrm_shiftselectposition(void);
void DisableTxFrm_shiftselectposition(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Reset service for the notify class 1 (RxNotif) class 3 (RxErrorNotif)
|    class 2 (TxNotif) and class 4 (TxErrorNotif)
|---------------------------------------------------------------------------
| Parameters description:
|   message: Identification of the signal.
/---------------------------------------------------------------------------*/
void ResetFlagRxSig(t_symbolic_name message);
//void ResetFlagRxSigDiagnosticReqSWTL(void);
void ResetFlagRxSigDiagnosticFuncAddrReq(void);
void ResetFlagTxSig(t_symbolic_name message);
void ResetFlagTxErrorSig(t_symbolic_name message);
void ResetFlagTxErrorSigDiagnosticRespSWTL(void);

/*---------------------------------------------------------------------------
| Portability:  Target platform independent
|----------------------------------------------------------------------------
| Routine description:
|  * Main runnable of the OsekCom stack intended to be called periodically by
|    the system scheduler with a period equal to FICOSEK_COM_TASK_TICKS
|---------------------------------------------------------------------------
| Parameters description:
/---------------------------------------------------------------------------*/
void OsekComTask(void);

#endif

