179 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| //////////////////////////////////////////////////////////////////////////////////
 | |
| /// \file phy_receiver.c
 | |
| /// \brief Physical receiver thread
 | |
| /// \author Pascal Sartoretti (sap at hevs dot ch)
 | |
| /// \version 1.0 - original
 | |
| /// \date  2018-02
 | |
| //////////////////////////////////////////////////////////////////////////////////
 | |
| #include "stm32f7xx_hal.h"
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include "main.h"
 | |
| #include "ext_uart.h"
 | |
| #include "ext_led.h"
 | |
| 
 | |
| uint8_t gInBuffer[256];											// generic byte receive buffer
 | |
| uint8_t recByte;
 | |
| uint8_t recPtr;
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////////
 | |
| /// \brief Called on interrupt on RS232 received char
 | |
| /// \param The uart handler (ext_uart)
 | |
| //////////////////////////////////////////////////////////////////////////////////
 | |
| void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 | |
| {
 | |
| 	struct queueMsg_t queueMsg;		// queue message	
 | |
| 	static uint8_t secondSTX;									// STX repeated control
 | |
|   uint32_t 	size;														// size of builded frame
 | |
| 	osStatus_t retCode;
 | |
| 
 | |
| 	//------------------------------------------------------------------------------
 | |
| 	// RECEIVED CHAR
 | |
| 	//------------------------------------------------------------------------------
 | |
|   if (recByte == STX)												// is it an STX char ?
 | |
|   {
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		if(recPtr == 0)													// is it first char ?
 | |
| 		{
 | |
| 			secondSTX = 0;			    							// this is the first STX
 | |
| 		}
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		else																		// is not the first char
 | |
| 		{
 | |
| 			if (secondSTX == 1)				   					// is it the second STX
 | |
| 			{
 | |
| 				secondSTX = 0;				    					// clear secondSTX flag
 | |
| 				HAL_UART_Receive_IT(&ext_uart,&recByte,1);	// enable uart receiver 1 char
 | |
| 
 | |
| 				return;															// and quit
 | |
| 			}
 | |
| 			secondSTX = 1;									    	// set secondSTX to 
 | |
| 		}
 | |
|   }
 | |
| 	//------------------------------------------------------------------------------
 | |
|   else																			// is not an STX char
 | |
|   {
 | |
| 		if(secondSTX == 1)							    		// if was a second STX
 | |
| 		{
 | |
| 			secondSTX = 0;										    // clearswap second STX	flag
 | |
| 			gInBuffer[0] = STX;										// set first STX received
 | |
| 			recPtr = 1;														// set byte counter at 1
 | |
| 			HAL_UART_Receive_IT(&ext_uart,&recByte,1);	// enable uart receiver 1 char
 | |
| 			return;																// and quit
 | |
| 		}
 | |
|   }
 | |
|   gInBuffer[recPtr] = recByte;							// copy data in input buffer
 | |
|   recPtr++;																	// increment byte counter			
 | |
| 	//------------------------------------------------------------------------------
 | |
|   if(recPtr > 4)														// received more than 4 bytes
 | |
|   {
 | |
| 		if(gInBuffer[1]== TOKEN_TAG)						// is it a token frame
 | |
| 		{
 | |
| 			size = TOKENSIZE;											// size is token size
 | |
| 		}
 | |
| 		else																		// not a token frame
 | |
| 		{
 | |
| 			size = gInBuffer[3]+6;								// get size in frame
 | |
| 		}
 | |
| 		if (recPtr == size)											// check all bytes received
 | |
| 		{
 | |
| 			if(recByte == ETX)										// last char received	was ETX ?
 | |
| 			{
 | |
| 				queueMsg.type = FROM_PHY;
 | |
| 				queueMsg.anyPtr = gInBuffer;
 | |
| 				//------------------------------------------------------------------------
 | |
| 				// QUEUE SEND	(send received frame to physical receiver)
 | |
| 				//------------------------------------------------------------------------
 | |
| 				retCode = osMessageQueuePut(
 | |
| 					queue_usartR_id,
 | |
| 					&queueMsg,
 | |
| 					osPriorityNormal,
 | |
| 					0);
 | |
| 				CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);										
 | |
| 			}
 | |
| 			recPtr = 0;														// reset bytes counter
 | |
| 		}
 | |
|   }
 | |
| 	HAL_UART_Receive_IT(&ext_uart,&recByte,1);	// enable uart receiver 1 char
 | |
| }
 | |
| 
 | |
| //////////////////////////////////////////////////////////////////////////////////
 | |
| // THREAD PHYSICAL RECEIVER
 | |
| //////////////////////////////////////////////////////////////////////////////////
 | |
| void PhReceiver(void *argument)
 | |
| {
 | |
| 	struct queueMsg_t queueMsg;		// queue message
 | |
| 	uint8_t * msg;
 | |
| 	uint8_t * qPtr;
 | |
| 	size_t	size;
 | |
| 	osStatus_t retCode;
 | |
| 	
 | |
| 	HAL_UART_Receive_IT(&ext_uart,&recByte,1);	// enable uart receiver 1 char
 | |
| 	//------------------------------------------------------------------------------
 | |
| 	for (;;)						// loop until doomsday
 | |
| 	{
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		// QUEUE READ										
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		retCode = osMessageQueueGet( 	
 | |
| 			queue_usartR_id,
 | |
| 			&queueMsg,
 | |
| 			NULL,
 | |
| 			osWaitForever); 	
 | |
|     CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);				
 | |
| 		qPtr = queueMsg.anyPtr;
 | |
|     //----------------------------------------------------------------------------
 | |
| 		// DEBUG DISPLAY FRAME
 | |
|     //----------------------------------------------------------------------------
 | |
|     putchar('R');                				    // insert a R for Receive       
 | |
|     putchar(':');                				    // insert a :                   	
 | |
|     DebugFrame((char*)qPtr);					  		// display frame on TERMINAL    		
 | |
| 		if (qPtr[1] == TOKEN_TAG)    						// is it a token frame ?
 | |
| 		{
 | |
| 		  size = TOKENSIZE;       							// yes -> token frame size
 | |
| 		  Ext_LED_PWM(1,100);										// token is in station
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			size = qPtr[3]+6;    									// size of string + 6 (ETX,...)
 | |
| 		}
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		// MEMORY ALLOCATION				
 | |
| 		//----------------------------------------------------------------------------
 | |
| 		msg = osMemoryPoolAlloc(memPool,osWaitForever);											
 | |
| 		memcpy(msg,&qPtr[1],size-2);
 | |
| 		queueMsg.anyPtr = msg;
 | |
| 		queueMsg.type = FROM_PHY;
 | |
| 		if((msg[0] == TOKEN_TAG) ||				// is a token frame
 | |
| 			((msg[1]>>3) == gTokenInterface.myAddress) ||	// is destination my address
 | |
| 			((msg[0]>>3) == gTokenInterface.myAddress) ||	// is source my address
 | |
| 			((msg[1]>>3) == BROADCAST_ADDRESS))	// is a broadcast frame
 | |
| 		{
 | |
| 			//--------------------------------------------------------------------------
 | |
| 			// QUEUE SEND	(send received frame to mac layer receiver)
 | |
| 			//--------------------------------------------------------------------------
 | |
| 			retCode = osMessageQueuePut(
 | |
| 				queue_macR_id,
 | |
| 				&queueMsg,
 | |
| 				osPriorityNormal,
 | |
| 				osWaitForever);
 | |
| 			CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);							
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			//--------------------------------------------------------------------------
 | |
| 			// QUEUE SEND	(send received frame to physical layer sender)
 | |
| 			//--------------------------------------------------------------------------
 | |
| 			retCode = osMessageQueuePut(
 | |
| 				queue_phyS_id,
 | |
| 				&queueMsg,
 | |
| 				osPriorityNormal,
 | |
| 				osWaitForever);
 | |
| 			CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);							
 | |
| 		}
 | |
| 	}	
 | |
| }
 | |
| 
 | |
| 
 |