Remove old SDK

This commit is contained in:
Patrick Moessler 2020-11-01 01:13:15 +01:00
parent 468942414e
commit e08a95555c
17 changed files with 0 additions and 2248 deletions

View file

@ -1,17 +0,0 @@
REM Automate the creation of an SDK package
REM C#
COPY ..\X64\Release\vJoyInterface.dll ".\c#\x64\vJoyInterface.dll"
COPY ..\X64\Release\vJoyInterfaceWrap.dll ".\c#\x64\vJoyInterfaceWrap.dll"
COPY ..\Win32\Release\vJoyInterface.dll ".\c#\x86\vJoyInterface.dll"
COPY ..\Win32\Release\vJoyInterfaceWrap.dll ".\c#\x86\vJoyInterfaceWrap.dll"
REM Include Files
COPY ..\Inc\public.h .\Inc\public.h
COPY ..\apps\common\vJoyInterface\vjoyinterface.h .\Inc\vjoyinterface.h
REM Library Files
COPY ..\Win32\Release\vJoyInterface.dll .\LIB\vJoyInterface.dll
COPY ..\Win32\Release\vJoyInterface.lib .\LIB\vJoyInterface.lib
COPY ..\X64\Release\vJoyInterface.dll .\LIB\amd64\vJoyInterface.dll
COPY ..\X64\Release\vJoyInterface.lib .\LIB\amd64\vJoyInterface.lib

View file

@ -1,89 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.21022</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>FeederDemoCS</RootNamespace>
<AssemblyName>FeederDemoCS</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="vJoyInterfaceWrap, Version=0.2.0.5, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\x64\vJoyInterfaceWrap.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
<Visible>False</Visible>
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
<Visible>False</Visible>
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<PropertyGroup>
<PostBuildEvent>copy $(SolutionDir)..\x64\vJoyInterface.dll $(TargetDir).</PostBuildEvent>
</PropertyGroup>
</Project>

View file

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C# Express 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FeederDemoCS", "FeederDemoCS.csproj", "{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CCA62E05-B035-49F6-A3B4-ACD21CD562E4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -1,284 +0,0 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// This project demonstrates how to write a simple vJoy feeder in C#
//
// You can compile it with either #define ROBUST OR #define EFFICIENT
// The fuctionality is similar -
// The ROBUST section demonstrate the usage of functions that are easy and safe to use but are less efficient
// The EFFICIENT ection demonstrate the usage of functions that are more efficient
//
// Functionality:
// The program starts with creating one joystick object.
// Then it petches the device id from the command-line and makes sure that it is within range
// After testing that the driver is enabled it gets information about the driver
// Gets information about the specified virtual device
// This feeder uses only a few axes. It checks their existence and
// checks the number of buttons and POV Hat switches.
// Then the feeder acquires the virtual device
// Here starts and endless loop that feedes data into the virtual device
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
#define ROBUST
//#define EFFICIENT
using System;
using System.Collections.Generic;
using System.Text;
// Don't forget to add this
using vJoyInterfaceWrap;
namespace FeederDemoCS
{
class Program
{
// Declaring one joystick (Device id 1) and a position structure.
static public vJoy joystick;
static public vJoy.JoystickState iReport;
static public uint id = 1;
static void Main(string[] args)
{
// Create one joystick object and a position structure.
joystick = new vJoy();
iReport = new vJoy.JoystickState();
// Device ID can only be in the range 1-16
if (args.Length>0 && !String.IsNullOrEmpty(args[0]))
id = Convert.ToUInt32(args[0]);
if (id <= 0 || id > 16)
{
Console.WriteLine("Illegal device ID {0}\nExit!",id);
return;
}
// Get the driver attributes (Vendor ID, Product ID, Version Number)
if (!joystick.vJoyEnabled())
{
Console.WriteLine("vJoy driver not enabled: Failed Getting vJoy attributes.\n");
return;
}
else
Console.WriteLine("Vendor: {0}\nProduct :{1}\nVersion Number:{2}\n", joystick.GetvJoyManufacturerString(), joystick.GetvJoyProductString(), joystick.GetvJoySerialNumberString());
// Get the state of the requested device
VjdStat status = joystick.GetVJDStatus(id);
switch (status)
{
case VjdStat.VJD_STAT_OWN:
Console.WriteLine("vJoy Device {0} is already owned by this feeder\n", id);
break;
case VjdStat.VJD_STAT_FREE:
Console.WriteLine("vJoy Device {0} is free\n", id);
break;
case VjdStat.VJD_STAT_BUSY:
Console.WriteLine("vJoy Device {0} is already owned by another feeder\nCannot continue\n", id);
return;
case VjdStat.VJD_STAT_MISS:
Console.WriteLine("vJoy Device {0} is not installed or disabled\nCannot continue\n", id);
return;
default:
Console.WriteLine("vJoy Device {0} general error\nCannot continue\n", id);
return;
};
// Check which axes are supported
bool AxisX = joystick.GetVJDAxisExist(id, HID_USAGES.HID_USAGE_X);
bool AxisY = joystick.GetVJDAxisExist(id, HID_USAGES.HID_USAGE_Y);
bool AxisZ = joystick.GetVJDAxisExist(id, HID_USAGES.HID_USAGE_Z);
bool AxisRX = joystick.GetVJDAxisExist(id, HID_USAGES.HID_USAGE_RX);
bool AxisRZ = joystick.GetVJDAxisExist(id, HID_USAGES.HID_USAGE_RZ);
// Get the number of buttons and POV Hat switchessupported by this vJoy device
int nButtons = joystick.GetVJDButtonNumber(id);
int ContPovNumber = joystick.GetVJDContPovNumber(id);
int DiscPovNumber = joystick.GetVJDDiscPovNumber(id);
// Print results
Console.WriteLine("\nvJoy Device {0} capabilities:\n", id);
Console.WriteLine("Numner of buttons\t\t{0}\n", nButtons);
Console.WriteLine("Numner of Continuous POVs\t{0}\n", ContPovNumber);
Console.WriteLine("Numner of Descrete POVs\t\t{0}\n", DiscPovNumber);
Console.WriteLine("Axis X\t\t{0}\n", AxisX ? "Yes" : "No");
Console.WriteLine("Axis Y\t\t{0}\n", AxisX ? "Yes" : "No");
Console.WriteLine("Axis Z\t\t{0}\n", AxisX ? "Yes" : "No");
Console.WriteLine("Axis Rx\t\t{0}\n", AxisRX ? "Yes" : "No");
Console.WriteLine("Axis Rz\t\t{0}\n", AxisRZ ? "Yes" : "No");
// Test if DLL matches the driver
UInt32 DllVer = 0, DrvVer = 0;
bool match = joystick.DriverMatch(ref DllVer, ref DrvVer);
if (match)
Console.WriteLine("Version of Driver Matches DLL Version ({0:X})\n", DllVer);
else
Console.WriteLine("Version of Driver ({0:X}) does NOT match DLL Version ({1:X})\n", DrvVer, DllVer);
// Acquire the target
if ((status == VjdStat.VJD_STAT_OWN) || ((status == VjdStat.VJD_STAT_FREE) && (!joystick.AcquireVJD(id))))
{
Console.WriteLine("Failed to acquire vJoy device number {0}.\n", id);
return ;
}
else
Console.WriteLine("Acquired: vJoy device number {0}.\n", id);
Console.WriteLine("\npress enter to stat feeding");
Console.ReadKey(true);
int X, Y, Z, ZR, XR;
uint count = 0;
long maxval = 0;
X = 20;
Y = 30;
Z = 40;
XR = 60;
ZR = 80;
joystick.GetVJDAxisMax(id, HID_USAGES.HID_USAGE_X, ref maxval);
#if ROBUST
bool res;
// Reset this device to default values
joystick.ResetVJD(id);
// Feed the device in endless loop
while (true)
{
// Set position of 4 axes
res = joystick.SetAxis(X, id, HID_USAGES.HID_USAGE_X);
res = joystick.SetAxis(Y, id, HID_USAGES.HID_USAGE_Y);
res = joystick.SetAxis(Z, id, HID_USAGES.HID_USAGE_Z);
res = joystick.SetAxis(XR, id, HID_USAGES.HID_USAGE_RX);
res = joystick.SetAxis(ZR, id, HID_USAGES.HID_USAGE_RZ);
// Press/Release Buttons
res = joystick.SetBtn(true, id, count / 50);
res = joystick.SetBtn(false, id, 1 + count / 50);
// If Continuous POV hat switches installed - make them go round
// For high values - put the switches in neutral state
if (ContPovNumber>0)
{
if ((count * 70) < 30000)
{
res = joystick.SetContPov(((int)count * 70), id, 1);
res = joystick.SetContPov(((int)count * 70) + 2000, id, 2);
res = joystick.SetContPov(((int)count * 70) + 4000, id, 3);
res = joystick.SetContPov(((int)count * 70) + 6000, id, 4);
}
else
{
res = joystick.SetContPov(-1, id, 1);
res = joystick.SetContPov(-1, id, 2);
res = joystick.SetContPov(-1, id, 3);
res = joystick.SetContPov(-1, id, 4);
};
};
// If Discrete POV hat switches installed - make them go round
// From time to time - put the switches in neutral state
if (DiscPovNumber>0)
{
if (count < 550)
{
joystick.SetDiscPov((((int)count / 20) + 0) % 4, id, 1);
joystick.SetDiscPov((((int)count / 20) + 1) % 4, id, 2);
joystick.SetDiscPov((((int)count / 20) + 2) % 4, id, 3);
joystick.SetDiscPov((((int)count / 20) + 3) % 4, id, 4);
}
else
{
joystick.SetDiscPov(-1, id, 1);
joystick.SetDiscPov(-1, id, 2);
joystick.SetDiscPov(-1, id, 3);
joystick.SetDiscPov(-1, id, 4);
};
};
System.Threading.Thread.Sleep(20);
X += 150; if (X > maxval) X = 0;
Y += 250; if (Y > maxval) Y = 0;
Z += 350; if (Z > maxval) Z = 0;
XR += 220; if (XR > maxval) XR = 0;
ZR += 200; if (ZR > maxval) ZR = 0;
count++;
if (count > 640)
count = 0;
} // While (Robust)
#endif // ROBUST
#if EFFICIENT
byte[] pov = new byte[4];
while (true)
{
iReport.bDevice = (byte)id;
iReport.AxisX = X;
iReport.AxisY = Y;
iReport.AxisZ = Z;
iReport.AxisZRot = ZR;
iReport.AxisXRot = XR;
// Set buttons one by one
iReport.Buttons = (uint)(0x1 << (int)(count / 20));
if (ContPovNumber>0)
{
// Make Continuous POV Hat spin
iReport.bHats = (count*70);
iReport.bHatsEx1 = (count*70)+3000;
iReport.bHatsEx2 = (count*70)+5000;
iReport.bHatsEx3 = 15000 - (count*70);
if ((count*70) > 36000)
{
iReport.bHats = 0xFFFFFFFF; // Neutral state
iReport.bHatsEx1 = 0xFFFFFFFF; // Neutral state
iReport.bHatsEx2 = 0xFFFFFFFF; // Neutral state
iReport.bHatsEx3 = 0xFFFFFFFF; // Neutral state
};
}
else
{
// Make 5-position POV Hat spin
pov[0] = (byte)(((count / 20) + 0)%4);
pov[1] = (byte)(((count / 20) + 1) % 4);
pov[2] = (byte)(((count / 20) + 2) % 4);
pov[3] = (byte)(((count / 20) + 3) % 4);
iReport.bHats = (uint)(pov[3]<<12) | (uint)(pov[2]<<8) | (uint)(pov[1]<<4) | (uint)pov[0];
if ((count) > 550)
iReport.bHats = 0xFFFFFFFF; // Neutral state
};
/*** Feed the driver with the position packet - is fails then wait for input then try to re-acquire device ***/
if (!joystick.UpdateVJD(id, ref iReport))
{
Console.WriteLine("Feeding vJoy device number {0} failed - try to enable device then press enter\n", id);
Console.ReadKey(true);
joystick.AcquireVJD(id);
}
System.Threading.Thread.Sleep(20);
count++;
if (count > 640) count = 0;
X += 150; if (X > maxval) X = 0;
Y += 250; if (Y > maxval) Y = 0;
Z += 350; if (Z > maxval) Z = 0;
XR += 220; if (XR > maxval) XR = 0;
ZR += 200; if (ZR > maxval) ZR = 0;
}; // While
#endif // EFFICIENT
} // Main
} // class Program
} // namespace FeederDemoCS

View file

@ -1,36 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("FeederDemoCS")]
[assembly: AssemblyDescription("C# Demo Feeder")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("FeederDemoCS")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("05b30ba2-93f6-465e-bc70-0e01acc9ea17")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.1.0")]
[assembly: AssemblyFileVersion("2.0.1.0")]

View file

@ -1,283 +0,0 @@
/*++
Copyright (c) Shaul Eizikovich. All rights reserved.
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Module Name:
public.h
Abstract:
Public header file for the vJoy project
Developpers that need to interface with vJoy need to include this file
Author:
Environment:
kernel mode and User mode
Notes:
Revision History:
--*/
#ifndef _PUBLIC_H
#define _PUBLIC_H
// Compilation directives
#define PPJOY_MODE
#undef PPJOY_MODE // Comment-out for compatibility mode
#ifdef PPJOY_MODE
#include "PPJIoctl.h"
#endif
#include <INITGUID.H> // Definitions for controlling GUID initialization
// Sideband comunication with vJoy Device
//{781EF630-72B2-11d2-B852-00C04FAD5101}
DEFINE_GUID(GUID_DEVINTERFACE_VJOY, 0x781EF630, 0x72B2, 0x11d2, 0xB8, 0x52, 0x00, 0xC0, 0x4F, 0xAD, 0x51, 0x01);
//
// Usage example:
// CreateFile(TEXT("\\\\.\\vJoy"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
#ifdef PPJOY_MODE
#define DEVICENAME_STRING "PPJoyIOCTL1"
#else
#define DEVICENAME_STRING "vJoy"
#endif
#define NTDEVICE_NAME_STRING "\\Device\\"DEVICENAME_STRING
#define SYMBOLIC_NAME_STRING "\\DosDevices\\"DEVICENAME_STRING
#define DOS_FILE_NAME "\\\\.\\"DEVICENAME_STRING
#define VJOY_INTERFACE L"Device_"
// Version parts
#define VER_X_ 0
#define VER_H_ 2
#define VER_M_ 1
#define VER_L_ 8
#define STRINGIFY_1(x) #x
#define STRINGIFY(x) STRINGIFY_1(x)
#define PASTE(x, y) x##y
#define MAKEWIDE(x) PASTE(L,x)
// Device Attributes
//
#define VENDOR_N_ID 0x1234
#define PRODUCT_N_ID 0xBEAD
#define VERSION_N (VER_L_ + 0x10*VER_M_ + 0x100*VER_H_ + 0x1000*VER_X_)
// Device Strings
//
#define VENDOR_STR_ID L"Shaul Eizikovich"
#define PRODUCT_STR_ID L"vJoy - Virtual Joystick"
#define SERIALNUMBER_STR MAKEWIDE(STRINGIFY(VER_H_)) L"." MAKEWIDE(STRINGIFY(VER_M_)) L"." MAKEWIDE(STRINGIFY(VER_L_))
// Function codes;
//#define LOAD_POSITIONS 0x910
//#define GETATTRIB 0x911
// #define GET_FFB_DATA 0x00222912 // METHOD_OUT_DIRECT + FILE_DEVICE_UNKNOWN + FILE_ANY_ACCESS
//#define SET_FFB_STAT 0x913 // METHOD_NEITHER
//#define GET_FFB_STAT 0x916
#define F_LOAD_POSITIONS 0x910
#define F_GETATTRIB 0x911
#define F_GET_FFB_DATA 0x912
#define F_SET_FFB_STAT 0x913
#define F_GET_FFB_STAT 0x916
#define F_GET_DEV_INFO 0x917
#define F_IS_DRV_FFB_CAP 0x918
#define F_IS_DRV_FFB_EN 0x919
#define F_GET_DRV_DEV_MAX 0x91A
#define F_GET_DRV_DEV_EN 0x91B
#define F_IS_DEV_FFB_START 0x91C
#define F_GET_DEV_STAT 0x91D
#define F_GET_DRV_INFO 0x91E
#define F_RESET_DEV 0x91F
#define F_GET_POSITIONS 0x920
// IO Device Control codes;
#define IOCTL_VJOY_GET_ATTRIB CTL_CODE (FILE_DEVICE_UNKNOWN, GETATTRIB, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define LOAD_POSITIONS CTL_CODE (FILE_DEVICE_UNKNOWN, F_LOAD_POSITIONS, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define GET_POSITIONS CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_POSITIONS, METHOD_BUFFERED, FILE_READ_ACCESS)
#define GET_FFB_DATA CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_FFB_DATA, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
#define SET_FFB_STAT CTL_CODE (FILE_DEVICE_UNKNOWN, F_SET_FFB_STAT, METHOD_NEITHER, FILE_ANY_ACCESS)
#define GET_FFB_STAT CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_FFB_STAT, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GET_DEV_INFO CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DEV_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IS_DRV_FFB_CAP CTL_CODE (FILE_DEVICE_UNKNOWN, F_IS_DRV_FFB_CAP, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IS_DRV_FFB_EN CTL_CODE (FILE_DEVICE_UNKNOWN, F_IS_DRV_FFB_EN, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GET_DRV_DEV_MAX CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DRV_DEV_MAX, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GET_DRV_DEV_EN CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DRV_DEV_EN, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IS_DEV_FFB_START CTL_CODE (FILE_DEVICE_UNKNOWN, F_IS_DEV_FFB_START, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GET_DEV_STAT CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DEV_STAT, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define GET_DRV_INFO CTL_CODE (FILE_DEVICE_UNKNOWN, F_GET_DRV_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define RESET_DEV CTL_CODE (FILE_DEVICE_UNKNOWN, F_RESET_DEV, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#ifndef __HIDPORT_H__
// Copied from hidport.h
#define IOCTL_HID_SET_FEATURE 0xB0191
#define IOCTL_HID_WRITE_REPORT 0xB000F
#define MAX_N_DEVICES 16 // Maximum number of vJoy devices
typedef struct _HID_DEVICE_ATTRIBUTES {
ULONG Size;
//
// sizeof (struct _HID_DEVICE_ATTRIBUTES)
//
//
// Vendor ids of this hid device
//
USHORT VendorID;
USHORT ProductID;
USHORT VersionNumber;
USHORT Reserved[11];
} HID_DEVICE_ATTRIBUTES, * PHID_DEVICE_ATTRIBUTES;
#endif
// Device Type
//enum DevType { vJoy, vXbox };
// Error levels for status report
enum ERRLEVEL {INFO, WARN, ERR, FATAL, APP};
// Status report function prototype
#ifdef WINAPI
typedef BOOL (WINAPI *StatusMessageFunc)(void * output, TCHAR * buffer, enum ERRLEVEL level);
#endif
///////////////////////////////////////////////////////////////
/////////////////////// Joystick Position ///////////////////////
//
// This structure holds data that is passed to the device from
// an external application such as SmartPropoPlus.
//
// Usage example:
// JOYSTICK_POSITION iReport;
// :
// DeviceIoControl (hDevice, 100, &iReport, sizeof(HID_INPUT_REPORT), NULL, 0, &bytes, NULL)
typedef struct _JOYSTICK_POSITION
{
BYTE bDevice; // Index of device. 1-based.
LONG wThrottle;
LONG wRudder;
LONG wAileron;
LONG wAxisX;
LONG wAxisY;
LONG wAxisZ;
LONG wAxisXRot;
LONG wAxisYRot;
LONG wAxisZRot;
LONG wSlider;
LONG wDial;
LONG wWheel;
LONG wAxisVX;
LONG wAxisVY;
LONG wAxisVZ;
LONG wAxisVBRX;
LONG wAxisVBRY;
LONG wAxisVBRZ;
LONG lButtons; // 32 buttons: 0x00000001 means button1 is pressed, 0x80000000 -> button32 is pressed
DWORD bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch
DWORD bHatsEx1; // 16-bit of continuous HAT switch
DWORD bHatsEx2; // 16-bit of continuous HAT switch
DWORD bHatsEx3; // 16-bit of continuous HAT switch
} JOYSTICK_POSITION, *PJOYSTICK_POSITION;
// Superset of JOYSTICK_POSITION
// Extension of JOYSTICK_POSITION with Buttons 33-128 appended to the end of the structure.
typedef struct _JOYSTICK_POSITION_V2
{
/// JOYSTICK_POSITION
BYTE bDevice; // Index of device. 1-based.
LONG wThrottle;
LONG wRudder;
LONG wAileron;
LONG wAxisX;
LONG wAxisY;
LONG wAxisZ;
LONG wAxisXRot;
LONG wAxisYRot;
LONG wAxisZRot;
LONG wSlider;
LONG wDial;
LONG wWheel;
LONG wAxisVX;
LONG wAxisVY;
LONG wAxisVZ;
LONG wAxisVBRX;
LONG wAxisVBRY;
LONG wAxisVBRZ;
LONG lButtons; // 32 buttons: 0x00000001 means button1 is pressed, 0x80000000 -> button32 is pressed
DWORD bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch
DWORD bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch
DWORD bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch
DWORD bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch LONG lButtonsEx1; // Buttons 33-64
/// JOYSTICK_POSITION_V2 Extenssion
LONG lButtonsEx1; // Buttons 33-64
LONG lButtonsEx2; // Buttons 65-96
LONG lButtonsEx3; // Buttons 97-128
} JOYSTICK_POSITION_V2, *PJOYSTICK_POSITION_V2;
// HID Descriptor definitions - Axes
#define HID_USAGE_X 0x30
#define HID_USAGE_Y 0x31
#define HID_USAGE_Z 0x32
#define HID_USAGE_RX 0x33
#define HID_USAGE_RY 0x34
#define HID_USAGE_RZ 0x35
#define HID_USAGE_SL0 0x36
#define HID_USAGE_SL1 0x37
#define HID_USAGE_WHL 0x38
#define HID_USAGE_POV 0x39
// HID Descriptor definitions - FFB Effects
#define HID_USAGE_CONST 0x26 // Usage ET Constant Force
#define HID_USAGE_RAMP 0x27 // Usage ET Ramp
#define HID_USAGE_SQUR 0x30 // Usage ET Square
#define HID_USAGE_SINE 0x31 // Usage ET Sine
#define HID_USAGE_TRNG 0x32 // Usage ET Triangle
#define HID_USAGE_STUP 0x33 // Usage ET Sawtooth Up
#define HID_USAGE_STDN 0x34 // Usage ET Sawtooth Down
#define HID_USAGE_SPRNG 0x40 // Usage ET Spring
#define HID_USAGE_DMPR 0x41 // Usage ET Damper
#define HID_USAGE_INRT 0x42 // Usage ET Inertia
#define HID_USAGE_FRIC 0x43 // Usage ET Friction
// HID Descriptor definitions - FFB Report IDs
#define HID_ID_STATE 0x02 // Usage PID State report
#define HID_ID_EFFREP 0x01 // Usage Set Effect Report
#define HID_ID_ENVREP 0x02 // Usage Set Envelope Report
#define HID_ID_CONDREP 0x03 // Usage Set Condition Report
#define HID_ID_PRIDREP 0x04 // Usage Set Periodic Report
#define HID_ID_CONSTREP 0x05 // Usage Set Constant Force Report
#define HID_ID_RAMPREP 0x06 // Usage Set Ramp Force Report
#define HID_ID_CSTMREP 0x07 // Usage Custom Force Data Report
#define HID_ID_SMPLREP 0x08 // Usage Download Force Sample
#define HID_ID_EFOPREP 0x0A // Usage Effect Operation Report
#define HID_ID_BLKFRREP 0x0B // Usage PID Block Free Report
#define HID_ID_CTRLREP 0x0C // Usage PID Device Control
#define HID_ID_GAINREP 0x0D // Usage Device Gain Report
#define HID_ID_SETCREP 0x0E // Usage Set Custom Force Report
#define HID_ID_NEWEFREP 0x01 // Usage Create New Effect Report
#define HID_ID_BLKLDREP 0x02 // Usage Block Load Report
#define HID_ID_POOLREP 0x03 // Usage PID Pool Report
#endif

View file

@ -1,366 +0,0 @@
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the VJOYINTERFACE_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// VJOYINTERFACE_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef VJOYINTERFACE_EXPORTS
#define VJOYINTERFACE_API __declspec(dllexport)
#else
#define VJOYINTERFACE_API __declspec(dllimport)
#endif
#ifdef STATIC
#undef VJOYINTERFACE_API
#define VJOYINTERFACE_API
#endif
///////////////////////////// vJoy device (collection) status ////////////////////////////////////////////
#ifndef VJDSTAT
#define VJDSTAT
enum VjdStat /* Declares an enumeration data type */
{
VJD_STAT_OWN, // The vJoy Device is owned by this application.
VJD_STAT_FREE, // The vJoy Device is NOT owned by any application (including this one).
VJD_STAT_BUSY, // The vJoy Device is owned by another application. It cannot be acquired by this application.
VJD_STAT_MISS, // The vJoy Device is missing. It either does not exist or the driver is down.
VJD_STAT_UNKN // Unknown
};
/* Error codes for some of the functions */
#define NO_HANDLE_BY_INDEX -1
#define BAD_PREPARSED_DATA -2
#define NO_CAPS -3
#define BAD_N_BTN_CAPS -4
#define BAD_CALLOC -5
#define BAD_BTN_CAPS -6
#define BAD_BTN_RANGE -7
#define BAD_N_VAL_CAPS -8
#define BAD_ID_RANGE -9
#define NO_SUCH_AXIS -10
#define BAD_DEV_STAT -11
#define NO_DEV_EXIST -12
#define NO_FILE_EXIST -13
/* Registry Constants */
#define REG_PARAM L"SYSTEM\\CurrentControlSet\\services\\vjoy\\Parameters"
#define REG_PARAM_DEV0 L"SYSTEM\\CurrentControlSet\\services\\vjoy\\Parameters\\Device0"
#define REG_PARAM_DEV L"SYSTEM\\CurrentControlSet\\services\\vjoy\\Parameters\\Device"
#define REG_DEVICE L"Device"
#define REG_INIT L"Init"
#define BTN_INIT L"BTNS"
/* Environment Variables */
#define INTERFACE_LOG_LEVEL "VJOYINTERFACELOGLEVEL"
#define INTERFACE_LOG_FILE "VJOYINTERFACELOGFILE"
#define INTERFACE_DEF_LOG_FILE "vJoyInterface.log"
/* Compatibility definitions */
#define FFB_EFF_CONST FFB_EFF_REPORT
#define PFFB_EFF_CONST PFFB_EFF_REPORT
#define Ffb_h_Eff_Const Ffb_h_Eff_Report
// Device Axis/POVs/Buttons
struct DEVCTRLS {
BOOL Init;
BOOL Rudder;
BOOL Aileron;
BOOL AxisX;
BOOL AxisY;
BOOL AxisZ;
BOOL AxisXRot;
BOOL AxisYRot;
BOOL AxisZRot;
BOOL Slider;
BOOL Dial;
BOOL Wheel;
BOOL AxisVX;
BOOL AxisVY;
BOOL AxisVZ;
BOOL AxisVBRX;
BOOL AxisVBRY;
BOOL AxisVBRZ;
INT nButtons;
INT nDescHats;
INT nContHats;
};
struct DeviceStat {
HANDLE h; // Handle to the PDO interface that represents the virtual device
VjdStat stat; // Status of the device
JOYSTICK_POSITION_V2 position; // Current Position of the device
HDEVNOTIFY hDeviceNotifyHandle; // Device Notification Handle
DEVCTRLS DeviceControls; // Structure Holding the data about the device's controls
PVOID pPreParsedData; // structure contains a top-level collection's preparsed data.
};
struct DEV_INFO {
BYTE DeviceID; // Device ID: Valid values are 1-16
BYTE nImplemented; // Number of implemented device: Valid values are 1-16
BYTE isImplemented; // Is this device implemented?
BYTE MaxDevices; // Maximum number of devices that may be implemented (16)
BYTE DriverFFB; // Does this driver support FFB (False)
BYTE DeviceFFB; // Does this device support FFB (False)
} ;
typedef void (CALLBACK *RemovalCB)(BOOL, BOOL, PVOID);
enum FFBEType // FFB Effect Type
{
// Effect Type
ET_NONE = 0, // No Force
ET_CONST = 1, // Constant Force
ET_RAMP = 2, // Ramp
ET_SQR = 3, // Square
ET_SINE = 4, // Sine
ET_TRNGL = 5, // Triangle
ET_STUP = 6, // Sawtooth Up
ET_STDN = 7, // Sawtooth Down
ET_SPRNG = 8, // Spring
ET_DMPR = 9, // Damper
ET_INRT = 10, // Inertia
ET_FRCTN = 11, // Friction
ET_CSTM = 12, // Custom Force Data
};
enum FFBPType // FFB Packet Type
{
// Write
PT_EFFREP = HID_ID_EFFREP, // Usage Set Effect Report
PT_ENVREP = HID_ID_ENVREP, // Usage Set Envelope Report
PT_CONDREP = HID_ID_CONDREP, // Usage Set Condition Report
PT_PRIDREP = HID_ID_PRIDREP, // Usage Set Periodic Report
PT_CONSTREP = HID_ID_CONSTREP, // Usage Set Constant Force Report
PT_RAMPREP = HID_ID_RAMPREP, // Usage Set Ramp Force Report
PT_CSTMREP = HID_ID_CSTMREP, // Usage Custom Force Data Report
PT_SMPLREP = HID_ID_SMPLREP, // Usage Download Force Sample
PT_EFOPREP = HID_ID_EFOPREP, // Usage Effect Operation Report
PT_BLKFRREP = HID_ID_BLKFRREP, // Usage PID Block Free Report
PT_CTRLREP = HID_ID_CTRLREP, // Usage PID Device Control
PT_GAINREP = HID_ID_GAINREP, // Usage Device Gain Report
PT_SETCREP = HID_ID_SETCREP, // Usage Set Custom Force Report
// Feature
PT_NEWEFREP = HID_ID_NEWEFREP+0x10, // Usage Create New Effect Report
PT_BLKLDREP = HID_ID_BLKLDREP+0x10, // Usage Block Load Report
PT_POOLREP = HID_ID_POOLREP+0x10, // Usage PID Pool Report
};
enum FFBOP
{
EFF_START = 1, // EFFECT START
EFF_SOLO = 2, // EFFECT SOLO START
EFF_STOP = 3, // EFFECT STOP
};
enum FFB_CTRL
{
CTRL_ENACT = 1, // Enable all device actuators.
CTRL_DISACT = 2, // Disable all the device actuators.
CTRL_STOPALL = 3, // Stop All Effects­ Issues a stop on every running effect.
CTRL_DEVRST = 4, // Device Reset Clears any device paused condition, enables all actuators and clears all effects from memory.
CTRL_DEVPAUSE = 5, // Device Pause The all effects on the device are paused at the current time step.
CTRL_DEVCONT = 6, // Device Continue The all effects that running when the device was paused are restarted from their last time step.
};
enum FFB_EFFECTS {
Constant = 0x0001,
Ramp = 0x0002,
Square = 0x0004,
Sine = 0x0008,
Triangle = 0x0010,
Sawtooth_Up = 0x0020,
Sawtooth_Dn = 0x0040,
Spring = 0x0080,
Damper = 0x0100,
Inertia = 0x0200,
Friction = 0x0400,
Custom = 0x0800,
};
typedef struct _FFB_DATA {
ULONG size;
ULONG cmd;
UCHAR *data;
} FFB_DATA, * PFFB_DATA;
typedef struct _FFB_EFF_CONSTANT {
BYTE EffectBlockIndex;
LONG Magnitude; // Constant force magnitude: -10000 - 10000
} FFB_EFF_CONSTANT, *PFFB_EFF_CONSTANT;
typedef struct _FFB_EFF_RAMP {
BYTE EffectBlockIndex;
LONG Start; // The Normalized magnitude at the start of the effect (-10000 - 10000)
LONG End; // The Normalized magnitude at the end of the effect (-10000 - 10000)
} FFB_EFF_RAMP, *PFFB_EFF_RAMP;
//typedef struct _FFB_EFF_CONST {
typedef struct _FFB_EFF_REPORT {
BYTE EffectBlockIndex;
FFBEType EffectType;
WORD Duration;// Value in milliseconds. 0xFFFF means infinite
WORD TrigerRpt;
WORD SamplePrd;
BYTE Gain;
BYTE TrigerBtn;
BOOL Polar; // How to interpret force direction Polar (0-360°) or Cartesian (X,Y)
union
{
BYTE Direction; // Polar direction: (0x00-0xFF correspond to 0-360°)
BYTE DirX; // X direction: Positive values are To the right of the center (X); Negative are Two's complement
};
BYTE DirY; // Y direction: Positive values are below the center (Y); Negative are Two's complement
} FFB_EFF_REPORT, *PFFB_EFF_REPORT;
//} FFB_EFF_CONST, *PFFB_EFF_CONST;
typedef struct _FFB_EFF_OP {
BYTE EffectBlockIndex;
FFBOP EffectOp;
BYTE LoopCount;
} FFB_EFF_OP, *PFFB_EFF_OP;
typedef struct _FFB_EFF_PERIOD {
BYTE EffectBlockIndex;
DWORD Magnitude; // Range: 0 - 10000
LONG Offset; // Range: 10000 - 10000
DWORD Phase; // Range: 0 - 35999
DWORD Period; // Range: 0 - 32767
} FFB_EFF_PERIOD, *PFFB_EFF_PERIOD;
typedef struct _FFB_EFF_COND {
BYTE EffectBlockIndex;
BOOL isY;
LONG CenterPointOffset; // CP Offset: Range -­10000 ­- 10000
LONG PosCoeff; // Positive Coefficient: Range -­10000 ­- 10000
LONG NegCoeff; // Negative Coefficient: Range -­10000 ­- 10000
DWORD PosSatur; // Positive Saturation: Range 0 10000
DWORD NegSatur; // Negative Saturation: Range 0 10000
LONG DeadBand; // Dead Band: : Range 0 1000
} FFB_EFF_COND, *PFFB_EFF_COND;
typedef struct _FFB_EFF_ENVLP {
BYTE EffectBlockIndex;
DWORD AttackLevel; // The Normalized magnitude of the stating point: 0 - 10000
DWORD FadeLevel; // The Normalized magnitude of the stopping point: 0 - 10000
DWORD AttackTime; // Time of the attack: 0 - 4294967295
DWORD FadeTime; // Time of the fading: 0 - 4294967295
} FFB_EFF_ENVLP, *PFFB_EFF_ENVLP;
#define FFB_DATA_READY WM_USER+31
typedef void (CALLBACK *FfbGenCB)(PVOID, PVOID);
#endif
#ifndef STATIC
extern "C" {
#else
namespace vJoyNS {
#endif
///////////////////////////// vJoy device (collection) Control interface /////////////////////////////////
/*
These functions allow writing feeders and other applications that interface with vJoy
It is assumed that only one vJoy top-device (= Raw PDO) exists.
This top-level device can have up to 16 siblings (=top-level Reports/collections)
Each sibling is refered to as a "vJoy Device" and is attributed a unique Report ID (Range: 1-16).
Naming convetion:
VJD = vJoy Device
rID = Report ID
*/
#pragma warning( push )
#pragma warning( disable : 4995 )
///// General driver data
VJOYINTERFACE_API SHORT __cdecl GetvJoyVersion(void);
VJOYINTERFACE_API BOOL __cdecl vJoyEnabled(void);
VJOYINTERFACE_API PVOID __cdecl GetvJoyProductString(void);
VJOYINTERFACE_API PVOID __cdecl GetvJoyManufacturerString(void);
VJOYINTERFACE_API PVOID __cdecl GetvJoySerialNumberString(void);
VJOYINTERFACE_API BOOL __cdecl DriverMatch(WORD * DllVer, WORD * DrvVer);
VJOYINTERFACE_API VOID __cdecl RegisterRemovalCB(RemovalCB cb, PVOID data);
VJOYINTERFACE_API BOOL __cdecl vJoyFfbCap(BOOL * Supported); // Is this version of vJoy capable of FFB?
VJOYINTERFACE_API BOOL __cdecl GetvJoyMaxDevices(int * n); // What is the maximum possible number of vJoy devices
VJOYINTERFACE_API BOOL __cdecl GetNumberExistingVJD(int * n); // What is the number of vJoy devices currently enabled
///// vJoy Device properties
VJOYINTERFACE_API int __cdecl GetVJDButtonNumber(UINT rID); // Get the number of buttons defined in the specified VDJ
VJOYINTERFACE_API int __cdecl GetVJDDiscPovNumber(UINT rID); // Get the number of descrete-type POV hats defined in the specified VDJ
VJOYINTERFACE_API int __cdecl GetVJDContPovNumber(UINT rID); // Get the number of descrete-type POV hats defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl GetVJDAxisExist(UINT rID, UINT Axis); // Test if given axis defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl GetVJDAxisMax(UINT rID, UINT Axis, LONG * Max); // Get logical Maximum value for a given axis defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl GetVJDAxisMin(UINT rID, UINT Axis, LONG * Min); // Get logical Minimum value for a given axis defined in the specified VDJ
VJOYINTERFACE_API enum VjdStat __cdecl GetVJDStatus(UINT rID); // Get the status of the specified vJoy Device.
// Added in 2.1.6
VJOYINTERFACE_API BOOL __cdecl isVJDExists(UINT rID); // TRUE if the specified vJoy Device exists
// Added in 2.1.8
VJOYINTERFACE_API int __cdecl GetOwnerPid(UINT rID); // Reurn owner's Process ID if the specified vJoy Device exists
///// Write access to vJoy Device - Basic
VJOYINTERFACE_API BOOL __cdecl AcquireVJD(UINT rID); // Acquire the specified vJoy Device.
VJOYINTERFACE_API VOID __cdecl RelinquishVJD(UINT rID); // Relinquish the specified vJoy Device.
VJOYINTERFACE_API BOOL __cdecl UpdateVJD(UINT rID, PVOID pData); // Update the position data of the specified vJoy Device.
///// Write access to vJoy Device - Modifyiers
// This group of functions modify the current value of the position data
// They replace the need to create a structure of position data then call UpdateVJD
//// Reset functions
VJOYINTERFACE_API BOOL __cdecl ResetVJD(UINT rID); // Reset all controls to predefined values in the specified VDJ
VJOYINTERFACE_API VOID __cdecl ResetAll(void); // Reset all controls to predefined values in all VDJ
VJOYINTERFACE_API BOOL __cdecl ResetButtons(UINT rID); // Reset all buttons (To 0) in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl ResetPovs(UINT rID); // Reset all POV Switches (To -1) in the specified VDJ
// Write data
VJOYINTERFACE_API BOOL __cdecl SetAxis(LONG Value, UINT rID, UINT Axis); // Write Value to a given axis defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl SetBtn(BOOL Value, UINT rID, UCHAR nBtn); // Write Value to a given button defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl SetDiscPov(int Value, UINT rID, UCHAR nPov); // Write Value to a given descrete POV defined in the specified VDJ
VJOYINTERFACE_API BOOL __cdecl SetContPov(DWORD Value, UINT rID, UCHAR nPov); // Write Value to a given continuous POV defined in the specified VDJ
#pragma region FFB Function prototypes
// Force Feedback (FFB) functions
VJOYINTERFACE_API FFBEType __cdecl FfbGetEffect(); // Returns effect serial number if active, 0 if inactive
VJOYINTERFACE_API VOID __cdecl FfbRegisterGenCB(FfbGenCB cb, PVOID data);
__declspec(deprecated("** FfbStart function was deprecated - you can remove it from your code **")) \
VJOYINTERFACE_API BOOL __cdecl FfbStart(UINT rID); // Start the FFB queues of the specified vJoy Device.
__declspec(deprecated("** FfbStop function was deprecated - you can remove it from your code **")) \
VJOYINTERFACE_API VOID __cdecl FfbStop(UINT rID); // Stop the FFB queues of the specified vJoy Device.
// Added in 2.1.6
VJOYINTERFACE_API BOOL __cdecl IsDeviceFfb(UINT rID);
VJOYINTERFACE_API BOOL __cdecl IsDeviceFfbEffect(UINT rID, UINT Effect);
// Force Feedback (FFB) helper functions
VJOYINTERFACE_API DWORD __cdecl Ffb_h_DeviceID(const FFB_DATA * Packet, int *DeviceID);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Type(const FFB_DATA * Packet, FFBPType *Type);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Packet(const FFB_DATA * Packet, WORD *Type, int *DataSize, BYTE *Data[]);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_EBI(const FFB_DATA * Packet, int *Index);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Report(const FFB_DATA * Packet, FFB_EFF_REPORT* Effect);
__declspec(deprecated("** Ffb_h_Eff_Const function was deprecated - Use function Ffb_h_Eff_Report **")) \
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Const(const FFB_DATA * Packet, FFB_EFF_CONST* Effect);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Ramp(const FFB_DATA * Packet, FFB_EFF_RAMP* RampEffect);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_EffOp(const FFB_DATA * Packet, FFB_EFF_OP* Operation);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_DevCtrl(const FFB_DATA * Packet, FFB_CTRL * Control);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Period(const FFB_DATA * Packet, FFB_EFF_PERIOD* Effect);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Cond(const FFB_DATA * Packet, FFB_EFF_COND* Condition);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_DevGain(const FFB_DATA * Packet, BYTE * Gain);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Envlp(const FFB_DATA * Packet, FFB_EFF_ENVLP* Envelope);
VJOYINTERFACE_API DWORD __cdecl Ffb_h_EffNew(const FFB_DATA * Packet, FFBEType * Effect);
// Added in 2.1.6
VJOYINTERFACE_API DWORD __cdecl Ffb_h_Eff_Constant(const FFB_DATA * Packet, FFB_EFF_CONSTANT * ConstantEffect);
#pragma endregion
#pragma warning( pop )
#ifndef STATIC
} // extern "C"
#else
} // Namespace vJoyNS
#endif

View file

@ -1,21 +0,0 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <basetyps.h>
#include <cfgmgr32.h>
#include <Setupapi.h>
#include <strsafe.h>
#include <Newdev.h>
#include <INITGUID.H>
// TODO: reference additional headers your program requires here

View file

@ -1,571 +0,0 @@
// vJoyClient.cpp : Simple feeder application with a FFB demo
//
// Monitor Force Feedback (FFB) vJoy device
#include "stdafx.h"
//#include "Devioctl.h"
#include "public.h"
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include "vjoyinterface.h"
#include "Math.h"
// Default device ID (Used when ID not specified)
#define DEV_ID 1
// Prototypes
void CALLBACK FfbFunction(PVOID data);
void CALLBACK FfbFunction1(PVOID cb, PVOID data);
BOOL PacketType2Str(FFBPType Type, LPTSTR Str);
BOOL EffectType2Str(FFBEType Ctrl, LPTSTR Str);
BOOL DevCtrl2Str(FFB_CTRL Type, LPTSTR Str);
BOOL EffectOpStr(FFBOP Op, LPTSTR Str);
int Polar2Deg(BYTE Polar);
int Byte2Percent(BYTE InByte);
int TwosCompByte2Int(BYTE in);
int ffb_direction = 0;
int ffb_strenght = 0;
int serial_result = 0;
JOYSTICK_POSITION_V2 iReport; // The structure that holds the full position data
int
__cdecl
_tmain(int argc, _TCHAR* argv[])
{
int stat = 0;
UINT DevID = DEV_ID;
USHORT X = 0;
USHORT Y = 0;
USHORT Z = 0;
LONG Btns = 0;
PVOID pPositionMessage;
UINT IoCode = LOAD_POSITIONS;
UINT IoSize = sizeof(JOYSTICK_POSITION);
// HID_DEVICE_ATTRIBUTES attrib;
BYTE id = 1;
UINT iInterface = 1;
// Define the effect names
static FFBEType FfbEffect= (FFBEType)-1;
LPCTSTR FfbEffectName[] =
{"NONE", "Constant Force", "Ramp", "Square", "Sine", "Triangle", "Sawtooth Up",\
"Sawtooth Down", "Spring", "Damper", "Inertia", "Friction", "Custom Force"};
// Set the target Joystick - get it from the command-line
if (argc>1)
DevID = _tstoi(argv[1]);
// Get the driver attributes (Vendor ID, Product ID, Version Number)
if (!vJoyEnabled())
{
_tprintf("Function vJoyEnabled Failed - make sure that vJoy is installed and enabled\n");
int dummy = getchar();
stat = - 2;
goto Exit;
}
else
{
wprintf(L"Vendor: %s\nProduct :%s\nVersion Number:%s\n", static_cast<TCHAR *> (GetvJoyManufacturerString()), static_cast<TCHAR *>(GetvJoyProductString()), static_cast<TCHAR *>(GetvJoySerialNumberString()));
};
// Get the status of the vJoy device before trying to acquire it
VjdStat status = GetVJDStatus(DevID);
switch (status)
{
case VJD_STAT_OWN:
_tprintf("vJoy device %d is already owned by this feeder\n", DevID);
break;
case VJD_STAT_FREE:
_tprintf("vJoy device %d is free\n", DevID);
break;
case VJD_STAT_BUSY:
_tprintf("vJoy device %d is already owned by another feeder\nCannot continue\n", DevID);
return -3;
case VJD_STAT_MISS:
_tprintf("vJoy device %d is not installed or disabled\nCannot continue\n", DevID);
return -4;
default:
_tprintf("vJoy device %d general error\nCannot continue\n", DevID);
return -1;
};
// Acquire the vJoy device
if (!AcquireVJD(DevID))
{
_tprintf("Failed to acquire vJoy device number %d.\n", DevID);
int dummy = getchar();
stat = -1;
goto Exit;
}
else
_tprintf("Acquired device number %d - OK\n", DevID);
// Start FFB
#if 1
BOOL Ffbstarted = FfbStart(DevID);
if (!Ffbstarted)
{
_tprintf("Failed to start FFB on vJoy device number %d.\n", DevID);
int dummy = getchar();
stat = -3;
goto Exit;
}
else
_tprintf("Started FFB on vJoy device number %d - OK\n", DevID);
#endif // 1
// Register Generic callback function
// At this point you instruct the Receptor which callback function to call with every FFB packet it receives
// It is the role of the designer to register the right FFB callback function
FfbRegisterGenCB(FfbFunction1, NULL);
// Start endless loop
// The loop injects position data to the vJoy device
// If it fails it let's the user try again
//
// FFB Note:
// All FFB activity is performed in a separate thread created when registered the callback function
while (1)
{
// Set destenition vJoy device
id = (BYTE)DevID;
iReport.bDevice = id;
// Set position data of 3 first axes
if (Z>35000) Z=0;
Z += 200;
iReport.wAxisZ = Z;
iReport.wAxisX = 32000-Z;
iReport.wAxisY = Z/2+7000;
// Set position data of first 8 buttons
Btns = 1<<(Z/4000);
iReport.lButtons = Btns;
// Send position data to vJoy device
pPositionMessage = (PVOID)(&iReport);
if (!UpdateVJD(DevID, pPositionMessage))
{
printf("Feeding vJoy device number %d failed - try to enable device then press enter\n", DevID);
getchar();
AcquireVJD(DevID);
}
Sleep(2);
}
Exit:
RelinquishVJD(DevID);
return 0;
}
// Generic callback function
void CALLBACK FfbFunction(PVOID data)
{
FFB_DATA * FfbData = (FFB_DATA *)data;
int size = FfbData->size;
_tprintf("\nFFB Size %d\n", size);
_tprintf("Cmd:%08.8X ", FfbData->cmd);
_tprintf("ID:%02.2X ", FfbData->data[0]);
_tprintf("Size:%02.2d ", static_cast<int>(FfbData->size - 8));
_tprintf(" - ");
for (UINT i = 0; i < FfbData->size - 8; i++)
_tprintf(" %02.2X", (UINT)FfbData->data);
_tprintf("\n");
}
void CALLBACK FfbFunction1(PVOID data, PVOID userdata)
{
// Packet Header
_tprintf("\n ============= FFB Packet size Size %d =============\n", static_cast<int>(((FFB_DATA *)data)->size));
/////// Packet Device ID, and Type Block Index (if exists)
#pragma region Packet Device ID, and Type Block Index
int DeviceID, BlockIndex;
FFBPType Type;
TCHAR TypeStr[100];
if (ERROR_SUCCESS == Ffb_h_DeviceID((FFB_DATA *)data, &DeviceID))
_tprintf("\n > Device ID: %d", DeviceID);
if (ERROR_SUCCESS == Ffb_h_Type((FFB_DATA *)data, &Type))
{
if (!PacketType2Str(Type, TypeStr))
_tprintf("\n > Packet Type: %d", Type);
else
_tprintf("\n > Packet Type: %s", TypeStr);
}
if (ERROR_SUCCESS == Ffb_h_EBI((FFB_DATA *)data, &BlockIndex))
_tprintf("\n > Effect Block Index: %d", BlockIndex);
#pragma endregion
/////// Effect Report
#pragma region Effect Report
FFB_EFF_CONST Effect;
if (ERROR_SUCCESS == Ffb_h_Eff_Report((FFB_DATA *)data, &Effect))
{
if (!EffectType2Str(Effect.EffectType, TypeStr))
_tprintf("\n >> Effect Report: %02x", Effect.EffectType);
else
_tprintf("\n >> Effect Report: %s", TypeStr);
if (Effect.Polar)
{
_tprintf("\n >> Direction: %d deg (%02x)", Polar2Deg(Effect.Direction), Effect.Direction);
}
else
{
_tprintf("\n >> X Direction: %02x", Effect.DirX);
_tprintf("\n >> Y Direction: %02x", Effect.DirY);
};
if (Effect.Duration == 0xFFFF)
_tprintf("\n >> Duration: Infinit");
else
_tprintf("\n >> Duration: %d MilliSec", static_cast<int>(Effect.Duration));
if (Effect.TrigerRpt == 0xFFFF)
_tprintf("\n >> Trigger Repeat: Infinit");
else
_tprintf("\n >> Trigger Repeat: %d", static_cast<int>(Effect.TrigerRpt));
if (Effect.SamplePrd == 0xFFFF)
_tprintf("\n >> Sample Period: Infinit");
else
_tprintf("\n >> Sample Period: %d", static_cast<int>(Effect.SamplePrd));
_tprintf("\n >> Gain: %d%%", Byte2Percent(Effect.Gain));
};
#pragma endregion
#pragma region PID Device Control
FFB_CTRL Control;
TCHAR CtrlStr[100];
if (ERROR_SUCCESS == Ffb_h_DevCtrl((FFB_DATA *)data, &Control) && DevCtrl2Str(Control, CtrlStr))
_tprintf("\n >> PID Device Control: %s", CtrlStr);
#pragma endregion
#pragma region Effect Operation
FFB_EFF_OP Operation;
TCHAR EffOpStr[100];
if (ERROR_SUCCESS == Ffb_h_EffOp((FFB_DATA *)data, &Operation) && EffectOpStr(Operation.EffectOp, EffOpStr))
{
_tprintf("\n >> Effect Operation: %s", EffOpStr);
if (Operation.LoopCount == 0xFF)
_tprintf("\n >> Loop until stopped");
else
_tprintf("\n >> Loop %d times", static_cast<int>(Operation.LoopCount));
};
#pragma endregion
#pragma region Global Device Gain
BYTE Gain;
if (ERROR_SUCCESS == Ffb_h_DevGain((FFB_DATA *)data, &Gain))
_tprintf("\n >> Global Device Gain: %d", Byte2Percent(Gain));
#pragma endregion
#pragma region Condition
FFB_EFF_COND Condition;
if (ERROR_SUCCESS == Ffb_h_Eff_Cond((FFB_DATA *)data, &Condition))
{
if (Condition.isY)
_tprintf("\n >> Y Axis");
else
_tprintf("\n >> X Axis");
_tprintf("\n >> Center Point Offset: %d", TwosCompByte2Int(Condition.CenterPointOffset)*10000/127);
_tprintf("\n >> Positive Coefficient: %d", TwosCompByte2Int(Condition.PosCoeff)*10000/127);
_tprintf("\n >> Negative Coefficient: %d", TwosCompByte2Int(Condition.NegCoeff)*10000/127);
_tprintf("\n >> Positive Saturation: %d", Condition.PosSatur*10000/255);
_tprintf("\n >> Negative Saturation: %d", Condition.NegSatur*10000/255);
_tprintf("\n >> Dead Band: %d", Condition.DeadBand*10000/255);
}
#pragma endregion
#pragma region Envelope
FFB_EFF_ENVLP Envelope;
if (ERROR_SUCCESS == Ffb_h_Eff_Envlp((FFB_DATA *)data, &Envelope))
{
_tprintf("\n >> Attack Level: %d", Envelope.AttackLevel*10000/255);
_tprintf("\n >> Fade Level: %d", Envelope.FadeLevel*10000/255);
_tprintf("\n >> Attack Time: %d", static_cast<int>(Envelope.AttackTime));
_tprintf("\n >> Fade Time: %d", static_cast<int>(Envelope.FadeTime));
};
#pragma endregion
#pragma region Periodic
FFB_EFF_PERIOD EffPrd;
if (ERROR_SUCCESS == Ffb_h_Eff_Period((FFB_DATA *)data, &EffPrd))
{
_tprintf("\n >> Magnitude: %d", EffPrd.Magnitude * 10000 / 255);
_tprintf("\n >> Offset: %d", TwosCompByte2Int(EffPrd.Offset) * 10000 / 127);
_tprintf("\n >> Phase: %d", EffPrd.Phase * 3600 / 255);
_tprintf("\n >> Period: %d", static_cast<int>(EffPrd.Period));
};
#pragma endregion
#pragma region Effect Type
FFBEType EffectType;
if (ERROR_SUCCESS == Ffb_h_EffNew((FFB_DATA *)data, &EffectType))
{
if (EffectType2Str(EffectType, TypeStr))
_tprintf("\n >> Effect Type: %s", TypeStr);
else
_tprintf("\n >> Effect Type: Unknown");
}
#pragma endregion
#pragma region Ramp Effect
FFB_EFF_RAMP RampEffect;
if (ERROR_SUCCESS == Ffb_h_Eff_Ramp((FFB_DATA *)data, &RampEffect))
{
_tprintf("\n >> Ramp Start: %d", TwosCompByte2Int(RampEffect.Start) * 10000 / 127);
_tprintf("\n >> Ramp End: %d", TwosCompByte2Int(RampEffect.End) * 10000 / 127);
};
#pragma endregion
_tprintf("\n");
FfbFunction(data);
_tprintf("\n ====================================================\n");
}
// Convert Packet type to String
BOOL PacketType2Str(FFBPType Type, LPTSTR OutStr)
{
BOOL stat = TRUE;
LPTSTR Str="";
switch (Type)
{
case PT_EFFREP:
Str = "Effect Report";
break;
case PT_ENVREP:
Str = "Envelope Report";
break;
case PT_CONDREP:
Str = "Condition Report";
break;
case PT_PRIDREP:
Str = "Periodic Report";
break;
case PT_CONSTREP:
Str = "Constant Force Report";
break;
case PT_RAMPREP:
Str = "Ramp Force Report";
break;
case PT_CSTMREP:
Str = "Custom Force Data Report";
break;
case PT_SMPLREP:
Str = "Download Force Sample";
break;
case PT_EFOPREP:
Str = "Effect Operation Report";
break;
case PT_BLKFRREP:
Str = "PID Block Free Report";
break;
case PT_CTRLREP:
Str = "PID Device Contro";
break;
case PT_GAINREP:
Str = "Device Gain Report";
break;
case PT_SETCREP:
Str = "Set Custom Force Report";
break;
case PT_NEWEFREP:
Str = "Create New Effect Report";
break;
case PT_BLKLDREP:
Str = "Block Load Report";
break;
case PT_POOLREP:
Str = "PID Pool Report";
break;
default:
stat = FALSE;
break;
}
if (stat)
_tcscpy_s(OutStr, 100, Str);
return stat;
}
// Convert Effect type to String
BOOL EffectType2Str(FFBEType Type, LPTSTR OutStr)
{
BOOL stat = TRUE;
LPTSTR Str="";
switch (Type)
{
case ET_NONE:
stat = FALSE;
break;
case ET_CONST:
Str="Constant Force";
break;
case ET_RAMP:
Str="Ramp";
break;
case ET_SQR:
Str="Square";
break;
case ET_SINE:
Str="Sine";
break;
case ET_TRNGL:
Str="Triangle";
break;
case ET_STUP:
Str="Sawtooth Up";
break;
case ET_STDN:
Str="Sawtooth Down";
break;
case ET_SPRNG:
Str="Spring";
break;
case ET_DMPR:
Str="Damper";
break;
case ET_INRT:
Str="Inertia";
break;
case ET_FRCTN:
Str="Friction";
break;
case ET_CSTM:
Str="Custom Force";
break;
default:
stat = FALSE;
break;
};
if (stat)
_tcscpy_s(OutStr, 100, Str);
return stat;
}
// Convert PID Device Control to String
BOOL DevCtrl2Str(FFB_CTRL Ctrl, LPTSTR OutStr)
{
BOOL stat = TRUE;
LPTSTR Str="";
switch (Ctrl)
{
case CTRL_ENACT:
Str="Enable Actuators";
break;
case CTRL_DISACT:
Str="Disable Actuators";
break;
case CTRL_STOPALL:
Str="Stop All Effects";
break;
case CTRL_DEVRST:
Str="Device Reset";
break;
case CTRL_DEVPAUSE:
Str="Device Pause";
break;
case CTRL_DEVCONT:
Str="Device Continue";
break;
default:
stat = FALSE;
break;
}
if (stat)
_tcscpy_s(OutStr, 100, Str);
return stat;
}
// Convert Effect operation to string
BOOL EffectOpStr(FFBOP Op, LPTSTR OutStr)
{
BOOL stat = TRUE;
LPTSTR Str="";
switch (Op)
{
case EFF_START:
Str="Effect Start";
break;
case EFF_SOLO:
Str="Effect Solo Start";
break;
case EFF_STOP:
Str="Effect Stop";
break;
default:
stat = FALSE;
break;
}
if (stat)
_tcscpy_s(OutStr, 100, Str);
return stat;
}
// Polar values (0x00-0xFF) to Degrees (0-360)
int Polar2Deg(BYTE Polar)
{
return ((UINT)Polar*360)/255;
}
// Convert range 0x00-0xFF to 0%-100%
int Byte2Percent(BYTE InByte)
{
return ((UINT)InByte*100)/255;
}
// Convert One-Byte 2's complement input to integer
int TwosCompByte2Int(BYTE in)
{
int tmp;
BYTE inv = ~in;
BOOL isNeg = in>>7;
if (isNeg)
{
tmp = (int)(inv);
tmp = -1*tmp;
return tmp;
}
else
return (int)in;
}

View file

@ -1,32 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vJoyClient", "vJoyClient.vcproj", "{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Rel64|Win32 = Rel64|Win32
Rel64|x64 = Rel64|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Debug|Win32.ActiveCfg = Debug|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Debug|Win32.Build.0 = Debug|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Debug|x64.ActiveCfg = Debug|x64
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Debug|x64.Build.0 = Debug|x64
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Rel64|Win32.ActiveCfg = Rel64|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Rel64|Win32.Build.0 = Rel64|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Rel64|x64.ActiveCfg = Rel64|x64
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Rel64|x64.Build.0 = Rel64|x64
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Release|Win32.ActiveCfg = Release|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Release|Win32.Build.0 = Release|Win32
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Release|x64.ActiveCfg = Release|x64
{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View file

@ -1,529 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="vJoyClient"
ProjectGUID="{A3C0D9FE-F4A3-45F9-874A-AC2E6806477C}"
RootNamespace="vJoyClient"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
<Platform
Name="x64"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
UseUnicodeResponseFiles="true"
Optimization="0"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib vJoyInterface.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="..\lib"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description=""
CommandLine="Copy /y ..\lib\vjoyinterface.dll $(OutDir)\."
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
UseUnicodeResponseFiles="true"
Optimization="0"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib vJoyInterface.lib"
LinkIncremental="2"
AdditionalLibraryDirectories="..\lib\amd64"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine="copy /y ..\lib\amd64\vjoyinterface.dll $(OutDir)\."
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib vJoyInterface.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="..\lib"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine="Copy /y ..\lib\vjoyinterface.dll $(OutDir)\."
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib vJoyInterface.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="..\lib\amd64"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
CommandLine="copy /y ..\lib\amd64\vjoyinterface.dll $(OutDir)\."
/>
</Configuration>
<Configuration
Name="Rel64|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="..\lib"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Rel64|x64"
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
AdditionalIncludeDirectories="..\inc"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Setupapi.lib"
LinkIncremental="1"
AdditionalLibraryDirectories="..\lib"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\vJoyClient.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath="..\inc\public.h"
>
</File>
<File
RelativePath=".\stdafx.h"
>
</File>
<File
RelativePath="..\inc\vjoyinterface.h"
>
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>