⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 macm.nc.svn-base

📁 802.15.4协议的实现
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
		post create_gts_request();
		printfUART("SEND GTS REQUEST \n", "");
	}
	*/
	//printfUART("ENTERING SLOT: %i Final slot: %i \n", number_bb,final_CAP_slot);
	
	if (number_bb >= final_CAP_slot )
	{
		printfUART("FINAL SLOT \n", "");
		atomic{
		
			if(number_bb == s_GTSss || number_bb == r_GTSss )
			{
			
				//printfUART("s_GTSss: %u r_GTSss: %u\n", s_GTSss,r_GTSss);
				if(number_bb == s_GTSss)
				{	
					printfUART("MY SEND SLOT \n", "");
					//send start slot
					trx_status = PHY_TX_ON;
					post set_trx();
					on_s_GTS =1;
					s_GTS_length --;
					if (s_GTS_length != 0 )
					{
						s_GTSss++;
					}
					if (gts_buffer_count > 0 )
					{
						//printfUART("HAVE DATA TO SEND\n", "");
						//call PD_DATA.request(gts_frame_to_send->length,gts_frame_to_send);
						//post send_gts_frame();
					}
					
					
				}
				else			
				{
					printfUART("MY RECEIVE SLOT \n", "");
					//number_bb == r_GTSss: //receive start slot
					on_r_GTS =1;
					trx_status = PHY_RX_ON;
					post set_trx();
					r_GTS_length --;
					if (r_GTS_length != 0 )
					{
						r_GTSss++;
					}
				}				
			}
			else
			{
				//idle
				on_s_GTS=0;
				on_r_GTS=0;
				trx_status = PHY_TRX_OFF;
				post set_trx();
			}
		}
	}
	
	atomic{
	
		if( csma_locate_backoff_boundary == 1 )
		{
			csma_locate_backoff_boundary=0;
			
			post start_csma_ca_slotted();
		}
		if( csma_cca_backoff_boundary == 1 )
			post perform_csma_ca_slotted();
	}


	if (gts_buffer_count > 0 && number_bb == s_GTSss - 1 )
	{
		atomic{
		
			gts_index_to_send =transmit_gts_buffer_element(0,s_GTSss);
		
			gts_frame_to_send = (MPDU *) gts_buffer_list[gts_index_to_send].frame;
		}
		printfUART("gts_index_to_send%i\n", gts_index_to_send);
		
	}

	//printfUART("%i - %i\n", number_bb,number_b);
	
	//printfUART("BB%i\n", number_bb);
	
return SUCCESS;
}

task void send_gts_frame()
{
	atomic send_frame(gts_frame_to_send->length,(uint8_t *) gts_frame_to_send,TYPE_DATA,0);
}

/*******************Timer BACKOFF PERIOD******************/
async event result_t TimerAsync.b_fired()
{

	//CSMA/CA
	atomic{
		
		if(csma_delay == 1 )
		{
			if (delay_backoff_period == 0)
			{
				if(csma_slotted == 0)
				{
					post perform_csma_ca_unslotted();
				}
				else
				{
					//CSMA/CA SLOTTED
					csma_delay=0;
					csma_cca_backoff_boundary=1;
				}
			}
			delay_backoff_period--;
		}
	}

	number_b++;

return SUCCESS;
}


task void set_trx()
{
	atomic call PLME_SET_TRX_STATE.request(trx_status);//PHY_RX_ON
	return;
}

task void create_data()
{
	create_data_frame(SHORT_ADDRESS, 0x0000, 0x00, SHORT_ADDRESS, 0x0000, 0x00, 10, msdu_pay,1,set_txoptions(1,0,1,0),0,0);
	
return;
}





task void signal_loss()
{
	atomic signal MLME_SYNC_LOSS.indication(beacon_loss_reason); //MAC_BEACON_LOSS
	return;
}

/*******************T_scan_duration**************************/ 
event result_t T_scan_duration.fired() 
{
	uint8_t channel_to_scan;
	
	printfUART("T_scan_duration.fired\n", "");

	channel_to_scan= pow(2,current_scanning);
		
	while ( (channels_to_scan & channel_to_scan ) == 0x00 )
	{
		channel_to_scan++;
		if (current_scanning == 16 )
				return SUCCESS;
	}
	current_scanning++;
	
	switch(scan_type)
	{
		//ED SCAN only FFD			
		case 0x00: 	call PLME_SET.request(PHYCURRENTCHANNEL, original_channel + current_scanning);  //change the channel
					call PLME_ED.request();
					break;
		//active scan only FFD
		case 0x01:
					break;
		//passive scan
		case 0x02:	
					break;
		//orphan scan
		case 0x03:
					break;
	
		default:
					break;
	}
	
	//end of scan
	if (current_scanning == 16 )
	{
		//signal upper layer
		scanning_channels = 0;
		
			switch(scan_type)
			{
				//ED SCAN only FFD												//total number of scans
				case 0x00: 	signal MLME_SCAN.confirm(MAC_SUCCESS,scan_type, 0x00, scan_count -1 , scanned_values, 0x00);
							
							break;
				//active scan only FFD
				case 0x01:
							break;
				//passive scan
				case 0x02:	
							break;
				//orphan scan
				case 0x03:
							break;
			
				default:
							break;
			}
	}
	return SUCCESS;
  }


/*******************T_ResponseWaitTime**************************/
event result_t T_ResponseWaitTime.fired()
{
	printfUART("T_ResponseWaitTime.fired\n", "");

	if (associating == 1)
	{
		printfUART("association failed\n", "");
		associating=0;
		signal MLME_ASSOCIATE.confirm(0x0000,MAC_NO_DATA);
		
	}

	return SUCCESS;
}

/***************TEST TIMER***************/
event result_t T_cca.fired()
{
	//uint32_t SrcAddr[2];
	//uint32_t DstAddr[2];
		//call Leds.redToggle();
		
		//post create_data();
		
		//atomic mac_PIB.macShortAddress = TOS_LOCAL_ADDRESS;
		
//		create_gts_request_cmd(set_gts_characteristics(1, GTS_RX_ONLY, 0));

//uint32_t t;
   // clearCCA = TOSH_READ_CC_CCA_PIN();
	
		//call PLME_ED.request();
	
	//t= TOSH_READ_CC_SFD_PIN();


	//create_beacon_request_cmd();
	//create_disassociation_notification_cmd(MAC_PAN_DEVICE_LEAVE);

	//create_gts_request_cmd();
 
	//create_disassociation_notification_cmd(MAC_PAN_DEVICE_LEAVE);
 
	return SUCCESS;
}

//TEST
task void test_send_data()
{

	uint32_t SrcAddr[2];
	uint32_t DstAddr[2];

	SrcAddr[0]= 0x00000000;
	SrcAddr[1]= 0x00000001;
	
	DstAddr[0]= 0x00000000;
	DstAddr[1]= 0x00000002;
	
	//TEST data send
	//uint8_t SrcAddrMode, uint16_t SrcPANId, uint32_t SrcAddr[], uint8_t DstAddrMode, uint16_t DestPANId, uint32_t DstAddr[], uint8_t msduLength, uint8_t msdu[],uint8_t msduHandle, uint8_t TxOptions)
	create_data_frame(SHORT_ADDRESS, 0x0000, SrcAddr, LONG_ADDRESS, 0x0000, DstAddr, 10, msdu_pay,1,set_txoptions(1,0,1,0),0,0);
	//END TEST
return;
}


/*******************T_ackwait**************************/
event result_t T_ackwait.fired()
{
	//printfUART("T_ackwait.fired \n", "");
	ack_wait=0;
	if (ack_received == 1)
	{
		printfUART("Ack SUCCESS \n", "");
	}
	else
	{
		printfUART("ACK FAIL \n", "");
		
		if (associating == 1)
		{
			//try again
			association_retries--;
			if (association_retries==0)
			{
				printfUART("association failed \n", "");
				associating=0;
				signal MLME_ASSOCIATE.confirm(0x0000,MAC_NO_ACK);
			}
			else
			{
				printfUART("ASSOCIATION RETRY association_retries: %i\n", association_retries);
				
				create_association_request_cmd(a_CoordAddrMode,a_CoordPANId,a_CoordAddress);
			}
		}
	}
	
	return SUCCESS;
}

/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/************************		BUILD FRAMES FUNCTIONS   			**********************************/
/*****************************************************************************************************/ 
/*****************************************************************************************************/
/*****************************************************************************************************/


task void create_beacon()
{
	int i;
	uint8_t packet_length = 25;
	int data_count;
	
	uint8_t gts_directions=0x00;
	
	atomic{
		
		beacon_addr_short *mac_beacon_addr_short_ptr;
		mac_beacon_addr_short_ptr = (beacon_addr_short*) &mac_txmpdu.data[0];
	
		//call PLME_SET_TRX_STATE.request(PHY_TX_ON);
		
		mac_txmpdu_ptr->length = 15;
		mac_txmpdu_ptr->frame_control = set_frame_control(TYPE_BEACON,0,0,0,1,SHORT_ADDRESS,SHORT_ADDRESS);
		mac_txmpdu_ptr->seq_num = mac_PIB.macBSN;
		mac_PIB.macBSN++;
		 
		mac_beacon_addr_short_ptr->source_PAN_identifier = mac_PIB.macPANId;
		mac_beacon_addr_short_ptr->destination_address = 0xffff;
		mac_beacon_addr_short_ptr->source_address = mac_PIB.macShortAddress;
		mac_beacon_addr_short_ptr->superframe_specification = set_superframe_specification(mac_PIB.macBeaconOrder,(uint8_t)mac_PIB.macSuperframeOrder,final_CAP_slot,0,1,0);
		
		mac_txmpdu_ptr->data[8] = set_gts_specification(GTS_descriptor_count,mac_PIB.macGTSPermit);
		
		mac_txmpdu_ptr->data[9] = set_pending_address_specification(short_addr_pending,long_addr_pending);
		
		data_count = 9;
		packet_length = 15;
		
		//BUILDING the GTS DESCRIPTORS
		if( GTS_descriptor_count > 0 )
		{
			data_count++;
					
			for(i=0; i< 7 ; i++)
			{
				if( GTS_db[i].gts_id != 0x00 && GTS_db[i].DevAddressType != 0x0000) 
				{
					
					mac_txmpdu_ptr->data[data_count] = GTS_db[i].DevAddressType;
					//printfUART("B gts %i\n", (GTS_db[i].DevAddressType >> 8 ) ); 
					
					data_count++;
					mac_txmpdu_ptr->data[data_count] = (GTS_db[i].DevAddressType >> 8 );
					//printfUART("B gts %i\n",  GTS_db[i].DevAddressType ); 
					
					data_count++;
					
					mac_txmpdu_ptr->data[data_count] = set_gts_descriptor(i,GTS_db[i].length);
					data_count++;
					//printfUART("B gts %i\n", set_gts_descriptor(GTS_db[i].starting_slot,GTS_db[i].length) ); 
					
					packet_length = packet_length +3;
					
					if ( GTS_db[i].direction == 1 )
					{
						gts_directions = gts_directions | (1 << i); 
					}
					else
					{
						gts_directions = gts_directions | (0 << i); 
					}
					
					//printfUART("dir %i\n", gts_directions); 
				}
			}
			
			mac_txmpdu_ptr->data[9] = gts_directions;
		
			//BUILDING the NULL GTS DESCRIPTORS
			if ( GTS_null_descriptor_count > 0 )
			{
				for(i=0; i< 7 ; i++)
				{
					if( GTS_null_db[i].DevAddressType != 0x0000) 
					{
						mac_txmpdu_ptr->data[data_count] = GTS_null_db[i].DevAddressType;
						//printfUART("B gts %i\n", (GTS_db[i].DevAddressType >> 8 ) ); 
						data_count++;
						mac_txmpdu_ptr->data[data_count] = (GTS_null_db[i].DevAddressType >> 8 );
						//printfUART("B gts %i\n",  GTS_db[i].DevAddressType ); 
						data_count++;
						mac_txmpdu_ptr->data[data_count] = 0x00;
						data_count++;
						//printfUART("B gts %i\n", set_gts_descriptor(GTS_db[i].starting_slot,GTS_db[i].length) ); 
						packet_length = packet_length +3;
					}
				}
			}
	
			//resetting the GTS specification field
			mac_txmpdu_ptr->data[8] = set_gts_specification(GTS_descriptor_count + GTS_null_descriptor_count,mac_PIB.macGTSPermit);
		
			mac_txmpdu_ptr->data[data_count] = set_pending_address_specification(short_addr_pending,long_addr_pending);
			packet_length++;
		}
		
		
		
		mac_txmpdu_ptr->length = packet_length;
		
		
		send_beacon_length = packet_length;
		
		send_beacon_frame_ptr = (uint8_t*)mac_txmpdu_ptr;
		
		}
		//send_frame(mac_txmpdu_ptr->length,(uint8_t*)mac_txmpdu_ptr,TYPE_BEACON,0);
		//call PD_DATA.request(16,(uint8_t*)mac_txmpdu_ptr);
}


void create_association_response_cmd(uint32_t DeviceAddress[],uint16_t shortaddress, uint8_t status)
{

atomic{
	cmd_association_response *mac_association_response;
	

	//creation of a pointer to the association response structure
	mac_association_response = (cmd_association_response*) &mac_txmpdu.data;									
	
	mac_txmpdu_ptr->length = 29;
	mac_txmpdu_ptr->frame_control = set_frame_control(TYPE_CMD,0,0,1,0,LONG_ADDRESS,LONG_ADDRESS);
	mac_txmpdu_ptr->seq_num = mac_PIB.macDSN;
	mac_PIB.macDSN++;
	
	mac_association_response->destination_PAN_identifier = mac_PIB.macPANId;

	mac_association_response->destination_address0 = DeviceAddress[0];
	mac_association_response->destination_address1 = DeviceAddress[1];
	
	mac_association_response->source_PAN_identifier = mac_PIB.macPANId;
	
	mac_association_response->source_address0 = aExtendedAddress0;
	mac_association_response->source_address1 = aExtendedAddress1;

	mac_association_response->command_frame_identifier = CMD_ASSOCIATION_RESPONSE;
	
	mac_association_response->short_address = shortaddress;

	mac_association_response->association_status = status;


	printfUART("ASS RESP S: %i\n",shortaddress); 
	

	add_ind_queue(LONG_ADDRESS,DeviceAddress,(uint8_t*)mac_txmpdu_ptr);
	
	}
	
	return;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -