@ -14,7 +14,7 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MSGCTRL . bit . DLC  =  message . msgctrl. bit . DLC  ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MSGCTRL . bit . DLC  =  message . dataLength ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  message . mdh . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  message . mdl . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -34,6 +34,69 @@ void CAN::transmitMsg(Uint16 boxNumber, const CANMessage& message){
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : transmitMsg ( Uint16  boxNumber ,  const  Uint32 &  message ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( boxNumber  >  31 )  return ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Uint32  mboxControl ( 0 ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    mboxControl  =  1ul  < <  boxNumber ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    volatile  MBOX *  p_MailBox ( 0 ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox  =  & ( p_CanMBoxes_ - > MBOX0 )  +  boxNumber ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  message  > >  16 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  message ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Set TRS for mailbox
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTRS . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTRS . all  | =  mboxControl ;    
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANTRS . all  =  CanShadow_ . CANTRS . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Wait for TA bit to be set
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    do  {  CanShadow_ . CANTA . all  =  p_CanRegs_ - > CANTA . all ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    while ( ( CanShadow_ . CANTA . all  &  mboxControl )  = =  0  ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Clear TA (transmit acknowledge bit)
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTA . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTA . all  | =  mboxControl ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANTA . all  =  CanShadow_ . CANTA . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : transmitMsg ( Uint16  boxNumber ,  const  Uint32 &  message ,  const  Uint16  dlc ) { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( boxNumber  >  31 )  return ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Uint32  mboxControl ( 0 ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    mboxControl  =  1ul  < <  boxNumber ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    volatile  MBOX *  p_MailBox ( 0 ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox  =  & ( p_CanMBoxes_ - > MBOX0 )  +  boxNumber ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  0x0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MSGCTRL . bit . DLC  =  dlc ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  message  > >  16 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  message ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Set TRS for mailbox
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTRS . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTRS . all  | =  mboxControl ;    
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANTRS . all  =  CanShadow_ . CANTRS . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Wait for TA bit to be set
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    do  {  CanShadow_ . CANTA . all  =  p_CanRegs_ - > CANTA . all ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    while ( ( CanShadow_ . CANTA . all  &  mboxControl )  = =  0  ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Clear TA (transmit acknowledge bit)
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTA . all  =  0 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    CanShadow_ . CANTA . all  | =  mboxControl ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANTA . all  =  CanShadow_ . CANTA . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				void  CAN : : updateTXMessage ( Uint16  boxNumber ,  const  CANMessage &  message ) {  // TODO check trs bit and set it at the end if it was here. Once the TRS bit is set for a mailbox and then data is changed in the mailbox using the CDR
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                                                                        // bit, the CAN module fails to transmit the new data and transmits the old data instead. To avoid this,
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                                                                        // reset transmission in that mailbox using the TRRn bit and set the TRSn bit again. The new data is
 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -46,6 +109,7 @@ void CAN::updateTXMessage(Uint16 boxNumber, const CANMessage& message){ // TODO
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // Set change data request (CDR bit + MBOX number)
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANMC . all  | =  ( 128  +  boxNumber ) ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    // TODO Add lenght changing?
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDL . all  =  message . mdl . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox - > MDH . all  =  message . mdh . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
			
			 
			 
			
				@ -83,7 +147,7 @@ void CAN::sendRemoteRequest(Uint16 boxNumber){
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				} 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				bool   CAN : : receiveMsg ( Uint16  boxNumber ,  CANMessage &  rxMessage ) {  // TODO faults just return -1
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				int16   CAN : : receiveMsg ( Uint16  boxNumber ,  CANMessage &  rxMessage ) {  // TODO faults just return -1
 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  ( boxNumber  >  31 )  {  return  - 1 ;  } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Uint32  mboxControl ( 0 ) ; 
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -93,11 +157,11 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_MailBox  =  & ( p_CanMBoxes_ - > MBOX0 )  +  boxNumber ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    bool  isNewMessageInBox  =  p_CanRegs_ - > CANRMP . all  &  mboxControl ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if ( ! isNewMessageInBox )  return  - 1 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if ( ! isNewMessageInBox )  return  - 2 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    p_CanRegs_ - > CANRMP . all  & =  mboxControl ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    rxMessage . msgctrl. all   =  p_MailBox - > MSGCTRL . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    rxMessage . dataLength  =  p_MailBox - > MSGCTRL . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    rxMessage . mdl . all  =  p_MailBox - > MDL . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    rxMessage . mdh . all  =  p_MailBox - > MDH . all ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
			
			 
			 
			
				@ -108,7 +172,7 @@ bool CAN::receiveMsg(Uint16 boxNumber, CANMessage& rxMessage){ // TODO faults ju
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    lostMessage  =  p_CanRegs_ - > CANRML . all  &  mboxControl ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if ( newMessage  | |  lostMessage )  { 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return  - 1 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return  - 3 ; 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    } 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  0 ;