TI 平台PC端和Master的AoA梳理

一、Master工程框架

/------------------------------  rtls_master.c  -------------------------------------------/
static void RTLSMaster_taskFxn(uintptr_t a0, uintptr_t a1)
{
    safeToDealloc = RTLSMaster_processStackMsg((ICall_Hdr *)pMsg);     //1、处理蓝牙协议栈事件

    RTLSMaster_processAppMsg(pMsg);                                    //处理应用层数据
}
    /--------------------------------------------  rtls_master.c  --------------------------------------------------/
    static void RTLSMaster_processAppMsg(rmEvt_t *pMsg)//1、处理蓝牙协议栈事件
    {
        switch (pMsg->hdr.event)
        {
                case RM_EVT_RTLS_CTRL_MSG_EVT:
                {
                    RTLSMaster_processRtlsCtrlMsg((uint8_t *)pMsg->pData);       //RTLS控制消息处理
                }
                break;

                case RM_EVT_RTLS_SRV_MSG_EVT:
                {
                    RTLSMaster_processRtlsSrvMsg((rtlsSrv_evt_t *)pMsg->pData);  //RTLS服务消息处理
                }
                break;
        }
    }
        /----------------------------------------------  rtls_master.c  ----------------------------------------------------/
        static void RTLSMaster_processRtlsCtrlMsg(uint8_t *pMsg)
        {
            case RTLS_REQ_ENABLE_SYNC:
            {
              RTLSMaster_enableRtlsSync((rtlsEnableSync_t *)pReq->pData);   //使能RTLS同步
            }
            break;

            case RTLS_REQ_SEND_DATA:
            {
              RTLSMaster_sendRTLSData((rtlsPacket_t *)pReq->pData);         //发送RTLS数据   
            }
            break;

            case RTLS_REQ_SET_AOA_PARAMS:
            {
              RTLSMaster_setAoaParamsReq((rtlsAoaConfigReq_t *)pReq->pData);  //设置AOA参数
            }
            break;

            case RTLS_REQ_AOA_ENABLE:
            {
              RTLSMaster_enableAoaReq((rtlsAoaEnableReq_t *)pReq->pData);       //使能AOA
            }
            break;

            case RTLS_REQ_UPDATE_CONN_INTERVAL:
            {
              RTLSMaster_processRTLSUpdateConnInterval((rtlsUpdateConnIntReq_t *)pReq->pData);   //更新连接间隔
            }
            break;
        }

        /-----------------------------------------  rtls_master.c  ------------------------------------------------------------/          
        static void RTLSMaster_processRtlsSrvMsg(rtlsSrv_evt_t *pEvt)
        { 
          switch (pEvt->evtType)
          {
            case RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT:
            {
              rtlsSrv_connectionIQReport_t *pReport = (rtlsSrv_connectionIQReport_t *)pEvt->evtData;

              RTLSAoa_processAoaResults(pReport->connHandle,                  //AOA数据处理
                                        pReport->rssi,
                                        pReport->dataChIndex,
                                        pReport->sampleCount,
                                        pReport->sampleRate,
                                        pReport->sampleSize,
                                        pReport->sampleCtrl,
                                        pReport->slotDuration,
                                        pReport->numAnt,
                                        pReport->iqSamples);
            }
            break;

            case RTLSSRV_ANTENNA_INFORMATION_EVT:
            {
              // This is for demonstration purposes - we could either use RTLSCtrl_sendDebugEvent
              // Or read the information by using a debugger
              // rtlsSrv_antennaInfo_t *pAntInfo = (rtlsSrv_antennaInfo_t)pEvt->evtData;
            }
            break;

            case RTLSSRV_CTE_REQUEST_FAILED_EVT:
            { 
              RTLSCtrl_sendDebugEvt("RTLS Services CTE Req Fail", (uint32_t)pReqFail->status);
            }
            break;

            case RTLSSRV_ERROR_EVT:
            { 
              RTLSCtrl_sendDebugEvt("RTLS Services Error", (uint32_t)pError->errCause);
            }
            break;

            default:
              break;
          }
        } 
        

1、Master怎样发送、接收数据?

Master如何把采集到的AoA数据到PC:

    RTLSHost_sendMsg(RTLS_CMD_AOA_RESULT_ANGLE, HOST_ASYNC_RSP, (uint8_t *)&aoaResult, sizeof(rtlsAoaResultAngle_t));
    uint8_t NPITask_sendToHost(_npiFrame_t *pMsg);
        NPIUtil_enqueueMsg(npiTxQueue, syncEvent, NPITASK_TX_READY_EVENT,(unsigned char *) pMsg);
            if (NPITask_events & NPITASK_TX_READY_EVENT)
            {
                NPITask_ProcessTXQ();
                    NPITL_writeTL(lastQueuedTxMsg, pMsg->dataLen + NPI_MSG_HDR_LENGTH);
                        transportWrite(npiTxBufLen);
                        NPITLUART_writeTransport();
                            UART_write(uartHandle, npiTxBuf, TransportTxLen);
            }

Master如何接收PC端数据:(接收AoA参数设置)

    void RTLSCtrl_processMessage(rtlsEvt_t *pMsg)           //rtls_ctrl.c
      void RTLSCtrl_processHostMessage(rtlsHostMsg_t *pHostMsg);
        RTLSCtrl_setAoaParamsCmd(pHostMsg->pData);   //Master接收到AoA参数设置命令
        // Request RTLS App to set it's own AoA parameters
        RTLSCtrl_callRtlsApp(RTLS_REQ_SET_AOA_PARAMS, (uint8_t *)pSetAoaConfigReq);
            gRtlsData.appCb((uint8_t *)appReq);   //调用回调下面的函数
                void RTLSMaster_rtlsCtrlMsgCb(uint8_t *cmd)
                {
                    // Enqueue the message to switch context
                    RTLSMaster_enqueueMsg(RM_EVT_RTLS_CTRL_MSG_EVT, SUCCESS, (uint8_t *)cmd);
                }

                
    static void RTLSMaster_processAppMsg(rmEvt_t *pMsg)   //rtls_master.c
        case RM_EVT_RTLS_CTRL_MSG_EVT:
            {
            RTLSMaster_processRtlsCtrlMsg((uint8_t *)pMsg->pData);
                    RTLSMaster_setAoaParamsReq((rtlsAoaConfigReq_t *)pReq->pData);
                        // Configure AoA receiver parameters
                        RTLSSrv_setConnCteReceiveParams(pConfig->connHandle,pConfig->samplingEnable,pConfig->slotDurations,pConfig->numAnt,pConfig->pAntPattern);
                        // Configure sample accuracy
                        RTLSSrv_setCteSampleAccuracy(pConfig->connHandle,pConfig->sampleRate,pConfig->sampleSize,pConfig->sampleRate,pConfig->sampleSize,pConfig->sampleCtrl);
            }

2、PC是怎样接收、发送数据的?

PC接收数据:

   devices = [{"com_port": "COM15", "baud_rate": 460800, "name": "CC26x2 Master"}]
   master_node, passive_nodes, all_nodes = rtlsUtil.set_devices(devices)                 
   
    def set_devices(self, devices_setting):
        self._start_message_receiver()
        
    def _start_message_receiver(self):
        self._message_receiver_th = threading.Thread(target=self._message_receiver)
    
    def _message_receiver(self):
        while not self._message_receiver_stop:
            # Get messages from manager
            try:
                identifier, msg_pri, msg = self._rtls_manager_subscriber.pend(block=True, timeout=0.05).as_tuple()

                self._log_incoming_msg(msg, identifier)

                if msg.command == 'RTLS_CMD_AOA_SET_PARAMS' and msg.payload.status == 'RTLS_SUCCESS':
                    sending_node.aoa_initialized = True

                if msg.command in ["RTLS_CMD_AOA_RESULT_ANGLE",
                                   "RTLS_CMD_AOA_RESULT_RAW",
                                   "RTLS_CMD_AOA_RESULT_PAIR_ANGLES"] and msg.type == "AsyncReq":
                    self.aoa_results_queue.put({
                        "name": sending_node.name,
                        "type": "aoa",
                        "identifier": identifier,
                        "payload": msg.payload
                    })

PC发送数据:

   rtlsUtil.aoa_set_params(aoa_params)   //PC发送设置AoA参数给Master(调用rtlsUtiil类的aoa_set_params方法)

二、AoA采集流程梳理

第1步:

PC通过UART给Master设置AoA参数

rtlsUtil.aoa_set_params(aoa_params)

Master接收到AoA参数后进行解析,设置参数到本地

static void RTLSMaster_setAoaParamsReq(rtlsAoaConfigReq_t *pConfig)
{
  ...
  ...
  // Configure AoA receiver parameters
  RTLSSrv_setConnCteReceiveParams(pConfig->connHandle,
                                  pConfig->samplingEnable,
                                  pConfig->slotDurations,
                                  pConfig->numAnt,
                                  pConfig->pAntPattern);

  // Configure sample accuracy
  RTLSSrv_setCteSampleAccuracy(pConfig->connHandle,
                               pConfig->sampleRate,
                               pConfig->sampleSize,
                               pConfig->sampleRate,
                               pConfig->sampleSize,
                               pConfig->sampleCtrl);
}
第2步:

PC端发送启动AoA采集命令给Master

rtlsUtil.aoa_start(cte_length=20, cte_interval=1)

Master接收到命令后,启动AoA采集

static void RTLSMaster_enableAoaReq(rtlsAoaEnableReq_t *pReq)
{
  ...
  // Request CTE from our peer
  RTLSSrv_setConnCteRequestEnableCmd(pReq->connHandle,
                                     pReq->enableAoa,
                                     pReq->cteInterval,
                                     pReq->cteLength,
                                     RTLSSRV_CTE_TYPE_AOA);
}
第3步:

运行AoA采集任务

/--------------------------  rtls_master.c  ------------------------/
  // Initialize RTLS Services
  RTLSSrv_init(MAX_NUM_BLE_CONNS);             
  RTLSSrv_register(RTLSMaster_rtlsSrvlMsgCb);  //注册回调函数
    /--------------------------  rtls_master.c  ------------------------/
    void RTLSMaster_rtlsSrvlMsgCb(rtlsSrv_evt_t *pRtlsSrvEvt)
    {
      // Enqueue the message to switch context
      RTLSMaster_enqueueMsg(RM_EVT_RTLS_SRV_MSG_EVT, SUCCESS, (uint8_t *)pRtlsSrvEvt);
    }
        /--------------------------  rtls_master.c  ------------------------/
        static status_t RTLSMaster_enqueueMsg((uint8_t event, uint8_t state,uint8_t *pData)
        {
            success = Util_enqueueMsg(appMsgQueue, syncEvent, (uint8_t *)pMsg);
        }
            /--------------------------  util.c  ------------------------/
            uint8_t Util_enqueueMsg(Queue_Handle msgQueue,Event_Handle event,uint8_t *pMsg)
            {           
                if (event)
                {
                  Event_post(event, UTIL_QUEUE_EVENT_ID); 
                }
            }
                    /--------------------------  rtls_master.c  ------------------------/
                    #define   RM_QUEUE_EVT      UTIL_QUEUE_EVENT_ID // Event_Id_30
                    // If RTOS queue is not empty, process app message
                    if (events & RM_QUEUE_EVT)
                    {
                        RTLSMaster_processAppMsg(pMsg);
                    }
                    /--------------------------  rtls_master.c  ------------------------/
                    static void RTLSMaster_processAppMsg(rmEvt_t *pMsg)
                    {
                        case RM_EVT_RTLS_SRV_MSG_EVT:
                        {
                          RTLSMaster_processRtlsSrvMsg((rtlsSrv_evt_t *)pMsg->pData);
                        }
                        break;
                    }
                        /--------------------------  rtls_master.c  ------------------------/
                        static void RTLSMaster_processRtlsSrvMsg(rtlsSrv_evt_t *pEvt)
                        {
                          switch (pEvt->evtType)
                          {
                            case RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT:
                            {
                              rtlsSrv_connectionIQReport_t *pReport = (rtlsSrv_connectionIQReport_t *)pEvt->evtData;

                              RTLSAoa_processAoaResults(pReport->connHandle,
                                                        pReport->rssi,
                                                        pReport->dataChIndex,
                                                        pReport->sampleCount,
                                                        pReport->sampleRate,
                                                        pReport->sampleSize,
                                                        pReport->sampleCtrl,
                                                        pReport->slotDuration,
                                                        pReport->numAnt,
                                                        pReport->iqSamples);
                            }
                          }
                        }
                            /--------------------------  rtls_aoa.c  ------------------------/
                            void RTLSAoa_processAoaResults(uint16_t connHandle, int8_t rssi, uint8_t channel, uint16_t numIqSamples, uint8_t sampleRate, uint8_t sampleSize, uint8_t sampleCtrl, uint8_t slotDuration, uint8_t numAnt, int8_t *pIQ)
                            {
                              RTLSCtrl_aoaResultEvt(connHandle, rssi, channel, numIqSamples, sampleRate, sampleSize, sampleCtrl, slotDuration, numAnt, pIQ);
                            }
                                /--------------------------  rtls_ctrl.c  ------------------------/
                                void RTLSCtrl_aoaResultEvt(uint16_t connHandle, int8_t rssi, uint8_t channel, uint16_t numIqSamples,
                                                           uint8_t sampleRate, uint8_t sampleSize, uint8_t sampleCtrl, uint8_t slotDuration,
                                                           uint8_t numAnt, int8_t *pIQ)
                                {

                                  // Copy data
                                  pEvt->connHandle = connHandle;
                                  pEvt->rssi = rssi;
                                  pEvt->channel = channel;
                                  pEvt->numIqSamples = numIqSamples;
                                  pEvt->sampleCtrl = sampleCtrl;
                                  pEvt->sampleRate = sampleRate;
                                  pEvt->sampleSize = sampleSize;
                                  pEvt->slotDuration = slotDuration;
                                  pEvt->numAnt = numAnt;
                                  pEvt->pIQ = pIQ;

                                  // Enqueue the event
                                  RTLSCtrl_enqueueMsg(AOA_RESULTS_EVENT, (uint8_t *)pEvt);
                                }

                                    /--------------------------  rtls_ctrl.c  ------------------------/
                                    void RTLSCtrl_processMessage(rtlsEvt_t *pMsg)
                                    {
                                        case AOA_RESULTS_EVENT:
                                      {
                                          RTLSCtrl_postProcessAoa((rtlsAoaIqEvt_t *)pMsg->pData);
                                      }
                                    }
                                          /--------------------------  rtls_ctrl_aoa.c  ------------------------/
                                          void RTLSCtrl_postProcessAoa(rtlsAoaIqEvt_t *pEvt)
                                          {
                                                     aoaTempResult = RTLSCtrl_estimateAngle(connHandle, sampleCtrl);
                                                     RTLSHost_sendMsg(RTLS_CMD_AOA_RESULT_PAIR_ANGLES, HOST_ASYNC_RSP, (uint8_t *)&aoaResult, sizeof(rtlsAoaResultPairAngles_t));
                                          }
                                             /------------------------------  rtls_ctrl_aoa.c  ------------------------/
                                              AoA_Sample_t RTLSCtrl_estimateAngle(uint16_t connHandle, uint8_t sampleCtrl)
                                              {
                                                  // Return results
                                                  AoA.angle = gAoaCb.connResInfo[connHandle].AoA_ma.AoA;
                                                  AoA.rssi = gAoaCb.connResInfo[connHandle].AoA_ma.currentRssi;
                                                  AoA.channel = gAoaCb.connResInfo[connHandle].AoA_ma.currentCh;
                                                  AoA.antenna =  gAoaCb.connResInfo[connHandle].AoA_ma.currentAntennaArray;
                                                 return AoA;
                                              }
第4步:

通过UART发送AoA采集数据到PC端:

RTLSHost_sendMsg(RTLS_CMD_AOA_RESULT_PAIR_ANGLES, HOST_ASYNC_RSP, (uint8_t *)&aoaResult, sizeof(rtlsAoaResultPairAngles_t));

PC端接收并进行数据解析:

# Setup thread to pull out received data from devices on screen
th_aoa_results_parsing = threading.Thread(target=results_parsing, args=(rtlsUtil.aoa_results_queue,))

## User function to proces
def results_parsing(q):
    while True:
        try:
            data = q.get(block=True, timeout=0.5)
            if isinstance(data, dict):
                data_time = datetime.datetime.now().strftime("[%m:%d:%Y %H:%M:%S:%f] :")
                print(f"{data_time} {json.dumps(data)}")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容