Необходимо разработать модуль, реализующий логику переключения светодиодного светофора для автомобилей (рис. 1). При выполнении задания считать, что светофор один, установлен на однополосной дороге и закреплен на столбе так, чтобы быть видным водителям транспортных средств.
Рис.1. Внешний вид светофора
Логика должна обеспечивать следующий цикл переключений сигналов:
Управляющая логика, которую следует разработать, должна взаимодействовать с исполнительным модулем, умеющим взаимодействовать с контроллером светофора, и контролирующей логикой. Модуль-исполнитель умеет устанавливать на светофоре нужный сигнал — зеленый, красный, желтый. Он не умеет организовывать ожиданий. Т.е., нельзя сказать ему: «показывай зеленый сигнал 40 секунд». Время должна контролировать управляющая логика. Контролирующая логика решает задачу включения цикла работы управляющей логики и получает от нее сообщения о проблемах.
При выполнении задания следует считать, что аппаратура светофора обеспечивает:
Модуль-исполнитель пассивен по своей природе и обеспечивает реакцию на команды, никогда не начиная обмены по своей инициативе. Управляющая логика должна в нужные моменты передавать через коммуникационную среду сообщения-команды исполнительному модулю и ожидать от него ответа об исполнении. Для установки сигнала нужного света нужно отправить исполнительному модулю сообщение SetLight. Ниже приведен протокол модуля-исполнителя:
Enumerations ; Перечислимые типы
ColorType | Цвет светофора
1 : 3
Red : 1 |- Красный цвет
Yellow : 2 |- Желтый цвет
Green : 3 |- Зеленый цвет
Messages ; Сообщения
SetLight : 1 | Установить новый сигнал
1 : 1
Color : ColorType |- Требуемый цвет сигнала
Success : 2 | Команда контроллеру отработана
1 : 0
Fail : 3 | Ошибка в работе контроллера (авария)
1 : 0
После отправки исполнителю команды (сообщения SetLight) следует учесть три возможных варианта дальнейшего развития событий:
Варианты 2 и 3 при выполнении задания считать аварийными. Обрабатывая эту ситуацию, следует остановить работу управляющей логики на паузу, отправив вышестоящему уровню (контролирующей логике) оповещение ProblemDetected. В состоянии паузы управляющая логика должна уметь воспринимать команды «выгрузиться» (сообщение Shutdown) и «возобновить работу» (сообщение Start). Изначально управляющая логика должна находиться в состоянии паузы.
Ниже приводится протокол управляющей логики:
Enumerations ; Перечислимые типы
Messages ; Сообщения
Start : 1 | Включить цикл работы светофора
1 : 0
Shutdown : 2 | Выгрузить управляющую логику
1 : 0
ProblemDetected : 3 | Проблема в работе светофора
1 : 0
При реализации модуля следует также использовать системные сообщения среды исполнения, определенные протоколом обмена ядра (Kernel).
Messages ; Сообщения
TimeOut : 1 | Сообщение TimeOut. Рассылается машинами состояний в случае превышения допустимого интервала нахождения в определенном состоянии.
1 : 0 ; Поколение 1, число аргументов 0
ModuleFailedOnEvent : 2 | Модуль не смог обработать сообщение
1 : 3 ; Поколение 1, число аргументов 3
EventKind : int | - Тип, события, при реакции на которое произошла ошибка
ExceptionKind : string | - Тип ошибки (исключения)
ExceptionMessage : string | - Сообщение об ошибке
Start : 3 | Команда инициализации
1 : 0 ; Поколение 1, число аргументов 0
Stop : 4 | Команда остановки
1 : 0 ; Поколение 1, число аргументов 0
StateChanged : 5 | Событие, присылаемое в момент изменения состояния конечного автомата
1 : 4 ; Поколение 1, число аргументов 4
MachineName : string | - Имя конечного автомата, перешедшего в новое состояние
OldState : string | - Старое состояние машины
NewState : string | - Новое состояние машины
Event : int | - Событие, активировавшее переход
Системные сообщения используются для возможности обработки в модуле событий его загрузки и выгрузки, а также о иных важных событиях (например тайм-аутах).
После загрузки модулю обычно направляется сообщение Kernel.Start. Получив его, модуль может выполнить какую-то инициализацию.
Сообщение Kernel.Stop используется для оповещения модуля о выгрузке. Обычно получив такое сообщение модуль переходит в конечное состояние.
Сообщение Kernel.TimeOut может быть прислано ядром, если модуль находится в состоянии, отмеченном пометкой TimeOut=Значение (в миллисекундах). Если модуль находится в таком состоянии без переходов время, большее чем указанное значение, то он получит сообщение Kernel.TimeOut.
Сообщение Kernel.StateChanged отладочное информационное сообщение. В режиме отладки модуль рассылает такое сообщение при каждом изменении состояния конечного автомата. В сообщении зафиксированы старое и новое состояние, а также код события, активировавшего переход.
При выполнении задания следует считать, что адреса указанных выше модулей постоянны и известны заранее:
| Модуль | Адрес |
| Контролирующая логика | "ControlLogic" |
| Модуль-исполнитель | "LedDriver" |
Для успешного прохождения тестирования кандидат должен предоставить комплект материалов:
Комплект предоставляется в форме zip-архива с именем в формате <ФамилияИО>.zip (например: SukhoiDA.zip).
Задание можно выполнять как с применением Microsoft Visual C++ (под управлением ОС Windows), так и с применением компилятора gcc (под управлением ОС Linux CentOS 7 или ОС Ubuntu Linux).
Если появились какие-то вопросы, на которые не обнаружился ответ в материалах их можно задать через электронную почту.