CommandMode

本文介绍了一种常用的设计模式——命令模式,并通过示例代码详细解释了如何在C++中实现这一模式,包括基本的命令执行及扩展到支持撤销操作的功能。

//一个很好的CommandMode

 

//提炼一个Command接口
class Command
{
public:
 virtual ~Command(){}
 virtual void Execute() = 0;
protected:
 Command(){}
};
class LightOnCommand : public Command
{
public:
 void Execute()
 {
  //一般来说这里多是借助其它对象来完成,这个例子从简了
  cout << "开始发光" << endl;
 }
};
class LightOffCommand : public Command
{
public:
 void Execute()
 {
  cout << "停止发光" << endl;
 }

};
class FireOnCommand : public Command
{
public:
 void Execute()
 {
  cout << "开始喷火" << endl;
 }
};
class FireOffCommand : public Command
{
public:
 void Execute()
 {
  cout << "结束喷火" << endl;
 }
};

//公牛类
class Bulls
{
private:
 //Command数组
 vector<void*> m_Commands;
 //void *m_Commands[4];
public:
 Bulls()
 {
  m_Commands.push_back(new LightOnCommand());
  m_Commands.push_back(new LightOffCommand());
  m_Commands.push_back(new FireOnCommand());
  m_Commands.push_back(new FireOffCommand());
 }
 //点击张开嘴
 void ClickMouthOpen()
 {
  m_Commands[0]->Execute();
 }
 void ClickMouthClose()
 {
  m_Commands[1]->Execute();
 }
 void ClickEyeOpen()
 {
  m_Commands[2]->Execute();
 }
 void ClickEyeClose()
 {
  m_Commands[3]->Execute();
 }
};

//提炼一个Command接口
class Command
{
public:
 virtual ~Command(){}
 virtual void Execute() = 0;
 //撤消操作
 virtual void UnExecute() = 0;
protected:
 Command(){}
};
class LightOnCommand : public Command
{
public:
 void Execute()
 {
  //一般来说这里多是借助其它对象来完成,这个例子从简了
  cout << "开始发光" << endl;
 }
 void UnExecute()
 {
  cout << "撤销发光操作" << endl;
 }
};

//公牛类
class Bulls
{
private:
 vector m_Commands;
 //添加一个堆栈作为撤消操作的容器
 stack m_UndoCommands;
public:
 Bulls()
 {
  m_Commands.push_back(new LightOnCommand());
  m_Commands.push_back(new LightOffCommand());
  m_Commands.push_back(new FireOnCommand());
  m_Commands.push_back(new FireOffCommand());
 }
 void ClickMouthOpen()
 {
  m_Commands[0]->Execute();
  //每次操作后,把该操作放入堆栈中
  m_UndoCommands.push(m_Commands[0]);
 }
 void ClickMouthClose()
 {
  m_Commands[1]->Execute();
  m_UndoCommands.push(m_Commands[1]);
 }
 void ClickEyeOpen()
 {
  m_Commands[2]->Execute();
  m_UndoCommands.push(m_Commands[2]);
 }
 void ClickEyeClose()
 {
  m_Commands[3]->Execute();
  m_UndoCommands.push(m_Commands[3]);
 }
 void Undo()
 {
  //撤消通过调用m_UndoCommands来完成
  if ( !m_UndoCommands.empty())
  {
   m_UndoCommands.top()->UnExecute();
   m_UndoCommands.pop();
  }
 }
};

### AMOLED Command Mode 与 Video Mode 的区别 AMOLED 显示屏的驱动模式主要分为 **Command Mode** 和 **Video Mode**,这两种模式在数据传输、刷新机制以及硬件设计上存在显著差异。 #### 1. 数据传输方式 - **Command Mode**:在这种模式下,主机通过发送命令和数据来控制显示内容。具体来说,主机需要逐帧向显示控制器发送完整的像素数据,并通过特定的命令序列触发显示更新[^1]。这种方式通常适用于较低分辨率或刷新率的需求。 - **Video Mode**:相比之下,**Video Mode** 更加高效。在这种模式下,显示控制器会持续接收来自主机的视频流数据,并自动将其输出到显示屏上,无需额外的命令干预[^1]。这种模式适合高分辨率、高刷新率的应用场景。 #### 2. 刷新机制 - **Command Mode**:刷新操作由主机显式控制。每次屏幕内容发生变化时,主机都需要重新发送所有相关像素数据并执行刷新命令。因此,这种模式下的刷新频率可能较低,且对主机性能要求较高。 - **Video Mode**:刷新过程是自动化的,显示控制器能够根据内部时钟或外部同步信号自行完成帧刷新。这不仅提高了刷新效率,还减轻了主机处理器的负担。 #### 3. 硬件设计复杂度 - **Command Mode**:由于需要频繁地发送命令和数据,该模式下的硬件接口设计相对简单,但对软件控制逻辑的要求较高[^1]。 - **Video Mode**:虽然硬件实现更为复杂(例如需要支持连续的数据流传输),但它可以简化软件层面的操作,同时提供更好的性能表现[^1]。 ### Panel Type 与 UEFI/Kernel 显示模式对比 #### 1. UEFI 阶段 在 UEFI 阶段,无论是 Command Mode 还是 Video Mode 的 AMOLED 面板,其初始化和配置通常依赖于 GOP(Graphics Output Protocol)。GOP 提供了一个统一的接口用于设置分辨率、颜色深度等基本参数,并不直接区分具体的面板类型或工作模式[^2]。 然而,在实际实现中: - 对于 **Command Mode**,可能需要通过额外的平台库或专用驱动程序来处理复杂的命令序列。 - 而对于 **Video Mode**,GOP 可以更直接地利用硬件加速功能来提升启动画面的渲染效果[^2]。 #### 2. Kernel 阶段 进入操作系统内核阶段后,不同类型的 AMOLED 面板及其工作模式将通过设备树描述文件(DTS/DTSI)进行详细定义。例如,在 SC66 模块中,`dsi-panel-rm67195-amoled-fhd-cmd.dtsi` 文件就明确指定了一个基于 DSI 接口的 AMOLED 面板采用的是 Command Mode。 - 在 **Command Mode** 下,内核驱动程序需要负责解析这些设备树信息,并按照指定的时序发送初始化命令和帧缓冲数据。 - 对于 **Video Mode**,则更多地依赖于硬件本身的 FIFO 缓冲区管理能力以及同步信号生成电路,从而减少软件干预的频率[^1]。 ```c // 示例代码:DSI 配置中的背光命令设置 static struct dsi_panel_cmd_set bl_config = { . cmds = bl_cmds, . state = CMD_SET_STATE_INIT, }; ``` 上述代码片段展示了如何在内核驱动中为 AMOLED 面板配置背光命令。 ### 总结 AMOLED 的 Command Mode 和 Video Mode 各有优劣,前者灵活性强但资源消耗较大,后者效率高却对硬件要求更高。在 UEFI 和 Kernel 阶段,这两种模式分别通过不同的机制得到支持,UEFI 更注重快速启动期间的基础图形输出,而 Kernel 则提供了更加精细和全面的控制能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值