device_bind_process是怎么实现绑定的?
enum
{
NOSTATE,
UBIND, //等待接收 握手一次1
WAIT_FOR_TOUCH, //
WAIT_FOR_CONFIRM, //点击按键后 回复一次2
BIND_SUCCESS, //等待接收 握手3次
};
此段代码是在void touch_scan(void)
//绑定状态的切换 按2、3按键进入网状态 怎么表现的2、3键
if (device_bind_process==WAIT_FOR_TOUCH)
{
if (i==3)
{
device_bind_process = WAIT_FOR_CONFIRM; //点击按键后 回复一次2
enter_vlps_xms(50);//进入第功率状态
return;
}
}
//检测到有新设备的时候,状态为WAIT_FOR_TOUCH,按了3键紧接着进入了WAIT_FOR_CONFIRM,进入WAIT_FOR_CONFIRM以后干吗用呢????
void task_25ms(void *args)
{
if (!is_task_set(EV_REPS))//如果没有启动wireless_response就启动wireless_check_irq
{
notify(EV_WIRQ); //75MS Per.time 启动wirless_check_irq
}
// if ((silicon_status&SILLICON_ALL_SET)||is_task_set(EV_REPS)||is_task_set(EV_WIRQ)||cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on) return; //sleep or not
// enter_vlps_xms(15); //wake up for EV_WIRQ 75ms
if (bind_state_cnt!=0)
{
if(0==--bind_state_cnt)
{
device_bind_process=UBIND;//入网的时候会把bind_state_cnt赋值0x28,,在282内没有完成就是没有绑定成功。
在规定的时间内没有完成绑定的工作
}
}
}
device_bind_process初始化为NOSTATE
uint8 device_bind_process=NOSTATE; //绑定状态切换
void bind_listen_send()
{
test_buff[8]={0x8E,0x24,0x8B,0x00,0x65,0x3,0xF0,0x95};
if (si4438_statue == SI4438_SLEEP)
{
vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH); //4MS 所有READCTS带自动复位功能
si4438_statue = SI4438_RX;
clr_detc();
}
//注意 清旧设备和这里会出现连续保持RX
if (si4438_statue == SI4438_RX)
{
clr_detc();
if(0==read_4438_irq_port())
// if (1)
{
if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))
return; // test by lgt
//如果是新设备会进入第一次入网的申请 木
if(BIND_MESSGE == frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT)) // test by lgt
//if(BIND_MESSGE == frame_ctl(test_buff,8))
{
//adapter_infor_add(); //置旧设备标志位,写FLASH
device_bind_process=WAIT_FOR_TOUCH;
这里就就解释了WAIT_FOR_TOUCH的由来
}
else //非绑定报文
{
if (!(silicon_status&0x58))
{
si446x_change_state(1);
return; //保证关灯时电够用
}
//notify(EV_BIND);
}
si446x_change_state(1); //先休眠无线在切低功耗 记得和上面的changestate合一起
// enter_vlps_100ms();
}
set_detc();
}
else
{
//code finished ,no test
//clr_selc();
if(cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on)
return;
si446x_get_int_status(0u, 0u, 0u); //一定清标志位
// enter_vlps_100ms(); //先电容充电再发送报文
// enter_vlps_100ms();
if (device_bind_process==WAIT_FOR_CONFIRM)//如果处于设置状态的话,就会填充握手报文。8e 24 8b 00 65 aa bb cc 04 77 00
{
Device_broadcast_mess.ctrl=4;
Device_broadcast_mess.handle=1;
Device_broadcast_mess.data=RELAY_4_CHAN;// enter_vlps_xms(200);
Device_broadcast_mess.sum=sum((unsigned char *)&Device_broadcast_mess,10);
}
if (device_bind_process == NOSTATE)
{
memset_my(Device_broadcast_mess.dev_id, 0XFF, ADAPTER_ADDRESS_LEN);
memset_my(Device_broadcast_mess.my_id, 0, SLAVE_ADDRESS_LEN);
Device_broadcast_mess.ctrl=3;
Device_broadcast_mess.data=RELAY_4_CHAN;
}
Device_broadcast_mess.sum=sum((unsigned char *)&Device_broadcast_mess,10);
vRadio_StartTx_Variable_Packet(0, &Device_broadcast_mess.head, 11); // 重传/100ms+20ms/次
while(read_4438_irq_port()!=0);
si4438_delay--;
//set_selc();
}
}
u8 wirless_state_analyse()
{
if (device_bind_process==WAIT_FOR_TOUCH) //TOUCH状态在触摸按键检测中切换
{
change_led_select();//等待触摸,不断闪灯
notify(EV_BIND);
return 0xff;
}
if (device_bind_process==BIND_SUCCESS) //TOUCH状态在触摸按键检测中切换
{
si446x_change_state(1); //先关闭无线 写FLASH需要时间
adapter_infor_add();//把新设备置成老设备 木
memset_my(g_frame_buffer, 0, 20);
// enter_vlps_xms(50); //防止绑定结束后复位
ctrl_set_all();
led_clr_all();
bind_state_cnt=0;//绑定成功了,就会把bind_state_cnt置0.。
si4438_statue = SI4438_SLEEP;//SI4438_SLEEP状态出现在3中情况下,BIND_SUCCESS,UBIND,初始化的时候三种状态
si4438_delay = WIRELESS_DELAY;
device_bind_process=NOSTATE;//无状态的三种情况是绑定成功,绑定失败,初始化为无状态
enter_my_sleep(5); //此处有重大BUG 成功后复位
return 0xff;
}
if(device_bind_process==UBIND)
{
si446x_change_state(1);
ctrl_set_all();
led_clr_all();
si4438_statue = SI4438_SLEEP;
si4438_delay = WIRELESS_DELAY;
device_bind_process=NOSTATE;
enter_vlps_xms(500);
return 0xff;
}
return 0;
}
uint8 SI4438_bind_message_handle(struct SI4438_Frame * pframe)
{
switch (pframe->ctrl)
{
case ADAPTER_BIND_FLAG:
mymemcpy(device_id, pframe->dev_id, ADAPTER_ADDRESS_LEN);
mymemcpy(slave_device_id,pframe->my_id,SLAVE_ADDRESS_LEN);
mymemcpy(Device_broadcast_mess.dev_id,pframe->dev_id,ADAPTER_ADDRESS_LEN); //填入广播报文
mymemcpy(Device_broadcast_mess.my_id,pframe->my_id,SLAVE_ADDRESS_LEN);//填入广播报文
Device_broadcast_mess.handle=pframe->handle;
bind_state_cnt = BIND_WAIT_TIME;//等待成功的时间
return BIND_MESSGE;
case BIND_ACK_FLAG:
if(device_bind_process != WAIT_FOR_CONFIRM)return 0xFF;
device_bind_process=BIND_SUCCESS;
return BIND_ACK_FLAG;
default:return 0xff;
}
}
uint8 SI4438_bind_message_handle(struct SI4438_Frame * pframe)问题来了谁来调用SI4438_bind_message_handle
uint8 frame_ctl(uint8 rxframe[], uint8 rxlen)
{
uint8 i = 0,framelenth;
struct SI4438_Frame *pframe;
if (rxlen<10) return 0xFF;//做的容错,因为协议都是11位的 木
while(i < rxlen)
{
if(HW_HEAD == rxframe[i]||STC == rxframe[i])//判断起始符,0X8E 木
break;
i++;
}
if(i >= rxlen)
{
return(0xFF);
}
framelenth=rxlen-i;//除起始符外的长度
if (framelenth<10) return 0XFF;
//if (STC==rxframe[i])return(frame_handle(0,rxframe + i)); //选择兼容载波协议
pframe = (struct SI4438_Frame *)(rxframe + i);
if (pframe->sum!=sum(rxframe+i,10)) return 0xFF;//判断校验码
if (DEVICE_IS_NEW==new_device_flag) //新设备发送入网申请命令 木
{
return(SI4438_bind_message_handle(pframe));
}
return (SI4438_remote_handle(pframe)); //选择支持自定义短协议
//return(remote_handle(pframe)); //选择支持遥控器
}
void wirless_check_irq(void *args)
{
clr_wdog();
// uint8_t lenth=0;
if (DEVICE_IS_NEW==new_device_flag) //新设备将不执行正常检测中断 added in 2015-3-4 no test
{
return;//如果是新设备就不用检测无线的中断了。
}
if (si4438_statue == SI4438_SLEEP) //绑定成功就读,那么不成功也是读呀????因为绑定成功和不成功设备都要是SI4438_SLEEP
{
vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH); //4MS 所有READCTS带自动复位功能, 读的东西放在哪里了????
si4438_statue = SI4438_RX;//为什么要把它置于读的状态????木 表示已经读过4438了吗???
//GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL2_PIN); //无线监听动作开始计量
}
if(0==read_4438_irq_port())//用来检测中断木 为0表示中断发生
{
if (si4438_statue==SI4438_TX)goto finish_rcv; //finish the tx//vRadio_StartRX只是开始读,把数据读出来只是bRadio_Check_Tx_RX这个函数
if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))return;//从433里面读出了数据 木
si446x_change_state(1);//猜测是清除的状态
// clr_detc();
// GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL1_PIN); //无线接收发送动作开始计量
frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//用读出来的数据改变灯的状态,把读出来的数据付诸于动作
// set_detc();
enter_vlps_xms(100); //进入低功率状态
si4438_delay = WIRELESS_DELAY;
goto finish_rcv;
}
if (si4438_delay) //如果不为0就不断的启动 无线检测 //CAL IN 1ms_TASK
{
notify(EV_WIRQ);//启动自己的无线检测
}
else
{
finish_rcv:;
si4438_delay=WIRELESS_DELAY; // WIRELESS_DELAY 0x28
si446x_get_int_status(0u, 0u, 0u);//猜测清零操作
si446x_change_state(1); //猜测是清除的状态
si4438_statue=SI4438_SLEEP; //sleep
// GPIOA_PSOR |= GPIO_PSOR_PTSO(CTRL2_PIN); //无线监听动作开始计量
if ((silicon_status&SILLICON_ALL_SET)||cap_pad[0].led_on
||cap_pad[1].led_on||cap_pad[2].led_on
||cap_pad[3].led_on) return; //sleep or not
enter_vlps_xms(100); //低功耗的作用
}
}
const struct task tasks[] =
{
{EV_1MS, 0, NULL, task_1ms},//主要用来操作si4438_delay
{EV_25MS, 0, NULL, task_25ms},//启动无线中断
{EV_TICK, ALWAYS_ALIVE, NULL, sys_tick},//系统时间驱动EV_1MS、EV_25MS、EV_5S
{EV_TOUCH_SCAN, ALWAYS_ALIVE, NULL, task_touch_scan},//LED等的亮度变化,和按键的扫描
{EV_BIND, 0, NULL, adapter_bind},//
{EV_WIRQ, 0, NULL, wirless_check_irq},//无线的监测是通过中断吗????,接收无线
{EV_CLRDOG, ALWAYS_ALIVE, NULL, clr_watchdog},
{EV_REPS, 0, NULL, wirless_reponse},//对无线进行回应
{EV_5S, 0, NULL, touch_seq_check},//主要用来启动绑定,首先查询开关是否触发。检查触摸屏的变化并且,如有变化与适配器通信告知
是谁启动的EV_WIRQ
};
启动EV_WIRQ在两种函数里进行启动,其中有一个是自启动
自启动的条件是
if (si4438_delay) //如果不为0就不断的启动 无线检测 {
notify(EV_WIRQ);//启动自己的无线检测
}
void task_25ms(void *args)
{
if (!is_task_set(EV_REPS))//如果没有启动wireless_response就启动wireless_check_irq
{
notify(EV_WIRQ); //75MS Per.time 启动wirless_check_irq
}
// if ((silicon_status&SILLICON_ALL_SET)||is_task_set(EV_REPS)||is_task_set(EV_WIRQ)||cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on||cap_pad[3].led_on) return; //sleep or not
// enter_vlps_xms(15); //wake up for EV_WIRQ 75ms
if (bind_state_cnt!=0)
{
if(0==--bind_state_cnt)
{
device_bind_process=UBIND;//入网的时候会把bind_state_cnt赋值0x28,,在282内没有完成就是没有绑定成功。
}
}
}
void wirless_check_irq(void *args)
{
clr_wdog();
// uint8_t lenth=0;
if (DEVICE_IS_NEW==new_device_flag) //新设备将不执行正常检测中断 added in 2015-3-4 no test
{
return;//如果是新设备就不用检测无线的中断了。
}
if (si4438_statue == SI4438_SLEEP) //绑定成功就读,那么不成功也是读呀????因为绑定成功和不成功设备都要是SI4438_SLEEP
{
vRadio_StartRX(SI4438_CHANL, SI4438_DATALETH); //4MS 所有READCTS带自动复位功能, 读的东西放在哪里了????
si4438_statue = SI4438_RX;//为什么要把它置于读的状态????木 表示已经读过4438了吗???
//GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL2_PIN); //无线监听动作开始计量
}
if(0==read_4438_irq_port())//用来检测中断木 为0表示中断发生
{
if (si4438_statue==SI4438_TX)goto finish_rcv; //finish the tx//vRadio_StartRX只是开始读,把数据读出来只是bRadio_Check_Tx_RX这个函数
if(SI446X_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT!=bRadio_Check_Tx_RX(g_frame_buffer))return;//从433里面读出了数据 木
si446x_change_state(1);//猜测是清除的状态
// clr_detc();
// GPIOA_PCOR |= GPIO_PCOR_PTCO(CTRL1_PIN); //无线接收发送动作开始计量
frame_ctl(&g_frame_buffer[0],Si446xCmd.FIFO_INFO.RX_FIFO_COUNT);//用读出来的数据改变灯的状态,把读出来的数据付诸于动作
// set_detc();
enter_vlps_xms(100); //进入低功率状态
si4438_delay = WIRELESS_DELAY;
goto finish_rcv;
}
if (si4438_delay) //如果不为0就不断的启动 无线检测 //CAL IN 1ms_TASK
{
notify(EV_WIRQ);//启动自己的无线检测
}
else
{
finish_rcv:;
si4438_delay=WIRELESS_DELAY; // WIRELESS_DELAY 0x28
si446x_get_int_status(0u, 0u, 0u);//猜测清零操作
si446x_change_state(1); //猜测是清除的状态
si4438_statue=SI4438_SLEEP; //sleep
// GPIOA_PSOR |= GPIO_PSOR_PTSO(CTRL2_PIN); //无线监听动作开始计量
if ((silicon_status&SILLICON_ALL_SET)||cap_pad[0].led_on
||cap_pad[1].led_on||cap_pad[2].led_on
||cap_pad[3].led_on) return; //sleep or not
enter_vlps_xms(100); //低功耗的作用
}
}
转载自原文链接, 如需删除请联系管理员。
原文链接:4438无线网络组网代码解析,转载请注明来源!