finish receiver
This commit is contained in:
		
							
								
								
									
										204
									
								
								mac_receiver.c
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								mac_receiver.c
									
									
									
									
									
								
							| @@ -1,5 +1,203 @@ | |||||||
|  |  | ||||||
| void MacReceiver(void *argument) | #include "main.h" | ||||||
| { | #include <cassert> | ||||||
| 	// TODO | #include <cstdint> | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef union { | ||||||
|  | 	struct { | ||||||
|  | 		uint8_t sapi: 3;	// MSB | ||||||
|  | 		uint8_t addr: 4; | ||||||
|  | 		uint8_t nothing: 1;	// LSB | ||||||
|  | 	}; | ||||||
|  | 	uint8_t raw; | ||||||
|  | } Adresse; | ||||||
|  |  | ||||||
|  | typedef union { | ||||||
|  | 	struct { | ||||||
|  | 		uint8_t ack: 1;			// MSB | ||||||
|  | 		uint8_t read: 1; | ||||||
|  | 		uint8_t checksum: 6;	// LSB | ||||||
|  | 	}; | ||||||
|  | 	uint8_t raw; | ||||||
|  | } Status; | ||||||
|  |  | ||||||
|  | void send_DATA_IND(Adresse source, Adresse destination, uint8_t* dataFramePtr) { | ||||||
|  | 	struct queueMsg_t queueMsg;	// queue message | ||||||
|  | 	osStatus_t retCode;			// return error code | ||||||
|  | 	char* strPtr;  | ||||||
|  |  | ||||||
|  | 	queueMsg.type = DATA_IND; | ||||||
|  | 	queueMsg.addr = source.addr; | ||||||
|  | 	queueMsg.sapi = source.sapi; | ||||||
|  |  | ||||||
|  | 	strPtr = osMemoryPoolAlloc(memPool, osWaitForever); | ||||||
|  |  | ||||||
|  | 	for(uint8_t i = 0; i < dataFramePtr[2]; i++) { | ||||||
|  | 		strPtr[i] = (char)dataFramePtr[3+i]; | ||||||
|  | 	} | ||||||
|  | 	strPtr[dataFramePtr[2]] = '\0'; // null-terminate string | ||||||
|  | 	queueMsg.anyPtr = strPtr; | ||||||
|  |  | ||||||
|  | 	switch (destination.sapi) { | ||||||
|  | 		case TIME_SAPI: | ||||||
|  | 			retCode = osMessageQueuePut( | ||||||
|  | 				queue_timeR_id, | ||||||
|  | 				&queueMsg, | ||||||
|  | 				osPriorityNormal, | ||||||
|  | 				osWaitForever); | ||||||
|  | 			CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 			break; | ||||||
|  | 		case CHAT_SAPI: | ||||||
|  | 			retCode = osMessageQueuePut( | ||||||
|  | 				queue_chatR_id, | ||||||
|  | 				&queueMsg, | ||||||
|  | 				osPriorityNormal, | ||||||
|  | 				osWaitForever); | ||||||
|  | 			CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 			break; | ||||||
|  | 		default: | ||||||
|  | 			assert(false); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void send_DATABACK(Adresse source, Adresse destination, uint8_t* dataFramePtr) { | ||||||
|  | 	struct queueMsg_t queueMsg;	// queue message | ||||||
|  | 	osStatus_t retCode;			// return error code | ||||||
|  |  | ||||||
|  | 	queueMsg.type = DATABACK; | ||||||
|  | 	queueMsg.anyPtr = dataFramePtr; | ||||||
|  | 	queueMsg.addr = source.addr; | ||||||
|  | 	queueMsg.sapi = source.sapi; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	retCode = osMessageQueuePut( | ||||||
|  | 		queue_macS_id, | ||||||
|  | 		&queueMsg, | ||||||
|  | 		osPriorityNormal, | ||||||
|  | 		osWaitForever); | ||||||
|  | 	CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 	 | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | void MacReceiver(void *argument) { | ||||||
|  | 	struct queueMsg_t queueMsg;	// queue message | ||||||
|  | 	Adresse src; | ||||||
|  | 	Adresse dst; | ||||||
|  | 	uint8_t length; | ||||||
|  | 	Status status; | ||||||
|  | 	uint8_t* msg; | ||||||
|  | 	osStatus_t retCode;			// return error code | ||||||
|  |  | ||||||
|  | 	for(;;) { | ||||||
|  | 		//-------------------------------------------------------------------------- | ||||||
|  | 		// QUEUE READ										 | ||||||
|  | 		//-------------------------------------------------------------------------- | ||||||
|  | 		{ | ||||||
|  | 		retCode = osMessageQueueGet( | ||||||
|  | 			queue_macR_id, | ||||||
|  | 			&queueMsg, | ||||||
|  | 			NULL, | ||||||
|  | 			osWaitForever); | ||||||
|  | 		CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 		 | ||||||
|  | 		msg = queueMsg.anyPtr; | ||||||
|  | 		} | ||||||
|  | 		switch (queueMsg.type) { | ||||||
|  |  | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// MESSAGE FROM PHY | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			case FROM_PHY: | ||||||
|  | 				if(msg[0] == TOKEN_TAG) { | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					// TOKEN | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					queueMsg.type = TOKEN; | ||||||
|  | 					retCode = osMessageQueuePut( | ||||||
|  | 						queue_macS_id, | ||||||
|  | 						&queueMsg, | ||||||
|  | 						osPriorityNormal, | ||||||
|  | 						osWaitForever); | ||||||
|  | 					CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  |  | ||||||
|  | 				} else { | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					// MESSAGE | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					src.raw = msg[0]; | ||||||
|  | 					dst.raw = msg[1]; | ||||||
|  | 					length = msg[2]; | ||||||
|  | 					status.raw = msg[3+length]; | ||||||
|  |  | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					// MESSAGE FOR ME (or broadcast) | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					if( dst.addr == gTokenInterface.myAddress || | ||||||
|  | 						dst.addr == BROADCAST_ADDRESS ) { | ||||||
|  | 						 | ||||||
|  | 						if((Checksum(msg) & 0x3F) == status.checksum) { | ||||||
|  | 							status.ack = 1; | ||||||
|  | 							 | ||||||
|  | 							if(dst.sapi == CHAT_SAPI && gTokenInterface.connected || | ||||||
|  | 								dst.sapi == TIME_SAPI && gTokenInterface.broadcastTime) { | ||||||
|  | 								// Send to Time or Chat ---------------------------- | ||||||
|  | 								send_DATA_IND(src, dst, queueMsg.anyPtr); | ||||||
|  | 								status.read = 1; | ||||||
|  | 							} else { | ||||||
|  | 								status.read = 0; | ||||||
|  | 							} | ||||||
|  | 							msg[3+length] = status.raw; | ||||||
|  | 							 | ||||||
|  | 							if(src.addr == gTokenInterface.myAddress) { // For me, from me | ||||||
|  | 								// Send DATABACK ----------------------------------- | ||||||
|  | 								send_DATABACK(src, dst, queueMsg.anyPtr); | ||||||
|  | 							} else { | ||||||
|  | 								// Send to PHY ------------------------------------- | ||||||
|  | 								queueMsg.type = TO_PHY; | ||||||
|  | 								retCode = osMessageQueuePut( | ||||||
|  | 									queue_phyS_id, | ||||||
|  | 									&queueMsg, | ||||||
|  | 									osPriorityNormal, | ||||||
|  | 									osWaitForever); | ||||||
|  | 								CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 							} | ||||||
|  | 						 | ||||||
|  | 						} else { // for me but bad checksum | ||||||
|  | 							status.ack = 0; | ||||||
|  | 							status.read = 0; | ||||||
|  | 							msg[3+length] = status.raw; | ||||||
|  | 							send_DATABACK(src, dst, queueMsg.anyPtr); | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					// MESSAGE FOR SOMEONE ELSE | ||||||
|  | 					//-------------------------------------------------------------- | ||||||
|  | 					} else if(src.addr == gTokenInterface.myAddress) { | ||||||
|  | 						// MESSAGE FROM ME ----------------------------------------- | ||||||
|  | 						send_DATABACK(src, dst, queueMsg.anyPtr); | ||||||
|  | 					} else { | ||||||
|  | 						// MESSAGE FROM SOMEONE ELSE ------------------------------- | ||||||
|  | 						queueMsg.type = TO_PHY; | ||||||
|  | 						retCode = osMessageQueuePut( | ||||||
|  | 							queue_phyS_id, | ||||||
|  | 							&queueMsg, | ||||||
|  | 							osPriorityNormal, | ||||||
|  | 							osWaitForever); | ||||||
|  | 						CheckRetCode(retCode, __LINE__, __FILE__, CONTINUE); | ||||||
|  | 					} | ||||||
|  | 					 | ||||||
|  | 				} | ||||||
|  | 				break; | ||||||
|  | 			 | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// DEFAULT - TBD | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			default: | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								mac_sender.c
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								mac_sender.c
									
									
									
									
									
								
							| @@ -17,9 +17,9 @@ void MacSender(void *argument) { | |||||||
|  |  | ||||||
| 	 | 	 | ||||||
| 	for(;;) { | 	for(;;) { | ||||||
| 		//---------------------------------------------------------------------------- | 		//-------------------------------------------------------------------------- | ||||||
| 		// QUEUE READ										 | 		// QUEUE READ										 | ||||||
| 		//---------------------------------------------------------------------------- | 		//-------------------------------------------------------------------------- | ||||||
| 		retCode = osMessageQueueGet( | 		retCode = osMessageQueueGet( | ||||||
| 			queue_macS_id, | 			queue_macS_id, | ||||||
| 			&queueMsg, | 			&queueMsg, | ||||||
| @@ -31,6 +31,9 @@ void MacSender(void *argument) { | |||||||
| 		 | 		 | ||||||
| 		switch(queueMsg.type) { | 		switch(queueMsg.type) { | ||||||
| 			 | 			 | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// TOKEN MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case TOKEN: { | 			case TOKEN: { | ||||||
| 				// Get token and save it | 				// Get token and save it | ||||||
| 				memcpy(lastToken, msg, TOKENSIZE-2); | 				memcpy(lastToken, msg, TOKENSIZE-2); | ||||||
| @@ -80,13 +83,17 @@ void MacSender(void *argument) { | |||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
| 			 | 			//---------------------------------------------------------------------- | ||||||
|  | 			// DATABACK MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case DATABACK: { | 			case DATABACK: { | ||||||
|  |  | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
| 			 | 			//---------------------------------------------------------------------- | ||||||
|  | 			// NEW TOKEN MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case NEW_TOKEN: { | 			case NEW_TOKEN: { | ||||||
| 				lastToken[0] = TOKEN_TAG; | 				lastToken[0] = TOKEN_TAG; | ||||||
| 				 | 				 | ||||||
| @@ -108,27 +115,34 @@ void MacSender(void *argument) { | |||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// START MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case START: { | 			case START: { | ||||||
| 				// Do nothing, don't care to receive start | 				gTokenInterface.connected = true; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// STOP MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case STOP: { | 			case STOP: { | ||||||
| 				// Do nothing, don't care to receive stop | 				gTokenInterface.connected = false; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
|  | 			// DATA MESSAGE | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			case DATA_IND: { | 			case DATA_IND: { | ||||||
|  |  | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			 | 			//---------------------------------------------------------------------- | ||||||
|  | 			// DEFAULT - TBD | ||||||
|  | 			//---------------------------------------------------------------------- | ||||||
| 			default: { | 			default: { | ||||||
|  |  | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								main.c
									
									
									
									
									
								
							| @@ -286,6 +286,20 @@ void CheckRetCode(uint32_t retCode,uint32_t lineNumber,char * fileName,uint8_t m | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | /// \brief Calculate the checksum of a frame | ||||||
|  | /// \param frame pointer to the frame to calculate the checksum | ||||||
|  | /// \return the checksum | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////// | ||||||
|  | uint8_t Checksum(uint8_t * frame) { | ||||||
|  | 	uint8_t checksum = 0; | ||||||
|  | 	uint8_t length = frame[2];	 | ||||||
|  | 	for (uint8_t i = 0; i < length+3; i++) { | ||||||
|  | 		checksum = checksum + frame[i]; | ||||||
|  | 	} | ||||||
|  | 	return checksum; | ||||||
|  | } | ||||||
|  |  | ||||||
| ////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////// | ||||||
| /// \brief Configure the clock @ 216MHz and peripheral clocks | /// \brief Configure the clock @ 216MHz and peripheral clocks | ||||||
| ////////////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////////////// | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								main.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								main.h
									
									
									
									
									
								
							| @@ -56,6 +56,7 @@ extern osEventFlagsId_t  	eventFlag_id; | |||||||
| void CheckRetCode(uint32_t retCode,uint32_t lineNumber,char * fileName,uint8_t mode); | void CheckRetCode(uint32_t retCode,uint32_t lineNumber,char * fileName,uint8_t mode); | ||||||
| void DebugFrame(char * stringP); | void DebugFrame(char * stringP); | ||||||
| void DebugMacFrame(uint8_t preChar,uint8_t * stringP); | void DebugMacFrame(uint8_t preChar,uint8_t * stringP); | ||||||
|  | uint8_t Checksum(uint8_t* frame); | ||||||
|  |  | ||||||
| //-------------------------------------------------------------------------------- | //-------------------------------------------------------------------------------- | ||||||
| // structure for system usage | // structure for system usage | ||||||
|   | |||||||
| @@ -145,7 +145,7 @@ | |||||||
|         <SetRegEntry> |         <SetRegEntry> | ||||||
|           <Number>0</Number> |           <Number>0</Number> | ||||||
|           <Key>ST-LINKIII-KEIL_SWO</Key> |           <Key>ST-LINKIII-KEIL_SWO</Key> | ||||||
|           <Name>-U0671FF485057775187193017 -O8398 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(5BA02477) -L00(0) -TO131075 -TC216000000 -TT216000000 -TP21 -TDS806B -TDT0 -TDC1F -TIE1 -TIP1 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32F7x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F746NGHx$CMSIS\Flash\STM32F7x_1024.FLM)</Name> |           <Name>-U066DFF485153826687131237 -O8398 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP (ARM Core") -D00(5BA02477) -L00(0) -TO131075 -TC216000000 -TT216000000 -TP21 -TDS806B -TDT0 -TDC1F -TIE1 -TIP1 -FO7 -FD20010000 -FC1000 -FN1 -FF0STM32F7x_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F746NGHx$CMSIS\Flash\STM32F7x_1024.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name> | ||||||
|         </SetRegEntry> |         </SetRegEntry> | ||||||
|         <SetRegEntry> |         <SetRegEntry> | ||||||
|           <Number>0</Number> |           <Number>0</Number> | ||||||
| @@ -160,6 +160,21 @@ | |||||||
|           <WinNumber>1</WinNumber> |           <WinNumber>1</WinNumber> | ||||||
|           <ItemText>sai</ItemText> |           <ItemText>sai</ItemText> | ||||||
|         </Ww> |         </Ww> | ||||||
|  |         <Ww> | ||||||
|  |           <count>1</count> | ||||||
|  |           <WinNumber>1</WinNumber> | ||||||
|  |           <ItemText>gTokenInterface</ItemText> | ||||||
|  |         </Ww> | ||||||
|  |         <Ww> | ||||||
|  |           <count>2</count> | ||||||
|  |           <WinNumber>1</WinNumber> | ||||||
|  |           <ItemText>t</ItemText> | ||||||
|  |         </Ww> | ||||||
|  |         <Ww> | ||||||
|  |           <count>3</count> | ||||||
|  |           <WinNumber>1</WinNumber> | ||||||
|  |           <ItemText>lastToken</ItemText> | ||||||
|  |         </Ww> | ||||||
|       </WatchWindow1> |       </WatchWindow1> | ||||||
|       <MemoryWindow1> |       <MemoryWindow1> | ||||||
|         <Mm> |         <Mm> | ||||||
| @@ -178,12 +193,12 @@ | |||||||
|         </Mm> |         </Mm> | ||||||
|       </MemoryWindow3> |       </MemoryWindow3> | ||||||
|       <ScvdPack> |       <ScvdPack> | ||||||
|         <Filename>C:\Keil_v5\ARM\CMSIS\5.9.0\CMSIS\RTOS2\RTX\RTX5.scvd</Filename> |         <Filename>C:\Users\remi\AppData\Local\Arm\Packs\ARM\CMSIS\5.9.0\CMSIS\RTOS2\RTX\RTX5.scvd</Filename> | ||||||
|         <Type>ARM.CMSIS.5.9.0</Type> |         <Type>ARM.CMSIS.5.9.0</Type> | ||||||
|         <SubType>1</SubType> |         <SubType>1</SubType> | ||||||
|       </ScvdPack> |       </ScvdPack> | ||||||
|       <ScvdPack> |       <ScvdPack> | ||||||
|         <Filename>C:\Keil_v5\Keil\ARM_Compiler\1.7.2\EventRecorder.scvd</Filename> |         <Filename>C:\Users\remi\AppData\Local\Arm\Packs\Keil\ARM_Compiler\1.7.2\EventRecorder.scvd</Filename> | ||||||
|         <Type>Keil.ARM_Compiler.1.7.2</Type> |         <Type>Keil.ARM_Compiler.1.7.2</Type> | ||||||
|         <SubType>1</SubType> |         <SubType>1</SubType> | ||||||
|       </ScvdPack> |       </ScvdPack> | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
|       <TargetName>Target 1</TargetName> |       <TargetName>Target 1</TargetName> | ||||||
|       <ToolsetNumber>0x4</ToolsetNumber> |       <ToolsetNumber>0x4</ToolsetNumber> | ||||||
|       <ToolsetName>ARM-ADS</ToolsetName> |       <ToolsetName>ARM-ADS</ToolsetName> | ||||||
|       <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed> |       <pCCUsed>5060960::V5.06 update 7 (build 960)::C:\Program Files (x86)\ARM_Compiler_5.06u7</pCCUsed> | ||||||
|       <uAC6>0</uAC6> |       <uAC6>0</uAC6> | ||||||
|       <TargetOption> |       <TargetOption> | ||||||
|         <TargetCommonOption> |         <TargetCommonOption> | ||||||
| @@ -186,6 +186,7 @@ | |||||||
|             <RvdsVP>2</RvdsVP> |             <RvdsVP>2</RvdsVP> | ||||||
|             <RvdsMve>0</RvdsMve> |             <RvdsMve>0</RvdsMve> | ||||||
|             <RvdsCdeCp>0</RvdsCdeCp> |             <RvdsCdeCp>0</RvdsCdeCp> | ||||||
|  |             <nBranchProt>0</nBranchProt> | ||||||
|             <hadIRAM2>1</hadIRAM2> |             <hadIRAM2>1</hadIRAM2> | ||||||
|             <hadIROM2>1</hadIROM2> |             <hadIROM2>1</hadIROM2> | ||||||
|             <StupSel>8</StupSel> |             <StupSel>8</StupSel> | ||||||
| @@ -864,4 +865,13 @@ | |||||||
|     </files> |     </files> | ||||||
|   </RTE> |   </RTE> | ||||||
|  |  | ||||||
|  |   <LayerInfo> | ||||||
|  |     <Layers> | ||||||
|  |       <Layer> | ||||||
|  |         <LayName>tokenring_project</LayName> | ||||||
|  |         <LayPrjMark>1</LayPrjMark> | ||||||
|  |       </Layer> | ||||||
|  |     </Layers> | ||||||
|  |   </LayerInfo> | ||||||
|  |  | ||||||
| </Project> | </Project> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user