FxEngine 插件用于模拟逻辑门
本文展示了如何使用 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):第一个版本