FSM для счетчика людей в номере на C/Arduino и схема

Прежде всего, извините меня, если это не тот сайт, где можно разместить этот вопрос, но я не знал, где его задать.

Мне нужно реализовать FSM для представления счетчика людей в комнате, есть две возможности: люди могут войти в комнату или выйти из комнаты. В начале гарантирована пустая комната, и только один человек может пройти через дверь одновременно.

Чтобы знать, входит человек или выходит, есть 2 датчика A и B, которые в зависимости от порядка активации показывают, входит человек или выходит. A, затем B означает, что человек входит в комнату, B, затем A указывает, что человек выходит из комнаты.

Теперь мне нужно реализовать это на arduino и сделать диаграмму FSM, но у меня проблемы с диаграммой, хотя я думаю, что уже правильно понял программу C (не проверял ее)

Итак, вот часть моей программы на C/Arduino

int currentPeople = 0;
PeopleState currentState = None;
enum PeopleState {
 A,
 B,
 None
};

Теперь это две функции, которые вызываются для соответствующих датчиков.

 //Gets called every time sensor A is activated
 void countPeopleA(){
    if (currentState == None){
       currentState = A;
    } else if (currentState == B){
       if(currentPeople > 0){
           currentPeople--;
       }
       currentState = None;
    }
 }
 //Gets called every time sensor B is activated
 void countPeopleB(){
     if (currentState == None){
         currentState = B;
     } else if (currentState == A){
         currentPeople++;
         currentState = None;
     }
 }

Мои опасения таковы:

  • Являются ли состояния, которые я определил, правильными для проблемы? Я имею в виду, правильно ли определять состояние всякий раз, когда датчик активируется, или состояния должны быть «Вход» и «Выход»?
  • Как я могу изобразить состояния? Я только изучаю FSM, поэтому у меня проблемы с пониманием, например, как вы можете гарантировать, что если комната пуста, человек не уйдет? Я могу проверить это условие в коде, но я не знаю, как его представить.

person HardCodeStuds    schedule 10.10.2016    source источник
comment
Что такое FSM?   -  person Weather Vane    schedule 10.10.2016
comment
Я не думаю, что реализация летающего спагетти-монстра на C была бы разумной.   -  person Bernardo Meurer    schedule 10.10.2016


Ответы (1)


Являются ли состояния, которые я определил, правильными для проблемы? Я имею в виду, правильно ли определять состояние всякий раз, когда датчик активируется, или состояния должны быть «Вход» и «Выход»?

Я думаю, что ваши состояния в порядке. Не путайте их имена с тем, что они представляют. Вам нужно одно состояние, представляющее случай, когда датчики в совокупности были активированы четное число раз (это также начальное состояние), одно для нечетного числа предыдущих активаций, последним из которых было A, и одно для нечетного количество предыдущих активаций, последняя из которых была B.

Как я могу изобразить состояния?

У вас есть три состояния. Напишите для них имена или метки, обведите их кругами и нарисуйте отмеченные стрелки для переходов, происходящих при различных активациях сенсоров. (См. также ниже.)

Я только изучаю FSM, поэтому у меня проблемы с пониманием, например, как вы можете гарантировать, что если комната пуста, человек не уйдет? Я могу проверить это условие в коде, но я не знаю, как его представить.

Вы не можете представить это условие с помощью конечного конечного автомата, если только вы не установите предел заполнения комнаты. (Комментарии выше предполагают, что вы этого не делаете, и, следовательно, количество людей в комнате не является частью состояния FSM.) Если вы хотите пойти по этому пути, вам нужен другой подход, с отдельными состояниями для каждого количества людей. . Поскольку это вводное упражнение, я склонен думать, что это не то, чем вы занимаетесь.

Также обратите внимание, что независимо от того, моделируете ли вы предел занятости или нет, существуют некоторые переходы, поведение которых не запрещено и не назначено явно. В частности, что произойдет, если, начиная с исходного состояния, один из двух датчиков сработает два раза подряд? Представьте, например, что они достаточно далеко друг от друга, чтобы вместить человека, который активирует один из них, а затем повернется в дверном проеме и снова активирует его. Если они разрешены (а может даже и нет), то они должны быть представлены на вашей диаграмме. Независимо от того, разрешено это или нет, ваш код должен учитывать их.

person John Bollinger    schedule 10.10.2016
comment
Да, я думаю, что теперь я понял, но я забыл указать, что два датчика не могут срабатывать одновременно, один должен идти за другим. Кроме того, если человек продолжает запускать только один и никогда не активирует другой, например, A продолжает активироваться, то, согласно моему коду, состояние будет A, пока кто-то не активирует B, а затем он засчитает кого-то и изменит состояние на none . - person HardCodeStuds; 10.10.2016