diff --git a/libs/main/geo/pigeomodule.h b/libs/main/geo/pigeomodule.h index 94293acb..4665bad8 100644 --- a/libs/main/geo/pigeomodule.h +++ b/libs/main/geo/pigeomodule.h @@ -26,16 +26,14 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ -//! \addtogroup Geo -//! \{ -//! \~\file pigeomodule.h +//! \defgroup Geo Geo //! \~\brief //! \~english Geographical position and Earth models module. //! \~russian Модуль географической позиции и моделей Земли. //! //! \~\details -//! \~english \section cmake_module_Cloud Building with CMake -//! \~russian \section cmake_module_Cloud Сборка с использованием CMake +//! \~english \section cmake_module_Geo Building with CMake +//! \~russian \section cmake_module_Geo Сборка с использованием CMake //! //! \~\code //! find_package(PIP REQUIRED) @@ -55,10 +53,8 @@ //! //! \~\authors //! \~english -//! Ivan Pelipenko peri4ko@yandex.ru; //! Andrey Bychkov work.a.b@yandex.ru; //! \~russian -//! Иван Пелипенко peri4ko@yandex.ru; //! Андрей Бычков work.a.b@yandex.ru; //! diff --git a/libs/main/http_client/pihttpclientmodule.h b/libs/main/http_client/pihttpclientmodule.h index cc348017..9b21a1fb 100644 --- a/libs/main/http_client/pihttpclientmodule.h +++ b/libs/main/http_client/pihttpclientmodule.h @@ -33,10 +33,15 @@ //! \~english HTTP client //! \~russian HTTP клиент //! +//! \~\details +//! \~english \section cmake_module_HTTPClient Building with CMake +//! \~russian \section cmake_module_HTTPClient Сборка с использованием CMake +//! //! \~\code //! find_package(PIP REQUIRED) //! target_link_libraries([target] PIP::HTTPClient) //! \endcode +//! //! \~\details //! \~english //! These files provide HTTP client functionality using libcurl for performing asynchronous HTTP requests with callbacks. diff --git a/libs/main/http_server/pihttpservermodule.h b/libs/main/http_server/pihttpservermodule.h index 6cd12aad..0f5da833 100644 --- a/libs/main/http_server/pihttpservermodule.h +++ b/libs/main/http_server/pihttpservermodule.h @@ -29,10 +29,15 @@ //! \~english HTTP server //! \~russian HTTP сервер //! +//! \~\details +//! \~english \section cmake_module_HTTPServer Building with CMake +//! \~russian \section cmake_module_HTTPServer Сборка с использованием CMake +//! //! \~\code //! find_package(PIP REQUIRED) //! target_link_libraries([target] PIP::HTTPServer) //! \endcode +//! //! \~\details //! \~english This file provides includes for the HTTP server module //! \~russian Этот файл предоставляет включения для модуля HTTP сервера diff --git a/libs/main/state_machine/pistatemachinemodule.h b/libs/main/state_machine/pistatemachinemodule.h index f467ba8b..66eb5a00 100644 --- a/libs/main/state_machine/pistatemachinemodule.h +++ b/libs/main/state_machine/pistatemachinemodule.h @@ -1,17 +1,12 @@ -/*! \file pistatemachinemodule.h - * \ingroup StateMachine - * \~\brief - * \~english Declares module entry includes for the state machine API - * \~russian Объявляет основной include модуля API машины состояний - * - * \~\details - * \~english Includes the public state machine, state, and transition headers. - * \~russian Подключает публичные заголовки машины состояний, состояний и переходов. - */ +//! \file pistatemachinemodule.h +//! \ingroup StateMachine +//! \~\brief +//! \~english Declares module entry includes for the state machine API +//! \~russian Объявляет основной include модуля API машины состояний /* PIP - Platform Independent Primitives Module includes - Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru + Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -46,656 +41,18 @@ //! \~english //! The module provides hierarchical states, event-driven transitions, timeout //! transitions and helper state classes for callback-based logic. +//! Details in \ref state_machine_overview //! \~russian //! Модуль предоставляет иерархические состояния, переходы по событиям, //! переходы по таймауту и вспомогательные классы состояний для логики на callback-функциях. +//! Подробнее \ref state_machine_overview +//! //! \~\authors //! \~english //! Ivan Pelipenko peri4ko@yandex.ru; -//! Andrey Bychkov work.a.b@yandex.ru; //! \~russian //! Иван Пелипенко peri4ko@yandex.ru; -//! Андрей Бычков work.a.b@yandex.ru; //! -//! -//! \~english \section state_machine_overview General Description -//! \~russian \section state_machine_overview Общее описание -//! -//! \~english State machine is a behavioral design pattern that allows an object to change its behavior when its internal state changes. -//! Implementation in PIP is based on the **SCXML** (State Chart XML) standard. -//! \~russian Машина состояний — это поведенческий паттерн проектирования, который позволяет объекту изменять свое поведение при изменении -//! внутреннего состояния. Реализация в PIP основана на стандарте **SCXML** (State Chart XML). -//! -//! \~english \subsection scxml_concepts SCXML Concepts -//! \~russian \subsection scxml_concepts Основные концепции SCXML -//! -//! \~english - **State** — a node in the state tree, can be atomic or compound -//! \~russian - **State (Состояние)** — узел в дереве состояний, может быть атомарным или составным -//! \~english - **Transition** — a connection between states that triggers on an event -//! \~russian - **Transition (Переход)** — связь между состояниями, срабатывает при событии -//! \~english - **Event** — a trigger that causes a transition -//! \~russian - **Event (Событие)** — триггер, вызывающий переход -//! \~english - **Guard** — a condition that must be true for a transition to execute -//! \~russian - **Guard (Сторожевая функция)** — условие, которое должно быть истинным для выполнения перехода -//! \~english - **Action** — an operation executed during a transition -//! \~russian - **Action (Действие)** — операция, выполняемая при переходе -//! \~english - **Parallel** — a state where all substates are activated simultaneously -//! \~russian - **Parallel (Параллельное состояние)** — состояние, в котором все подсостояния активируются одновременно -//! -//! \~english \subsection pim_state_machine_features PIP State Machine Features -//! \~russian \subsection pim_state_machine_features Особенности реализации PIP -//! -//! \~english - **Cannot create state, event, transition on stack** — all objects are created via `new` and managed via pointers -//! \~russian - **Нельзя создавать state, event, transition в стеке** — все объекты создаются через `new` и управляются через указатели -//! \~english - **State machine is the root state** — `PIStateMachine` inherits from `PIStateBase` -//! \~russian - **Машина состояний — это корневой state** — `PIStateMachine` наследуется от `PIStateBase` -//! \~english - **All transitions and states are automatically deleted** — when the parent object is destroyed -//! \~russian - **Все переходы и состояния удаляются автоматически** — при уничтожении родительского объекта -//! -//! \~english \subsection state_types State Types -//! \~russian \subsection state_types Основные типы состояний -//! -//! \~english - **Atomic state** — a state without nested substates -//! \~russian - **Атомарное состояние** — состояние без вложенных подсостояний -//! \~english - **Compound state** — a state containing nested substates -//! \~russian - **Составное состояние** — состояние, содержащее вложенные подсостояния -//! \~english - **Final state** — a terminating state indicating the end of machine execution -//! \~russian - **Финальное состояние** — завершающее состояние, указывающее на окончание работы машины -//! \~english - **Parallel state** — a state where all substates are activated simultaneously -//! \~russian - **Параллельное состояние** — состояние, в котором все подсостояния активируются одновременно -//! -//! \~english \subsection transition_types Transition Types -//! \~russian \subsection transition_types Виды переходов -//! -//! \~english - **Normal transition** — triggers on receiving a specific event -//! \~russian - **Обычный переход** — срабатывает при получении определенного события -//! \~english - **Timeout transition** — triggers automatically after a specified time interval -//! \~russian - **Переход по таймауту** — срабатывает автоматически через заданный промежуток времени -//! \~english - **Guarded transition** — triggers only when a specific condition is met -//! \~russian - **Переход с guard** — срабатывает только при выполнении определенного условия -//! -//! \~english \section state_machine_api State Machine API -//! \~russian \section state_machine_api PIP State Machine API -//! -//! \~english \subsection main_classes Main Classes -//! \~russian \subsection main_classes Основные классы -//! -//! \~english ### PIStateMachine -//! -//! \~english Main state machine class. -//! \~russian Основной класс машины состояний. -//! -//! \~english **Key methods:** -//! \~russian **Ключевые методы:** -//! -//! \~english - `bool start()` — starts state machine execution -//! \~russian - `bool start()` — запускает выполнение машины состояний -//! \~english - `bool isRunning()` — checks if state machine is running -//! \~russian - `bool isRunning()` — проверяет, запущена ли машина -//! \~english - `void setOnFinish(std::function f)` — sets finish callback -//! \~russian - `void setOnFinish(std::function f)` — устанавливает коллбэк завершения -//! \~english - `bool postEvent(int event_id, Args... args)` — posts event to state machine -//! \~russian - `bool postEvent(int event_id, Args... args)` — отправляет событие в машину состояний -//! -//! \~english ### PIStateBase -//! -//! \~english Base class for all states. -//! \~russian Базовый класс для всех состояний. -//! -//! \~english **Key methods:** -//! \~russian **Ключевые методы:** -//! -//! \~english - `virtual void onEnter()` — called when state is entered -//! \~russian - `virtual void onEnter()` — вызывается при входе в состояние -//! \~english - `virtual void onExit()` — called when state is exited -//! \~russian - `virtual void onExit()` — вызывается при выходе из состояния -//! \~english - `void addState(PIStateBase *s)` — adds child state -//! \~russian - `void addState(PIStateBase *s)` — добавляет дочернее состояние -//! \~english - `PITransitionBase *addTransition(PIStateBase *target, int event_id)` — adds transition -//! \~russian - `PITransitionBase *addTransition(PIStateBase *target, int event_id)` — добавляет переход -//! \~english - `PITransitionTimeout *addTimeoutTransition(PIStateBase *target, PISystemTime timeout)` — adds timeout transition -//! \~russian - `PITransitionTimeout *addTimeoutTransition(PIStateBase *target, PISystemTime timeout)` — добавляет переход по таймауту -//! \~english - `void setParallel(bool yes)` — sets parallel mode -//! \~russian - `void setParallel(bool yes)` — устанавливает параллельный режим -//! -//! \~english ### PIStateLambda -//! -//! \~english State with lambda callbacks. -//! \~russian Состояние с lambda-коллбэками. -//! -//! \~english ```cpp -//! \~english PIStateLambda(std::function on_enter, std::function on_exit = nullptr, const PIString &n = {}) -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateLambda(std::function on_enter, std::function on_exit = nullptr, const PIString &n = {}) -//! \~russian ``` -//! -//! \~english ### PIStateFinal -//! -//! \~english Final state of state machine. -//! \~russian Финальное состояние машины состояний. -//! -//! \~english ```cpp -//! \~english PIStateFinal(std::function on_finish = nullptr, const PIString &n = {}) -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateFinal(std::function on_finish = nullptr, const PIString &n = {}) -//! \~russian ``` -//! -//! \~english ### PITransitionBase -//! -//! \~english Base class for transitions. -//! \~russian Базовый класс для переходов. -//! -//! \~english **Key methods:** -//! \~russian **Ключевые методы:** -//! -//! \~english - `PITransitionBase *addGuard(std::function f)` — adds guard function -//! \~russian - `PITransitionBase *addGuard(std::function f)` — добавляет сторожевую функцию -//! \~english - `PITransitionBase *addAction(std::function a)` — adds action -//! \~russian - `PITransitionBase *addAction(std::function a)` — добавляет действие -//! \~english - `void trigger()` — triggers transition -//! \~russian - `void trigger()` — запускает переход -//! -//! \~english ### PITransitionTimeout -//! -//! \~english Transition that triggers after a specified timeout. -//! \~russian Переход, срабатывающий через заданный промежуток времени. -//! -//! \~english \section usage_examples Usage Examples -//! \~russian \section usage_examples Примеры использования -//! -//! \~english \subsection simple_state_machine Simple State Machine -//! \~russian \subsection simple_state_machine Простая машина состояний -//! -//! \~english ```cpp -//! \~english #include "pistatemachine.h" -//! \~english #include "pisystemtime.h" -//! \~english -//! \~english // Create state machine -//! \~english PIStateMachine *machine = new PIStateMachine("Main"); -//! \~english -//! \~english // Create states -//! \~english PIStateLambda *idle = new PIStateLambda( -//! \~english []() { piCout << "Entering Idle state\n"; }, -//! \~english []() { piCout << "Exiting Idle state\n"; }, -//! \~english "Idle" -//! \~english ); -//! \~english PIStateLambda *running = new PIStateLambda( -//! \~english []() { piCout << "Entering Running state\n"; }, -//! \~english []() { piCout << "Exiting Running state\n"; }, -//! \~english "Running" -//! \~english ); -//! \~english PIStateFinal *finish = new PIStateFinal( -//! \~english []() { piCout << "Machine finished\n"; }, -//! \~english "Finish" -//! \~english ); -//! \~english -//! \~english // Add states -//! \~english machine->addState(idle); -//! \~english machine->addState(running); -//! \~english machine->addState(finish); -//! \~english -//! \~english // Set initial state -//! \~english idle->setInitialState(idle); -//! \~english running->setInitialState(running); -//! \~english machine->setInitialState(idle); -//! \~english -//! \~english // Add transitions -//! \~english idle->addTransition(running, 1); -//! \~english running->addTransition(finish, 2); -//! \~english -//! \~english // Set finish callback -//! \~english machine->setOnFinish([]() { piCout << "Machine execution completed\n"; }); -//! \~english -//! \~english // Start machine -//! \~english machine->start(); -//! \~english -//! \~english // Post events -//! \~english machine->postEvent(1); // Transition to Running -//! \~english machine->postEvent(2); // Transition to Finish -//! \~english ``` -//! \~russian ```cpp -//! \~russian #include "pistatemachine.h" -//! \~russian #include "pisystemtime.h" -//! \~russian -//! \~russian // Создаем машину состояний -//! \~russian PIStateMachine *machine = new PIStateMachine("Main"); -//! \~russian -//! \~russian // Создаем состояния -//! \~russian PIStateLambda *idle = new PIStateLambda( -//! \~russian []() { piCout << "Entering Idle state\n"; }, -//! \~russian []() { piCout << "Exiting Idle state\n"; }, -//! \~russian "Idle" -//! \~russian ); -//! \~russian PIStateLambda *running = new PIStateLambda( -//! \~russian []() { piCout << "Entering Running state\n"; }, -//! \~russian []() { piCout << "Exiting Running state\n"; }, -//! \~russian "Running" -//! \~russian ); -//! \~russian PIStateFinal *finish = new PIStateFinal( -//! \~russian []() { piCout << "Machine finished\n"; }, -//! \~russian "Finish" -//! \~russian ); -//! \~russian -//! \~russian // Добавляем состояния -//! \~russian machine->addState(idle); -//! \~russian machine->addState(running); -//! \~russian machine->addState(finish); -//! \~russian -//! \~russian // Устанавливаем начальное состояние -//! \~russian idle->setInitialState(idle); -//! \~russian running->setInitialState(running); -//! \~russian machine->setInitialState(idle); -//! \~russian -//! \~russian // Добавляем переходы -//! \~russian idle->addTransition(running, 1); -//! \~russian running->addTransition(finish, 2); -//! \~russian -//! \~russian // Устанавливаем коллбэк завершения -//! \~russian machine->setOnFinish([]() { piCout << "Machine execution completed\n"; }); -//! \~russian -//! \~russian // Запускаем машину -//! \~russian machine->start(); -//! \~russian -//! \~russian // Отправляем события -//! \~russian machine->postEvent(1); // Перейти в Running -//! \~russian machine->postEvent(2); // Перейти в Finish -//! \~russian ``` -//! -//! \~english \subsection guarded_transitions Guarded Transitions -//! \~russian \subsection guarded_transitions Машина состояний с guard-функциями -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("With Guards"); -//! \~english -//! \~english PIStateLambda *stateA = new PIStateLambda([]() { piCout << "State A\n"; }, nullptr, "A"); -//! \~english PIStateLambda *stateB = new PIStateLambda([]() { piCout << "State B\n"; }, nullptr, "B"); -//! \~english PIStateLambda *stateC = new PIStateLambda([]() { piCout << "State C\n"; }, nullptr, "C"); -//! \~english -//! \~english machine->addState(stateA); -//! \~english machine->addState(stateB); -//! \~english machine->addState(stateC); -//! \~english -//! \~english stateA->setInitialState(stateA); -//! \~english machine->setInitialState(stateA); -//! \~english -//! \~english // Transition with guard function -//! \~english auto *t1 = stateA->addTransition(stateB, 1); -//! \~english t1->addGuard([](int value) -> bool { -//! \~english return value > 10; -//! \~english }); -//! \~english -//! \~english // Transition with another guard function -//! \~english auto *t2 = stateB->addTransition(stateC, 2); -//! \~english t2->addGuard([](const PIString &msg) -> bool { -//! \~english return msg == "allowed"; -//! \~english }); -//! \~english -//! \~english machine->start(); -//! \~english -//! \~english // First call will not execute (value <= 10) -//! \~english machine->postEvent(1, 5); -//! \~english -//! \~english // Second call will execute (value > 10) -//! \~english machine->postEvent(1, 15); -//! \~english -//! \~english // First call will not execute (msg != "allowed") -//! \~english machine->postEvent(2, "test"); -//! \~english -//! \~english // Second call will execute (msg == "allowed") -//! \~english machine->postEvent(2, "allowed"); -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("With Guards"); -//! \~russian -//! \~russian PIStateLambda *stateA = new PIStateLambda([]() { piCout << "State A\n"; }, nullptr, "A"); -//! \~russian PIStateLambda *stateB = new PIStateLambda([]() { piCout << "State B\n"; }, nullptr, "B"); -//! \~russian PIStateLambda *stateC = new PIStateLambda([]() { piCout << "State C\n"; }, nullptr, "C"); -//! \~russian -//! \~russian machine->addState(stateA); -//! \~russian machine->addState(stateB); -//! \~russian machine->addState(stateC); -//! \~russian -//! \~russian stateA->setInitialState(stateA); -//! \~russian machine->setInitialState(stateA); -//! \~russian -//! \~russian // Переход с guard-функцией -//! \~russian auto *t1 = stateA->addTransition(stateB, 1); -//! \~russian t1->addGuard([](int value) -> bool { -//! \~russian return value > 10; -//! \~russian }); -//! \~russian -//! \~russian // Переход с другой guard-функцией -//! \~russian auto *t2 = stateB->addTransition(stateC, 2); -//! \~russian t2->addGuard([](const PIString &msg) -> bool { -//! \~russian return msg == "allowed"; -//! \~russian }); -//! \~russian -//! \~russian machine->start(); -//! \~russian -//! \~russian // Первый вызов не выполнится (value <= 10) -//! \~russian machine->postEvent(1, 5); -//! \~russian -//! \~russian // Второй вызов выполнится (value > 10) -//! \~russian machine->postEvent(1, 15); -//! \~russian -//! \~russian // Первый вызов не выполнится (msg != "allowed") -//! \~russian machine->postEvent(2, "test"); -//! \~russian -//! \~russian // Второй вызов выполнится (msg == "allowed") -//! \~russian machine->postEvent(2, "allowed"); -//! \~russian ``` -//! -//! \~english \subsection timeout_transitions Timeout Transitions -//! \~russian \subsection timeout_transitions Машина состояний с таймаутами -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("With Timeout"); -//! \~english -//! \~english PIStateLambda *working = new PIStateLambda( -//! \~english []() { piCout << "Working...\n"; }, -//! \~english []() { piCout << "Stop working\n"; }, -//! \~english "Working" -//! \~english ); -//! \~english PIStateLambda *timeoutState = new PIStateLambda([]() { piCout << "Timeout occurred\n"; }, nullptr, "Timeout"); -//! \~english PIStateFinal *finish = new PIStateFinal([]() { piCout << "Done\n"; }, "Finish"); -//! \~english -//! \~english machine->addState(working); -//! \~english machine->addState(timeoutState); -//! \~english machine->addState(finish); -//! \~english -//! \~english working->setInitialState(working); -//! \~english machine->setInitialState(working); -//! \~english -//! \~english // Add timeout transition (after 5 seconds) -//! \~english working->addTimeoutTransition(timeoutState, PISystemTime::fromSeconds(5)); -//! \~english -//! \~english // Add transition from timeoutState to finish -//! \~english timeoutState->addTransition(finish, 1); -//! \~english -//! \~english machine->start(); -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("With Timeout"); -//! \~russian -//! \~russian PIStateLambda *working = new PIStateLambda( -//! \~russian []() { piCout << "Working...\n"; }, -//! \~russian []() { piCout << "Stop working\n"; }, -//! \~russian "Working" -//! \~russian ); -//! \~russian PIStateLambda *timeoutState = new PIStateLambda([]() { piCout << "Timeout occurred\n"; }, nullptr, "Timeout"); -//! \~russian PIStateFinal *finish = new PIStateFinal([]() { piCout << "Done\n"; }, "Finish"); -//! \~russian -//! \~russian machine->addState(working); -//! \~russian machine->addState(timeoutState); -//! \~russian machine->addState(finish); -//! \~russian -//! \~russian working->setInitialState(working); -//! \~russian machine->setInitialState(working); -//! \~russian -//! \~russian // Добавляем переход по таймауту (через 5 секунд) -//! \~russian working->addTimeoutTransition(timeoutState, PISystemTime::fromSeconds(5)); -//! \~russian -//! \~russian // Добавляем переход из timeoutState в finish -//! \~russian timeoutState->addTransition(finish, 1); -//! \~russian -//! \~russian machine->start(); -//! \~russian ``` -//! -//! \~english \subsection compound_states Compound States -//! \~russian \subsection compound_states Составные состояния -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("Compound States"); -//! \~english -//! \~english // Root state (machine) -//! \~english PIStateLambda *root = new PIStateLambda([]() { piCout << "Root state\n"; }, nullptr, "Root"); -//! \~english -//! \~english // Compound state with substates -//! \~english PIStateLambda *parent = new PIStateLambda([]() { piCout << "Parent state\n"; }, nullptr, "Parent"); -//! \~english PIStateLambda *child1 = new PIStateLambda([]() { piCout << "Child 1\n"; }, nullptr, "Child1"); -//! \~english PIStateLambda *child2 = new PIStateLambda([]() { piCout << "Child 2\n"; }, nullptr, "Child2"); -//! \~english -//! \~english parent->setInitialState(child1); -//! \~english parent->addState(child1); -//! \~english parent->addState(child2); -//! \~english root->addState(parent); -//! \~english -//! \~english machine->addState(root); -//! \~english machine->setInitialState(root); -//! \~english -//! \~english // Add transitions -//! \~english root->addTransition(parent, 1); -//! \~english parent->addTransition(root, 2); -//! \~english -//! \~english machine->start(); -//! \~english -//! \~english // Transition to parent -//! \~english machine->postEvent(1); -//! \~english -//! \~english // Transition back -//! \~english machine->postEvent(2); -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("Compound States"); -//! \~russian -//! \~russian // Корневое состояние (машина) -//! \~russian PIStateLambda *root = new PIStateLambda([]() { piCout << "Root state\n"; }, nullptr, "Root"); -//! \~russian -//! \~russian // Составное состояние с подсостояниями -//! \~russian PIStateLambda *parent = new PIStateLambda([]() { piCout << "Parent state\n"; }, nullptr, "Parent"); -//! \~russian PIStateLambda *child1 = new PIStateLambda([]() { piCout << "Child 1\n"; }, nullptr, "Child1"); -//! \~russian PIStateLambda *child2 = new PIStateLambda([]() { piCout << "Child 2\n"; }, nullptr, "Child2"); -//! \~russian -//! \~russian parent->setInitialState(child1); -//! \~russian parent->addState(child1); -//! \~russian parent->addState(child2); -//! \~russian root->addState(parent); -//! \~russian -//! \~russian machine->addState(root); -//! \~russian machine->setInitialState(root); -//! \~russian -//! \~russian // Добавляем переходы -//! \~russian root->addTransition(parent, 1); -//! \~russian parent->addTransition(root, 2); -//! \~russian -//! \~russian machine->start(); -//! \~russian -//! \~russian // Переход в parent -//! \~russian machine->postEvent(1); -//! \~russian -//! \~russian // Переход обратно -//! \~russian machine->postEvent(2); -//! \~russian ``` -//! -//! \~english \subsection parallel_states Parallel States -//! \~russian \subsection parallel_states Параллельные состояния -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("Parallel States"); -//! \~english -//! \~english PIStateLambda *root = new PIStateLambda([]() { piCout << "Root\n"; }, nullptr, "Root"); -//! \~english PIStateLambda *parallel = new PIStateLambda([]() { piCout << "Parallel\n"; }, nullptr, "Parallel"); -//! \~english PIStateLambda *sub1 = new PIStateLambda([]() { piCout << "Substate 1\n"; }, nullptr, "Sub1"); -//! \~english PIStateLambda *sub2 = new PIStateLambda([]() { piCout << "Substate 2\n"; }, nullptr, "Sub2"); -//! \~english -//! \~english // Enable parallel mode -//! \~english parallel->setParallel(true); -//! \~english parallel->addState(sub1); -//! \~english parallel->addState(sub2); -//! \~english parallel->setInitialState(sub1); -//! \~english root->addState(parallel); -//! \~english -//! \~english machine->addState(root); -//! \~english machine->setInitialState(root); -//! \~english -//! \~english machine->start(); -//! \~english -//! \~english // When entering parallel, both substates are activated simultaneously -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("Parallel States"); -//! \~russian -//! \~russian PIStateLambda *root = new PIStateLambda([]() { piCout << "Root\n"; }, nullptr, "Root"); -//! \~russian PIStateLambda *parallel = new PIStateLambda([]() { piCout << "Parallel\n"; }, nullptr, "Parallel"); -//! \~russian PIStateLambda *sub1 = new PIStateLambda([]() { piCout << "Substate 1\n"; }, nullptr, "Sub1"); -//! \~russian PIStateLambda *sub2 = new PIStateLambda([]() { piCout << "Substate 2\n"; }, nullptr, "Sub2"); -//! \~russian -//! \~russian // Включаем параллельный режим -//! \~russian parallel->setParallel(true); -//! \~russian parallel->addState(sub1); -//! \~russian parallel->addState(sub2); -//! \~russian parallel->setInitialState(sub1); -//! \~russian root->addState(parallel); -//! \~russian -//! \~russian machine->addState(root); -//! \~russian machine->setInitialState(root); -//! \~russian -//! \~russian machine->start(); -//! \~russian -//! \~russian // При входе в parallel оба подсостояния активируются одновременно -//! \~russian ``` -//! -//! \~english \subsection transitions_with_actions Transitions with Actions -//! \~russian \subsection transitions_with_actions Машина состояний с действиями -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("With Actions"); -//! \~english -//! \~english PIStateLambda *stateA = new PIStateLambda([]() { piCout << "State A\n"; }, nullptr, "A"); -//! \~english PIStateLambda *stateB = new PIStateLambda([]() { piCout << "State B\n"; }, nullptr, "B"); -//! \~english -//! \~english machine->addState(stateA); -//! \~english machine->addState(stateB); -//! \~english -//! \~english machine->setInitialState(stateA); -//! \~english -//! \~english // Add transition with action -//! \~english auto *t = stateA->addTransition(stateB, 1); -//! \~english t->addAction([]() { piCout << "Action during transition\n"; }); -//! \~english -//! \~english machine->start(); -//! \~english machine->postEvent(1); -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("With Actions"); -//! \~russian -//! \~russian PIStateLambda *stateA = new PIStateLambda([]() { piCout << "State A\n"; }, nullptr, "A"); -//! \~russian PIStateLambda *stateB = new PIStateLambda([]() { piCout << "State B\n"; }, nullptr, "B"); -//! \~russian -//! \~russian machine->addState(stateA); -//! \~russian machine->addState(stateB); -//! \~russian -//! \~russian machine->setInitialState(stateA); -//! \~russian -//! \~russian // Добавляем переход с действием -//! \~russian auto *t = stateA->addTransition(stateB, 1); -//! \~russian t->addAction([]() { piCout << "Action during transition\n"; }); -//! \~russian -//! \~russian machine->start(); -//! \~russian machine->postEvent(1); -//! \~russian ``` -//! -//! \~english \section threading Thread Safety -//! \~russian \section threading Потокобезопасность -//! -//! \~english State machine is thread-safe. The `postEvent` method uses a queue to handle nested calls, allowing safe event posting from -//! different threads. -//! \~russian Машина состояний PIP потокобезопасна. Метод `postEvent` использует очередь для обработки вложенных вызовов, что позволяет -//! безопасно отправлять события из разных потоков. -//! -//! \~english \section usage_rules Usage Rules -//! \~russian \section usage_rules Правила использования -//! -//! \~english \subsection cannot_stack Cannot Create on Stack -//! \~russian \subsection cannot_stack Нельзя создавать в стеке -//! -//! \~english ```cpp -//! \~english // ❌ WRONG -//! \~english PIStateLambda state([]() {}, nullptr, "State"); -//! \~english -//! \~english // ✅ CORRECT -//! \~english PIStateLambda *state = new PIStateLambda([]() {}, nullptr, "State"); -//! \~english ``` -//! \~russian ```cpp -//! \~russian // ❌ НЕЛЬЗЯ -//! \~russian PIStateLambda state([]() {}, nullptr, "State"); -//! \~russian -//! \~russian // ✅ ПРАВИЛЬНО -//! \~russian PIStateLambda *state = new PIStateLambda([]() {}, nullptr, "State"); -//! \~russian ``` -//! -//! \~english \subsection proper_hierarchy Proper Object Hierarchy -//! \~russian \subsection proper_hierarchy Правильная иерархия объектов -//! -//! \~english ```cpp -//! \~english PIStateMachine *machine = new PIStateMachine("Main"); -//! \~english -//! \~english // States are created via new and added to machine or another state -//! \~english PIStateLambda *state1 = new PIStateLambda([]() {}, nullptr, "State1"); -//! \~english PIStateLambda *state2 = new PIStateLambda([]() {}, nullptr, "State2"); -//! \~english -//! \~english machine->addState(state1); -//! \~english machine->addState(state2); -//! \~english -//! \~english // Transitions are added to states via addTransition -//! \~english state1->addTransition(state2, 1); -//! \~english -//! \~english // Machine is started -//! \~english machine->start(); -//! \~english ``` -//! \~russian ```cpp -//! \~russian PIStateMachine *machine = new PIStateMachine("Main"); -//! \~russian -//! \~russian // Состояния создаются через new и добавляются в машину или другое состояние -//! \~russian PIStateLambda *state1 = new PIStateLambda([]() {}, nullptr, "State1"); -//! \~russian PIStateLambda *state2 = new PIStateLambda([]() {}, nullptr, "State2"); -//! \~russian -//! \~russian machine->addState(state1); -//! \~russian machine->addState(state2); -//! \~russian -//! \~russian // Переходы добавляются к состояниям через addTransition -//! \~russian state1->addTransition(state2, 1); -//! \~russian -//! \~russian // Машина запускается -//! \~russian machine->start(); -//! \~russian ``` -//! -//! \~english \subsection memory_cleanup Memory Cleanup -//! \~russian \subsection memory_cleanup Очистка памяти -//! -//! \~english All objects (states, transitions) are automatically deleted when the parent object is destroyed: -//! \~russian Все объекты (состояния, переходы) автоматически удаляются при уничтожении родительского объекта: -//! -//! \~english - When `PIStateMachine` is destroyed, all states and transitions are deleted -//! \~russian - При уничтожении `PIStateMachine` удаляются все состояния и переходы -//! \~english - When `PIStateBase` is destroyed, all child states and transitions are deleted -//! \~russian - При уничтожении `PIStateBase` удаляются все дочерние состояния и переходы -//! -//! \~english \section debugging Debugging -//! \~russian \section debugging Отладка -//! -//! \~english For debugging, you can use the `print()` method to output the state tree: -//! \~russian Для отладки можно использовать метод `print()` для вывода дерева состояний: -//! -//! \~english ```cpp -//! \~english machine->print(); -//! \~english ``` -//! \~russian ```cpp -//! \~russian machine->print(); -//! \~russian ``` -//! -//! \~english Also, you can use `activeAtomics()` to get a list of active states. -//! \~russian Также можно использовать `activeAtomics()` для получения списка активных состояний. -//! -//! \~english \section related_modules Related Modules -//! \~russian \section related_modules Связанные модули -//! -//! \~english - \ref DateTime module for `PISystemTime` used in timeout transitions -//! \~russian - \ref DateTime модуль для `PISystemTime`, используемого в переходах по таймауту -//! -//! \~\} #ifndef PISTATEMACHINEMODULE_H #define PISTATEMACHINEMODULE_H