$ make
-eN
-- внешний вызов лифта на этаж N
-iN
-- внутреннее нажатие с целью поехать на этаж N
Симулятор реализован ввиде стейт машины. Переходы между состояниями осуществляются на основе списка(агенды) текущих команд лифту. При нажатии внешней(на этаже) или внутренней (в самом лифте) кнопки, в агенду добавляется команда. По завершении каждого состояния, на его основе и текущей агенды выбирается следующее состояние и т.д. . По завершении состояния OpenCloseDoors из агенды удаляется команды соответствующие этажу.
Rest
--> OpenCloseDoors
--> MoveOneFloorDown
--> MoveOneFloorUp
OpenCloseDoors
--> Rest
--> MoveOneFloorDown
--> MoveOneFloorUp
MoveOneFloorDown
--> MoveOneFloorDown
--> MoveOneFloorUp
--> OpenCloseDoors
Такой подход был выбран с прицелом на возможность гибкого изменения поведения лифта. Возможны как минимум два типа лифтов отличающиеся приоритетами в поведении: лифт в жилом доме, лифт в бизнесс центре корпорации. Первую категорию лифтов отличает то что люди восновном пытаются либо выбраться наружу со своего этажа либо наоборот, но гораздо реже они используют лифт для перемещения с этажа на этаж. А потому лифт оптимизирован как правило для того чтобы подбирать попутчиков лишь на пути вниз. В бизнес центре, люди часто перемещаются с этажа на этаж ввиду например распределённости сотрудников по этажам. Правда, нужно отметить что там и кнопок на этаже как правило не одна как в жилом доме, а по две и они указывают куда человек намеревается ехать -- вниз или вверх. Так или иначе, мне показалось интерессным применить данный подход для програмирования лифта. Были и другие идеи конечно.