📄 zigbee demo.c
字号:
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 + -