65.9K
CodeProject 正在变化。 阅读更多。
Home

FxEngine 插件用于模拟逻辑门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (12投票s)

2010年5月8日

GPL3

3分钟阅读

viewsIcon

42296

downloadIcon

1490

本文展示了如何使用 FxEngine 框架构建插件来模拟逻辑门。

引言

很久以前,我尝试寻找一个免费的软件工具来模拟一个非常简单的警报系统,使用少量门电路,但(几乎)没有成功。由于我了解 FxEngine 框架,我决定创建自己的门电路来模拟我的简单警报系统。最终目标是能够使用少量门电路创建复杂的数据流。

目前,可用的简单门电路类型有

  • AND
  • NAND (与非门)
  • 或者
  • NOR (或非门)
  • NOT
  • XOR (异或门)
  • XNOR (同或门)

此外,我编写了一个更复杂的门电路,即 RS 锁存器,以及几个有用的组件,包括

  • Button
  • 战术按钮
  • 常数位
  • 导线连接
  • 多色 LED
  • 字母数字计数器
  • 源时钟
  • 示波器渲染器 (CLI 演示)

关于字母数字计数器:我使用了来自 https://codeproject.org.cn/KB/static/digidisplay.aspx 项目的位图。感谢 Nic WILSON 的工作。

背景

主要背景是 FxEngine 框架 here。要使用所有插件,您必须下载该框架。

请注意,FxEngine 编辑器包含在框架安装中。

我之前已经发布了一篇关于如何创建 插件以从网络摄像头流式传输视频数据的文章。

Using the Code

在 zip 文件中,您将找到

  • 一个全局的 Visual 2005 和 2008 项目:.\Build\x86-w32\Vc8 和 .\Build\x86-w32\Vc9
  • 每个 Fx (即插件) 的所有独立项目,适用于 Visual 2005 和 2008

插件概念

主要的 Fx 概念是每次我们在输入引脚上接收到一个新的输入值时,Fx 必须计算一个新的值并将其传输到链中的下一个 Fx。为了更好地符合真实的逻辑电路,逻辑流中的值是 1 和 0,但我们可以设想具有两个以上值的更复杂的流。

编写插件

Fx 的编写快速而简单。第一行是 DLL 主函数 (可选),用于处理 DLL_PROCESS_ATTACH 消息。所有其他行描述插件的行为。每个 Fx 必须有一个 C++ 类,该类继承自两个 C++ 接口之一

  • IFxBase
  • IFxPinCallback

为了检索类实例,框架调用 FEF_GetFxBase 方法。

这两个接口都包含几个虚拟方法用于 (覆盖) 写入。这些接口用于

  • 控制插件(初始化、启动、停止等)
  • 处理插件事件,例如传入数据、引脚连接或新参数更新

例如,Led 插件的控制方法 Stop 将具有以下定义

Int32 CFxLedRnd::StopFx()
{
    if(_FxState != FX_STOP_STATE) {
       _pFxState->FxPublishState(_FxState = FX_STOP_STATE);
    }
    /*!  Delivers signal to the next Fx (i.e. O) */
    return DeliverSignal();
} 

其中该方法设置 Fx 状态并在其输出引脚上提供值 "0"。

连接事件将具有以下定义

Void CFxLedRnd::FxPinState( IFxPin* pFxPin, FX_PIN_STATE PinState )
{
    if(PinState == PIN_CONNECTED) {
        if(pFxPin == _pFxOutPin) //!< Transmit switch value 
            DeliverSignal(); //!< Delivers signal to the next Fx
    }
    else {//!< Force input to 0
        if(pFxPin == _pFxInPin) {
            _bInPinValue = 0;
            DeliverSignal(); //!< Delivers signal to the next Fx
        }
    }
    return;
}

其中

  • 当输入引脚断开连接时,我们认为其输入引脚上的值为 "0",然后将其提供到输出端。
  • 当输出引脚连接时,我们必须将当前值传输到下一个 Fx。

更多编程细节可在 FxEngine 用户指南中找到。

编写 GUI

第一个版本 (1.1) 中的门电路使用了来自 Microsoft 的旧版但非常有效的 API:WIN32 API。每个 GUI 都基于一个 .rc 和一个 .h 文件。为了让我的开发更容易,我使用了这个出色的工具:resedit。我唯一需要添加的代码是处理 GUI 事件,例如按钮、复选框等。这由回调函数完成

LONG CALLBACK FxWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

关于按钮:每个按钮有两个输入引脚,用于根据开关位置定义高位和低位值。但是,如果没有信号连接到它们,则默认情况下,高位和低位值分别为 "1" 和 "0"。

历史

  • 版本 1.3 (2010.07.12):添加了时钟和示波器 Fx
  • 版本 1.2 (2010.05.11):添加了字母数字计数器 Fx
  • 版本 1.1 (2010.04.22):第一个版本
© . All rights reserved.