FlightDisplay设计思路
来源:互联网 发布:管家婆软件怎样? 编辑:程序博客网 时间:2024/06/16 09:13
FlightDisplay 模块设计思路与学习总结
组成结构
FlightDisplay\ (飞行显示器)
- VedioManager (录像机管理器)
具体实现思路
VedioManager
引入头文件:
#include <QObject>#include <QTimer>#include <QUrl>#include "QGCLoggingCategory.h" // QGC登录类别#include "VideoSurface.h" // 视频外观#include "VideoReceiver.h" // 视频接收器#include "QGCToolbox.h" // QGC工具盒
源文件引入的头文件:
#include <QCameraInfo> // 摄影机信息#include <VideoItem.h> // 录像机项目#include "ScreenToolsController.h" // 屏幕工具控制器#include "VideoManager.h" // 录像机管理器#include "QGCToolbox.h"#include "QGCCorePlugin.h" // QGC核心插件#include "QGCOptions.h" // QGC选项#include "Settings/SettingsManager.h" // 设置管理器
创建一个继承QGCTool的VideoManager类,添加以下属性:
// 是否有录像机Q_PROPERTY(bool hasVideo READ hasVideo NOTIFY hasVideoChanged)// 是否初始化Q_PROPERTY(bool isGStreamer READ isGStreamer NOTIFY isGStreamerChanged)// 录像机来源IDQ_PROPERTY(QString videoSourceID READ videoSourceID NOTIFY videoSourceIDChanged)// 录像机是否运转Q_PROPERTY(bool videoRunning READ videoRunning NOTIFY videoRunningChanged)// 紫外线/万能接头是否启用Q_PROPERTY(bool uvcEnabled READ uvcEnabled CONSTANT)// 录像机表层Q_PROPERTY(VideoSurface* videoSurface MEMBER _videoSurface CONSTANT)// 录像机接收器Q_PROPERTY(VideoReceiver* videoReceiver MEMBER _videoReceiver CONSTANT)// 是否启用录音Q_PROPERTY(bool recordingEnabled READ recordingEnabled CONSTANT)
四个信号均没有具体的实现:
- void hasVideoChanged() (是否有录像机改变)
- void videoRunningChanged() (录像机是否运转改变)
- void isGStreamerChanged() (是否初始化改变)
- void videoSourceIDChanged() (录像机来源ID改变)
以及函数:
- setToolbox(QGCToolbox *toolbox) (重载QGCTool下的该函数)
- hasVideo() (是否有录像机)
- isGStreamer() (是否初始化)
- uvcEnabled() (紫外线/万能接头) 如果可用摄像机数量大于0,则启用。
- _updateTimer() (更新计时器)
- _updateVideo() (更新录像机) 如果初始化了,当videoReceiver和videoSurface存在时,删除他们,并新建。
总结
在飞行显示器的录像机管理器中,对录像机的是否存在,是否初始化,是否启用紫外线,以及计时器的更新,和录像机的更新进行了处理,频繁使用了
#if #ifndef #endif
以下是查阅的相关资料:
#if的使用说明#if的后面接的是表达式#if (MAX==10)||(MAX==20) code...#endif它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)#if defined的使用#if后面接的是一个宏。#if defined (x) ...code...#endif这个#if defined它不管里面的“x”的逻辑是“真”还是“假”它只管这个程序的前面的宏定义里面有没有定义“x”这个宏,如果定义了x这个宏,那么,编译器会编译中间的…code…否则不直接忽视中间的…code…代码。另外 #if defined(x)也可以取反,也就用 #if !defined(x)#ifdef的使用#ifdef的使用和#if defined()的用法一致#ifndef又和#if !defined()的用法一致。最后强调两点:第一:这几个宏定义只是决定代码块是否被编译!第二:别忘了#endif#if defined还有另外一个#if{n,}def没有的功能~#if (defined(x) && !defined (y)) || defined(z)
以及
首先,让我们先从头文件开始,在很多头文件里,我们会看到这样的语句 #ifndef _MYHEADFILE_H #define _MYHEADFILE_H // .......语句...... #endif // _MYHEADFILE_H 为了避免同一个文件被include多次,我们常使用 #ifndef 进行判断,如果没有包含 _MYHEADFILE_H , 则使用#define 来定义一个宏 _MYHEADFILE_H , #endif 与#ifndef 首尾呼应,表示结束。 说到这里,我们有必要提一个C语言中的预处理器,预处理器是一个小软件,它可以在编译前处理C程序,它的行为是由预处理指令控制的,预处理指令包含了以下内容: 1,宏定义 #define 2,文件包含 #include 3,条件编译 #if #ifdef #ifndef #if defined #if !defined #elif #else #endif #undef 指令都是以#开始的,我们来看一下简单的宏定义(对象式宏) #define 标准符 替换列表 #define PI 3.1415926 可以对类型重命名 #define BOOL int 宏可以带参数,也是常说的宏函数 #define 标识符(x1,x2...) 替换列表 特别注意的是标识符和(之间不能有空格,圆括号是必须的。 我们来看一下例子: #define MAX(x,y) ((x)>(y)?(x):(y)) #define IS_EVEN(n) ((n)%2==0) #define TOUPPER(c) (‘a’<(c)&&(c)<’z’?(c)-’a’+’A’(c)) #define SWAP(T,x,y) {T t=x; x=y; y=t} 还可以写得更复杂一点,比如我们来写一个宏函数,用它来验证一个日期是否合法 #define ISLEAP(y) ((y)%4==0&&(y)%100!=0||(y)%400==0) #define ISSMALL(m) ((m)==4||(m)==6||(m)==9||(m)==11) #define NORMAL(m) (ISSMALL(m)?30:31) #define DAYS(y,m) ((m)==2?28+ISLEAP(y):NORMAL(m)) #define IN(x, from,to) ((x)>=(from)&&(x)<=(to)) #define VALID(y,m,d) ((y)>1600&&IN(m,1,12)&&IN(d,1,DAYS(y,m))) 下面我们来看看条件编译 #if (comdition) {//语句##;} #endif 如果(comdition)为真, 也就是逻辑1的话,编译下面的语句,如果(comdition)为假,即逻辑0,则不编译下面的语句。例子如下: #define DEBUG #if DEBUG Printf(“Value of i:%d\n”, i); Printf(“Value of j:%d\n”, j); #endif 格式: #if 常量表达式 常量表达式为0时,预处理器删除#if 和#endif中间的代码 #if 会把没有定义过的标准符视做为0, 如果没有定义DEBUG, 则 测试#if DEBUG 会失败,但#if !DEBUG会成功。 可以用宏来定义文件名: #if define(IA32) #define CPU_FILE “ia32.h” #elif defined(IA64) #deifine CPU_FILE “ia64.h” #elif defined(AMD64) #define CPU_FILE “amd64.h” #endif #include CPU_FILE 还可以取消已经定义的宏: #if defined VALUE // 检验VALUE是否被定义 ,如果被定义 #undef VALUE // 解除语句定义 #define VALUE 1000 // 重新定义VALUE 为1000 #endif 如果检验没有定义,可以这样写: #ifndef VALUE // 如果VALUE没有被定义 #define VALUE 1000 // 定义VALUE 为1000 #endif 以上所用的宏中: #undef为解除定义; #ifndef是if not defined的缩写,也可以写成#if !defined 即如果没有定义; #ifdef是if defined的缩写,也可以写成#if defined 即检查是否定义过; #ifdef 和 #if defined 的区别,#ifndef 与#if !defined 的区别相类似,都在于后者可以组成复杂的预编译条件,前者只判断单个宏是否定义,例如: #if defined(PERL_PACK_CAN_SHRIEKSIGN) /* v */ SIZE16, #else 0, #endif #ifdef PERL_PACK_CAN_SHRIEKSIGN /* v */ SIZE16, #else 0, #endif #ifdef是种简写,但不支持更复杂的表达式。 #ifdef HAVE_MYHEADER # if VERSION > 3 ... # endif #endif 这种情况用 #if defined(HAVE_MYHEADER) && VERSION > 3 ... #endif 更为合理
阅读全文
0 0
- FlightDisplay设计思路
- 设计思路
- 设计思路
- 设计思路
- 工作流引擎设计思路
- Engine总体设计思路
- 进销存设计思路
- 进销存设计思路
- 初始的设计思路
- 浏览器设计转思路
- “个人设置”设计思路
- Dashboard设计思路
- 进销存设计思路
- 二进制协议设计思路
- 工作流引擎设计思路
- 又一种设计思路
- 搜索引擎设计思路
- 装备设计思路整理
- FREAK算法
- Ubuntu系统 Yaafe安装
- Hibernate和MyBatis的区别?
- 浅谈分布式计算的开发与实现(二)
- intellij idea svn 配置
- FlightDisplay设计思路
- android长度单位转换工具类
- jQuery操作dom的一个实例
- 深度学习常用非线性函数及其导数
- 排序
- 勒索病毒尝试解决方法
- c++作业五—项目5
- Windows学习(004)--消息机制
- AndroidStudio2.3使用小米手机MIUI调试出现DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs错误