add stream raw frame access
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
#include <algorithm>
|
||||
#include <chrono>
|
||||
#include <condition_variable>
|
||||
#include <cstdint>
|
||||
@@ -7,6 +8,7 @@
|
||||
#include <queue>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
#include "../../include/eskin_ffi.h"
|
||||
|
||||
@@ -64,20 +66,34 @@ static void demo_streaming(EskinDeviceHandle device, double duration_sec = 5.0)
|
||||
// 线程安全队列(参考 ROS publisher 的 read_loop + publish_callback 分离模式)
|
||||
std::mutex mtx;
|
||||
std::queue<CFingerSample> queue;
|
||||
std::queue<std::vector<uint8_t>> raw_queue;
|
||||
bool running = true;
|
||||
|
||||
// 读取线程:持续从设备读取 sample 放入队列
|
||||
// 读取线程:持续从设备读取 sample 和原始帧放入队列
|
||||
std::thread read_thread([&]() {
|
||||
while (running) {
|
||||
CFingerSample sample;
|
||||
memset(&sample, 0, sizeof(sample));
|
||||
auto e = eskin_read_sample(device, 50, &sample);
|
||||
if (e == ESkinSuccess) {
|
||||
uint8_t raw_buf[512] = {};
|
||||
uint32_t raw_len = 0;
|
||||
auto raw_err = eskin_read_stream_frame(
|
||||
device, 1, raw_buf, sizeof(raw_buf), &raw_len);
|
||||
std::vector<uint8_t> raw_frame;
|
||||
if (raw_err == ESkinSuccess) {
|
||||
raw_frame.assign(raw_buf, raw_buf + std::min<uint32_t>(raw_len, sizeof(raw_buf)));
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
queue.push(sample);
|
||||
raw_queue.push(std::move(raw_frame));
|
||||
while (queue.size() > 100) {
|
||||
queue.pop(); // 防止堆积
|
||||
}
|
||||
while (raw_queue.size() > 100) {
|
||||
raw_queue.pop();
|
||||
}
|
||||
}
|
||||
// 超时等非致命错误忽略,继续读取
|
||||
}
|
||||
@@ -96,11 +112,18 @@ static void demo_streaming(EskinDeviceHandle device, double duration_sec = 5.0)
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
while (!queue.empty()) {
|
||||
const auto &s = queue.front();
|
||||
printf("[%5u] module=%u fx=%u fy=%u fz=%u\n",
|
||||
size_t raw_len = 0;
|
||||
if (!raw_queue.empty()) {
|
||||
raw_len = raw_queue.front().size();
|
||||
raw_queue.pop();
|
||||
}
|
||||
|
||||
printf("[%5u] module=%u fx=%u fy=%u fz=%u raw_len=%zu\n",
|
||||
s.sequence, s.combined_force.module,
|
||||
s.combined_force.force.fx,
|
||||
s.combined_force.force.fy,
|
||||
s.combined_force.force.fz);
|
||||
s.combined_force.force.fz,
|
||||
raw_len);
|
||||
queue.pop();
|
||||
count++;
|
||||
}
|
||||
@@ -145,4 +168,4 @@ int main(int argc, char *argv[]) {
|
||||
eskin_close(device);
|
||||
printf("Device closed\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user