• 【DWM1000】 code 解密9一 ANCHOR response poll message


    根据上面TAG发送的代码,我直接找到如下代码

                                case RTLS_DEMO_MSG_TAG_POLL:

                                {

                                                                               if(inst->mode == LISTENER)                                                                       {

                                                                               ……不满足条件

                                                                               }

                                    if (!inst->frameFilteringEnabled)

                                    {

                                        // if we missed the ACK to the ranging init message we may not have turned frame filtering on

                                        dwt_enableframefilter(DWT_FF_DATA_EN | DWT_FF_ACK_EN); //we are starting ranging - enable the filter....

                                        inst->frameFilteringEnabled = 1 ;

                                    }

                                                                               if(inst->previousState == TA_TXRESPONSE_WAIT_SEND)

                                                                               {

                                                                                        inst->norange = 3;

                                                                               }

                                    if(dw_event->type3 == DWT_SIG_TX_PENDING)

                                    {

                                             inst->canprintinfo = 0;

                                             inst->testAppState = TA_TX_WAIT_CONF;                                               // wait confirmation

                                             inst->previousState = TA_TXRESPONSE_WAIT_SEND ;

                                    }

                                    else

                                    {

                                             //stay in RX wait for next frame...

                                             inst->testAppState = TA_RXE_WAIT ;              // wait for next frame

                                    }

                                }

                                break; //RTLS_DEMO_MSG_TAG_POLL

    inst->frameFilteringEnabled 这个参数之前有接触过,确实是0,所以会执行。

    后面感觉代码很少,不像之前看到的代码有很多,而且从注释中发现,这里直接就等待下一个帧了,而我们的直观感觉或者从DWM1000官方代码分析手册上看到,这个时候ANCHOR应该回复一下TAG。

    我们这里追一下rxcallback 函数,这里我也困惑了很久。

    发现在rxcall back 函数中确实会直接处理这个信息

                       if(rxd_event == DWT_SIG_RX_OKAY)

                       {

                                //check if this is a TWR message (and also which one)

                                if(instance_data[instance].tagListLen > 0)

                                {

                                         switch(dw_event.msgu.frame[fcode_index])

                                         {

                                                   case RTLS_DEMO_MSG_TAG_POLL:

                                                   {

    这里保存了几个非常重要的变量,首先一个是

    nstance_data[instance].tagPollRxTime = dw_event.timeStamp ; //Poll's Rx time

    这个是ANCHOR接收数据的时间,在TAG端记录了一个发送数据的时间,两者之差就是TOF的时间长度。

    下面这个变量用到再说

    instance_data[instance].delayedReplyTime = 0;

    后面开始构建数据发送poll response

    memcpy(&instance_data[instance].msg.destAddr[0], &dw_event.msgu.frame[srcAddr_index], ADDR_BYTE_SIZE_L); //remember who to send the reply to (set destination address)

    memcpy(&(instance_data[instance].msg.messageData[TOFR]), &instance_data[instance].tof, 5);

    instance_data[instance].tof = 0; //clear ToF ..

    instance_data[instance].msg.seqNum = instance_data[instance].frame_sn++;

    instance_data[instance].wait4ack = DWT_RESPONSE_EXPECTED;

    这里有个比较奇怪的地方,就是数据包为何包括了instance_data[instance].tof, 这个量是定位时间最终结果,我们这里定位才刚刚开始,数据还没法完呢。 这里剧透下,看来官方的文档才明白, 定位数据结果在下一次anchor 给tag 的poll request中,所以这里就有这么一个坑。

    好了,再来几个发送函数就万事大吉了

    dwt_setrxaftertxdelay((uint32)instance_data[instance].txToRxDelayAnc_sy);  //units are 1.0256us - wait for wait4respTIM before RX on (delay RX)

    dwt_writetxfctrl(frameLength, 0);

    dwt_writetxdata(frameLength, (uint8 *)  &instance_data[instance].msg, 0) ;  // write the frame data

    dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);

    仔细看,由于宏定义

    所以下面这行肯定被执行IMMEDIATE_RESPONSE =1

    dw_event.type3 = DWT_SIG_TX_PENDING ;

    // exit this interrupt and notify the application/instance that TX is in progress.

    现在返回来再看testapprun_s,所以肯定会执行下面的代码,然后退出estapprun_s

    if(dw_event->type3 == DWT_SIG_TX_PENDING)

    {       

    inst->canprintinfo = 0;

    inst->testAppState = TA_TX_WAIT_CONF;    

    inst->previousState = TA_TXRESPONSE_WAIT_SEND ;

    }

    根据上面两个重要变量,我们再次进入testapprun_s,,其实case TA_TX_WAIT_CONF 我们已经看过多次了,但是由于previousState 代码不同,每次执行略有不同, 这个case的主要作用是等待发送完成。 我们再把代码拿上来。

    首先是这几行代码,我们之前已经分析过了,就是一直等待发送结果,一带而过,之间根据previousState 找代码吧。

             if(dw_event->type != DWT_SIG_TX_DONE) //wait for TX done confirmation

                    {

                                                   if(dw_event->type == DWT_SIG_RX_TIMEOUT) //got RX timeout - i.e. did not get the response (e.g. ACK)

                                                   {

                                                            //printf("RX timeout in TA_TX_WAIT_CONF (%d) ", inst->previousState);

                                                            //we need to wait for SIG_TX_DONE and then process the timeout and re-send the frame if needed

                                                            inst->gotTO = 1;

                                                   }

                        inst->done = INST_DONE_WAIT_FOR_NEXT_EVENT;

                            break;

                    }

    发现这个case中的其他if 都没有满足的,但是中间会有几个变量不需要判断自动赋值的,摘录如下

    inst->done = INST_NOT_DONE_YET;

    inst->txu.txTimeStamp = dw_event->timeStamp;

    inst->testAppState = TA_RXE_WAIT ; 

    message = 0;

    //break ; // end case TA_TX_WAIT_CONF

    和之前一样,将testAppState 设置为TA_RXE_WAIT,没有break直接进入下面的case了,这里就不分析了,和之前代码一样,一直等TAG的回复了,我们又该转到TAG端了。 这里说下一个比较重要的变量,之前我们把它遗漏了

    inst->txu.txTimeStamp = dw_event->timeStamp;

     这个变量保存了发送时间,在TAG端也有一个这样的值,两个一起不是冲突了,这个。。。 TAG的是TAG的,ANCHOR 是ANCHOR的,一份代码在两个不同设备上同时运行。 

             这里需要提前剧透,因为转到TAG发现好像刚才我们分析代码的时候没有像case RTLS_DEMO_MSG_TAG_POLL放到数据帧里发送出去。 这个让我纠结了好久,其实我们之前的代码说过了。 摘录一段之前的分析

    nst->msg.messageData[RES_R1] = 0x2; // "activity"

    inst->msg.messageData[RES_R2] = 0x0; //

    inst->msg.messageData[RES_R3] = 0x0;

    setupmacframedata(inst, RTLS_DEMO_MSG_ANCH_RESP);

    前三句我们比较熟悉是我们案发现场的三个变量。 后面四句好像在组合什么帧的数据,准备下次发送(重要)。 我们简单看下setupmacframedata

    这个确实是好久就准备好了,这个代码写的也是太。。。 不说了,根据这个东西,我们可以从TAG入手了。

    博客讨论一些室内定位(DWM1000/CC2431/CC2530) 以及一些随性的技术。博文可以转载,但需要注明出处!
  • 相关阅读:
    使用VS2005搭建典型高效的SharePoint开发环境,提高生产效率,包含远程调试,自动部署 无为而为
    该死的Windows 2003 Server DMA设置,然我刻录DVD这么慢,终于找到办法了 无为而为
    听说Team Foundation Server 繁體中文版於 2006.04.28 RTM ,不知道微软中国的工作做得如何? 无为而为
    [软件开发过程]反模式:简单的部分留在需求人员的脑海中,只描述最复杂的部分给我们听 无为而为
    软件过程改进(SPI)常见反模式:第22条军规 无为而为
    在WebPart中上传图片到SharePoint图片库,读取Exif信息到图片的自定义属性 无为而为
    SQL Server 2005 Service Pack 1正式发布了,我想起,有人说,微软的软件至少要等到出了SP1才能用,那么现在可以用SQL2005了 无为而为
    可以下载Microsoft ISA Server 2006 试用版了,网管需要关注 无为而为
    超女带给我们什么? 无为而为
    Asp.net Url改写方法——采用HttpModules(转)
  • 原文地址:https://www.cnblogs.com/tuzhuke/p/7739384.html
Copyright © 2020-2023  润新知