问题标签 [fsm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1338 浏览

java - Java上的有限状态机设计问题

我想像下面那样实现 FSM

  • 第一级最基本的状态是BASE_STATE。所有状态都源自 BASE_STATE。
  • Second Level , WAITING_STATE, RUNNING_STATE, END_STATE, ... 等等(源自 BASE_STATE。没有新功能)
  • 第三级,有 2 组状态(主动和被动),对所有第二级状态进行一对一匹配,例如

ACTIVE_WAITING_STATE、ACTIVE_RUNNING_STATE、ACTIVE_END_STATE 等等 PASSIVE_WAITING_STATE、PASSIVE_RUNNING_STATE、PASSIVE_END_STATE 等等

大多数功能对于 ACTIVE 和 PASSIVE 状态都是通用的,只是覆盖了一些小功能。到这里为止没有问题。问题是,所有第三级组都有共同的功能。我的意思是,例如我必须实现 2 个不同的 increment() 函数,其中一个是 ACTIVE_xxx_STATEs,另一个是 PASSIVE_xxx_STATEs。如何在不重写所有状态的情况下做到这一点(例如 ACTIVE_WAITING_STATE 、 ACTIVE_RUNNING_STATE 、 ACTIVE_END_STATE 以及 PASSIVE 状态)

为了澄清我的问题,我丑陋的sol'n。问题是增量函数是相同的,并且为所有 ActivexxxState(以及 PassiveXXXState)重写。

0 投票
3 回答
1529 浏览

c++ - 状态机 - 保存状态、事件和 pFunc 的结构

如果我制作一个状态机并想使用这样的界面:

这样,当我处于 state1 并且 FSM 收到 Key_UP 时,程序会打印:

问题是如何在不要求程序员更改数组大小的情况下将状态和过渡信息存储在类中。我在想我可以使用 2D 数组并像往常一样使其成为状态表,并使其更便携,我只需通过使用矢量类型根据需要调整大小来处理事件和状态的添加。向量的问题是没有多少嵌入式设备可以使用内存分配调用。我的第二个选择是使用状态机调用构造函数并将表所需的大小传递给它,但是如果我添加任何新的状态或事件,我也需要更改这些值......

那么我应该如何存储我的状态、事件和函数指针呢?!

0 投票
1 回答
153 浏览

design-patterns - 在 FSM 中设置状态

我第一次使用基于类的 FSM,我对设置初始状态的最佳实践有点困惑。

我在我的Screen班级中添加了一个 FSM,我想用它来处理(主要是)转换。传统上我会做这样的事情:

我认为这是一种非常标准的方法。

所以我对新状态的问题是,谁负责在屏幕上创建所有对象?我应该Screen创建所有按钮和东西,然后将它们传递给MainMenuTransitionInState班级,还是班级应该MainMenuTransitionState创建按钮然后传递它们,还是我完全错过了标记?

在这里感谢您的明智建议。谢谢!

0 投票
1 回答
694 浏览

c++ - 如何在 on_entry 中使用 Boost.MSM is_flag_active?

我想在我的状态的 on_entry 模板函数之一中使用 is_flag_active() 函数:

但是我得到了以下编译错误:

但是在状态机之外,我的意思是如果我首先声明一个状态机,我可以使用 is_flag_active:

如果我使用前端的 is_flag_,我会再次遇到编译器错误(msm::back::state_machine 中没有这样的函数)。

知道如何将 is_flag_active 与 on_entry 一起使用吗?或者,如果不可能,还有其他选择吗?

感谢您的帮助,加博尔

0 投票
1 回答
546 浏览

akka - Akka,线程调度程序,代理最佳实践

我已经在 Scala 中涉足了一段时间,并且从远处研究了 Akka,并且终于投入其中。FSM 特性为我敲定了交易。让我担心的是,我可能已经设想过如何不恰当地共享数据,并且我可能已经错误地设想了事件处理循环以匹配 Akka 最佳实践。

在我的问题中,我有一个中央协调器,他会将传入的任务请求匹配到也是有限状态机的适当参与者。我最初假设 onTransition 不仅会给出状态名称,还会给出状态数据。

我想传统的数据封装将是不将该数据暴露给听众的原因。但对我来说,我有两个用途让其他人看到这些数据。

状态数据包含一个基础域对象,其属性用于根据其要求确定哪些参与者是处理工作的最佳人选。由于工作要求是动态的,我对单独收集工人演员犹豫不决(尽管我不确定为什么这会让我停下来)。

查询所有满足其他先决条件的单独参与者并加入所有回复的想法对 Akka 来说效率低下或至少不习惯。我还需要在 UI 中显示当前状态,并且没有理由使用相同的事件队列来查看状态。

无论如何,我正在考虑让 FSM 更新一个代理,但由于那是一个演员本身,我不确定那层间接会给我带来什么,而且它可能会使对事件顺序的推理变得更加困难。

Fowler 的 Event Collaboration 指出我要明确发送状态数据,但我希望有一种更简单的方法来为所有自动更新状态数据的转换执行此操作。

我也很难理解事件级联的顺序,以及我是否需要控制它。即使我所有传入的外部事件都来自单个参与者,我仍希望在处理下一个外部事件之前将所有内部生成的事件处理给所有其他参与者。我正在考虑让中央协调员使用!等待回复,但我担心如果不小心删除了事件链中某处的一个感叹号,我将失去该保证。

我正在考虑解决此问题的解决方案包括使用优先级事件,以便为内部事件赋予更高的优先级,对所有共享的“内部”参与者使用单线程调度程序(可能是工作窃取?)。

我正在尝试做的事情是否涉及最佳实践,或者我是否尝试做错误的事情:)?

0 投票
3 回答
6137 浏览

c# - 具有先前状态的状态模式 C#

我是 C# 中状态模式实现的新手,您能否提供一些有关如何实现它的信息。

我正在使用状态模式在 C# 中重构状态机。目前我的状态机包含 5 个状态,只能通过状态前进或后退,即从状态 1 到状态 2、3 和 4 最终到达状态 5。在此处输入图像描述

我能够继续前进

每次您想前进时都会创建一个新状态,但是,一旦所有这些都已创建和/或您想后退,我将需要进入相同的状态,而不仅仅是一个新状态。我怎样才能做到这一点?有没有更好的方法让它变得简单?

0 投票
2 回答
3345 浏览

vhdl - VHDL和有限状态机的反应时间?

这是我经常遇到的一个问题——希望有人能向我解释正确的思考方式!

我基本上可以将我的问题简化为:我有一个带有 input p_in、 outputp_out和 clock的模块clk。功能是每当in变低时 -out应该产生一个持续时间为一个时钟周期的高脉冲;并且这个“负边缘检测器”被实现为具有四种状态的 FSM resetwt_in_lo(等待输入低);sample_signal(在检测到输入变为零时,在输出上生成高信号);wt_in_hi(等待输入高电平,在采样信号被提升后)。

代码包含在下面,isim模拟器中的结果是这样的(这是行为模拟,所以不应该有任何特定于平台的翻译影响):

fsm_react_test_annot.png

基本上,状态确实会按照我的预期发生变化 - 第一个时钟位姿,FSM 识别in为低电平,因此它转换为sample_signal; 第二个时钟,我们处于sample_signal状态。

  • 但是,这是我的问题 - 我希望out一旦sample_signal进入状态(或者至少,这就是我想要实现的目标),它就会变高;然而,在进入下一个状态 ( )之前out不会执行高脉冲!wt_in_hi

然后我通常会尝试围绕这个进行编码(即out在同步 fsm 部分中设置,这可能是一个坏主意) - 最终混淆了合成器和我自己:)

 

所以,简而言之 - 我是否有可能在out进入第二个状态后立即收到一个信号(以及在第二个状态的持续时间内);什么是正确的编码方式?

非常感谢您的任何答案,
干杯!

 

编码:

0 投票
1 回答
2516 浏览

vhdl - VHDL“生成”FSM状态

我有可变数量的模块通过 a 链接到另一个模块signal bus : std_logic_vector(NUM-1 downto 0),每个组件使用 8 位,因此:

至于创建实例和进行端口映射,这很容易通过

我的问题: 我希望能够通过 FSM 与每个模块交互(因为它也需要做一些其他事情),所以希望能够“生成”以下代码,而不是必须写出每个手动状态(signal empty : std_logic_vector(NUM-1 downto 0)每个模块的状态标志在哪里)

如您所见,有很多重复。但是我不能简单地把一个for-generate放在箱子里,那我该怎么办呢?

0 投票
1 回答
202 浏览

erlang - 如果没有事件发生,终止 gen_fsm

我希望我的 FSM 终止任何时间事件在每个州的指定时间之后都没有发生。

只有在 FSM 创建后没有事件的情况下,我才能通过在 init 回调中指定超时值来实现这样的场景,但我希望这个功能也适用于所有状态。

有什么简单快捷的解决方案吗?

最好的祝福

马特

0 投票
2 回答
2726 浏览

javascript - 有限状态机解析

这张图片描述了解析“nice”字符串的有限状态机。

问题是它在 JS 代码中会是什么样子?

编辑

图片来自以上链接:

有限状态机解析