Pull to refresh

Программирования для PlayStation 2: Controller Library — часть 2

Reading time4 min
Views2.7K
image
В прошлой статье я рассказывал о модуле исключительно для 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.: На сегодня, думаю, хватит.
Tags:
Hubs:
+24
Comments6

Articles

Change theme settings