using System;
using Microsoft.DirectX.DirectInput;
namespace SBC{
public class DynamicClass
{
SteelBattalionController controller;
bool currentResetValue;
bool lastResetValue;//used in assessing when to flip lights
vJoy joystick;
bool acquired;
const int refreshRate = 50;//number of milliseconds between call to mainLoop
//this gets called once by main program
public void Initialize()
{
controller = new SteelBattalionController();
controller.Init(50);//50 is refresh rate in milliseconds
//set all buttons by default to light up only when you press them down
// Right Block
// joystick
controller.AddButtonKeyMapping(ButtonEnum.RightJoy Fire, Microsoft.DirectX.DirectInput.Key.LeftControl, true); // fire primary weapon
controller.AddButtonKeyMapping(ButtonEnum.RightJoy MainWeapon, Microsoft.DirectX.DirectInput.Key.RightControl,tru e); // fire secondary weapon or next fire group
controller.AddButtonKeyMapping(ButtonEnum.RightJoy LockOn, Microsoft.DirectX.DirectInput.Key.Z, true); // mouselook view
// buttons right
controller.AddButtonKeyLightMapping(ButtonEnum.Eje ct, false, 3, Microsoft.DirectX.DirectInput.Key.J, true); // frameshift drive
controller.AddButtonKeyLightMapping(ButtonEnum.Coc kpitHatch, false, 3, Microsoft.DirectX.DirectInput.Key.Insert, true); // Landing gear
controller.AddButtonKeyLightMapping(ButtonEnum.Ign ition, false, 3, Microsoft.DirectX.DirectInput.Key.Home, true); // cargo scoop
controller.AddButtonKeyLightMapping(ButtonEnum.Sta rt, false, 3, Microsoft.DirectX.DirectInput.Key.U, true); //deploy/stow hardpoints
// buttons middle
controller.AddButtonKeyLightMapping(ButtonEnum.Mul tiMonOpenClose, false, 3, Microsoft.DirectX.DirectInput.Key.M, true); // open galaxy map
controller.AddButtonKeyLightMapping(ButtonEnum.Mul tiMonMapZoomInOut, false, 3, Microsoft.DirectX.DirectInput.Key.D2, true); //Scanner Focus
controller.AddButtonKeyLightMapping(ButtonEnum.Mul tiMonModeSelect, false, 3, Microsoft.DirectX.DirectInput.Key.D3, true);
controller.AddButtonKeyLightMapping(ButtonEnum.Mul tiMonSubMonitor, false, 3, Microsoft.DirectX.DirectInput.Key.B, true);
controller.AddButtonKeyLightMapping(ButtonEnum.Mai nMonZoomIn, false, 3, Microsoft.DirectX.DirectInput.Key.PageDown, true); // scanner zoom in
controller.AddButtonKeyLightMapping(ButtonEnum.Mai nMonZoomOut, false, 3, Microsoft.DirectX.DirectInput.Key.PageUp, true); // scanner zoom out
// Center Block
// Function matrix
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionF1, false, 3, Microsoft.DirectX.DirectInput.Key.D1, true); //Navigation screen (left)
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionTankDetach, false, 3, Microsoft.DirectX.DirectInput.Key.W, true); //go menu up
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionFSS, false, 3, Microsoft.DirectX.DirectInput.Key.D4, true); //System screen (right)
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionF2, false, 3, Microsoft.DirectX.DirectInput.Key.A, true); //go menu left
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionOverride, false, 3, Microsoft.DirectX.DirectInput.Key.Space, true); // menu select enter
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionManipulator, false, 3, Microsoft.DirectX.DirectInput.Key.D, true); // go menu right
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionF3, false, 3, Microsoft.DirectX.DirectInput.Key.Q, true); // go previous menu tab
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionNightScope, false, 3, Microsoft.DirectX.DirectInput.Key.S, true); // go menu down
controller.AddButtonKeyLightMapping(ButtonEnum.Fun ctionLineColorChange, false, 3, Microsoft.DirectX.DirectInput.Key.E, true); //go next menu tab
// buttons bottom
controller.AddButtonKeyLightMapping(ButtonEnum.Was hing, false, 3, Microsoft.DirectX.DirectInput.Key.I, true); // previous hostile
controller.AddButtonKeyLightMapping(ButtonEnum.Ext inguisher, false, 3, Microsoft.DirectX.DirectInput.Key.T, true); // target ahead
controller.AddButtonKeyLightMapping(ButtonEnum.Cha ff, false, 3, Microsoft.DirectX.DirectInput.Key.H, true); // next hostile
controller.AddButtonKeyLightMapping(ButtonEnum.Wea ponConMain, false, 3, Microsoft.DirectX.DirectInput.Key.K, true); // previous subsystem
controller.AddButtonKeyLightMapping(ButtonEnum.Wea ponConSub, false, 3, Microsoft.DirectX.DirectInput.Key.Y, true); // Next subsystem
controller.AddButtonKeyLightMapping(ButtonEnum.Wea ponConMagazine, false, 3, Microsoft.DirectX.DirectInput.Key.N, true); // next firegroup
controller.AddButtonKeyLightMapping(ButtonEnum.Com m1, false, 3, Microsoft.DirectX.DirectInput.Key.F1, true); //escape key
controller.AddButtonKeyLightMapping(ButtonEnum.Com m2, false, 3, Microsoft.DirectX.DirectInput.Key.F2, true);
controller.AddButtonKeyLightMapping(ButtonEnum.Com m3, false, 3, Microsoft.DirectX.DirectInput.Key.F3, true);
controller.AddButtonKeyLightMapping(ButtonEnum.Com m4, false, 3, Microsoft.DirectX.DirectInput.Key.F4, true);
controller.AddButtonKeyLightMapping(ButtonEnum.Com m5, false, 3, Microsoft.DirectX.DirectInput.Key.F5, true);
// Left Block
controller.AddButtonKeyMapping(ButtonEnum.ToggleBu fferMaterial, Microsoft.DirectX.DirectInput.Key.V, true); // fire heatsink
controller.AddButtonKeyMapping(ButtonEnum.ToggleFi lterControl, Microsoft.DirectX.DirectInput.Key.Delete, true); // flight assist
controller.AddButtonKeyMapping(ButtonEnum.ToggleOx ygenSupply, Microsoft.DirectX.DirectInput.Key.D0, true); // silent running
controller.AddButtonKeyMapping(ButtonEnum.ToggleFu elFlowRate, Microsoft.DirectX.DirectInput.Key.L, true);
int litIntensity = 3;
int baseLineIntensity = 7;
for(int i=1;i<=32;i++)
{
if (controller.GetButtonState(ButtonEnum.ToggleFuelFl owRate))
controller.SetLEDState((ControllerLEDEnum)(i), baseLineIntensity, true);
else
controller.SetLEDState((ControllerLEDEnum)(i), litIntensity, true);
}
/*
int baseLineIntensity = 15;//just an average value for LED intensity
//int emergencyLightIntensity = 15;//for stuff like eject,cockpit Hatch,Ignition, and Start
int litIntensity = 10;
for(int i=1;i<=32;i++)
{
if ((bool)controller.GetButtonState(i + 1))
controller.SetLEDState((ControllerLEDEnum)(i), litIntensity, false);
else
{
if (controller.GetButtonState(ButtonEnum.ToggleFuelFl owRate))
controller.SetLEDState((ControllerLEDEnum)(i), baseLineIntensity, true);
else
controller.SetLEDState((ControllerLEDEnum)(i), 0, true);
}
}
*/
//controller.AddButtonKeyLightMapping(ButtonEnum.Coc kpitHatch, true, 10, Microsoft.DirectX.DirectInput.Key.A, true);//last true means if you hold down the button,
joystick = new vJoy();
acquired = joystick.acquireVJD(1);
joystick.resetAll();//have to reset before we use it
}
//this is necessary, as main program calls this to know how often to call mainLoop
public int getRefreshRate()
{
return refreshRate;
}
private uint getDegrees(double x,double y)
{
uint temp = (uint)(System.Math.Atan(y/x)* (180/Math.PI));
if(x < 0)
temp +=180;
if(x > 0 && y < 0)
temp += 360;
temp += 90;//origin is vertical on POV not horizontal
if(temp > 360)//by adding 90 we may have gone over 360
temp -=360;
temp*=100;
if (temp > 35999)
temp = 35999;
if (temp < 0)
temp = 0;
return temp;
}
//this gets called once every refreshRate milliseconds by main program
public void mainLoop()
{
joystick.setAxis(1,controller.AimingX,HID_USAGES.H ID_USAGE_X);
joystick.setAxis(1,controller.AimingY,HID_USAGES.H ID_USAGE_Y);
joystick.setAxis(1,(controller.RightPedal - controller.MiddlePedal),HID_USAGES.HID_USAGE_Z);//throttle
joystick.setAxis(1,controller.RotationLever,HID_US AGES.HID_USAGE_RZ);
joystick.setAxis(1,controller.SightChangeX,HID_USA GES.HID_USAGE_SL0);
joystick.setAxis(1,controller.SightChangeY,HID_USA GES.HID_USAGE_RX);
joystick.setAxis(1,controller.LeftPedal,HID_USAGES .HID_USAGE_RY);
joystick.setAxis(1,controller.GearLever,HID_USAGES .HID_USAGE_SL1);
joystick.setContPov(1,getDegrees(controller.SightC hangeX,controller.SightChangeY),1);
// comment from here to calibrate the axis in windows usb controller screen.
if (controller.GetButtonState(ButtonEnum.RightJoyMain Weapon))
{
int thumbstickDeadZone = 75;
SBC.POVdirection lastDirection = controller.POVhat;
// picks up the direction you are switching the POV or ...
if (((Math.Abs(controller.SightChangeX) > thumbstickDeadZone) || (Math.Abs(controller.SightChangeY) > thumbstickDeadZone)))
{
if (Math.Abs(controller.SightChangeX) > Math.Abs(controller.SightChangeY))
if (controller.SightChangeX < 0)
controller.POVhat = SBC.POVdirection.LEFT;
else
controller.POVhat = SBC.POVdirection.RIGHT;
else
if (controller.SightChangeY < 0)
controller.POVhat = SBC.POVdirection.DOWN;
else
controller.POVhat = SBC.POVdirection.UP;
}
else // ... centers it
{
controller.POVhat = SBC.POVdirection.CENTER;
}
// POWER DISTRIBUTION
{
switch (controller.POVhat)
{
case SBC.POVdirection.LEFT:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.Left);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Left);
break;
case SBC.POVdirection.RIGHT:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.Right);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Right);
break;
case SBC.POVdirection.DOWN:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.Up);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Up);
break;
case SBC.POVdirection.UP:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.Down);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Down);
break;
case SBC.POVdirection.CENTER:
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Up);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Right);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Left);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Down);
break;
}
}
}
else
{
int thumbstickDeadZone = 75;
SBC.POVdirection lastDirection = controller.POVhat;
if (((Math.Abs(controller.SightChangeX) > thumbstickDeadZone) || (Math.Abs(controller.SightChangeY) > thumbstickDeadZone)))
{
if (Math.Abs(controller.SightChangeX) > Math.Abs(controller.SightChangeY))
if (controller.SightChangeX < 0)
controller.POVhat = SBC.POVdirection.LEFT;
else
controller.POVhat = SBC.POVdirection.RIGHT;
else
if (controller.SightChangeY < 0)
controller.POVhat = SBC.POVdirection.DOWN;
else
controller.POVhat = SBC.POVdirection.UP;
}
else // ... centers it
{
controller.POVhat = SBC.POVdirection.CENTER;
}
{
// LATERAL/VERTICAL THRUST
switch (controller.POVhat)
{
case SBC.POVdirection.LEFT:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.Q);
int LEDNum_LFT = (int)(ButtonEnum.FunctionF2) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ LFT),15,true);
break;
case SBC.POVdirection.RIGHT:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.E);
int LEDNum_RGT = (int)(ButtonEnum.FunctionManipulator) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ RGT),15,true);
break;
case SBC.POVdirection.DOWN:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.R);
int LEDNum_DWN = (int)(ButtonEnum.FunctionTankDetach) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ DWN),15,true);
break;
case SBC.POVdirection.UP:
controller.sendKeyDown(Microsoft.DirectX.DirectInp ut.Key.F);
int LEDNum_UP = (int)(ButtonEnum.FunctionNightScope) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ UP),15,true);
break;
case SBC.POVdirection.CENTER:
int LEDNum_Center = (int)(ButtonEnum.FunctionOverride) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ Center),10,true);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.F);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.R);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.E);
controller.sendKeyUp(Microsoft.DirectX.DirectInput .Key.Q);
int LEDNum_UP2 = (int)(ButtonEnum.FunctionNightScope) + 1;
int LEDNum_DWN2 = (int)(ButtonEnum.FunctionTankDetach) + 1;
int LEDNum_RGT2 = (int)(ButtonEnum.FunctionManipulator) + 1;
int LEDNum_LFT2 = (int)(ButtonEnum.FunctionF2) + 1;
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ UP2),5,true);
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ DWN2),5,true);
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ RGT2),5,true);
controller.SetLEDState((ControllerLEDEnum)(LEDNum_ LFT2),5,true);
break;
}
}
}
/*
if (controller.GetButtonState(ButtonEnum.ToggleFuelFl owRate)) //ToggleFuelFlowRate turns on the lights
{
controller.AddButtonKeyMapping(ButtonEnum.ToggleFu elFlowRate, Microsoft.DirectX.DirectInput.Key.L, true);
}
else //ToggleFuelFlowRate turns off the lights
{
controller.AddButtonKeyMapping(ButtonEnum.ToggleFu elFlowRate, Microsoft.DirectX.DirectInput.Key.L, false);
}
*/
// toggle switching buttons
/*
if (controller.GetButtonState(ButtonEnum.ToggleFuelFl owRate)) //ToggleFuelFlowRate to JoyFire
{
if (controller.GetButtonState(ButtonEnum.RightJoyFire ))
joystick.setButton(controller.GetButtonState(Butto nEnum.RightJoyFire), 1, 5);
}
else
{
if (controller.GetButtonState(ButtonEnum.RightJoyFire ))
joystick.setButton(controller.GetButtonState(Butto nEnum.RightJoyFire), 1, 1);
}
currentResetValue = controller.GetButtonState((int)ButtonEnum.ToggleVT Location);
if (currentResetValue != lastResetValue && currentResetValue)
{
controller.TestLEDs(1);//reset lights
}
*/
lastResetValue = currentResetValue;
//Toggles Management (toggle = 1 button mapp on key )
//controller.AddButtonKeyLightMapping(ButtonEnum.Tog gleFilterControl, true, 10, Microsoft.DirectX.DirectInput.Key.F1, true);
//controller.AddButtonKeyLightMapping(ButtonEnum.Tog gleOxygenSupply, true, 10, Microsoft.DirectX.DirectInput.Key.F2, true);
//Toggles Management (toggle = 1 button mapp on key )
// controller.AddButtonKeyMapping(ButtonEnum.ToggleFi lterControl,Microsoft.DirectX.DirectInput.Key.F1, true);
// controller.AddButtonKeyMapping(ButtonEnum.ToggleOx ygenSupply, Microsoft.DirectX.DirectInput.Key.F2, true);
joystick.sendUpdate(1);
}
//this gets called at the end of the program and must be present, as it cleans up resources
public void shutDown()
{
controller.UnInit();
joystick.Release(1);
}
}
}