@ -42,10 +42,7 @@ void RFCOMM_ProcessControlCommand(const uint8_t* Command, Bluetooth_Channel_t* c
 
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  RFCOMM_Command_t *  CommandHeader   =  ( const  RFCOMM_Command_t * ) Command ; 
 
			
		
	
		
			
				
						const  uint8_t *           CommandData     =  ( const  uint8_t * ) Command  +  sizeof ( RFCOMM_Command_t ) ; 
 
			
		
	
		
			
				
						uint16_t                 ControlDataLen  =  RFCOMM_GetFrameDataLength ( CommandData ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Adjust the command data pointer to skip over the variable size field */ 
 
			
		
	
		
			
				
						CommandData  + =  ( ControlDataLen  <  128 )  ?  1  :  2 ; 
 
			
		
	
		
			
				
						uint8_t                  CommandDataLen  =  RFCOMM_GetVariableFieldValue ( & CommandData ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						switch  ( CommandHeader - > Command ) 
 
			
		
	
		
			
				
						{ 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -59,7 +56,7 @@ void RFCOMM_ProcessControlCommand(const uint8_t* Command, Bluetooth_Channel_t* c
 
			
		
	
		
			
				
								RFCOMM_ProcessFCDCommand ( CommandHeader ,  CommandData ,  Channel ) ; 
 
			
		
	
		
			
				
								break ; 
 
			
		
	
		
			
				
							case  RFCOMM_Control_ModemStatus : 
 
			
		
	
		
			
				
								RFCOMM_ProcessMSCommand ( CommandHeader ,  CommandData ,  Channel ) ; 
 
			
		
	
		
			
				
								RFCOMM_ProcessMSCommand ( CommandHeader ,  CommandData Len,  CommandData  ,  Channel ) ; 
 
			
		
	
		
			
				
								break ; 
 
			
		
	
		
			
				
							case  RFCOMM_Control_RemotePortNegotiation : 
 
			
		
	
		
			
				
								RFCOMM_ProcessRPNCommand ( CommandHeader ,  CommandData ,  Channel ) ; 
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -94,10 +91,48 @@ static void RFCOMM_ProcessFCDCommand(const RFCOMM_Command_t* const CommandHeader
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 1 ,  " << FCD Command " ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  RFCOMM_ProcessMSCommand ( const  RFCOMM_Command_t *  const  CommandHeader ,  const  uint8_t * CommandData ,  
			
		
	
		
			
				
								                         Bluetooth_Channel_t *  const  Channel )  
			
		
	
		
			
				
					static  void  RFCOMM_ProcessMSCommand ( const  RFCOMM_Command_t *  const  CommandHeader ,  const  uint8_t  CommandData Len ,  
			
		
	
		
			
				
					                                    const  uint8_t *  CommandData ,   Bluetooth_Channel_t *  const  Channel )  
			
		
	
		
			
				
					{  
			
		
	
		
			
				
						const  RFCOMM_MS_Parameters_t *  Params  =  ( const  RFCOMM_MS_Parameters_t * ) CommandData ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 1 ,  " << MS Command " ) ; 
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 2 ,  " -- DLCI: 0x%02X " ,  Params - > Channel . DLCI ) ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* Ignore status flags sent to the control channel */ 
 
			
		
	
		
			
				
						if  ( Params - > Channel . DLCI  = =  RFCOMM_CONTROL_DLCI ) 
 
			
		
	
		
			
				
						  return ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* Retrieve existing channel configuration data, if already opened */ 
 
			
		
	
		
			
				
						RFCOMM_Channel_t *  RFCOMMChannel  =  RFCOMM_GetChannelData ( Params - > Channel . DLCI ) ; 	
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* If the channel does not exist, abort */ 
 
			
		
	
		
			
				
						if  ( RFCOMMChannel  = =  NULL ) 
 
			
		
	
		
			
				
						  return ; 
 
			
		
	
		
			
				
						  
 
			
		
	
		
			
				
						/* Save the new channel signals to the channel state structure */ 
 
			
		
	
		
			
				
						RFCOMMChannel - > Signals  =  Params - > Signals ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* If the command contains the optional break signals field, store the value */ 
 
			
		
	
		
			
				
						if  ( CommandDataLen  = =  sizeof ( RFCOMM_MS_Parameters_t ) ) 
 
			
		
	
		
			
				
						  RFCOMMChannel - > BreakSignals  =  Params - > BreakSignals ; 
 
			
		
	
		
			
				
						  
 
			
		
	
		
			
				
						struct 
 
			
		
	
		
			
				
						{ 
 
			
		
	
		
			
				
							RFCOMM_Command_t        CommandHeader ; 
 
			
		
	
		
			
				
							uint8_t                 Length ; 
 
			
		
	
		
			
				
							RFCOMM_MS_Parameters_t  Params ; 
 
			
		
	
		
			
				
						}  MSResponse ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Fill out the MS response data */ 
 
			
		
	
		
			
				
						MSResponse . CommandHeader  =  ( RFCOMM_Command_t ) { . Command  =  RFCOMM_Control_ModemStatus ,  . EA  =  true } ; 
 
			
		
	
		
			
				
						MSResponse . Length         =  ( CommandDataLen  < <  1 )  |  0x01 ; 
 
			
		
	
		
			
				
						MSResponse . Params         =  * Params ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 1 ,  " >> MS Response " ) ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						/* Send the PDN response to acknowledge the command */ 
 
			
		
	
		
			
				
						RFCOMM_SendFrame ( RFCOMM_CONTROL_DLCI ,  false ,  RFCOMM_Frame_UIH ,  sizeof ( MSResponse ) ,  & MSResponse ,  Channel ) ; 
 
			
		
	
		
			
				
					}  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					static  void  RFCOMM_ProcessRPNCommand ( const  RFCOMM_Command_t *  const  CommandHeader ,  const  uint8_t *  CommandData ,  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -118,7 +153,7 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
 
			
		
	
		
			
				
						const  RFCOMM_DPN_Parameters_t *  Params  =  ( const  RFCOMM_DPN_Parameters_t * ) CommandData ; 
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 1 ,  " << DPN Command " ) ; 
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 2 ,  " --  Config  DLCI: 0x%02X" ,  Params - > DLCI ) ; 
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 2 ,  " --  DLCI: 0x%02X" ,  Params - > DLCI ) ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* Ignore parameter negotiations to the control channel */ 
 
			
		
	
		
			
				
						if  ( Params - > DLCI  = =  RFCOMM_CONTROL_DLCI ) 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -136,8 +171,10 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
 
			
		
	
		
			
				
								/* If the channel's DLCI is zero, the channel state entry is free */ 
 
			
		
	
		
			
				
								if  ( ! ( RFCOMM_Channels [ i ] . DLCI ) ) 
 
			
		
	
		
			
				
								{ 
 
			
		
	
		
			
				
									RFCOMMChannel        =  & RFCOMM_Channels [ i ] ; 
 
			
		
	
		
			
				
									RFCOMMChannel - > DLCI  =  Params - > DLCI ; 
 
			
		
	
		
			
				
									RFCOMMChannel                =  & RFCOMM_Channels [ i ] ; 
 
			
		
	
		
			
				
									RFCOMMChannel - > DLCI          =  Params - > DLCI ; 
 
			
		
	
		
			
				
									RFCOMMChannel - > Signals       =  0 ; 
 
			
		
	
		
			
				
									RFCOMMChannel - > BreakSignals  =  0 ; 
 
			
		
	
		
			
				
									break ; 
 
			
		
	
		
			
				
								} 
 
			
		
	
		
			
				
							} 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -154,7 +191,7 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
 
			
		
	
		
			
				
						RFCOMMChannel - > State        =  RFCOMM_Channel_Open ; 
 
			
		
	
		
			
				
						RFCOMMChannel - > Priority     =  Params - > Priority ; 
 
			
		
	
		
			
				
						RFCOMMChannel - > UseUIFrames  =  ( Params - > FrameType  ! =  0 ) ; 
 
			
		
	
		
			
				
						RFCOMMChannel - > Remote MTU   =  Params - > MaximumFrameSize ; 
 
			
		
	
		
			
				
						RFCOMMChannel - >           =  Params - > MaximumFrameSize ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						struct 
 
			
		
	
		
			
				
						{ 
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -164,10 +201,10 @@ static void RFCOMM_ProcessDPNCommand(const RFCOMM_Command_t* const CommandHeader
 
			
		
	
		
			
				
						}  DPNResponse ; 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						/* Fill out the DPN response data */ 
 
			
		
	
		
			
				
						DPNResponse . CommandHeader . Command  =  CommandHeader - > Command ; 
 
			
		
	
		
			
				
						DPNResponse . CommandHeader. EA       =  true  ; 
 
			
		
	
		
			
				
						DPNResponse . Length                =  ( sizeof ( DPNResponse . Params )  < <  1 )  |  0x01  ; 
 
			
		
	
		
			
				
						DPNResponse . Params                 =  * Params ;  
 
			
		
	
		
			
				
						DPNResponse . CommandHeader            =  ( RFCOMM_Command_t ) { . Command  =  RFCOMM_Control_DLCParameterNegotiation ,  . EA  =  true }  ; 
 
			
		
	
		
			
				
						DPNResponse . Length                  =  ( sizeof ( DPNResponse . Params )  < <  1 )  |  0x01  ; 
 
			
		
	
		
			
				
						DPNResponse . Params                  =  * Params  ; 
 
			
		
	
		
			
				
						DPNResponse . Params . ConvergenceLayer  =  0x00 ;  // TODO: Enable credit based transaction support
 
 
			
		
	
		
			
				
						
 
			
		
	
		
			
				
						BT_RFCOMM_DEBUG ( 1 ,  " >> DPN Response " ) ;