C语言面向对象编程,linux同时控制TOF摄像头和RGB摄像头

linux应用层同时控制TOF和RGB摄像头,为了方便操作,统一接口,这里将TOF和RGB摄像头看成两个对象,对它们分别实现,初始化,去初始化,读取视频流,停止视频流,启动视频流,读取配置文件,保存配置,删除配置,获取参数,设置参数等接口。

1、头文件

/* 对象接口 */
typedef struct {char device_name[LV_DEVICE_LENGTH];int context_size;void *context;int (*init)(const char *device_name, void *context);int (*deinit)(void *context);int (*start_stream)(void *context);int (*stop_stream)(void *context, int flag);int (*read_stream)(void *context);int (*read_config)(void *context);int (*save_config)(void *context);int (*delete_config)(void *context);int (*get_parameter)(void *context, uint16_t command_type, char *data_get, int *data_len);int (*set_parameter)(void *context, uint16_t command_type, char *data_set, int data_len);
} LV_STREAM_T;/* 全局数据,包含TOF对象和RGB对象 */
typedef struct {uint8_t lv_start_flag;                   /* 启动采集标志位,0:停止采集;1:开始采集 */uint8_t lv_tof_support;                  /* TOF设备支持 */uint8_t lv_rgb_support;                  /* RGB设备支持 */char device_name_tof[LV_DEVICE_LENGTH];  /* TOF设备名称 */char device_name_rgb[LV_DEVICE_LENGTH];  /* RGB设备名称 */LV_STREAM_T *lv_stream_tof_p;            /* TOF设备对象 */LV_STREAM_T *lv_stream_rgb_p;            /* RGB设备对象 */
} LV_DATA_T;

2.对象实现

LV_STREAM_T g_lv_tof_stream = {"/dev/vide0",sizeof(LV_IMX_STREAM_T),NULL,lv_tof_stream_init,lv_tof_stream_deinit,lv_tof_stream_start,lv_tof_stream_stop,lv_tof_read_stream,lv_tof_read_config,lv_tof_save_config,lv_tof_delete_config,lv_tof_get_parameter,lv_tof_set_parameter,
};LV_STREAM_T g_lv_rgb_stream = {"/dev/vide1",sizeof(LV_RGB_STREAM_T),NULL,lv_rgb_stream_init,lv_rgb_stream_deinit,lv_rgb_stream_start,lv_rgb_stream_stop,lv_rgb_read_stream,lv_rgb_read_config,lv_rgb_save_config,lv_rgb_delete_config,lv_rgb_get_parameter,lv_rgb_set_parameter,
};/* TOF对象接口实现 */
int lv_tof_stream_init(const char *video_device_name, void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_stream_deinit(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_stream_start(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_stream_stop(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_read_stream(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_read_config(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_save_config(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_delete_config(void *context) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_get_parameter(void *context, uint16_t command_type, char *data_get, int *data_len) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}int lv_tof_set_parameter(void *context, uint16_t command_type, char *data_set, int data_len) {LV_IMX_STREAM_T *lv_imx_stream_p = (LV_IMX_STREAM_T *)context;return 0;
}

3.对象调用

/* 对象列表 */
extern LV_STREAM_T g_lv_tof_stream;
extern LV_STREAM_T g_lv_rgb_stream;static LV_STREAM_T *lv_stream_list[] = {&g_lv_tof_stream,&g_lv_rgb_stream,
};/* 根据设备名称来找到对应的相机对象
tof : /dev/video0
rgb : /dev/video1*/
static LV_STREAM_T *lv_find_stream(const char *device_name) {int i = 0;LV_STREAM_T *lv_stream_p = NULL;int list_size = ARRAY_SIZE(lv_stream_list);for (i = 0; i < list_size; i++) {if (strncmp(lv_stream_list[i]->device_name, device_name, strlen(lv_stream_list[i]->device_name)) == 0) {lv_stream_p = lv_stream_list[i];return lv_stream_p;}}LV_WARN("Not find lv_stream, device_name:%s\n", device_name);return NULL;
}/* 创建对象 */
LV_STREAM_T *lv_stream_new(const char *device_name) {int ret = 0;LV_STREAM_T *lv_stream_p = NULL;if (NULL == device_name) {LV_ERROR("device_name is NULL!\n");return NULL;}lv_stream_p = lv_find_stream(device_name);if (lv_stream_p) {if(lv_stream_p->init == NULL) {LV_ERROR("init is NULL!\n");return NULL;}LV_DEBUG("find stream, device_name=%s, context_size=%d\n", device_name, lv_stream_p->context_size);lv_stream_p->context = calloc(1, lv_stream_p->context_size);if (NULL == lv_stream_p->context) {LV_ERROR("context calloc failed!\n");}ret = lv_stream_p->init(device_name, lv_stream_p->context);if(ret) {LV_ERROR("stream init failed!\n");free(lv_stream_p->context);return NULL;}lv_stream_p->read_config(lv_stream_p->context);} else {LV_ERROR("find stream failed!\n");}return lv_stream_p;
}/* 释放对象 */
int lv_stream_free(LV_STREAM_T *lv_stream_p) {if (NULL == lv_stream_p) {return -1;}if (NULL == lv_stream_p->deinit) {return -2;}lv_stream_p->stop_stream(lv_stream_p->context);if (lv_stream_p->context) {lv_stream_p->deinit(lv_stream_p->context);free(lv_stream_p->context);}lv_stream_p = NULL;return 0;
}/* 读取TOF数据流 */
void *start_read_tof_pthread(void *arg) {int ret = 0;LV_DATA_T *lv_data_p = (LV_DATA_T *)arg;while (1) {ret = lv_data_p->lv_stream_tof_p->read_stream(lv_data_p->lv_stream_tof_p->context);if (0 != ret) {sleep_ms(10);}}lv_stream_free(lv_data_p->lv_stream_tof_p);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8 | 卷积模块 | 即插即用的可变核卷积AKConv【附代码+小白可上手】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在目标检测领域内,尽管YOLO系列的算法傲视群雄,但在某些方面仍然存在改进的空间。在YOLOv8提取特征的时候,卷积的核是固定的K*K大小,导致参数数量随着大小的增加呈平方级增长。显然,不同数据集和目标的形状…

基于微信的家庭理财管理小程序的设计与实现(论文+源码)_kaic

摘 要 随着中国经济的飞速发展&#xff0c;家庭收入不断增高&#xff0c;人们的消费除了简单的维持日常生活之外&#xff0c;还有其他的消费方式&#xff0c;比如旅游、电商购物等&#xff0c;层出不穷的消费方式带给人快乐的同时&#xff0c;也常常让一些人逐渐无法把握住自…

【LeetCode】每日一题 2024_5_24 找出最具竞争力的子序列(栈,模拟,贪心)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;找出最具竞争力的子序列题目描述代码与解题思路 每天进步一点点 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;找出最具竞争力的子序列 题目链接&a…

建材行业工程设计资质人员不足对资质有哪些影响

资质申请与审批&#xff1a;在申请工程设计资质时&#xff0c;人员的数量和专业配置是考核的重要指标之一。如果企业人员不足&#xff0c;尤其是缺乏关键岗位的专业技术人员&#xff0c;将直接影响资质的申请和审批。建设部门在核查企业主要人员信息时&#xff0c;如果发现人员…

24年前端面试 高频经典(答案版)

目录 1、函数式编程是什么简单说下&#xff1f; 2、打包工具代码管理 git svn 了解多少&#xff1f; 3、什么是Webpack&#xff1f;它的主要功能是什么&#xff1f; 4、Webpack的核心概念是什么&#xff1f; 5、如何获取到父节点dom 祖父节点呢&#xff1f; 6、登录流…

广义线性chirplet变换【附MATLAB代码】

文章来源&#xff1a;微信公众号&#xff1a;EW Frontier 摘要 时频分析方法是一种刻画信号时变特征的有效工具&#xff0c;在相当长的一段时间内受到了广泛的关注。随着TF算法的发展&#xff0c;许多先进的方法被提出&#xff0c;可以提供更精确的TF结果。但是&#xff0c;不…

【LabVIEW FPGA入门】使用事件发生函数同步FPGA循环

1.使用事件发生函数 使用 Occurrences 函数来控制单独的同步活动。特别是&#xff0c;当您希望程序框图的一部分等待程序框图的另一部分完成任务而不强制 LabVIEW 进行轮询时&#xff0c;请使用这些函数。 您可以使用全局变量执行类似于occurrences函数的功能&#xff0c;通过一…

Nginx 是一款高性能的开源 Web 服务器软件

文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的a…

SQL——DML对表中数据的操作

# 创建数据库 create database if not exists db_BigData default character set gb2312 default collate gb2312_chinese_ci; # 创建表 create table if not exists db_BigData.stu (id int auto_increment primary key comment 主键ID,name var…

navicat15设置字类型为decimal的字段默认值失败

可能是由于我使用的破解版的原因,使用sql可以设置成功,但是navicat可视化工具就不行, sql如下: alter table <表名> alter column <字段名> set default <默认值> ;

Windows内核--DMA

DMA工作期间CPU可以访问内存吗? DMA工作期间&#xff0c;占用内存访问总线&#xff0c;和CPU访问内存总线是冲突的。DMA并不是完全和CPU工作并行&#xff0c;如果CPU只是在对内部寄存器操作&#xff0c;没有访问内存&#xff0c;CPU可以和DMA同时工作。一旦CPU也需要访问内存&…

详解CSS(二)

目录 1.背景属性 1.1背景颜色 1.2背景图片 1.3背景平铺 1.4背景位置 1.5背景尺寸 2.圆角矩形 3.元素的显示模式 3.1行内元素/内联元素&#xff08;Inline element&#xff09; 3.2块级元素&#xff08;Block-level element&#xff09; 3.3行内块元素&#xff08;In…

配置 tmux 状态栏

如果你希望 script_status.sh 脚本用于检测是否能正常上网,并将结果显示在 tmux 状态栏中,可以编写一个脚本来执行此操作。下面是如何实现这一功能的详细步骤: 编写 script_status.sh 脚本 首先,创建或编辑 script_status.sh 脚本,使其能够检测互联网连接状态。可以通过…

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II 1 题目介绍2 个人解题思路2.1 代码2.2 思路 3 官方题解 1 题目介绍 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组…

d20(184-190)-勇敢开始Java,咖啡拯救人生

目录 网络通信 网络通信三要素&#xff08;IP地址&#xff0c;端口号&#xff0c;协议 IP地址 InetAddress 端口号 协议 传输层的两个通信协议 UDP通信 java.net.Datagramsocket类 客户端 服务端 UDP通信多收多发 客户端 服务端 TCP通信 java.net.Socket类 客…

【全网最全】2024电工杯数学建模A题21页初步参考论文+py代码+保奖思路等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模A题21页初步参考论文py代码保奖思路等&#xff08;后续会更新成品论文&#xff09;「首先来看看目前已有的资料&#x…

企业应考虑的优秀云安全措施

作为云客户&#xff0c;企业有责任确保正确使用他们提供的工具来保证数据和应用程序的安全。让德迅云安全来跟大家一起研究一些典型企业应该考虑的优秀云安全措施。 在数据安全和隐私方面&#xff0c;企业是否在努力跟上疫情的发展?企业不是一个人。就像多年以前&#xff0c;C…

【栈】Leetcode 224. 基本计算器【困难】

基本计算器 给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 **注意:**不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 示例 1&#xff1a; 输入&#xff1a;s “1 1” 输出&#xff1a;2 示例 2&…

解决小皮面版搭建php网站数据库连接不了

首先进入mysql bin目录下 并执行cmd mysql -u root -pCREATE USER userlocalhost IDENTIFIED BY pass;GRANT ALL PRIVILEGES ON *.* TO userlocalhost;GRANT SELECT, INSERT, UPDATE ON database_name.* TO xxwlocalhost;FLUSH PRIVILEGES;select host ,user from mysql.user…

Android 自定义Adapter关键函数getView性能最优使用

文章目录 1、自定义Adapter关键函数getView()标准写法2、布局文件list_item_user.xml3、解释3、示例使用4、结果5、进一步优化和扩展5.1. **优化性能&#xff1a;ViewHolder模式**5.2. **处理多种类型的视图**5.3. **使用RecyclerView.Adapter** 6、RecyclerView使用示例7、结果…