Difference between revisions of "User:Satijas"

From CDOT Wiki
Jump to: navigation, search
Line 8: Line 8:
 
== Force Feedback ==
 
== Force Feedback ==
  
Add this to Configuration.h:
+
Add this to WindowSettings.h:
 
<big>
 
<big>
 +
 
  #define IDC_NOFF //number
 
  #define IDC_NOFF //number
 +
</big>
 +
 +
Add this in typedef enum Integer:
 +
<big>
 +
GF_CT_RMBL
 
</big>
 
</big>
  
Line 32: Line 38:
  
 
In Input.cpp, add the following to the Joystick constructor
 
In Input.cpp, add the following to the Joystick constructor
 
 
<big>
 
<big>
 
   ffEffects = NULL;
 
   ffEffects = NULL;
Line 67: Line 72:
 
  if(feedBackOFF)
 
  if(feedBackOFF)
 
     centre = NULL;
 
     centre = NULL;
 +
</big>
 +
 +
add these in the restore function:
 +
<big>
 +
else{
 +
if(ffEffects){
 +
    ffEffects->Download();
 +
}
 +
if(centre){
 +
    centre->Download();
 +
    centre->Start(1,0);
 +
}
 +
</big>
 +
 +
 +
add this function in:
 +
<big>
 +
void Joystick::updateForce(float factor, double time, int direction){
 +
    if(joystick)
 +
    {
 +
        if (feedBackOFF == 0)
 +
        {
 +
            if(context->get(GF_CT_RMBL) == 1)
 +
            {
 +
            if(ffEffects){
 +
                ffEffects->Download();
 +
            }
 +
         
 +
            DIEFFECT dif;
 +
            DWORD axes[2] = {DIJOFS_X, DIJOFS_Y};
 +
            LONG dir[2]  = {1, 0};
 +
            ZeroMemory(&dif, sizeof dif);
 +
         
 +
            // set the size of the struct
 +
            dif.dwSize  = sizeof dif;
 +
            // set axes and directions
 +
            dif.rgdwAxes = axes;
 +
            dif.rglDirection = dir;
 +
         
 +
            DIPERIODIC dip;
 +
            DIENVELOPE die;
 +
 +
            // if both x & y have FF, make shake come at 45 degree angle
 +
            // otherwise just shake the x axis.
 +
            //
 +
            if (axisIsActive[0] && axisIsActive[1]) {
 +
                dif.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
 +
                dif.cAxes = 2;
 +
                dir[0] = direction * DI_DEGREES;
 +
            }
 +
            else { // assume only x axis has FF
 +
                dif.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
 +
                dif.cAxes = 1;
 +
            }
 +
            dif.dwGain = DI_FFNOMINALMAX;
 +
            dif.dwDuration = time * DI_SECONDS / 2; // Timing in seconds of the force feedback, time is passed in here;
 +
            dif.dwSamplePeriod = direction;
 +
            dif.dwTriggerButton = DIEB_NOTRIGGER;
 +
            dif.dwTriggerRepeatInterval = 0;
 +
            dif.lpEnvelope = &die;
 +
            dif.cbTypeSpecificParams = sizeof dip;
 +
            dif.lpvTypeSpecificParams = &dip;
 +
            dif.dwStartDelay = 3 * DI_SECONDS; // 3 secs
 +
 +
            dip.dwMagnitude = 3 * DI_FFNOMINALMAX / 10;
 +
            dip.lOffset  = 0;
 +
            dip.dwPhase  = 0;
 +
            dip.dwPeriod = DI_SECONDS / 10; // 1/10th second
 +
 +
            die.dwSize = sizeof die;
 +
            die.dwAttackLevel = factor;
 +
            die.dwAttackTime  = factor * DI_SECONDS / 2;
 +
            die.dwFadeLevel  = factor;
 +
            die.dwFadeTime    = DI_SECONDS / 2;
 +
            HRESULT hr = joystick->CreateEffect(GUID_Square, &dif, &ffEffects, NULL);
 +
 +
            // create a ramp force
 +
            DIRAMPFORCE dirf;
 +
            // if both x & y have FF, use the direction to change the angle of the shake
 +
            // otherwise just shake the x axis.
 +
            //
 +
            if (axisIsActive[0] && axisIsActive[1]) {
 +
                dif.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
 +
                dif.cAxes = 2;
 +
                dir[0] = direction * DI_DEGREES;
 +
            }
 +
            else { // assume only x axis has FF
 +
                dif.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
 +
                dif.cAxes = 1;
 +
            }
 +
            dif.dwGain = DI_FFNOMINALMAX;
 +
            dif.dwDuration = time * DI_SECONDS / 2; // Timing in seconds for the force feedback, time is passed in here;
 +
            dif.dwSamplePeriod = direction;
 +
            dif.dwTriggerButton = DIEB_NOTRIGGER;
 +
            dif.dwTriggerRepeatInterval = 0;
 +
            dif.lpEnvelope = &die;
 +
            dif.cbTypeSpecificParams = sizeof dirf;
 +
            dif.lpvTypeSpecificParams = &dirf;
 +
            dif.dwStartDelay = 0.01 * DI_SECONDS;
 +
 +
            dirf.lStart = DI_FFNOMINALMAX / 2;
 +
            dirf.lEnd  = - DI_FFNOMINALMAX / 2;
 +
 +
            die.dwSize = sizeof die;
 +
            die.dwAttackLevel = DI_FFNOMINALMAX / 50;
 +
            die.dwAttackTime  = time * DI_SECONDS / 2;
 +
            die.dwFadeLevel  = DI_FFNOMINALMAX / 10;
 +
            die.dwFadeTime    = time * DI_SECONDS / 2;
 +
 +
            if (SUCCEEDED(joystick->CreateEffect(GUID_RampForce, &dif,
 +
            &ffEffects, NULL))){
 +
              ffEffects->Download();// download to driver
 +
                ffEffects->Start(INFINITE,0); // infinite so it can be played as many times
 +
                }
 +
            }
 +
            else if(context->get(GF_CT_RMBL) == 0)
 +
            {
 +
                if(ffEffects){
 +
                DWORD DIGFFS_STOPPED1 = 2;
 +
                if(!joystick->GetForceFeedbackState(&DIGFFS_STOPPED1))
 +
                    ffEffects->Stop();
 +
                }
 +
            }
 +
        }
 +
    }
 +
}
 +
</big>
 +
 +
Add this to release:
 +
<big>
 +
if(centre){
 +
    centre->Release();
 +
    centre = NULL;
 +
}
 +
if(ffEffects){
 +
    ffEffects->Release();
 +
    ffEffects = NULL;
 +
}
 +
</big>
 +
 +
In UserDialog.cpp:
 +
In the saveUserChoices function, add another bool:
 +
<big>
 +
bool y, z, <b>ff</b>, none;
 +
</big>
 +
 +
<big>
 +
</big>
 +
 +
<big>
 +
</big>
 +
 +
<big>
 
</big>
 
</big>
  
 
[[Category:force feedback]]
 
[[Category:force feedback]]

Revision as of 13:27, 7 April 2011

About Me

Hi, my name is Sasha. I'm in GAM670

Force Feedback

Add this to WindowSettings.h:

#define IDC_NOFF //number

Add this in typedef enum Integer:

GF_CT_RMBL

In iInput.h, add line 1 in the iJoystick class In Input.h, add line 2 in the Joystick class In Input.h, add line 3 in the Joystick class

1.
public:
   virtual void updateForce(float, double, int) = 0;
2.
  int feedBackOFF;
  LPDIRECTINPUTEFFECT centre;
  LPDIRECTINPUTEFFECT ffEffects;
3.
  public:
     void updateForce(float factor, double time, int direction);

In Input.cpp, add the following to the Joystick constructor

 ffEffects = NULL;
 centre = NULL;
 feedBackOFF = 0;

add this in Joystick::interrogate function:

 DIDEVCAPS didcaps;
     didcaps.dwSize = sizeof didcaps;
     if(SUCCEEDED(didInter->GetCapabilities(&didcaps)) &&
       (didcaps.dwFlags && DIDC_FOREFEEDBACK){
        EnableWindow(GetDlgItem((HWND)hwnd, IDC_NOFF), TRUE);   
        }
     else{
        EnableWindow(GetDlgItem((HWND)hwnd, IDC_NOFF), FALSE);
     }

add this in Joystick::setup function:

 feedBackOFF = !!(flags & 8);

change the SetCooperativeLevel in setup to check for device exclusivity

   else if (FAILED(joystick->SetCooperativeLevel((HWND)hwnd,
 (feedBackOFF ? DISCL_NONEXCLUSIVE : DISCL_EXCLUSIVE) | DISCL_FOREGROUND)))

add this line after (!zAxisOn)

if(feedBackOFF)
   centre = NULL;

add these in the restore function:

else{
if(ffEffects){
    ffEffects->Download();
}
if(centre){
    centre->Download();
    centre->Start(1,0);
}


add this function in:

void Joystick::updateForce(float factor, double time, int direction){
   if(joystick)
   {
       if (feedBackOFF == 0)
       {
           if(context->get(GF_CT_RMBL) == 1)
           {
           if(ffEffects){
               ffEffects->Download();
           }
          
           DIEFFECT dif;
           DWORD axes[2] = {DIJOFS_X, DIJOFS_Y};
           LONG dir[2]   = {1, 0};
           ZeroMemory(&dif, sizeof dif);
          
           // set the size of the struct
           dif.dwSize  = sizeof dif;
           // set axes and directions
           dif.rgdwAxes = axes;
           dif.rglDirection = dir;
          
           DIPERIODIC dip;
           DIENVELOPE die;
           // if both x & y have FF, make shake come at 45 degree angle
           // otherwise just shake the x axis.
           //
           if (axisIsActive[0] && axisIsActive[1]) {
               dif.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
               dif.cAxes = 2;
               dir[0] = direction * DI_DEGREES;
           }
           else { // assume only x axis has FF
               dif.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
               dif.cAxes = 1;
           }
           dif.dwGain = DI_FFNOMINALMAX;
           dif.dwDuration = time * DI_SECONDS / 2; // Timing in seconds of the force feedback, time is passed in here;
           dif.dwSamplePeriod = direction;
           dif.dwTriggerButton = DIEB_NOTRIGGER;
           dif.dwTriggerRepeatInterval = 0;
           dif.lpEnvelope = &die;
           dif.cbTypeSpecificParams = sizeof dip;
           dif.lpvTypeSpecificParams = &dip;
           dif.dwStartDelay = 3 * DI_SECONDS; // 3 secs
           dip.dwMagnitude = 3 * DI_FFNOMINALMAX / 10;
           dip.lOffset  = 0;
           dip.dwPhase  = 0;
           dip.dwPeriod = DI_SECONDS / 10; // 1/10th second
           die.dwSize = sizeof die;
           die.dwAttackLevel = factor;
           die.dwAttackTime  = factor * DI_SECONDS / 2;
           die.dwFadeLevel   = factor;
           die.dwFadeTime    = DI_SECONDS / 2;
           HRESULT hr = joystick->CreateEffect(GUID_Square, &dif, &ffEffects, NULL);
           // create a ramp force
           DIRAMPFORCE dirf;
           // if both x & y have FF, use the direction to change the angle of the shake
           // otherwise just shake the x axis.
           //
           if (axisIsActive[0] && axisIsActive[1]) {
               dif.dwFlags = DIEFF_POLAR | DIEFF_OBJECTOFFSETS;
               dif.cAxes = 2;
               dir[0] = direction * DI_DEGREES;
           }
           else { // assume only x axis has FF
               dif.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
               dif.cAxes = 1;
           }
           dif.dwGain = DI_FFNOMINALMAX;
           dif.dwDuration = time * DI_SECONDS / 2; // Timing in seconds for the force feedback, time is passed in here;
           dif.dwSamplePeriod = direction;
           dif.dwTriggerButton = DIEB_NOTRIGGER;
           dif.dwTriggerRepeatInterval = 0;
           dif.lpEnvelope = &die;
           dif.cbTypeSpecificParams = sizeof dirf;
           dif.lpvTypeSpecificParams = &dirf;
           dif.dwStartDelay = 0.01 * DI_SECONDS;
           dirf.lStart = DI_FFNOMINALMAX / 2;
           dirf.lEnd   = - DI_FFNOMINALMAX / 2;
           die.dwSize = sizeof die;
           die.dwAttackLevel = DI_FFNOMINALMAX / 50;
           die.dwAttackTime  = time * DI_SECONDS / 2;
           die.dwFadeLevel   = DI_FFNOMINALMAX / 10;
           die.dwFadeTime    = time * DI_SECONDS / 2;
           if (SUCCEEDED(joystick->CreateEffect(GUID_RampForce, &dif,
            &ffEffects, NULL))){
              ffEffects->Download();// download to driver
               ffEffects->Start(INFINITE,0); // infinite so it can be played as many times
               }
           }
           else if(context->get(GF_CT_RMBL) == 0)
           {
               if(ffEffects){
               DWORD DIGFFS_STOPPED1 = 2;
               if(!joystick->GetForceFeedbackState(&DIGFFS_STOPPED1))
                   ffEffects->Stop();
               }
           }
       }
   }
}

Add this to release:

if(centre){
    centre->Release();
    centre = NULL;
}
if(ffEffects){
    ffEffects->Release();
    ffEffects = NULL;
}

In UserDialog.cpp: In the saveUserChoices function, add another bool:

bool y, z, ff, none;