
/* STATUS NON VALIDE
*
* CAN CONFIGURATION USED:
* Bit Time = (Sync Segment + Propagation Delay + Phase Segment 1 + Phase Segment 2)=20TQ
* Phase Segment 1 = 8TQ
* Phase Segment 2 = 6Tq
* Propagation Delay = 5Tq
* Sync Segment = 1TQ
* BIT RATE OF 1Mbps

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


/* Include the appropriate header (.h) file, depending on device used */

#include "p33FJ64MC802.h"
#include "delay.h"
#include "ecan.h"

/*****************************************************************************************************
Configuration bits: 
_FOSCSEL: Start up with the FRC oscillator 
_FOSC: Use Primary oscillator XT w/ PLL, Two-speed Oscillator Startup enabled 
_FWDT: Watch dog timer is off 	
*****************************************************************************************************/

_FOSCSEL(FNOSC_FRC);			
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_XT);	// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
													// OSC2 Pin Function: OSC2 is Clock Output												// Primary Oscillator Mode: XT Crystal
_FWDT(FWDTEN_OFF); 

        
/*****************************************************************************************************
Function Prototypes  
*****************************************************************************************************/
extern  void InitClock();
extern void InitPORT_AND_PIN();

/*****************************************************************************************************
Globals   
*****************************************************************************************************/
mID canTxMessage; // type struct défini dans ecan.h
mID canRxMessage;

/* Réservation espace mémoire DMA		*/
/* Trame envoyée par le périph ECAN p5 manuel */ 
ECAN1MSGBUF ecan1msgBuf __attribute__((space(dma),aligned(ECAN1_MSG_BUF_LENGTH*16)));

unsigned int capteur[4];


/*****************************************************************************************************
main() function 
*****************************************************************************************************/
int main ( void )
{	
	/* Configure Oscillator Clock Source */
	InitClock();
	
	/* initialise ECAN et DMA */				
	initECAN();
	initDMAECAN();
	

	
	/* Enable ECAN1 Interrupt */     	
	IEC2bits.C1IE=1;	
	/* enable Transmit interrupt */
	C1INTEbits.TBIE=1;
	/* Enable Receive interrupt */
	C1INTEbits.RBIE=1;
	
	// PREPARATION TRAME
	/* configure and send a message */
	canTxMessage.message_type=CAN_MSG_DATA; // message normal
	//canTxMessage.message_type=CAN_MSG_RTR; // trame spéciale requete de données pour le destinaire

	canTxMessage.frame_type=CAN_FRAME_STD; // adressage standart
	//canTxMessage.frame_type=CAN_FRAME_EXT;// adressage étendu
	canTxMessage.buffer=0;	// non utilisé par la fct sendECAN
	canTxMessage.id=0x12A;  // adresse destinaire
	canTxMessage.data[0]=0x55;
	canTxMessage.data[1]=0x55;
	canTxMessage.data[2]=0x55;
	canTxMessage.data[3]=0x55;
	canTxMessage.data[4]=0x55;
	canTxMessage.data[5]=0x55;
	canTxMessage.data[6]=0x55;
	canTxMessage.data[7]=0x55;
	canTxMessage.data_length=8;
	
	/* Delay for a second */
	Delay(Delay_1S_Cnt);
		
	/* envoi message
		FCT NON BLOQUANTE: le DMA se charge du transfert de la trame contenue
		dans ecan1msgBuf -espace RAMDMA-
		IT 
	*/
	sendECAN(&canTxMessage);
		
	while(1) // TACHE DE FOND
	{
		/* si un message a été recu */
		if(canRxMessage.buffer_status==CAN_BUF_FULL)
		{	// reconstitue à partir du message brut ecan1msgBuf
			// la trame reçue 
			rxECAN(&canRxMessage);

			// TRAITEMENT DES DONNEES
			if(canRxMessage.message_type=CAN_MSG_RTR) // LE MESSAGE EST UNE REQUETE DE DONNEES
			{// ALORS JE PREPARE UNE TRAME AVEC LES DONNES RECLAMEES
			// A COMPLETER ICI
			}
			else // MESSAGE NORMAL
			{
			// EXEMPLE DE RECUPERATION DES DONNES
			//hypothese: les capteurs sont sur 16 bits
			// capteur 0: 
			// 		canRxMessage.Data[0] est l'octet de poid fort
			// 		canRxMessage.Data[1] est l'octet de poid fort
			// capteur 1: 
			// 		canRxMessage.Data[2] est l'octet de poid fort
			// 		canRxMessage.Data[3] est l'octet de poid fort
			char t;
			for (t=0; t<canRxMessage.data_length/2; t++)
				capteur[t]=(canRxMessage.data[2*t+1]<<8)+canRxMessage.data[2*t];

			// TRAITEMENT sur les capteurs à compléter à la suite
			
			}
			
			/* reset the flag when done */
			canRxMessage.buffer_status=CAN_BUF_EMPTY;
		}
		
	
	}
}



void __attribute__((interrupt,no_auto_psv))_C1Interrupt(void)  
{
	/* Si un message a été recu par le ecan */     	 
    if(C1INTFbits.RBIF)
    {
	    /* check to see if buffer 1 is full */
	    if(C1RXFUL1bits.RXFUL1)
	    {			
			/* positionne flag + buffer pour TRAITEMENT DIFFERE */ 
			canRxMessage.buffer_status=CAN_BUF_FULL;
			canRxMessage.buffer=1;	
		}		
		/* Si plusieurs buffer de reception prévoir le elseif
		else if(C1RXFUL1bits.RXFUL2)
		{
			// positionne flag + buffer pour TRAITEMENT DIFFERE  
			canRxMessage.buffer_status=CAN_BUF_FULL;
			canRxMessage.buffer=2;					
		}
		*/
	
		else;
		/* clear flag */
		C1INTFbits.RBIF = 0;
	}
	
	// si message a bien été envoyé
	// IT = résultat de la requete de transfert DMA initié par la fct 	sendECAN(&canTxMessage)
	else if(C1INTFbits.TBIF) 
    {	
		// DANS CETTE EXEMPLE ON NE FAIT RIEN 
	    /* clear flag */
		C1INTFbits.TBIF = 0;	    
	}
	else;
	
	/* clear interrupt flag */
	IFS2bits.C1IF=0;
}

/********* END OF INTERRUPT SERVICE ROUTINES ********/
