First FFB handling
This commit is contained in:
parent
fb10213ced
commit
962c5fd412
1 changed files with 147 additions and 5 deletions
|
@ -1,5 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Runtime.InteropServices.ComTypes;
|
||||||
using vJoyInterfaceWrap;
|
using vJoyInterfaceWrap;
|
||||||
|
|
||||||
namespace WheelAdapter
|
namespace WheelAdapter
|
||||||
|
@ -14,8 +14,11 @@ namespace WheelAdapter
|
||||||
|
|
||||||
static System.Threading.Mutex vj_mutex = new System.Threading.Mutex(true, "VJ access lock");
|
static System.Threading.Mutex vj_mutex = new System.Threading.Mutex(true, "VJ access lock");
|
||||||
|
|
||||||
|
static byte ifsDeviceState = 0;
|
||||||
|
|
||||||
static int Main(string[] args)
|
static int Main(string[] args)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("Initializing...");
|
||||||
AppDomain.CurrentDomain.ProcessExit += AppDomain_ProcessExit;
|
AppDomain.CurrentDomain.ProcessExit += AppDomain_ProcessExit;
|
||||||
|
|
||||||
#region vJoy init
|
#region vJoy init
|
||||||
|
@ -54,13 +57,17 @@ namespace WheelAdapter
|
||||||
|
|
||||||
IForceSerial.QueryHandler handleQueryDelegate = handleQuery;
|
IForceSerial.QueryHandler handleQueryDelegate = handleQuery;
|
||||||
ifs.queryHandler = handleQueryDelegate;
|
ifs.queryHandler = handleQueryDelegate;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// activate wheel packets
|
vj.FfbRegisterGenCB(handleFfb, null);
|
||||||
|
|
||||||
|
Console.WriteLine("Running, press q, Enter to exit.");
|
||||||
|
string s="";
|
||||||
|
while (!s.StartsWith("q"))
|
||||||
|
{
|
||||||
|
s = Console.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
Console.WriteLine("Press Enter to exit.");
|
|
||||||
Console.ReadLine();
|
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -118,5 +125,140 @@ namespace WheelAdapter
|
||||||
Console.WriteLine("Query [" + query.type.ToString() + "]: " + BitConverter.ToString(query.data));
|
Console.WriteLine("Query [" + query.type.ToString() + "]: " + BitConverter.ToString(query.data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void _ffb_check(UInt32 result)
|
||||||
|
{
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
throw new Exception("FFB Error: " + result.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void handleFfb(IntPtr data, object userData)
|
||||||
|
{
|
||||||
|
int devId = 0;
|
||||||
|
_ffb_check(vj.Ffb_h_DeviceID(data, ref devId));
|
||||||
|
|
||||||
|
FFBPType pkt_type = FFBPType.PT_CTRLREP;
|
||||||
|
_ffb_check(vj.Ffb_h_Type(data, ref pkt_type));
|
||||||
|
|
||||||
|
uint itype = 0;
|
||||||
|
int dsize = 0;
|
||||||
|
byte[] dbuf = new byte[200];
|
||||||
|
_ffb_check(vj.Ffb_h_Packet(data, ref itype, ref dsize, ref dbuf));
|
||||||
|
|
||||||
|
int ebi = 0;
|
||||||
|
vj.Ffb_h_EBI(data, ref ebi);
|
||||||
|
|
||||||
|
switch (pkt_type)
|
||||||
|
{
|
||||||
|
case FFBPType.PT_EFFREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_REPORT effect = new vJoy.FFB_EFF_REPORT();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Report(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_ENVREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_ENVLP effect = new vJoy.FFB_EFF_ENVLP();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Envlp(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_CONDREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_COND effect = new vJoy.FFB_EFF_COND();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Cond(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_PRIDREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_PERIOD effect = new vJoy.FFB_EFF_PERIOD();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Period(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_CONSTREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_CONSTANT effect = new vJoy.FFB_EFF_CONSTANT();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Constant(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_RAMPREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_RAMP effect = new vJoy.FFB_EFF_RAMP();
|
||||||
|
_ffb_check(vj.Ffb_h_Eff_Ramp(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_CSTMREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_SMPLREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_EFOPREP:
|
||||||
|
{
|
||||||
|
vJoy.FFB_EFF_OP effect = new vJoy.FFB_EFF_OP();
|
||||||
|
_ffb_check(vj.Ffb_h_EffOp(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_BLKFRREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_CTRLREP:
|
||||||
|
{
|
||||||
|
FFB_CTRL ctrl = FFB_CTRL.CTRL_DEVRST;
|
||||||
|
_ffb_check(vj.Ffb_h_DevCtrl(data, ref ctrl));
|
||||||
|
switch (ctrl)
|
||||||
|
{
|
||||||
|
case FFB_CTRL.CTRL_ENACT: { ifsDeviceState |= (Byte)IForceSerial.DeviceState.ENABLE_FFB; break; }
|
||||||
|
case FFB_CTRL.CTRL_DISACT: { ifsDeviceState &= (Byte)~IForceSerial.DeviceState.ENABLE_FFB; break; }
|
||||||
|
case FFB_CTRL.CTRL_STOPALL: { ifsDeviceState |= (Byte)IForceSerial.DeviceState.STOP_ALL; break; }
|
||||||
|
case FFB_CTRL.CTRL_DEVRST: { ifsDeviceState = 0; break; }
|
||||||
|
case FFB_CTRL.CTRL_DEVPAUSE: { ifsDeviceState |= (Byte)IForceSerial.DeviceState.PAUSE_FFB; break; }
|
||||||
|
case FFB_CTRL.CTRL_DEVCONT: { ifsDeviceState &= (Byte)~IForceSerial.DeviceState.PAUSE_FFB; break; }
|
||||||
|
}
|
||||||
|
ifs.WritePacket(IForceSerial.Type.SET_DEVICE_STATE, new Byte[] { ifsDeviceState });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_GAINREP:
|
||||||
|
{
|
||||||
|
byte gain = 0;
|
||||||
|
vj.Ffb_h_DevGain(data, ref gain);
|
||||||
|
gain = (byte)(gain / 255.0 * 0x80);
|
||||||
|
ifs.WritePacket(IForceSerial.Type.SET_OVERALL, new Byte[] { (Byte)IForceSerial.OverallControlType.GAIN, gain });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_SETCREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_NEWEFREP:
|
||||||
|
{
|
||||||
|
FFBEType effect = FFBEType.ET_NONE;
|
||||||
|
_ffb_check(vj.Ffb_h_EffNew(data, ref effect));
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_BLKLDREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FFBPType.PT_POOLREP:
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//ref itype, ref dsize, ref dbuf
|
||||||
|
Console.WriteLine("FFB[" + devId.ToString() + "]: " + pkt_type.ToString()+" ("+itype.ToString()+"@"+ebi.ToString()+"): "+BitConverter.ToString(dbuf));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue