Какие основные требования, которым я хочу чтобы удовлетворяла архитектура:
1. Возможность писать программы, в которых можно будет средствами самой программы, или в худшем случае через INI-файл настраивать какое конкретно железо будет использоваться. При этом при настройке средствами программы она должна выдать информацию понятную для пользователя - т.е. скажем если на контроллере написано "Порт А", пины 0..7, тогда и выдаёт пользователю вопрос "куда у вас подключен передний ИК-дальномер" и список портов "А0,А1,А2,...,А7,F0,F1,...,F7".
2. Возможность подключить к старой программе новый контроллер с новой прошивкой, оказавшийся в руках, и не скачивать ничего с сайта проекта при этом (аналог - подключаем к ноуту мышку и работаем, не устанавливая драйвера);
3. Однотипные драйверы должны удовлетворять однотипным интерфейсам, допускается отличие только в количестве и адресах управляемых объектов (например - GPIO портов может быть разное количество и они могут быть по разному сгруппированы).
Теперь по реализации:
1. Уровень интроспекции ядра модуля должен отвечать на запросы:
1.1. Сколько драйверов на модуле;
1.2. Какие GPIO-порты по буквам имеются на нашем модуле (2 числа, 16 бит, A..Q);
1.3. Какие биты этих GPIO-портов доступны для использования всеми;
1.4. Какие регистры занимает драйвер №X и какой UID этого драйвера;
2. В программе пользователя должен быть уровень изоляции от конкретного оборудования, т.е. мы должны писать код типа:
- Код: Выделить всё
orBumperSensor frontLeftBumper=orCreateBumper("front-ir-left");
При том что у нас где-то в INI-файле (который может редактироваться напрямую или через графическую оболочку), будет лежать информация типа:
- Код: Выделить всё
<robot id="my_robot">
<comm>
<uart name="pri_uart" comport="COM4">
<i2c_device address="0x20" id="or1"/>
<i2c_device address="0x24" id="or2"/>
</uart>
<uart name="sec_uart" comport="COM9">
<i2c_device address="0x22" id="or3"/>
</uart>
</comm>
<devices>
<wheelbase mcu="or3" width="20cm" length="25cm" height="15cm" wheel_radius="10cm" wheel_xoffset="0cm">
<irrangefinder id="front-ir-left" mcu="or2" pin="PORTA.1" min_range="10cm" max_range="80cm" pos="10,10,5" dir="0,1,0"/>
<irrangefinder id="front-ir-right" mcu="or2" pin="PORTA.2" min_range="10cm" max_range="80cm" pos="-10,10,5" dir="0,1,0"/>
<irrangefinder id="rear-ir-center" mcu="or1" pin="PORTA.1" min_range="4cm" max_range="30cm" pos="0,-10,5" dir="0,-1,0"/>
</base>
</devices>
</robot>