Необходимо разработать модуль, реализующий управляющую логику переключения светодиодных светофоров (рис. 1) для автомобилей на перекрестке (рис. 2). При выполнении задания считать, что светофора четыре, установлены они и закреплен на столбах так, чтобы быть видными водителям транспортных средств.
Рис.1. Внешний вид светофора
Рис.2. Схема перекрестка
Светофоры на перекрестке не имеют дополнительных секций (только три лампы - красный, зеленый, желтый). Для каждой полосы движения, по которой можно подъехать к перекрестку, установлен свой светофор, который направлен только в одну сторону - к своей полосе. Смена сигналов каждого светофора осуществляется по следующей схеме:
По направлению главной дороги поток машин - больше. Поэтому зеленый сигнал для него должен гореть в два раза дольше, чем по направлению второстепенной дороги.
При отображении красного и зеленого света в средней секции водителю должен показываться счетчик секунд, показывающий сколько еще будет отображаться сигнал этого света.
При разработке считать, что за установку определенного света на каждом светофоре отвечает контроллер светофора, управляемый специальным модулем-исполнителем. Управляющая логика, которую следует разработать, должна взаимодействовать с четырьмя исполнительными модулями (различаются адресами, можно задать статически). Исполнительные модули умеют взаимодействовать с контроллером светофора и контролирующей логикой. Модуль-исполнитель умеет устанавливать на светофоре нужный сигнал — зеленый, красный, желтый. Он не умеет организовывать ожиданий. Т.е., нельзя сказать ему: «показывай зеленый сигнал 40 секунд». Он не умеет сам организовывать отсчет секунд на соответствующем табло, но умеет отображать указанное ему число. Время должна контролировать управляющая логика. Контролирующая логика решает задачу включения цикла работы управляющей логики и получает от нее сообщения о проблемах.
При выполнении задания следует считать, что аппаратура светофора обеспечивает:
Модуль-исполнитель пассивен по своей природе и обеспечивает реакцию на команды, никогда не начиная обмены по своей инициативе. Управляющая логика должна в нужные моменты передавать через коммуникационную среду сообщения-команды исполнительному модулю и ожидать от него ответа об исполнении. Для установки сигнала нужного света нужно отправить исполнительному модулю сообщение SetLight. Ниже приведен протокол модуля-исполнителя:
Enumerations ; Перечислимые типы ColorType | Цвет светофора 1 : 3 Red : 1 |- Красный цвет Yellow : 2 |- Желтый цвет Green : 3 |- Зеленый цвет Messages ; Сообщения SetLight : 1 | Установить новый сигнал 1 : 2 Color : ColorType |- Требуемый цвет сигнала Seconds : int |- Число секунд 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 | - Событие, активировавшее переход
Для успешного прохождения тестирования кандидат должен предоставить комплект материалов:
Комплект предоставляется в форме zip-архива с именем в формате <ФамилияИО>.zip (например: SukhoiDA.zip).
Задание можно выполнять как с применением Microsoft Visual C++ (под управлением ОС Windows), так и с применением компилятора gcc (под управлением ОС Linux CentOS 7 или ОС Ubuntu Linux).
Если у кандидата появились какие-то вопросы, на которые не обнаружился ответ в материалах их можно задать через электронную почту n.prosalkova@uniteller.ru.