Uma ferramenta de geração automática de máquina de estado

Siga + estrela conta oficial , não perca conteúdo emocionante

0ea0dad360f93c47581f5e4d02d85f4c.gif

Fonte do material | Internet

Escrever uma máquina de estado para um sistema de software prático não é uma tarefa fácil, especialmente quando a própria máquina de estado é relativamente complexa. tempo e energia para como gerenciar os vários estados na máquina de estado, em vez da lógica operacional do próprio programa.

Como padrão geral de design de software, deve haver mais ou menos semelhança entre as máquinas de estado de vários sistemas de software, então as pessoas começaram a tentar desenvolver algumas ferramentas para gerar automaticamente o código de estrutura da máquina de estado finito e, no Linux Next, há é uma escolha muito boa──FSME (Finite State Machine Editor).

FSME visualizado

fd092d92a975c75d16dc0ae66ecfa915.jpeg

FSME é uma ferramenta de máquina de estado finito baseada em Qt que permite aos usuários modelar graficamente a máquina de estado necessária no programa e também pode gerar automaticamente o código de estrutura da máquina de estado implementado em C++ ou Python.

Vamos pegar a máquina de estado do portão da cidade na figura abaixo como um exemplo para introduzir como usar o FSME para gerar automaticamente o código da máquina de estado necessário no programa.

Máquina de estado controlando o portão

94912b8d47b86a8d580153325a670bd6.jpeg

1 Modelagem de máquina de estado

Primeiro, execute o comando fsme para iniciar o editor da máquina de estado e, em seguida, clique no botão "Novo" na barra de ferramentas para criar uma nova máquina de estado. Existem cinco elementos básicos usados ​​para construir uma máquina de estado no FSME: evento (Event), input (Input), output (Output), state (State) e transição (Transition), que podem ser encontrados na lista de árvore à esquerda lado da interface Quatro deles.

  • modelagem de estado

Selecione o item "Estados" na lista em árvore no lado esquerdo da interface FSME, pressione a tecla Inserir no teclado para inserir um novo estado e insira o nome do estado na caixa de texto "Nome" na parte inferior direita e, em seguida, digite o nome do estado no canto superior direito Clique na posição onde o estado deve ser colocado na área de desenho do , e um novo estado é criado. Da mesma forma, podem ser adicionados todos os estados requeridos pela máquina de estados, conforme a figura abaixo.

modelagem de estado

b0e3eef123144fdd59fcbbc95d63fe28.jpeg

  • modelagem de evento

Selecione o item "Eventos" na lista da árvore no lado esquerdo da interface FSME, pressione a tecla Insert no teclado para adicionar um novo evento e digite o nome do evento na caixa de texto "Nome" na parte inferior direita e, em seguida, clique no botão "Aplicar", um novo evento é criado. Da mesma forma, podem ser adicionados todos os eventos requeridos pela máquina de estado, conforme a figura abaixo.

f107f8c78a4bcb732359bd546b33fff3.jpeg

  • modelagem de transformação

A transição de estado é a parte mais importante de todo o processo de modelagem, é usada para definir como um estado na máquina de estado finito muda para outro estado. Por exemplo, quando a máquina de estado usada para controlar o portão da cidade está no estado Aberto, se ocorrer um evento Fechar neste momento, o estado atual da máquina de estado mudará para o estado Fechado. Esse processo completo pode ser usado em o modelo de máquina de estado como closeDoor Uma transformação para descrever.

Para adicionar essa conversão no FSME, primeiro você precisa selecionar o item "Aberto" em "Estados" na lista em árvore no lado esquerdo da interface e, em seguida, pressionar a tecla Insert no teclado para adicionar uma nova conversão e, em seguida, clique em Digite o nome da transição "closeDoor" na caixa de texto "Nome", digite "Fechar" na caixa de texto "Condição" para indicar que a condição que aciona a transição é a geração do evento Fechar e selecione a opção "Fechado " item na caixa suspensa "Destino" para indicar Após a transição ocorrer, a máquina de estado será alternada para o estado Fechado e, finalmente, clique no botão "Aplicar" para definir um novo relacionamento de transição de estado, conforme mostrado na figura abaixo. Todas as transições exigidas pela máquina de estado podem ser adicionadas da mesma maneira.

modelagem de transformação

094521d2e489b1cf5a0d33a1129b3c71.jpeg

2 Gerar quadro de máquina de estado

O uso do FSME pode não apenas executar a modelagem visual da máquina de estado, mas, mais importante, também pode gerar automaticamente uma estrutura de máquina de estado implementada em C++ ou Python com base no modelo obtido. Primeiro selecione o item "Root" na lista da árvore à esquerda da interface FSME, digite o nome da máquina de estado "DoorFSM" na caixa de texto "Nome" no canto inferior direito e selecione o estado "Aberto " na lista suspensa "Initial State" Como o estado de inicialização da máquina de estado, é mostrado na Figura 6.

Definir propriedades iniciais

a50ba2da1258d62a272803f3751ed13b.jpeg

Depois de salvar o modelo da máquina de estado como um arquivo door.fsm, use o seguinte comando para gerar um arquivo de cabeçalho contendo a definição da máquina de estado:

[xiaowp@linuxgam code]$ fsmc door.fsm -d -o DoorFSM.h

Além disso, também é possível gerar um código de estrutura que inclua uma implementação de máquina de estado:

[xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp

Se você deseja verificar a máquina de estado gerada, basta escrever manualmente um trecho de código para teste:

/*
 * TestFSM.cpp
 * 测试生成的状态机框架
 */

#include "DoorFSM.h"

int main()
{
  DoorFSM door;
  door.A(DoorFSM::Close);
  door.A(DoorFSM::Lock);
  door.A(DoorFSM::Unlock);
  door.A(DoorFSM::Open);
}

A máquina de estado finito é controlada por eventos. No código da estrutura da máquina de estado gerado pelo FSME, o método A() pode ser usado para enviar eventos correspondentes à máquina de estado, fornecendo assim o "poder" necessário para a operação normal da máquina de estado . A máquina de estados é responsável por manter uma fila de eventos dentro dela, e todos os eventos que chegam serão colocados na fila de eventos para aguardar, de forma a garantir que serão processados ​​sequencialmente na ordem de chegada. Ao processar cada evento recebido, a máquina de estado verificará se a condição de transição correspondente ao estado foi satisfeita de acordo com seu estado atual e ativará o processo de transição de estado correspondente se for satisfeita.

O esqueleto da máquina de estado gerado e o código de teste podem ser compilados em um arquivo executável usando o seguinte comando:

[xiaowp@linuxgam code]$ g++ DoorFSM.cpp TestFSM.cpp -o fsm

Como a opção -d foi usada ao gerar o código da máquina de estado com o comando fsmc, o quadro da máquina de estado gerado conterá certas informações de depuração, incluindo o evento de ativação de cada transição de estado na máquina de estado, o estado antes da transição, a experiência transições, estados de transição, etc., como segue:

[xiaowp@linuxgam code]$ ./fsm
DoorFSM:event:'Close'
DoorFSM:state:'Opened'
DoorFSM:transition:'closeDoor'
DoorFSM:new state:'Closed'
DoorFSM:event:'Lock'
DoorFSM:state:'Closed'
DoorFSM:transition:'lockDoor'
DoorFSM:new state:'Locked'
DoorFSM:event:'Unlock'
DoorFSM:state:'Locked'
DoorFSM:transition:'unlockDoor'
DoorFSM:new state:'Unlocked'
DoorFSM:event:'Open'
DoorFSM:state:'Unlocked'
DoorFSM:transition:'openDoor'
DoorFSM:new state:'Opened'

3 máquina de estado personalizada

A máquina de estado atual foi capaz de responder a vários eventos externos e ajustar adequadamente seu estado atual, ou seja, a função do mecanismo da máquina de estado foi realizada e a próxima coisa a fazer é ajustar o estado máquina de acordo com as necessidades específicas da aplicação. Personalize para adicionar à máquina de estado aquelas lógicas de processamento relacionadas ao próprio sistema de software. No FSME, as operações relacionadas a aplicações específicas são chamadas de Saída. Na verdade, são algumas funções virtuais que precisam ser implementadas especificamente pelo usuário.O mecanismo da máquina de estados gerada automaticamente é responsável por chamá-los ao entrar ou sair de um determinado estado.

Ainda tomando como exemplo a máquina de estados que controla o portão da cidade, suponha que queremos adicionar alguma lógica de processamento ao entrar em cada estado. Primeiro, selecione o item "Saídas" na lista em árvore no lado esquerdo da interface FSME, pressione a tecla Inserir no teclado para adicionar uma nova saída e digite o nome correspondente na caixa de texto "Nome" no canto inferior direito e, em seguida, clique no botão "Aplicar", uma nova saída é criada, conforme mostrado na figura. Todas as saídas necessárias para a máquina de estado podem ser adicionadas da mesma forma.

adicionar saída

ce0f8fa7286cc4b2ba29ec9263ed974f.jpeg

Quando todas as saídas são definidas, é possível vincular as saídas correspondentes para cada estado na máquina de estado. Primeiro selecione o estado correspondente no item "Estados" no lado esquerdo da interface FSME, selecione a saída correspondente ao estado na caixa de listagem "Disponível" no canto inferior direito e clique no botão "<" para adicione-o à lista "In", conforme mostrado na figura. Da mesma forma, as saídas correspondentes podem ser definidas para todos os estados na máquina de estado. O mesmo estado pode ter várias saídas. A saída na lista In será chamada ao entrar no estado e a saída na lista Out será It é chamado ao sair desse estado e a ordem das chamadas de saída é consistente com sua ordem na lista In ou Out.

A imagem mostra a saída de configuração de estado

11dfae2bfd2d0af6e3da5c339c51179f.jpeg

Devido à modificação do modelo da máquina de estado, precisamos gerar novamente o código do framework da máquina de estado, mas desta vez não há necessidade de adicionar o parâmetro -d:

[xiaowp@linuxgam code]$ fsmc door.fsm -o DoorFSM.h
[xiaowp@linuxgam code]$ fsmc door.fsm -d -impl DoorFSM.h -o DoorFSM.cpp

Adicionamos quatro saídas de enterOpend, enterClosed, enterLocked e enterUnlocked ao novo modelo de máquina de estado, de modo que a classe gerada DoorFSM conterá as seguintes funções virtuais puras:

virtual void enterOpened() = 0;
virtual void enterLocked() = 0;
virtual void enterUnlocked() = 0;
virtual void enterClosed() = 0;

Obviamente, a estrutura da máquina de estado gerada neste momento não pode mais ser compilada diretamente, devemos derivar uma subclasse da classe DoorFSM e fornecer a implementação específica dessas funções virtuais puras:

/*
 * DoorFSMLogic.h
 * 状态机控制逻辑的头文件
 */
#include "DoorFSM.h"

class DoorFSMLogic : public DoorFSM
{
 
 protected:
  virtual void enterOpened();
  virtual void enterLocked();
  virtual void enterUnlocked();
  virtual void enterClosed();
};

Como mencionado acima, essas funções representam na verdade a lógica de processamento do sistema aplicativo. Como exemplo, simplesmente exibimos algumas informações de prompt:

/*
 * DoorFSMLogic.cpp
 * 状态机控制逻辑的实现文件
 */
#include "DoorFSMLogic.h"
#include <iostream>

void DoorFSMLogic::enterOpened()
{
    std::cout << "Enter Opened state." << std::endl;
}

void DoorFSMLogic::enterClosed()
{
    std::cout << "Enter Closed state." << std::endl;
}

void DoorFSMLogic::enterLocked()
{
    std::cout << "Enter Locked state." << std::endl;
}

void DoorFSMLogic::enterUnlocked()
{
    std::cout << "Enter Unlocked state." << std::endl;
}

Da mesma forma, para verificar a máquina de estado gerada, também precisamos escrever manualmente um código de teste:

/*
 * TestFSM.cpp
 * 测试状态机逻辑
 */
#include "DoorFSMLogic.h"

int main()
{
  DoorFSMLogic door;
  door.A(DoorFSM::Close);
  door.A(DoorFSM::Lock);
  door.A(DoorFSM::Unlock);
  door.A(DoorFSM::Open);
}

O esqueleto da máquina de estado gerado e o código de teste podem ser compilados em um arquivo executável usando o seguinte comando:

[xiaowp@linuxgam code]$ g++ DoorFSM.cpp DoorFSMLogic.cpp TestLogic.cpp -o logic

Os resultados em execução são os seguintes:

[xiaowp@linuxgam code]$ ./logic
Enter Closed state.
Enter Locked state.
Enter Unlocked state.
Enter Opened state.

Este artigo envolve downloads de código: http://www.uml.org.cn/umlcode/code.zip

Isenção de responsabilidade: o material deste artigo vem da Internet e os direitos autorais pertencem ao autor original. Se envolver questões de direitos autorais, entre em contato comigo para excluir.

------------  FIM  ------------

79e5d600640655b39cc97205c1c1228b.gif

●Coluna "Ferramentas incorporadas "

●Coluna "Desenvolvimento Integrado"

●Coluna "Tutorial Keil"

●Tutoriais selecionados na coluna incorporada

Preste atenção à conta oficial e responda " Jiagroup " para ingressar no grupo de intercâmbio técnico de acordo com as regras e responda " 1024 " para ver mais conteúdo.

6d729b2999c7283dff860c844a744406.jpeg

e354460fded1ffd8880bc55436782879.png

Clique em " Ler o texto original " para visualizar mais compartilhamentos.

Acho que você gosta

Origin blog.csdn.net/ybhuangfugui/article/details/132033245
Recomendado
Clasificación