/***************************************************************************//**
 *   @file   traps.c
 *   @brief  Gestion des exceptions matérielles
 *   @author Kévin (Kevin.marchand@intelligence-electronique.com)
********************************************************************************
 * Copyright 2014(c) PLCD, Inc.
 *
 * Gère les exceptions matérielles
 *
 * Ces routines d'interruption s'assurer simplement que le microcontôleur
 * tourne en boucle dans chaque routine. Les utilisateurs qui connaissent
 * ces erreurs peuvent ajouter du code pour gérer l'erreur.
 *
********************************************************************************
 *   SVN Revision: 1
*******************************************************************************/

/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/

/* Device header file */
#if defined(__XC16__)
    #include <xc.h>
#elif defined(__C30__)
    #if defined(__dsPIC33E__)
    	#include <p33Exxxx.h>
    #elif defined(__dsPIC33F__)
    	#include <p33Fxxxx.h>
    #endif
#endif

#include <stdint.h>        /* Includes uint16_t definition */
#include <stdbool.h>       /* Includes true/false definition */

/******************************************************************************/
/********************** Trap Function Prototypes  *****************************/
/******************************************************************************/
/* <Other function prototypes for debugging trap code may be inserted here>   */

/* Use if INTCON2 ALTIVT=1 */
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void);
void __attribute__((interrupt,no_auto_psv)) _AddressError(void);
void __attribute__((interrupt,no_auto_psv)) _StackError(void);
void __attribute__((interrupt,no_auto_psv)) _MathError(void);

#if defined(__HAS_DMA__)

void __attribute__((interrupt,no_auto_psv)) _DMACError(void);

#endif

#if defined(__dsPIC33F__)

/* Use if INTCON2 ALTIVT=0 */
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void);
void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void);
void __attribute__((interrupt,no_auto_psv)) _AltStackError(void);
void __attribute__((interrupt,no_auto_psv)) _AltMathError(void);

    #if defined(__HAS_DMA__)

    void __attribute__((interrupt,no_auto_psv)) _AltDMACError(void);

    #endif

#endif

/* Default interrupt handler */
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void);

#if defined(__dsPIC33E__)

/* These are additional traps in the 33E family.  Refer to the PIC33E
migration guide.  There are no Alternate Vectors in the 33E family. */
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void);
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void);

#endif

/***************************************************************************//**
 * @brief Oscillator Fail Error trap routine.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _OscillatorFail(void)
{
        INTCON1bits.OSCFAIL = 0;        /* Clear the trap flag */
        while(1);
}
/***************************************************************************//**
 * @brief Address Error trap routine.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _AddressError(void)
{
        INTCON1bits.ADDRERR = 0;        /* Clear the trap flag */
        while (1);
}
/***************************************************************************//**
 * @brief Stack Error trap routine.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _StackError(void)
{
        INTCON1bits.STKERR = 0;         /* Clear the trap flag */
        while (1);
}
/***************************************************************************//**
 * @brief Math (Arithmetic) Error trap routine.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _MathError(void)
{
        INTCON1bits.MATHERR = 0;        /* Clear the trap flag */
        while (1);
}

#if defined(__HAS_DMA__)

void __attribute__((interrupt,no_auto_psv)) _DMACError(void)
{
        INTCON1bits.DMACERR = 0;        /* Clear the trap flag */
        while (1);
}

#endif

#if defined(__dsPIC33F__)

/* Alternate address error trap function declarations */
void __attribute__((interrupt,no_auto_psv)) _AltOscillatorFail(void)
{
        INTCON1bits.OSCFAIL = 0;        /* Clear the trap flag */
        while (1);
}

void __attribute__((interrupt,no_auto_psv)) _AltAddressError(void)
{
        INTCON1bits.ADDRERR = 0;        /* Clear the trap flag */
        while (1);
}

void __attribute__((interrupt,no_auto_psv)) _AltStackError(void)
{
        INTCON1bits.STKERR = 0;         /* Clear the trap flag */
        while (1);
}

void __attribute__((interrupt,no_auto_psv)) _AltMathError(void)
{
        INTCON1bits.MATHERR = 0;        /* Clear the trap flag */
        while (1);
}

    #if defined(__HAS_DMA__)

    void __attribute__((interrupt,no_auto_psv)) _AltDMACError(void)
    {
         INTCON1bits.DMACERR = 0;        /* Clear the trap flag */
         while (1);
    }

    #endif

#endif

/***************************************************************************//**
 * @brief This executes when an interrupt occurs for an interrupt source
 * with an improperly defined or undefined interrupt handling routine.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _DefaultInterrupt(void)
{
        while(1);
}

#if defined(__dsPIC33E__)
/***************************************************************************//**
 * @brief These trap are new to the dsPIC33E family. Refer to the device Interrupt
 * chapter of the FRM to understand trap priority.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _HardTrapError(void)
{
    while(1);
}
/***************************************************************************//**
 * @brief These trap are new to the dsPIC33E family. Refer to the device Interrupt
 * chapter of the FRM to understand trap priority.
*******************************************************************************/
void __attribute__((interrupt,no_auto_psv)) _SoftTrapError(void)
{
    while(1);
}

#endif
