无线入网分析代码一

void touch_scan(void)

{

    int i;

 

/*扫描按键*/

if(scan_pad_task() != SCAN_TASK_OK)//按键值确定就会开始扫描   scan_pad_task这是个干嘛用的函数,就是按完按键就扫描

{

return;

}

 

for(i=0; i<CAP_PAD_NUM; i++)

{

if(0 == cap_pad[i].touch)//如果符合条件结束这一次小循环  下面有对cap_pad[i].touch的赋值,如果还没有用就直接跳过这次的按键扫描

{

continue;//scan_pad_task里如果过触发了就赋值1

}

    //    if (!is_task_set(EV_BIND)) 

if(cap_pad[i].led_on) //cap_pad[i].led_on只是代表扫描完成

{

cap_pad[i].touch = 0;//触摸清零

continue;//如果扫描完成了,结束此次小循环,????如果灯开了为什么结束此次小循环

}

cap_pad[i].led_on = 1;//标志扫描

 

        if ((i==3)&&(cap_pad[0].led_on||cap_pad[1].led_on||cap_pad[2].led_on)) //什么意思没有看懂????

        {

            cap_pad[3].led_on = 0;

            return;

        }

if (!is_tpm0_interrupt_enable())//is_tpm0_interrupt_enable这是一个什么中断????

{

enable_tpm0_interrupt();//什么意思????

}

        if (device_bind_process==WAIT_FOR_TOUCH)//绑定状态的切换   按23按键进入网状态 怎么表现的23

        {

            if (i==3) //检测到有新设备的时候,状态为WAIT_FOR_TOUCH,按了3键紧接着进入了WAIT_FOR_CONFIRM,进入WAIT_FOR_CONFIRM以后干吗用呢????

            {

                device_bind_process = WAIT_FOR_CONFIRM; //点击按键后 回复一次2

                

                enter_vlps_xms(50);//进入第功率状态

                return;

            }

        }

        cap_pad[i].touch = 0;

 

        if (i==3) //如果为3执行的是第3种情况

        if (!(silicon_status & SILLICON_ALL_SET)) 

        {

            relay_status_on(i);//点亮i=3

            return;

        }

        else

        {

            led_on_ctl|=(1<<i);//用来改变LED灯的转态

            return;

        }//谁来改变silicon_status

 

        if (!(silicon_status & (1 << (SILLICON_CHANNAL_1 + i)))) //如果silicon_status0,那么就可以执行if下面的函数  木  silicon_status 和后面与是怎么配合使用的

        {

            relay_status_on(i);//改变的是LED的灯,LED和继电器同时改变

        }

        else

        {

            led_on_ctl|=(1<<i);

        }

 

        if (1==i||2==i)//这的意义是不是  连续2键和3键后启动入网用的????

        {

            touch_seq_cnt++;

        }

//ctrl_device_opt(logicch2phych[i]);

}

 

}

只要是触摸2键或3键,就会执行touch_seq_cnt++。这段代码大致对入网就做了这么些事。

 

 

 

 

 

#define     USER_TOUCH_SEQ_CHECK 0X08

touch_seq_check这个函数是每隔5秒运行一次,但为什么选择USER_TOUCH_SEQ_CHECK8呢????如果是说明已经入网了

void touch_seq_check(void *args)//added in 2015-3-4 untest   添加这个函数的意思在哪呢????

{

   statue_report();//跳出表示有数据????

   //无灯亮时不进行处理

  if (!(silicon_status&SILLICON_ALL_SET)) goto end;  //sleep or not  有状态变化就进入

  if (touch_seq_cnt>=USER_TOUCH_SEQ_CHECK) //touch_seq_cnt这参数是干什么用的????   if (1==i||2==i)  touch_seq_cnt++;  只在这种情况下运行为什么呢????

  {

      if (DEVICE_IS_NEW==new_device_flag)//touch_san运行了8次,touch_seq_check才运行一次我就开启

      {

          notify(EV_BIND);//加入新设备就启动绑定通信一次

      }

      else

      {

          adapter_infor_clean(); //执行清理操作//执行这次操作的意义在哪里呢????   里面有新设备的赋值,不和逻辑???? ????

          notify(EV_BIND);//马上进入一次绑定流程

      }

     bind_state_cnt = BIND_WAIT_TIME;//这里为什么加绑定的时间呢????

  }

  end:;

  touch_seq_cnt=0;

  clr_wdog();

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void adapter_bind(void *args)//added in 2015-3-4 untest

{

  //根据亮灯来实施

    

        if (!(silicon_status&(1<<SILLICON_CHANNAL_1))) //状态11时,绑定成功,不在绑定。用1键确认绑定成功

        {

            notify(EV_BIND);  //ADDED IN 3-12 UNTTEST,为什么启动自己

            return;  //无灯亮时不执行

        }

        randseed++; 

        if(0xFF==wirless_state_analyse())return;   //如果程序处在WAIT_FOR_TOUCH,BIND_SUCCESS,UBIND这几个状态的时候,就返回

        if (si4438_delay&&(si4438_delay!=210)) //第一次进入时 delay有值,记得ms--时加上处理,为什么偏偏是210????

        {//即便种子为0也不会产生随机数0呀????

            bind_listen_send();             //通讯单位为ms   检测是否为新设备,是新设备将等待操作  加入网络   木

            notify(EV_BIND);

        }

        else

        {

            if (si4438_statue == SI4438_TX) //SI4438_TX 2

            {

                si4438_delay = rand() % 200;   

            }

            else

            {

                si4438_delay = rand() % 5 +210;    

            }

            si446x_change_state(1); //什么意思????木

            if((0==(cap_pad[0].led_on||cap_pad[1].led_on

                    ||cap_pad[2].led_on||cap_pad[3].led_on))

                    &&(device_bind_process!=WAIT_FOR_TOUCH))

                enter_vlps_xms(50);   //TX&RX之间增加睡眠间隔 保证不复位

            srand(randseed);

            clr_wdog();

            wirless_TX_RX_negation(); //TX RX切换  里面发送握手报文

            notify(EV_BIND);

        } 

 

}

 

这个绑定只能分析到这里了,已经找不到其他的了。连续触摸23键,表示要入网。随后会有呼吸灯,呼吸灯是怎么进行的呢?

所有灯具全亮时停止点击,这一句是怎么实现的呢???

呼吸灯是怎么实现的呢????

1. 打开无线适配器手机界面,点击扫描设备按钮

2. 快速点击电容触摸开关2,3键 所有灯具全亮时停止点击,已进入绑定模式

3. 等待呼吸灯闪烁,点击触摸1键确认绑定

4. 手机界面显示绑定成功列表

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于迟入网时隙编号设计,可以通过Omnet++进行模拟实现。具体步骤如下: 1. 创建Omnet++工程并添加必要的库文件。 2. 在工程中创建一个名为"slot"的模块,用于模拟时隙的传输和接收。 3. 在"slot"模块中定义时隙的编号和长度,并定义时隙传输的相关参数,如传输速率、信道状态等。 4. 在"slot"模块中实现时隙传输和接收的逻辑,包括时隙编号的生成和识别、数据的传输和接收等。 5. 在"slot"模块中添加统计功能,用于记录时隙传输的成功率、传输延迟等指标。 6. 在工程中创建其他模块,如发送方、接收方等,用于模拟实际网络环境下的数据传输。 7. 在发送方模块中实现数据的生成和传输,包括选择合适的时隙进行传输等。 8. 在接收方模块中实现数据的接收和处理,包括识别正确的时隙进行接收等。 9. 运行模拟程序并记录相关指标,进行分析和优化。 代码实现如下(仅供参考): ``` // slot模块.h文件 #ifndef __SLOT_H_ #define __SLOT_H_ #include <omnetpp.h> using namespace omnetpp; class Slot : public cSimpleModule { private: int slotNum; // 时隙编号 int slotLength; // 时隙长度 double transmitRate; // 传输速率 bool channelStatus; // 信道状态 protected: virtual void initialize(); virtual void handleMessage(cMessage *msg); public: void generateSlotNum(); // 生成时隙编号 int getSlotNum(); // 获取时隙编号 int getSlotLength(); // 获取时隙长度 double getTransmitRate(); // 获取传输速率 bool getChannelStatus(); // 获取信道状态 void setChannelStatus(bool status); // 设置信道状态 }; #endif // slot模块.cc文件 #include "slot.h" void Slot::initialize() { slotNum = 0; slotLength = 10; transmitRate = 1.0; channelStatus = true; generateSlotNum(); } void Slot::handleMessage(cMessage *msg) { delete msg; } void Slot::generateSlotNum() { slotNum++; if (slotNum > 100) slotNum = 1; } int Slot::getSlotNum() { return slotNum; } int Slot::getSlotLength() { return slotLength; } double Slot::getTransmitRate() { return transmitRate; } bool Slot::getChannelStatus() { return channelStatus; } void Slot::setChannelStatus(bool status) { channelStatus = status; } // 发送方模块.cc文件 #include <omnetpp.h> #include "slot.h" using namespace omnetpp; class Sender : public cSimpleModule { private: Slot *slot; cMessage *msg; protected: virtual void initialize(); virtual void handleMessage(cMessage *msg); }; Define_Module(Sender); void Sender::initialize() { slot = getParentModule()->getSubmodule("slot"); // 创建数据包 msg = new cMessage("data"); msg->setByteLength(100); scheduleAt(0, msg); } void Sender::handleMessage(cMessage *msg) { if (msg == this->msg) { // 选择合适的时隙进行传输 if (slot->getChannelStatus()) { int slotNum = slot->getSlotNum(); int slotLength = slot->getSlotLength(); double transmitRate = slot->getTransmitRate(); double transmitTime = (double)slotLength / transmitRate; EV << "Send data in slot " << slotNum << endl; // 发送数据包 sendDelayed(msg, transmitTime, "out"); // 更新时隙状态 slot->setChannelStatus(false); scheduleAt(simTime() + transmitTime, new cMessage("channel_idle")); } else { EV << "Channel is busy, wait for next slot" << endl; scheduleAt(simTime() + slot->getSlotLength(), msg); } } else { // 时隙空闲,更新状态 slot->setChannelStatus(true); delete msg; } } // 接收方模块.cc文件 #include <omnetpp.h> #include "slot.h" using namespace omnetpp; class Receiver : public cSimpleModule { private: Slot *slot; protected: virtual void initialize(); virtual void handleMessage(cMessage *msg); }; Define_Module(Receiver); void Receiver::initialize() { slot = getParentModule()->getSubmodule("slot"); } void Receiver::handleMessage(cMessage *msg) { // 识别正确的时隙进行接收 int slotNum = slot->getSlotNum(); if (strcmp(msg->getName(), "data") == 0 && slotNum == msg->getArrivalGate()->getIndex()) { EV << "Receive data in slot " << slotNum << endl; } delete msg; } ``` 以上代码仅为示例,具体实现需根据实际需求进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值