
В прошлой статье я рассказывал о модуле исключительно для EE режима. В этой главе я расскажу о достаточно сложном, сложно понятном, но дающим много возможностей модуле
Данный модуль советуется использовать для игр, где используется только один джойстик.
Поддержка multitap есть, но о ней для данного модуля я рассказывать не буду.
Существует специальная библиотека libpad2. Библиотека использует сопроцессор Emotion Engine (сокращение EE) и Input Output Processor (IOP).
Использовать ее, на данный момент, можно только для обычных цифровых контроллеров, DualShock и DualShock 2.
Библиотеки для подключения EE: «libdbc.a» и «libpad2.a». Заголовочные файлы: «libdbc.h» и «libpad2.h».
Модули для подключения IOP: «sio2man.irx» (версия 2.4 или выше), «sio2d.irx», «dbcman.irx», модули драйверов контроллеров (***.irx).
Модули IOP загружаются с помощью функции sceSifLoadModule() после загрузки EE приложения.
Модули используют виртуальные сокеты.
Следующие модули используются для подключения драйверов контроллеров:
| Имя модуля | Цифровой контроллер | DualShock | DualShock 2 |
| ds1u.irx | Поддерживает | Поддерживает | Эмуляция DualShock |
| ds2u.irx | Поддерживает | Поддерживает | Поддерживает |
| dgco.irx | Поддерживает | Эмуляция цифрового контроллера | Эмуляция цифрового контроллера |
| ds1o.irx | Не совместим | Поддерживает | Эмуляция DualShock |
| ds2o.irx | Не совместим | Не совместим | Поддерживает |
Драйвера переключаются автоматически при подключении определенных контроллеров.
Также, количество загруженных драйверов должно соответствовать количеству используемых контроллеров.
Как это сделать?
Для каждого контроллера существует свой драйвер.
Для контроллера 1 соответствуют: ds1u_s1.irx, ds2u_s1.irx, dgco_s1.irx, ds1o_s1.irx, ds2o_s1.irx.
Для контроллера 2: ds1u_d.irx, ds2u_d.irx, dgco_d.irx, ds1o_d.irx, ds2o_d.irx.
Использовать второй контроллер не желательно.
Процедуры модулей
sceSifLoadModule() – используется для загрузки sio2man.irx, sio2d.irx и dbcman.irx в этой же последовательности.
sceDbcInit() и scePad2Init() – используются для инициализации libdbc и libpad2.
scePad2CreateSocket() – используется для создание сокета для работы с контроллером. Первым параметром является номер порта (или NULL для первого контроллера) и вторым – профиль размером 64 байта через который будут передаваться данные.
scePad2ButtonProfile() – читает данные с сокета и передает в буфер. Параметрами является сокет и буфер.
scePad2Read() – читает данные кнопок. Параметры такие же.
scePad2GetState() – проверяет состояние контроллера. Параметры такие же.
scePad2DeleteSocket() – удаляет сокет. Параметром является номер сокета.
scePad2End() и sceDbcEnd() – заканчивают работу библиотек libpad2 и libdbc, соответственно.
Самый простой код программы будет выглядеть так:
<br>main(){<br> int socket_number;<br> unsigned char rdata[32];<br> unsigned char profile[10];<br> u_long128 pad_buff[SCE_PAD2_DMA_BUFFER_MAX]__attribute__((aligned(64)));<br> sceDbcInit();<br> scePad2Init();<br> socket_number = scePad2CreateSocket( NULL, pad_buff );<br> while(1) {<br> scePad2ButtonProfile( socket_number, profile );<br> scePad2Read( socket_number, rdata );<br> //ваш код<br> }<br> scePad2DeleteSocket( socket_number );<br> scePad2End();<br> sceDbcEnd();<br>}<br><br>* This source code was highlighted with Source Code Highlighter.Профили контроллеров
Профиль показывает особенности контроллеров, т.е. всю информацию о подключенном контроллере, какие кнопки присутствуют и количество.
Каждый бит профиля описывает индивидуальную особенность контроллера. Если у контроллера есть требуемая возможность, то бит будет установлен в 1 и 0 – для отсутствия поддержки.
Профиль представляет собой 4 байта информации, которые в будущем Sony хотела расширить.
| Байт | Бит | Кнопка | Количество выделенных битов |
| 0 | 0 | Select | 1 |
| 1 | L3 (нажатие на левый стик) | 1 | |
| 2 | R3 (нажатие на правый стик) | 1 | |
| 3 | Start | 1 | |
| 4 | Стрелка вверх | 1 | |
| 5 | Стрелка вправо | 1 | |
| 6 | Стрелка вниз | 1 | |
| 7 | Стрелка влево | 1 | |
| 1 | 8 | L2 | 1 |
| 9 | R2 | 1 | |
| 10 | L1 | 1 | |
| 11 | R1 | 1 | |
| 12 | Треугольник | 1 | |
| 13 | Круг | 1 | |
| 14 | Икс | 1 | |
| 15 | Квадрат | 1 | |
| 2 | 16 | Режим аналога: Правый стик переведен по X |
8 |
| 17 | Режим аналога: Правый стик переведен по Y |
8 | |
| 18 | Режим аналога: Левый стик переведен по X |
8 | |
| 19 | Режим аналога: Левый стик переведен по Y |
8 | |
| 20 | Режим аналога: Стрелка вправо |
8 | |
| 21 | Режим аналога: Стрелка влево |
8 | |
| 22 | Режим аналога: Стрелка вверх |
8 | |
| 23 | Режим аналога: Стрелка вниз |
8 | |
| 3 | 24 | Режим аналога: Треугольник |
8 |
| 25 | Режим аналога: Круг |
8 | |
| 26 | Режим аналога: Крест |
8 | |
| 27 | Режим аналога: Квадрат |
8 | |
| 28 | Режим аналога: L1 |
8 | |
| 29 | Режим аналога: R1 |
8 | |
| 30 | Режим аналога: L2 |
8 | |
| 31 | Режим аналога: R2 |
8 |
Режим аналога подразумевает чувствительность.
Для цифрового контроллера все аналоги, R3 и L3 будут равны нулю. Поэтому профиль для него будет выглядеть так:
| Байт | Бит | Кнопка | Количество выделенных битов |
| 0 | 0 | Select | 1 |
| 1 | Start | 1 | |
| 2 | Стрелка вверх | 1 | |
| 3 | Стрелка вправо | 1 | |
| 4 | Стрелка вниз | 1 | |
| 5 | Стрелка влево | 1 | |
| 6 | L2 | 1 | |
| 7 | R2 | 1 | |
| 1 | 8 | L1 | 1 |
| 9 | R1 | 1 | |
| 10 | Треугольник | 1 | |
| 11 | Круг | 1 | |
| 12 | Икс | 1 | |
| 13 | Квадрат | 1 | |
| 14 | -Пусто- | 1 | |
| 15 | -Пусто- | 1 |
Случаи
Может случиться так, что пользователь выключит цифровой контроллер и подключит аналоговый.
Драйвер переключится автоматически. А вы можете неправильно обработать данные.
В случае, если контроллер будет отключен, то функция scePad2GetState() вернет scePad2StateNoLink. Если п��сле этого будет подключен котроллер обратно, то функция scePad2GetState() вернет scePad2StateStable. Желательно для проверки отключения вызывать функцию scePad2GetState() перед каждым кадром.
Под конец.
Данный вид информации о кнопках контроллера подходит для обоих режимов.
Следить за контроллерами надо постоянно.
На этом про контроллеры осталось только библиотека вибрации, но ее я расскажу попозже, т.е. в конце.
P.S.: На сегодня, думаю, хватит.
