【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)\n", 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入手了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM