按照上面的流程来一步步搭建属于自己的程序流程图. 这里,我是在QT上搭建的类.
创建一个类.我们姑且为 DLPControl{};
class DLPControl : public QObject
{
Q_OBJECT
Public:
DLPControl();
~DLPControl();
}
//接下来,创建上诉需要用到的各个寄存器指令接口以及接口需要用到的功能.
class DLPControl : public QObject
{
Q_OBJECT
public:
//控制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+red
BLUE = 4,
MAGENTA = 5,//blue+red
CYAN = 6, //blue+green
WHITE = 7 //blue+green+red
};
//0:1 bit
enum 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进制来设计了.希望大家明白这里的区别..
以此类推,其它指令相信大家可以很快的设计出来其它基础指令..
实际上,这里只是一小步, 麻烦的是在后面的整套指令设计理解上,
基于在这个基础上,