本文主要是介绍DLP 控制指令流程图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
按照上面的流程来一步步搭建属于自己的程序流程图. 这里,我是在QT上搭建的类.
创建一个类.我们姑且为 DLPControl{};
class DLPControl : public QObject
{Q_OBJECTPublic:DLPControl();~DLPControl();}
//接下来,创建上诉需要用到的各个寄存器指令接口以及接口需要用到的功能.
class DLPControl : public QObject
{Q_OBJECTpublic://控制DLP 状态指令.enum class StartOrStopEnum :int{Start,Pause,Stop};//控制DLP 显示模式指令.enum class DisplayModeEnum :int{Video,Pattern};//控制DLP 投影来源指令.enum class DisplaySourceEnum :int{RgbOrFpd,Flash};enum class TrrigerModeEnum :int{Mode0_Vsyn,Mode1_Internally,Mode2_TwoPattern,Mode3_Variable,Mode4_VsynForVariable};enum class MainBoxAccessEnum :unsigned int{Close,Image,Pattern,VariableExP //可变曝光.};enum BitEnum :unsigned int{BIT1 = 1,BIT2 = 2,BIT3 = 3,BIT4 = 4,BIT5 = 5,BIT6 = 6,BIT7 = 7,BIT8 = 8,};enum LEDEnum : unsigned int{NOLED = 0,RED = 1,GREEN = 2,YELLOW = 3, //green+redBLUE = 4,MAGENTA = 5,//blue+redCYAN = 6, //blue+greenWHITE = 7 //blue+green+red};//0:1 bitenum class PatternTriggerEnum : unsigned int{Internal = 0,ExternalPositive = 1,ExternalNegative = 2,NoInputTrigger = 3 //不设置触发,对这一张pattern,DLP内部依旧有充分的曝光时间.};enum InvertPatternEnum :unsigned int{NoInvertPattern = 0,InvertPattern = 1};enum InsertPatternEnum : unsigned int{NoInsertPostPattern = 0,InsertBlackPattern = 1};enum SwapBufferEnum : unsigned int{NoSwapBuffer = 0,SwapBuffer = 1};enum TriggerOutEnum : unsigned int{TirgOut1Rise = 0,TrigOut1Continue = 1};DLPControl();~DLPControl();protected://封装一系列DLP指令集合.并设置成API可供调用的函数.//设置DLP状态开关WR 0x65//设置视频模式,或者显示模式WR 0x69//设置投影来源WR 0x6F//设置触发模式WR 0x70//设置访问模式W 0x77//设置曝光时间WR 0x66//设置imageIndex entries W 0x78//write an byte 0x00 0x7D//read an byte from R 0x7D //HardWare status R 0x20//弹射硬件错误信息.//System status R 0x21//获取系统错误信息.//Main Status R 0x22//获取main 主状态命令提供了DMD park和DLPC350音序器、帧缓冲区和伽马校正的状态//计算0x5D寄存器 13byte 设计方式.};
以上只是定义了我们投影需要用到的操作DLP寄存器指令的接口,
这里就使用一个简单的例子,来作为如何对应GUI指导书里面的来书写指令.
比如GUI里开启 以及 关闭DLP投影的功能.
在类中定义.
//控制DLP 状态指令.
enum class StartOrStopEnum :int{Start,Pause,Stop};
声明
bool setDLPStartorStop(StartOrStopEnum _status = StartOrStopEnum::Start);
实现的方式.
bool DLPControl::setDLPStartorStop(StartOrStopEnum _status)
{//调用指令函数,bool commandStatus = false;switch (_status){case DLPControl::StartOrStopEnum::Start:{byte writei2cCommand[2] = { 0xE5,0x02 };if (_cameraApiControl != nullptr){commandStatus = _cameraApiControl->sendDLPCommand(writei2cCommand, 0x65);}break;}case DLPControl::StartOrStopEnum::Pause:{byte writei2cCommand[2] = { 0xE5,0x01 };if (_cameraApiControl != nullptr){commandStatus = _cameraApiControl->sendDLPCommand(writei2cCommand, 0x65);}break;}case DLPControl::StartOrStopEnum::Stop:{byte writei2cCommand[2] = { 0xE5,0x00 };if (_cameraApiControl != nullptr){commandStatus = _cameraApiControl->sendDLPCommand(writei2cCommand, 0x65);}break;}default:break;}return commandStatus;
}这里
_cameraApiControl->sendDLPCommand(writei2cCommand, 0x65);
这行代码是将上诉指令通过I2c发送到DLP的方式, 具体大家的主从设备是如何通信的, 这里大家各有各的实现方式,
byte writei2cCommand[2] = { 0xE5,0x00 };
writei2cCommand[0] :寄存器地址.
writei2cCommand[1]: 写入的控制指令.
注意: 0xE5 是 写的指令, 0x65是读取的指令, 这个地址之间的转换就是 0xE5 = 0x65|0x80 得到的,
切记这里的寄存器地址不要写错了.
再来说说,控制指令如何写 ,这里是告诉大家,要控制其启动,停止,需要写入一个字节的指令, 那么这里就需要 0x00 0x01(0000 0001) 这样的16进制来设计了.希望大家明白这里的区别..
以此类推,其它指令相信大家可以很快的设计出来其它基础指令..
实际上,这里只是一小步, 麻烦的是在后面的整套指令设计理解上,
基于在这个基础上,
这篇关于DLP 控制指令流程图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!