我是靠谱客的博主 单薄鱼,最近开发中收集的这篇文章主要介绍lsm6dso_set_client_request 记录,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

// 简单的记录下 
lsm6dso_set_client_request
更新传感器的客户端请求
//
在这里插入图片描述在这里插入图片描述client 应该是个相对的概念
比如:
事件消息由传感器实例异步发送至其注册的客户端,这些客户端可以是其他传感器或传感器实例。
a向 b 注册了,那么 b 就可以说是 a 的server . a 就是 client

没有 新的 请求  或者 新的请求不是这个  才打印 SNS_STD_MSGID_SNS_STD_FLUSH_REQ 
哦  这个是打印  当前正在进行的 request .

  if(new_request == NULL || new_request->message_id != SNS_STD_MSGID_SNS_STD_FLUSH_REQ)
  {
    SNS_PRINTF(HIGH, this, "client_req: sensor=%u req=%d/%d remove=%u hw_id=[%u]",
               state->sensor, exist_request != NULL ? exist_request->message_id : -1,
               new_request != NULL ? new_request->message_id : -1, remove,
               state->hardware_id);
  }

继续  进入  lsm6dso_update_request_q 函数

1:获取一个共享的instance,许多物理sensor会共享一个单独的instance,这个函数就是查找这 (我现在对这个 instance 有点迷迷糊糊 ,等下次再来补充下,没有搞懂这个是干啥的 ???)
instance 就是一个实例,一个 sensor 的具体功能…

2:有  remove 或者  退出去的请求,执行这个…

sns_sensor_instance *instance = sns_sensor_util_get_shared_instance(this);
  if(remove && (NULL != exist_request) && (NULL != instance))
  {
    instance->cb->remove_client_request(instance, exist_request);
  }

3:有中情况,新的请求和 没有移除的请求
if(!remove && NULL != new_request)
  3.1:   instance 为null ,要在重新创建一个 instance
  if (NULL == instance &&
        // first request cannot be a Flush request or Calibration reset request
        SNS_STD_MSGID_SNS_STD_FLUSH_REQ != new_request->message_id)
    {
      instance = create_new_instance(this);
    }
  3.2:  instance 不为 null , 又分为2中情况
        a:self_test_info.test_alive sensor 在自测? 或者新的请求的 id 为 : SNS_STD_MSGID_SNS_STD_FLUSH_REQ 或者 SNS_CAL_MSGID_SNS_CAL_RESET 同时  exist_request !=NULL 
         // 从  instance  移除 exist_request  
          instance->cb->remove_client_request(instance, exist_request)
     B:
              instance->cb->add_client_request(instance, new_request);

正常 返回  instance    

继续 往下走:
处理  客户端的请求:
lsm6dso_handle_client_request

remove 与 request 队列的请求 不为空,开始移除 request
在这里插入图片描述接下来 来分析 new request 不为空
分为两种
   1: instance 不为 null
     1.a: message 为 SNS_STD_MSGID_SNS_STD_FLUSH_REQ ,然后 又没有存在的请求则 : 直接  instance = NULL; 为空

 if(SNS_STD_MSGID_SNS_STD_FLUSH_REQ == new_request->message_id) // most frequent request
        {

1.b: 1.a: message 为 SNS_STD_MSGID_SNS_STD_FLUSH_REQ ,然后 本身也没有请求, 所以 也就存在清空, 直接把刚才生成的  instance 为空 就行…

            lsm6dso_handle_flush_request(this, instance, shared_state);

1:b 存在 request , 这个时候 就要去 处理这个请求了
看下 是怎么处理这个请求的

lsm6dso_handle_flush_request

进入这个函数
这个暂时先跳过, 不影响全局
在这里插入图片描述在这里插入代码片

1:判断 sensor 的类型...
if(state->sensor & (LSM6DSO_MOTION_DETECT | LSM6DSO_SENSOR_TEMP))
  {
    reason = FLUSH_DONE_NOT_ACCEL_GYRO;
  }
2:再来判断  是否  有 fifo enable 
else if(shared_state->inst_cfg.fifo_enable == 0 && !lsm6dso_dae_if_available(instance))
  {
    reason = FLUSH_DONE_NOT_FIFO;
  }
  3: reason 值改变了, 有需求要 进行  flush 
if(reason != FLUSH_TO_BE_DONE)
  {
    lsm6dso_send_fifo_flush_done(instance, state->sensor, reason);
  }

当然 真正进行的 是 lsm6dso_send_fifo_flush_done 函数
看下是 怎么 刷新 fifo 的.

//  这么多  if 判断, 主要是 看下 flush sensor 是什么类型的...
  while(flushing_sensors != 0)

{
    sns_sensor_uid const *suid = NULL;
    lsm6dso_sensor_type sensor_type = LSM6DSO_ACCEL;
    if(flushing_sensors & LSM6DSO_ACCEL)
    {
      suid = &state->accel_info.suid;
      sensor_type = LSM6DSO_ACCEL;
    }
    else if(flushing_sensors & LSM6DSO_GYRO)
    {
      suid = &state->gyro_info.suid;
      sensor_type = LSM6DSO_GYRO;
    }
    ......
    else
    {
      flushing_sensors = 0;
    }
    // 说明 匹配到了  sensor 的类型...
    if(NULL != suid)
    {
      sns_service_manager *mgr = instance->cb->get_service_manager(instance);
      // a SNS_EVENT_SERVICE 类型.
      sns_event_service *e_service = (sns_event_service*)mgr->get_service(mgr, SNS_EVENT_SERVICE);
    
   //  2: 分配 empty buff    
      sns_sensor_event *event = e_service->api->alloc_event(e_service, instance, 0);
    //  message id 设置为了   SNS_STD_MSGID_SNS_STD_FLUSH_EVENT ,我们之前发送的时候 都是 SNS_STD_MSGID_SNS_STD_FLUSH_REQ ,原来是在这里做的手脚. 所以,我们在 接收的时候, mseeage id 也是 SNS_STD_MSGID_SNS_STD_FLUSH_EVENT
      event->message_id = SNS_STD_MSGID_SNS_STD_FLUSH_EVENT;
      event->event_len = 0;
      event->timestamp = sns_get_system_time();
      flushing_sensors &= ~sensor_type;
    //  publish evnet 这个 词应该怎么理解??
    //  看注释上写的是 注册到 客户端..
//Client may specify the SUID of the data being sent.  This SUID //must match the SUID of the Sensor to which a client sent its //enable request.
      e_service->api->publish_event(e_service, instance, event, suid);
    }
  }

这里看到了  设置了 event->message_id = SNS_STD_MSGID_SNS_STD_FLUSH_EVENT; 说明,在其他的地方是要处理这个 event? 暂时 没看懂这个是怎么一回事.

看下 a SNS_EVENT_SERVICE 类型

sns_service_manager_init
{
	  service_manager.services[SNS_EVENT_SERVICE] = (sns_service*)sns_event_service_init();

}
event_service_api 的初始化要关注下,不然到后面真的特么的看不懂了...
sns_fw_event_service*
sns_event_service_init(void)
{
  sns_osa_lock_attr attr;
  sns_rc rc;
  event_service_api = (sns_event_service_api)
  {
    .struct_len = sizeof(event_service_api),
    .get_max_event_size = &get_max_event_size,
    .alloc_event = &alloc_event_for_instance,
    .publish_event = &publish_event,
    .publish_error = &publish_error
  };
  ......
  event_service.service.api = &event_service_api;
  event_service.island_client = sns_island_aggregator_register_client("event service");
  sns_es_low_mem_init(&event_service);

  return &event_service;
}

lsm6dso_send_fifo_flush_done 做了哪些事情呢?
1:判断 sensor 的类型
2:获取 sensor 的服务 (SNS_EVENT_SERVICE)
3: 设置 message id SNS_STD_MSGID_SNS_STD_FLUSH_EVENT 等
4: publish_event 到 cilent

在回到 lsm6dso_handle_flush_request 函数
我们 看下 else 分支是干啥的…
在这里插入图片描述
主要就是 set_client_config
Update a Sensor Instance configuration to this sensorRequest

static void  lsm6dso_send_flush_config(
  sns_sensor          *const this,
  sns_sensor_instance *instance,
  lsm6dso_sensor_type sensor)
{
  sns_request config;

  config.message_id = SNS_STD_MSGID_SNS_STD_FLUSH_REQ;
  config.request_len = sizeof(sensor);
  config.request = &sensor;

  this->instance_api->set_client_config(instance, &config);
}

我们看下 this->instance_api->set_client_config 这个函数的实现

lsm6dsm_inst_set_client_config
不等于 SNS_STD_MSGID_SNS_STD_FLUSH_REQ 打印下 client_config
在这里插入图片描述

1: 通过sns_scp_update_bus_power给COM port上电state->scp_service->api->sns_scp_update_bus_power(state->com_port_info.port_handle,
      true);

2:  message_id 为 SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_CONFIG 的时候, 后面 讲解下这个函数的作用...
 if(client_request->message_id == SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_CONFIG)
  {
    lsm6dsm_process_sensor_config_request(this, client_request);
  }
  ....
3:  else if(client_request->message_id == SNS_STD_MSGID_SNS_STD_FLUSH_REQ)
  {
    lsm6dsm_process_flush_request(this, client_request);
  }
4:  else if(client_request->message_id == SNS_PHYSICAL_SENSOR_TEST_MSGID_SNS_PHYSICAL_SENSOR_TEST_CONFIG)
  {
    /** All self-tests are handled in normal mode. */
    lsm6dsm_inst_exit_island(this);
    lsm6dsm_set_client_test_config(this, client_request);
  }
 5: else if(client_request->message_id == SNS_CAL_MSGID_SNS_CAL_RESET)
  {
    lsm6dsm_process_cal_reset_request(this, client_request);
  }

 关闭 com 口...
// Turn COM port OFF
state->scp_service->api->sns_scp_update_bus_power(state->com_port_info.port_handle,
      false);

看下 2: message_id 为 SNS_STD_SENSOR_MSGID_SNS_STD_SENSOR_CONFIG

lsm6dsm_process_sensor_config_request 函数

最后

以上就是单薄鱼为你收集整理的lsm6dso_set_client_request 记录的全部内容,希望文章能够帮你解决lsm6dso_set_client_request 记录所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部