resample sensor 的一个问题。
背景: 项目要求,发送多个数据到 sensor-hal 上去,发现无论怎样,在 sensor-hal 上都 只有一个数据。
resample sensor 是重新采样,这个怎么理解的,我的理解是: 假设 sensor 采样率有 5/10/15HZ,上层那边发过来的 90ms, 没有这个挡位,则通过这个 resample 会纠正到 100ms(也就是10hz)进行采样
使用 see_workhorse 测试
./see_workhorse -debug=1 -display_events=1 -sensor=pressure -sample_rate=5 -duration=20
看到确实是有两个 payload 上来…
"events" : [
{
"msg_id" : 1025,
"timestamp" : 14729396536,
"payload" : {
"data" : [
1000.000000,
990.000000
],
"status" : "SNS_STD_SENSOR_SAMPLE_STATUS_ACCURACY_HIGH"
}
}
]
},
但是为什么, sensor-hal 上就只有一个数据呢?
后面发现,是被 resample 截取了
截取一段 代码,看下
static bool suid_lookup_cb(sns_sensor *const sensor,
char const *data_type, sns_sensor_event *event)
{
resampler_state *state =
(resampler_state*)sensor->state->state;
pb_istream_t stream = pb_istream_from_buffer(
(void*)event->event, event->event_len);
sns_std_attr_event attr_event = sns_std_attr_event_init_default;
sns_sensor_util_attrib attrib_list[] =
{ {.sensor = sensor, .attr_id = SNS_STD_SENSOR_ATTRID_STREAM_TYPE},
{.sensor = sensor, .attr_id = SNS_STD_SENSOR_ATTRID_EVENT_SIZE},
{.sensor = NULL, .attr_id = -1}
};
attr_event.attributes.funcs.decode = &sns_sensor_util_decode_attr_list;
attr_event.attributes.arg = (void*)&attrib_list;
if(!pb_decode(&stream, sns_std_attr_event_fields, &attr_event))
{
SNS_PRINTF(ERROR, sensor, "Error decoding attr event");
}
else
{
bool is_streaming = false;
uint8_t axis_cnt = 0;
int32_t event_size = 0;
for(int i=0; i< ARR_SIZE(attrib_list); i++)
{
if(SNS_STD_SENSOR_ATTRID_STREAM_TYPE == attrib_list[i].attr_id)
{
is_streaming = (SNS_STD_SENSOR_STREAM_TYPE_STREAMING == attrib_list[i].attr_value);
}
if(SNS_STD_SENSOR_ATTRID_EVENT_SIZE == attrib_list[i].attr_id)
{
event_size = attrib_list[i].attr_value;
}
}
/* If expected attribute matched, store it */
if (is_streaming)
{
axis_cnt = resampler_get_axis_count(event_size);
resampler_store_sensor(sensor, data_type, &state->suid_lookup_data, axis_cnt);
}
SNS_PRINTF(ERROR, sensor, "xuzhibang event_size:%d, axis_cnt:%d\n",event_size,axis_cnt);
}
return false;
}
// 这个就是从 event size attribute 拿到的值..
/* Calculate the axis count of a sensor from its event size attribute */
static uint8_t resampler_get_axis_count(int32_t event_size)
{
uint8_t axis_cnt = AXIS_CNT_DEFAULT;
if (event_size > pb_overhead)
{
axis_cnt = (event_size - pb_overhead)/sizeof(float);
}
return axis_cnt;
}
打印log ,看到 axis_cnt 这个值确实是为1,这个是从 event size attribute 得到的。
resampler_get_axis_count: 这个是决定 发送的个数。 可以看到会除以一个 sizeof(float)
所以我们在:直接发送PRESSURE_EVENT_SIZE 就行了。不需要 什么 sizeof(float)
static void XXX_publish_attributes(sns_sensor * const this)
{
{
float data[PRESSURE_EVENT_SIZE ] = {0}; //
state->encoded_event_len =
pb_get_encoded_size_sensor_stream_event(data, PRESSURE_EVENT_SIZE );
sns_std_attr_value_data value = sns_std_attr_value_data_init_default;
value.has_sint = true;
value.sint = state->encoded_event_len;
sns_publish_attribute(
this, SNS_STD_SENSOR_ATTRID_EVENT_SIZE, &value, 1, false);
}
}
我们修改 相关的 sensor 驱动的 XXX_publish_attributes 的 SNS_STD_SENSOR_ATTRID_EVENT_SIZE 上报的值,我们要上报几个,则 设置 PRESSURE_EVENT_SIZE 这个值为几,就ok 了。
最后说一下:
see_workhorse 与 sensors-hal 的区别是 : see_workhorse 会关闭 resample
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » resample sensor
发表评论 取消回复