概述
// 简单的记录下
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 记录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复