О главе

«Си для встраиваемых систем»

Это онлайн версия книги «Си для встраиваемых систем». В печатном формате её можно приобрести у нас в магазине, а в виде файла epub/mobi/pdf на площадке LeanPub.

Когда функциональность расширяется, и в разное время при разных условиях устройство выполняет разные задачи, т.е. находится в разных состояниях (англ. state), то целесообразнее использовать автомат. Не будем углубляться в теорию, а рассмотрим такой подход на примере.

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

Опишем желаемую логику работы. По умолчанию часы должны показывать время, т. е. при запуске устройства на дисплее отображаются часы и минуты — назовем это состояние STATE_SHOW_TIME. При прокрутке энкодера по часовой стрелке яркость дисплея увеличивается, а против часовой, наоборот, уменьшается. Изменение яркости работает отдельно от логики всей остальной программы во всех возможных состояниях. При нажатии на кнопку на дисплее начинает отображаться температура (состояние STATE_SHOW_TEMPERATURE). Если ничего не происходит, то по истечении 30 секунд устройство вновь переключается в состояние STATE_SHOW_TIME и отображает время. В противном случае, если кнопка была нажата снова, устройство может перейти в два возможных состояния: либо вернуться к отображению времени (STATE_SHOW_TEMPERATURE), либо перейти к настройке. Условие перехода в следующий режим — это яркость экранаwhy. Пусть при минимальной яркости часы переходят в режим настройки часов (STATE_ADJUST_HOURS). Прокручивая ручку энкодера, пользователь будет либо увеличивать, либо уменьшать значение часов. Когда настройка часов завершена, по нажатию на кнопку устройство переходит в режим настройки минут (STATE_ADJUST_MINUTES). После повторного нажатия кнопки устройство начинает показывать время.

Не самое элегантное решение, но что делать 🙂

Всё поведение устройства можно описать графом состояний.

Выразить такую диаграмму в виде кода можно разными способами, рассмотрим их.


Изменено: