#1 22-06-2008 19:27

Fess
Registered: 29-04-2008
Posts: 62

Force feedback (DirectInput)

Решил поэкспериментировать с джойстиком, установил Microsoft DirectX SDK нашел пример, как раз с демонстрацией вибрации. Начал переделывать под Delphi, но застрял вот здесь:

    // This application needs only one effect: Applying raw forces.
    DWORD           rgdwAxes[2]     = { DIJOFS_X, DIJOFS_Y };
    LONG            rglDirection[2] = { 0, 0 };
    DICONSTANTFORCE cf              = { 0 };

    DIEFFECT eff;
    ZeroMemory( &eff, sizeof(eff) );
    eff.dwSize                  = sizeof(DIEFFECT);
    eff.dwFlags                 = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
    eff.dwDuration              = INFINITE;
    eff.dwSamplePeriod          = 0;
    eff.dwGain                  = DI_FFNOMINALMAX;
    eff.dwTriggerButton         = DIEB_NOTRIGGER;
    eff.dwTriggerRepeatInterval = 0;
    eff.cAxes                   = g_dwNumForceFeedbackAxis;
    eff.rgdwAxes                = rgdwAxes;
    eff.rglDirection            = rglDirection;
    eff.lpEnvelope              = 0;
    eff.cbTypeSpecificParams    = sizeof(DICONSTANTFORCE);
    eff.lpvTypeSpecificParams   = &cf;
    eff.dwStartDelay            = 0;

    // Create the prepared effect
    if( FAILED( hr = g_pDevice->CreateEffect( GUID_ConstantForce, 
                                              &eff, &g_pEffect, NULL ) ) )
    {
        return hr; // !!!!!!!!!!!!!
    }

вроде простой кусок но функция g_pDevice->CreateEffect всегда возвращает ошибку. Скомпилировал бы сам на си, но в наличие сейчас только Visual C++ 2005 Express Edition. Может прокинете какие-нибудь примеры на Delphi если есть.

Offline

#2 23-06-2008 00:00

Seemann
Registered: 07-08-2006
Posts: 2,156

Re: Force feedback (DirectInput)

Эх, я бы возможно помог - когда я разрабатывал HUME 2, пришлось повозиться с Direct X, но это был DirectShow, а не DirectInput. И исходники те мною, похоже, утеряны.

На всякий случай кину линк на msdn:
http://msdn.microsoft.com/en-us/library … S.85).aspx

EDIT:

Покопался в старых файлах, нашел кое-что. Есть библиотека DelphiX, реализующая основные функции DirectX на языке Delphi. Найти можно, конечно, на torry.net. Там есть и примеры с FF, множество функций и классов для работы с джойстиком.

Last edited by Seemann (23-06-2008 00:10)

Offline

#3 26-06-2008 21:32

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Force feedback (DirectInput)

о_0 а можно вывести через USB порт вибрацию на самодельный руль? или хотябы через COM

Какбе надо шоб на определённые контакты подавалось напряжение и всё это можно бы было контроллировать...


GIMS developer

Offline

#4 26-06-2008 21:43

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Force feedback (DirectInput)

Смотря кому. Мне - легко. (На USB - совсем легко, на COM - нужно чутка повозиться).
Тебе, судя по вопросу - нет. (Сколько на USB контактов? Назначение их знаешь?)

Offline

#5 26-07-2008 22:04

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Force feedback (DirectInput)

listener wrote:

Смотря кому. Мне - легко. (На USB - совсем легко, на COM - нужно чутка повозиться).
Тебе, судя по вопросу - нет. (Сколько на USB контактов? Назначение их знаешь?)

Я неверно поставил вопрос, попытаюсь упростить:

Я хочу реализовать в САне отдачу на руль

Просто надо при значении 1 по какому-либо адресу памяти выводилось на любые 2 контакта USB разъёма вольт 12 или 5 хотябы

Интересен исходник для вывода напряжения)))




Возможно ли это в Visual или Quick Basic?

Last edited by 3Doomer (26-07-2008 22:05)


GIMS developer

Offline

#6 28-07-2008 09:00

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Force feedback (DirectInput)

Вопрос-то верный. Неверна постановка в принципе.

Вопрос примерно того же класса: как мне сделать, чтобы при значении 1 по какому-нибудь адресу памяти, на один из контактов ethernet выводилось вольт 12  или 5 хотя бы.

Если посмотреть на техническую стророну, у USB - 4 контакта. Два из них - питание. Два - дифференциальная пара для двунаправленного обмена. Обмен идет пакетами. Для каждого подключенного устройства, должен обрабатываться как минимум один пакет в одну миллисекунду. Если устройство не подает признаков жизни в течение трех миллисекунд, значит его отключили или оно повисло. Если на устройство не поступило ни одного пакета за десять миллисекунд, значит компьютер выключили, и нужно выключиться тоже.

И откуда, при всем этом безобразии, взять "свободный контакт" ?

Хорошее краткое описание, как это работает (USB in a nutshell) - есть на beyondlogic.org.

Т.е., если хочется добавить force feedback в какое-то устройство - есть два пути:
1) если есть возможность менять прошивку контроллера этого устройства, нужно в HID-дескриптор добавить поле для feedback, и сделать обработку соответствущего report-а (при наличии исходника прошивки и свободного выхода контроллера - минут двадцать работы). После этого, все приложения, которые используют feedback, будут работать с этим устройством без каких либо изменений.

2) подключиться к свободному контакту LPT или COM и повесить хук на соответствующий опкод. Для LPT - использовать что-то типа DLPortIO (примеры есть в комплекте), для COM, если подключиться к DTE, достаточно будет просто открыть/закрыть устройство.

Offline

#7 28-07-2008 14:15

3Doomer
From: КаZан
Registered: 14-05-2008
Posts: 659
Website

Re: Force feedback (DirectInput)

тэк....ладно забили

мне уже ненадо, руль сгорел:crazy:


GIMS developer

Offline

Board footer

Powered by FluxBB