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

📄 zigbee demo.c

📁 zigbee 飞思卡尔 音频传输 基于ucos的所有源码
💻 C
📖 第 1 页 / 共 3 页
字号:
				if( button_value_current == 4 )//press the SW4 cancel button
				{
					button_value_current = 0;
					printf("cancel this call\n");
					app_status = CANCEL;
					break;
				}
				if( button_value_current ==5 )//press the SW5 confirm button
				{
					button_value_current = 0;
					printf("accept this call\n send the accept command\n");
					app_status = SEND_ACCEPT;
					break;
				}
				break;
				
			case SEND_ACCEPT:
				printf("send accept \n");
				
				if (MLMERXDisableRequest() != SUCCESS)  //Turn off the RX mode.
				{
					app_status = SEND_ACCEPT;
					printf("can't disable the rx\n");
					break;
				}
				//void make_trans_package(unsigned char src_id,unsigned char des_id,unsigned char cmd,unsigned char *data,unsigned char data_buf_length)
				make_trans_package(src_nodeid,des_nodeid,CMD_ACCEPT,cmd_para_buf,0);
				MCPSDataRequest(&tx_pkt);
			
				app_status = WAIT_FOR_ACCEPT_ACK; 
				MLMERXEnableRequest(&rx_pkt, TIMEOUT_PERIOD);
				break;
				
			case WAIT_FOR_ACCEPT_ACK:
				printf("wait for accept ack\n");

				if( button_value_current == 4 )//press the SW4 cancel button
				{
					button_value_current = 0;
					printf("cancel this call\n");
					app_status = CANCEL;
					break;
				}
				break;
			
			case REC_ACCEPT:
				printf("receive accept\n");
				
				out_buf_count = 0;
				out_buf_full_flag = 0;
				out_buf_flag = 1;
			
				in_buf_count = 0;
				in_buf_flag = 1;
				
				for(i=0; i<0x9000;i++)
			
				app_status = AUDIO_DATA;
				#ifdef zigbee_debug
				//printf("zigbee transrec channel setup over\n");
				#endif
				
				button_value_current = 0;
				break;
			
			case SEND_ACCEPT_ACK:
				printf("send accept ack\n");
				if (MLMERXDisableRequest() != SUCCESS)  //Turn off the RX mode.
				{
					app_status = SEND_ACCEPT;
					printf("can't disable the rx\n");
					break;
				}
				//void make_trans_package(unsigned char src_id,unsigned char des_id,unsigned char cmd,unsigned char *data,unsigned char data_buf_length)
				make_trans_package(src_nodeid,des_nodeid,CMD_ACCEPT_ACK,cmd_para_buf,0);
				MCPSDataRequest(&tx_pkt);
				
				app_status = REC_ACCEPT; 
				
				MLMERXEnableRequest(&rx_pkt, 0);
				break;
				
			case REC_ACCEPT_ACK:
				printf("receive accept ack\n");
				printf("zigbee transrec channel setup over\n");
				
				button_value_current = 0;
				out_buf_count = 0;
				out_buf_full_flag = 0;
				out_buf_flag = 1;
			
				in_buf_count = 0;
				in_buf_flag = 1;
			
   			
				MLMERXEnableRequest(&rx_pkt, 0);
				app_status = AUDIO_DATA; 
			
				break;
				
			case AUDIO_DATA:
				//方案三
				//out buf为两个缓冲区,每count达到MAX OUT就把flag=相应的缓冲区的号码,in buf每输出4次,即in buf的一个字节就
				//恢复为0x80,从而防止重复播放。
				//用两个缓冲区看能不能解决host端接受不到数据的情况。
				//不用循环队列
				//
				if(host_client == 1)//host
				{
					if( (out_buf_full_flag == 1) || (out_buf_full_flag == 2) )//have data ,so can transmit
					{
						//void make_trans_package(unsigned char src_id,unsigned char des_id,unsigned char cmd,unsigned char *data,unsigned char data_buf_length)
						switch(out_buf_full_flag)
						{
							case 1:
								make_trans_package(src_nodeid,des_nodeid,CMD_AUDIO_DATA,out_data_buf1,UIF_MAX_OUT);
								break;
								
							case 2:
								make_trans_package(src_nodeid,des_nodeid,CMD_AUDIO_DATA,out_data_buf2,UIF_MAX_OUT);
								break;
								
								
							default:
								printf("out buf transmit error\n");
								break;
						}
						
						out_buf_full_flag = 0;
					
						if (MLMERXDisableRequest() != SUCCESS)  //Turn off the RX mode.
						{
							app_status = AUDIO_DATA;
							printf("can't disable rx\n");
							break;

						}
						
						MCPSDataRequest(&tx_pkt);
						MLMERXEnableRequest(&rx_pkt, 0);//dont set data ack
					}
				}

				else//client
				{
					if( trans_flag == 1 )
					{
						
						if( (out_buf_full_flag == 1) || (out_buf_full_flag == 2) )//have data ,so can transmit						{
						{	
							trans_flag = 0;
							//void make_trans_package(unsigned char src_id,unsigned char des_id,unsigned char cmd,unsigned char *data,unsigned char data_buf_length)
							switch(out_buf_full_flag)
							{
								case 1:
									make_trans_package(src_nodeid,des_nodeid,CMD_AUDIO_DATA,out_data_buf1,UIF_MAX_OUT);
									//out_buf_front = 2;
									break;
									
								case 2:
									make_trans_package(src_nodeid,des_nodeid,CMD_AUDIO_DATA,out_data_buf2,UIF_MAX_OUT);
									//out_buf_front = 3;
									break;
									
								default:
									printf("out buf transmit error\n");
									break;
									
							}
							
							if (MLMERXDisableRequest() != SUCCESS)  //Turn off the RX mode.
							{
								app_status = AUDIO_DATA;
								printf("can't disable rx\n");
								break;

							}
							
							out_buf_full_flag = 0;
							MCPSDataRequest(&tx_pkt);
						
							MLMERXEnableRequest(&rx_pkt, 0);//dont set data ack							
						}
					}
				}
				
				
				break;
						
			case CANCEL:
				
				zigbee_flag = 0;
				button_value_current = 0;
				//for old cpt
				//cpt_i = 0;
				//index = 1;
				index_cpt = 1;
				//stop the timer and stop sampling and return to WAIT_CALL_SEND status 
				// and 			app_status = RECEIVER_ALWAYS_ON;
				//disable PWM out and ADC sampling and PIT; 
				MCF_PWM_PWME &= ~MCF_PWM_PWME_PWME1; 	// Disable the Pwm Chanl 1
				MCF_PIT1_PCSR &= ~MCF_PIT_PCSR_EN;	// disable the PIT1 Clock
				//in PIT1 ISR ADC begin to run ,so we disable the PIT1 and at the same time we disable the ADC
				
				printf("return idle mode\n");
				MLMERXEnableRequest(&rx_pkt,0);
				trans_flag = 0;
				host_client = 0;
				app_status = IDLE_STATE;
				encode_bite_n = 0;//16bit-》encode-》2bit-》put 4 encode‘data into one byte,first fill the lower bites of one byte
				decode_bite_n = 3;
				bite_temp = 0;
				decode_temp = 0;
				zigbee_enter_726 = 0;
				start_decode = 0;
				
				break;
				
			case WAIT_ACCEPT:
				MLMERXEnableRequest(&rx_pkt,0);
				app_status=IDLE_STATE;
				break;
				
			default:						
				break;
				
		} //switch end
		
	} // for end

} //main end


/********************************************************************/
/*
 * Toggle channel from 1 to MAXCHANNEL 
 * 
 */
__interrupt__ void
sw2_handler(void)
{
	uint32 i;
	

		//disable interrupt
		MCF_INTC_IMRL |= 0x00000010; 
	
	if(channel == MAXCHANNEL)
	{
		channel = 0x1;
		PLMESetChannelRequest(channel);
		MCF_GPIO_PORTTC = channel;
	}
	else
	{
		channel++;
		PLMESetChannelRequest(channel);
		MCF_GPIO_PORTTC = channel;
	}
	
	//hold channel for a while
    for(i=0;i<=0x300000;i++);
   		nop();
    
	printf("\r\nToggle to Channel: %x\n", channel);
	
    /* Clear the interrupt event */
	MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF4;
	
	//enable interrupt
	MCF_INTC_IMRL &= ~0x00000010; 
}


/********************************************************************/
/*
 * Change power level
 *
 */
__interrupt__ void
sw3_handler(void)
{
	uint32 i;
		

	//disable interrupt
		MCF_INTC_IMRL |= 0x00000020; 
	printf("\r\n");
	//change by michael chen
	//hold channel for a while
	for(i=0;i<=0x300000;i++);
   		nop();
	
		
	switch(power_level)
	{
		case MIN_POWER:
			power_level = NOMINAL_POWER;
			MLMEMC13192PAOutputAdjust(power_level);
			printf("NOMINAL POWER LEVEL\n");
			break;
			//For FCC purposes limited to NOMINAL POWER LEVEL
		case NOMINAL_POWER:
			power_level = NOMINAL_POWER;
			MLMEMC13192PAOutputAdjust(power_level);
			printf("NOMINAL POWER LEVEL\n");
			break;
		case MAX_POWER:
			power_level = MIN_POWER;
			MLMEMC13192PAOutputAdjust(power_level);
			printf("MINIMUM POWER LEVEL\n");
			break;
	}


	
   
    // Clear the interrupt event
	MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF5;
	
		//enable interrupt
	MCF_INTC_IMRL &= ~0x00000020;
}

/********************************************************************/
/*
 * cancel button
 *
 */
__interrupt__ void
sw4_handler(void)
{
	uint32 i;
		
	//disable interrupt
		MCF_INTC_IMRL |= 0x00000040; 
		
	button_value_current = 4;
	
	app_status = CANCEL;
	

	//hold channel for a while
	for(i=0;i<=0x300000;i++);
   		nop();
   		
   	printf("SW4\n");
   
    // Clear the interrupt event
	MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF6;
	
	//enable interrupt
	MCF_INTC_IMRL &= ~0x00000040; 
}


/********************************************************************/
/*
 * confirm button
 *
 */
__interrupt__ void
sw5_handler(void)
{
	uint32 i;
		
	//关中断
	MCF_INTC_IMRL |= 0x00000080; 	
	button_value_current = 5;


	//hold channel for a while
	for(i=0;i<=0x300000;i++);
   		nop();
   		
   	printf("SW5\n");

   
    // Clear the interrupt event
	MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF7;
	//enable interrupt
	MCF_INTC_IMRL &= ~0x00000080;
}



/**********************************************************
*ucos-ii test task for zigbee audio demo
***********************************************************/
OS_STK	AppTaskZigbeeStk[1224];

void  AppTaskZigbee (void * pdata)
{	
	//firstly we should set a different nodeid for each demo
	//the range is 1-7
	/*
	do
	{
		button_value = 0;
		button_value_current = 0;
		printf("pls set a nodeid for this demo\n(be sure that is a different id for each demo)\n\n");
		printf("->SW2    SW3    SW4    SW5    \n");
		printf(" 1      2      4    confirm \n");
		printf("the id is (1-5):");
		

		while( !(button_value_current == 5) );//wait for confirm
		//for debug
		printf("button_value_current=%d\n",button_value_current);
		printf("button_value=%d\n",button_value);
		while(button_value > 8)
		{
			button_value = button_value - 8;//minus the confirm key
		}
		if(button_value <1 || button_value >5)
		{
			printf("the wrong id!\npleas give the id in the range of 1-5\n");
			button_value = 0;
			button_value_current = 0;
			zigbee_flag = 1;
		}
		else
		{
			printf("\nThis demo's id is %d\n",button_value);
			src_nodeid = button_value;
			button_value = 0;
			button_value_current = 0;
			zigbee_flag = 0;
		}
	}while(zigbee_flag);
	
	//first set the call command of nodeid
	do
	{
		printf("send a call command of aimed nodeid is(1-6,6-bst):\n");
		printf("SW2    SW3    SW4    SW5    \n");
		printf(" 1      2      4    confirm \n");
		printf("the destination id is:->");
		
		while( !(button_value_current == 5) )//wait for confirm
		{
			OSTimeDly(25);
		}
		while(button_value > 8)
		{
			button_value = button_value - 8;//minus the confirm key
		}
		if(button_value <1 || button_value >6 || button_value == src_nodeid)
		{
			printf("the wrong id!\npleas give the destination id in the range of 1-6\n");
			if(button_value == src_nodeid)
			{
				printf("the aim nodeid should different from this demo nodeid\n");
				printf("This demo id is %d\n",src_nodeid);
			}
			button_value = 0;
			button_value_current = 0;
			zigbee_flag = 1;
		}
		else
		{
			printf("\nThis destination address is %d\n",button_value);
			des_nodeid = button_value;
			button_value = 0;
			button_value_current = 0;
			zigbee_flag = 0;		
		}
	}while(zigbee_flag);
	*/
	
	printf("SET ZigBee ISR on IRQ1!\n");
	//set level and proity
	MCF_INTC_ICR1 = 0x0f;
	OSVectSet	(64+1,(void (*)(void))irq_isr);

	OSVectSet 	(64+4,(void (*)(void))sw2_handler);//安装isr
	OSVectSet	(64+5,(void	(*)(void))sw3_handler);
	OSVectSet	(64+6,(void (*)(void))sw4_handler);
	OSVectSet	(64+7,(void	(*)(void))sw5_handler);

	button_value_current = 0;
	zigbee_main();
}

⌨️ 快捷键说明

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