Необходимо разработать модуль, реализующий управляющую логику переключения светодиодных светофоров (рис. 1) для автомобилей на перекрестке (рис. 2). При выполнении задания считать, что светофора четыре, установлены они и закреплен на столбах так, чтобы быть видными водителям транспортных средств.
Рис.1. Внешний вид светофора
Рис.2. Схема перекрестка
Светофоры на перекрестке не имеют дополнительных секций (только три лампы - красный, зеленый, желтый). Для каждой полосы движения, по которой можно подъехать к перекрестку, установлен свой светофор, который направлен только в одну сторону - к своей полосе. Смена сигналов каждого светофора осуществляется по следующей схеме:
По направлению главной дороги поток машин - больше. Поэтому зеленый сигнал для него должен гореть в два раза дольше, чем по направлению второстепенной дороги.
При разработке считать, что за установку определенного света на каждом светофоре отвечает контроллер светофора, управляемый специальным модулем-исполнителем. Управляющая логика, которую следует разработать, должна взаимодействовать с четырьмя исполнительными модулями (различаются адресами, можно задать статически). Исполнительные модули умеют взаимодействовать с контроллером светофора и контролирующей логикой. Модуль-исполнитель умеет устанавливать на светофоре нужный сигнал — зеленый, красный, желтый. Он не умеет организовывать ожиданий. Т.е., нельзя сказать ему: «показывай зеленый сигнал 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 ModuleFailedOnEvent : 2 | Модуль не смог обработать сообщение 1 : 3 EventKind : int | - Тип, события, при реакции на которое произошла ошибка ExceptionKind : string | - Тип ошибки (исключения) ExceptionMessage : string | - Сообщение об ошибке Start : 3 | Команда инициализации 1 : 0 Stop : 4 | Команда остановки 1 : 0 ; Поколение 1, число аргументов 0 StateChanged : 5 | Событие, присылаемое в момент изменения состояния конечного автомата 1 : 4 MachineName : string | - Имя конечного автомата, перешедшего в новое состояние OldState : string | - Старое состояние машины NewState : string | - Новое состояние машины Event : int | - Событие, активировавшее переход
При выполнении задания следует считать, что адреса указанных выше модулей постоянны и известны заранее:
Модуль | Адрес |
Контролирующая логика | "ControlLogic" |
Модуль-исполнитель | "LedDriver" |
Для успешного прохождения тестирования кандидат должен предоставить комплект материалов:
Комплект предоставляется в форме zip-архива с именем в формате <ФамилияИО>.zip (например: SukhoiDA.zip).
Задание можно выполнять как с применением Microsoft Visual C++ (под управлением ОС Windows), так и с применением компилятора gcc (под управлением ОС Linux CentOS 7 или ОС Ubuntu Linux).
Если у кандидата появились какие-то вопросы, на которые не обнаружился ответ в материалах их можно задать через электронную почту n.prosalkova@uniteller.ru.