Хобрук: Ваш путь к мастерству в программировании

Реализация конечного автомата для BLE в Котлине

Я создаю конечный автомат в Котлине для управления состоянием BLE. Я знаю, что в Tinder есть библиотека DSL для FSM, но я хочу написать что-нибудь самостоятельно.

Вот что у меня есть до сих пор.

Состояние и действия FSM представлены с помощью запечатанных классов. Например, устройство BLE может находиться в состоянии Подключено или Отключено, каждое из которых, в свою очередь, может иметь подсостояния (состояние Подключено может означает, что он находится в одном из ReadingCharacteristic, WritingCharacteristic, SubscribeingToCharacteristic или просто Idle)

sealed class BleState {
    sealed class Connected : BleState() {
        object Idle : Connected()
        object ReadingCharacteristic : Connected()
        object WritingCharacteristic : Connected()
        object SubscribingToCharacteristic : Connected()
    }
    object Error: BleState()
}

Действия также представлены с помощью запечатанных классов.

sealed class BleOperation {
    data class Connect(val bleDevice: BleDevice) : BleOperation()
    object ConnectionCompleted : BleOperation()
    .
    .
    data class Disconnect(val bleDevice: BleDevice) : BleOperation()
    object ErrorOccurred : BleOperation()
}

Мне нужен способ представления переходов. Должно ли это быть что-то вроде таблицы/двухмерного массива? Должна ли это быть карта ‹State, List(Events)›, где каждое состояние будет перечислять все возможные события, которые оно может принять? Или я могу моделировать Transition как класс с такими свойствами, как currentState, action и newState? Мне нужно убедиться, что переходы действительны.


  • Мне удалось успешно обрабатывать события BLE с помощью XState в браузере (думая о расширении моего SDK до Node.js). Ответ @nsk кажется мне очень привлекательным, потому что я пытаюсь перенести одни и те же концепции и выровнять команды (мобильные устройства, веб-приложения, граничные вычисления) на одной модели (на основе актеров / иерархических конечных автоматов) ... Как ваши успехи в этом ? 13.05.2021

Ответы:


1

Я не думаю, что библиотека Tinder полностью удовлетворит ваши потребности. BLE API довольно сложный, поэтому я предполагаю, что вам может понадобиться поддержка вложенных и параллельных состояний.

Я думаю, что подход ООП заключается в том, что состояние должно иметь список/набор своих переходов. И параметры перехода:

  • событие, запускающее этот переход;
  • обязательное исходное состояние;
  • необязательное целевое состояние или функция, которая может его вычислить.

Вы можете взглянуть на исходный код моей библиотеки: https://github.com/nsk90/kstatemachine

20.12.2020
  • Привет @nsk, спасибо за ваш вклад в сообщество открытого исходного кода ... вы случайно не справлялись с пользовательским интерфейсом Jetpack Compose / навигацией через конечный автомат? любые образцы? 13.05.2021
  • Привет @AlanHortz! Я не знаком с Jetpack Compose. Что касается навигации, я использовал конечный автомат для случаев, когда пользователю должны быть показаны последовательные диалоги (например, запросы на разрешение) (это очень помогает). В общем случае, я думаю, вам может понадобиться какая-то история предыдущих состояний, чтобы выполнить обратную навигацию. На данный момент у меня нет такого функционала. 14.05.2021
  • Привет @nsk, извините за задержку моего ответа. Я думаю, что разгадал гайку относительно того, как отделить состояние от пользовательского интерфейса. Я посмотрю на вашу реализацию. Тх. 26.05.2021
  • Пользовательский интерфейс должен прослушивать изменения состояния и выполнять обновления для предварительного просмотра текущего состояния для пользователя. 31.05.2021
  • @AlanHortz взгляните на этот образец. Он неполный, но он должен вам помочь. github.com/nsk90/android-kstatemachine-sample 31.05.2021
  • Спасибо, я попробую! 23.06.2021
  • Новые материалы

    5 проектов на Python, которые нужно создать прямо сейчас!
    Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

    Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
    DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

    «Очень простой» эволюционный подход к обучению с подкреплением
    В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

    Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
    Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

    Фишинг — Упаковано и зашифровано
    Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..