sensor数据分发

一.概要

        数据分发的流程你就是注册时序的一个逆过程,上一篇文章中说到了注册,android.hardware.sensors@1.0-service进程最后会创建一个data_msg_reader_thread线程在不断的监听数据,当收到数据后,数据会逐步往APP传递,传递的进程是android.hardware.sensors@1.0-service->system_server->APP,看了这篇文章你会大概了解这个sensor数据分发的流程。
数据分发流程见图上紫蓝色部分:

二.android.hardware.sensors@1.0-service进程接收数据并向上传递:

 

         我们先看到qmi的data_msg_reader_thread线程,APP每注册一个新的sensor都会创建一个data_msg_reader_thread线程,一个sensor只有一个data_msg_reader_thread线程,我们在之前注册的文章中SensorDevice.cpp部分说过如果这个sensor是第一次注册,那么他会继续调用activate,否则不会继续调用activate了,说明不会在次初始化qmi 连接,当然也不会再次创建线程了。这个线程的作用是监听某个类型的sensor数据,如果我们注册了10个不同的sensor,那么就会有是个data_msg_reader_thread线程。它们在这里会分别会通过socket接收BP发送上来的sensor数据,然后往上分发

vendor/qcom/proprietary/commonsys-intf/qmi-framework/qcci/src/qmi_cci_xport_qrtr.c

static void *data_msg_reader_thread(void *arg)

{

  struct xport_handle *xp = (struct xport_handle *)arg;

  unsigned char ch, *buf;

  int i;

  ssize_t rx_len;

  struct pollfd pbits[2];

  struct xport_ipc_router_server_addr src_addr;

  struct sockaddr_qrtr addr;

 

  while(1)

  {

    pbits[0].fd = xp->rdr_tdata.wakeup_pipe[0];

    pbits[0].events = POLLIN;

    pbits[1].fd = xp->fd;

    pbits[1].events = POLLIN;

    // 等待数据

    i = poll(pbits, 2, -1);

    if(i < 0)

    {

      if (errno == EINTR)

        QMI_CCI_LOGD("%s: poll error (%d)\n", __func__, errno);

      else

        QMI_FW_LOGE("%s: poll error (%d)\n", __func__, errno);

      continue;

    }

 

    ......

if((pbits[1].revents & POLLIN))

    {

      socklen_t addr_size = sizeof(struct sockaddr_qrtr);

 

      buf = (unsigned char *)calloc(xp->max_rx_len, 1);

      if(!buf)

      {

        QMI_FW_LOGE("%s: Unable to allocate read buffer for %p of size %d\n",

                     __func__, xp, xp->max_rx_len);

        break;

      }

      addr_size = sizeof(struct sockaddr_qrtr);

      // 通过socket读取bp发送过来的数据

      rx_len = recvfrom(xp->fd, buf, xp->max_rx_len, MSG_DONTWAIT, (struct sockaddr *)&addr, &addr_size);

      if (rx_len < 0)

      {

        QMI_FW_LOGE("%s: Error recvfrom %p - rc : %d\n", __func__, xp, errno);

        free(buf);

        break;

      }

      else if (rx_len == 0)

      {

        if (addr_size == sizeof(struct sockaddr_qrtr))

        {

          QMI_CCI_LOGD("%s: QCCI Received Resume_Tx on FD %d from port %08x:%08x\n",

                        __func__, xp->fd, addr.sq_node, addr.sq_port);

          qmi_cci_xport_resume(xp->clnt);

        }

        else

        {

          QMI_FW_LOGE("%s: No data read from %d\n", __func__, xp->fd);

        }

        free(buf);

        continue;

      }

      else if (addr.sq_port == QRTR_PORT_CTRL)

      {

  /* NOT expected to receive data from control port */

        QMI_FW_LOGE("%s: DATA from control port len[%d]\n", __func__, rx_len);

        free(buf);

        continue;

      }

 

      QMI_CCI_LOGD("%s: Received %d bytes from %d\n", __func__, rx_len, xp->fd);

      src_addr.service = 0;

      src_addr.instance = 0;

      src_addr.node_id = addr.sq_node;

      src_addr.port_id = addr.sq_port;

      // NO.1 将buf往上分发

      qmi_cci_xport_recv(xp->clnt, (void *)&src_addr, buf, (uint32_t)rx_len);

      free(buf);

    }

  ......

  return NULL;

}

这里主要是poll等待bp数据到来,到来之后通过socket读取bp发送过来的数据存到buf中,然后再通过qmi_cci_xport_recv方法将buf继续向上传递

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值