Preliminary Upload for Build 80

This commit is contained in:
bm98 2020-03-08 18:30:44 +01:00
parent ae56478bdc
commit 220cd3d73d
29 changed files with 1211 additions and 500 deletions

View File

@ -28,7 +28,7 @@ public class GamepadCls : DeviceCls
public new const string DeviceID = "xi1_";
static public int RegisteredDevices = 0;
public const string DevNameCIG = "Controller (Gamepad)"; // seems CIG names the Gamepad always like this - and not as the device replies
public const string DevGUIDCIG = "{}"; // @@@ t.b.d.
public const string DevGUIDCIG = "{028E045E-0000-0000-0000-504944564944}"; // - Fixed for Gamepads - just one of the many possible -
public const string JsUnknown = "xi_";
public new const string DisabledInput = DeviceID + DeviceCls.DisabledInput;

View File

@ -23,9 +23,56 @@ class ActionItem
// Input Device Refs
public string DeviceName { get; set; } = ""; // Device Name
public string DeviceProdGuid { get; set; } = ""; // Device Product GUID
public string InputType { get; set; } = ""; // K, M, J, G (keyb, mouse, joystick, gamepad)
public string InputType { get; set; } = ""; // K1, M1, Jn, G1 (keyb, mouse, joystick jsN number 1.., gamepad)
// Command Input Ref - match required to find the display location
public string ControlInput { get; set; } = ""; // buttonN, hatN_up,_right,_down,_left, [rot]xyz, sliderN (CryInput notification)
/// <summary>
/// Returnd the PID VID part of the device GUID in lowercase
/// or an empty string...
/// </summary>
public string DevicePidVid
{
get {
if ( DeviceProdGuid.Length > 9 ) {
return DeviceProdGuid.Substring( 1, 8 ).ToLowerInvariant( );
}
return DeviceProdGuid;
}
}
public string InputTypeLetter { get => InputType.Substring( 0, 1 ); }
public short InputTypeNumber { get => short.Parse( InputType.Substring( 1 ) ); } // cannot fail else we have a program error...
/// <summary>
/// Returns the Modifier for this item
/// i.e.
/// </summary>
public string Modifier
{
get {
// input can be: {modifier+}Input
if ( !ControlInput.Contains( "+" ) ) return ""; // no modifier
string[] e = ControlInput.Split( new char[] { '+' } );
string mod = "";
for ( int i = 0; i < e.Length - 1; i++ ) {
mod += MapProps.ModS( e[i] );
}
return "("+mod+")";
}
}
/// <summary>
/// Returns the DispText with Modding added
/// </summary>
public string ModdedDispText
{
get {
return Modifier+DispText;
}
}
}
}

View File

@ -11,6 +11,70 @@ namespace SCJMapper_V2.Layout
/// </summary>
class ActionItemList : List<ActionItem>
{
public class Tracker
{
public string PidVid { get; set; } = "";
private short m_lowN = 100;
private short m_highN = 0;
public short LowN { get => m_lowN; }
public short HighN { get => m_highN; }
/// <summary>
/// Add a JsN number and keep track of low and high
/// </summary>
/// <param name="n"></param>
public void AddNumber( short n )
{
m_lowN = ( n < m_lowN ) ? n : m_lowN;
m_highN = ( n > m_highN ) ? n : m_highN;
}
}
private Dictionary<string, Tracker> m_trackers = new Dictionary<string, Tracker>( );
private Tracker GetTracker( string pidVid )
{
if ( m_trackers.ContainsKey( pidVid ) ) {
return m_trackers[pidVid];
}
return null;
}
/// <summary>
/// Returns true if the jsN number is the lower one
/// </summary>
/// <param name="pidVid">Device pidvid</param>
/// <param name="jsN">The JsN number</param>
/// <returns></returns>
public bool IsFirstInstance( string pidVid, short jsN )
{
var tracker = GetTracker( pidVid );
if ( tracker == null ) return true;
return ( jsN == tracker.LowN );
}
/// <summary>
/// Keep track of JsNs while adding stuff
/// </summary>
/// <param name="actionItem"></param>
public new void Add( ActionItem actionItem )
{
base.Add( actionItem );
if ( actionItem.InputTypeLetter != "J" ) return; // track only Joysticks
if ( !m_trackers.ContainsKey( actionItem.DevicePidVid ) ) {
// newly seen device
m_trackers.Add( actionItem.DevicePidVid, new Tracker( ) { PidVid = actionItem.DevicePidVid } );
}
m_trackers[actionItem.DevicePidVid].AddNumber( actionItem.InputTypeNumber );
}
/// <summary>
/// Get the Devices contained in the List
/// </summary>
@ -26,5 +90,7 @@ public List<string> Devices
return list;
}
}
}
}

222
Layout/DbgActionItemList.cs Normal file
View File

@ -0,0 +1,222 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SCJMapper_V2.Devices.Gamepad;
namespace SCJMapper_V2.Layout
{
/// <summary>
/// Create an ActionItemList for Layout Debug
/// contains allmost all possible items ...
/// </summary>
class DbgActionItemList
{
private ActionItemList m_actionItems = new ActionItemList( );
public ActionItemList DbgList { get => m_actionItems; }
private ActionItem AI_Button( string aMap, short bNum, short jNum, string guid )
{
var ai = new ActionItem {
ActionMap = aMap,
ControlInput = $"button{bNum}",
DeviceName = "Debug Controller",
DeviceProdGuid = guid,
DispText = $"Joy{jNum} - Button {bNum}",
InputType = $"J{jNum}"
};
return ai;
}
private List<ActionItem> AI_POV( string aMap, short povNum, short jNum, string guid )
{
var ail = new List<ActionItem>( );
var ai = new ActionItem {
ActionMap = aMap, ControlInput = $"hat{povNum}_up", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - POV {povNum} Up", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"hat{povNum}_right", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - POV {povNum} Right", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"hat{povNum}_down", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - POV {povNum} Down", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"hat{povNum}_left", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - POV {povNum} Left", InputType = $"J{jNum}"
}; ail.Add( ai );
return ail;
}
private List<ActionItem> AI_Analog( string aMap, short jNum, string guid )
{
var ail = new List<ActionItem>( );
var ai = new ActionItem {
ActionMap = aMap, ControlInput = $"x", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - X - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"y", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - Y - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"z", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - Z - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"rotx", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - RotX - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"roty", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - RotY - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"rotz", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - RotZ - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"slider1", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - Slider 1 - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"slider2", DeviceName = "Debug Controller",
DeviceProdGuid = guid, DispText = $"Joy{jNum} - Slider 2 - Axis", InputType = $"J{jNum}"
}; ail.Add( ai );
return ail;
}
private List<ActionItem> AI_Gamepad( string aMap )
{
var ail = new List<ActionItem>( );
var ai = new ActionItem {
ActionMap = aMap, ControlInput = $"x", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button X", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"a", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button A", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"b", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button B", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"y", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Y", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"shoulderl", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Shoulder Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"shoulderr", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Shoulder Right", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"triggerl_btn", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Trigger Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"triggerr_btn", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Trigger Right", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"back", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Back", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"start", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Start", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumbl", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Thumb Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumbr", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Button Thumb Right", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"dpad_up", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Up", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"dpad_right", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Right", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"dpad_down", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Down", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"dpad_left", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - POV Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumblx", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - X - Axis Thumb Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumbly", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Y - Axis Thumb Left", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumbrx", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - X - Axis Thumb Right", InputType = $"G1"
}; ail.Add( ai );
ai = new ActionItem {
ActionMap = aMap, ControlInput = $"thumbry", DeviceName = "Debug Controller",
DeviceProdGuid = GamepadCls.DevGUIDCIG, DispText = $"GP - Y - Axis Thumb Right", InputType = $"G1"
}; ail.Add( ai );
return ail;
}
/// <summary>
/// Create a debug list for all the guids provided
/// </summary>
/// <param name="guids">Array: At least one guid </param>
public void CreateDebugList( string[] guids )
{
// create Joysticks js1..js4 for the provided GUIDs
for ( int joy = 0; joy < guids.Length; joy++ ) {
// Joy Buttons are in "spaceship_general"
for ( int i = 1; i <= 32; i++ ) {
m_actionItems.Add( AI_Button( "spaceship_general", (short)i, (short)( joy + 1 ), guids[joy] ) );
}
// Joy POVs are in "spaceship_view"
for ( int i = 1; i <= 4; i++ ) {
m_actionItems.AddRange( AI_POV( "spaceship_view", (short)i, (short)( joy + 1 ), guids[joy] ) );
}
// Joy Analogs are in "spaceship_movement"
m_actionItems.AddRange( AI_Analog( "spaceship_movement", (short)( joy + 1 ), guids[joy] ) );
}
// Create Gamepad
// Joy Analogs are in "spaceship_targeting"
m_actionItems.AddRange( AI_Gamepad( "spaceship_targeting" ) );
// Create Gamepad modified
// Create Keyboard
}
}
}

View File

@ -11,20 +11,27 @@ namespace SCJMapper_V2.Layout
// The Json file for a controller
/*
{
"InputDevice" : {
"InputType": "Joystick",
"DeviceName": "SaitekX55Joystick",
"DeviceProdGuid": "{6dfb1c7b-7808-4f43-9dec-e9a4d83fcf4f}",
"MapImage": "x55-joystick.jpg",
{
"MapName" : "T.16000M Joystick (right)",
"MapImage" : "T16000M.jpg",
"InputDevices" :[
{
"InputType": "J1",
"DeviceName": "T16000M",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "B1", "Type": "Digital", "X": 2044, "Y": 604, "Width": 642, "Height": 108, "Cmt": "Primary trigger" },
...
]
}
}
]
}
]
}
*/
/// <summary>
/// The Device Mapping File
/// </summary>
[DataContract]
class DeviceFile
{
@ -36,7 +43,7 @@ class DeviceFile
public List<Device> InputDevices { get; set; } = new List<Device>( );
/// <summary>
/// Create all possible ShapeItems for this Device
/// Create all possible ShapeItems for this Mapping File
/// </summary>
public void CreateShapes()
{
@ -48,17 +55,24 @@ public void CreateShapes()
/// <summary>
/// Find a Control entry with the given product guid and input command
/// </summary>
/// <param name="pGuid">the Device Prduct GUID</param>
/// <param name="item">the Item (device property)</param>
/// <param name="pidVid">the Device Prduct PID VID string in lowecase</param>
/// <param name="input">the Item (device property)</param>
/// <param name="firstInstance">If true it looks for the InputTypeNumber 1 (InputType="x1") else for the next</param>
/// <returns>The found Control or Null</returns>
public Control FindItem( string pGuid, string item )
public Control FindItem( string pidVid, string input, bool firstInstance )
{
if ( string.IsNullOrEmpty( pGuid ) ) return null;
if ( string.IsNullOrEmpty( item ) ) return null;
if ( string.IsNullOrEmpty( pidVid ) ) return null;
if ( string.IsNullOrEmpty( input ) ) return null;
for ( int i = 0; i < InputDevices.Count; i++ ) {
if ( InputDevices[i].DevicePIDVID.Contains( pGuid.Substring(1,8).ToLowerInvariant( ) ) ) {
return InputDevices[i].FindItem( item );
if ( InputDevices[i].DevicePIDVID.Contains( pidVid ) ) { // can have multiple PID VIDs for a device (alternates)
// returns if we are asked for the first instance and it is the first one (default)
if ( firstInstance && ( InputDevices[i].InputTypeNumber == 1 ) ) {
return InputDevices[i].FindItem( input );
}
else if (!firstInstance && InputDevices[i].InputTypeNumber > 1 ) {
return InputDevices[i].FindItem( input ); // not first and J2.. - return any other (more than 2 not supported)
}
}
}
return null;
@ -66,20 +80,36 @@ public Control FindItem( string pGuid, string item )
}
/// <summary>
/// One Game Device
/// </summary>
[DataContract]
class Device
{
[DataMember]
[DataMember( IsRequired = true )]
public string InputType { get; set; } // Joystick, Throttle, Pedal, Gamepad, Keyboard, Other
[DataMember]
[DataMember( IsRequired = true )]
public string DeviceName { get; set; } // The device name
[DataMember]
[DataMember( IsRequired = true )]
public List<string> DeviceProdGuid { get; set; } = new List<string>( ); // The device product GUIDs as read by DirecInput
[DataMember]
public List<Control> Controls { get; set; } = new List<Control>( );// The list of Controls supported (see below)
// non Json
public string InputTypeLetter { get => InputType.Substring( 0, 1 ); }
public int InputTypeNumber
{
get {
if ( InputType.Length > 1 ) {
if ( int.TryParse( InputType.Substring( 1 ), out int num ) ) {
return num;
}
}
return 1; //default
}
}
/// <summary>
/// returns the PID VID part of the GUID (seems how this is composed in Win)
/// </summary>
@ -88,7 +118,7 @@ public List<string> DevicePIDVID
get {
var ret = new List<string>( );
foreach ( string s in DeviceProdGuid ) {
string pv = s.Substring( 1, 8 ).ToLowerInvariant(); // this is "{12345678-0000-0000 etc}
string pv = s.Substring( 1, 8 ).ToLowerInvariant( ); // this is "{12345678-0000-0000 etc}
ret.Add( pv );
}
return ret;
@ -98,12 +128,15 @@ public List<string> DevicePIDVID
/// <summary>
/// Find a Control entry with the given input command
/// </summary>
/// <param name="item">the Item (device property)</param>
/// <param name="input">the Item (device property)</param>
/// <returns>The found Control or Null</returns>
public Control FindItem( string item )
public Control FindItem( string input )
{
// input can be: {modifier+}Input
string[] e = input.Split( new char[] { '+' } );
string effInput = e[e.Length - 1]; // last item is the real input
for ( int i = 0; i < Controls.Count; i++ ) {
if ( Controls[i].Input == item ) {
if ( input == Controls[i].Input ) {
return Controls[i];
}
}
@ -120,7 +153,6 @@ public void CreateShapes()
Controls[i].CreateShapes( );
}
}
}
/// <summary>
@ -129,20 +161,20 @@ public void CreateShapes()
[DataContract]
class Control
{
[DataMember]
[DataMember( IsRequired = true )]
public string Input { get; set; } = ""; // buttonN, hatN_up,_right,_down,_left, [rot]xyz, sliderN (CryInput notification)
[DataMember]
public string Type { get; set; } = ""; // "" or Analog or Digital
[DataMember]
[DataMember( IsRequired = true )]
public int X { get; set; } = 0; // X label pos (left=0)
[DataMember]
[DataMember( IsRequired = true )]
public int Y { get; set; } = 0; // Y label pos (top=0)
[DataMember]
[DataMember( IsRequired = true )]
public int Width { get; set; } = 600; // Label field width
[DataMember]
public int Height { get; set; } = 54; // Label field height
[DataMember]
public string Cmt { get; set; } // Comment
public string Cmt { get; set; } = ""; // Comment
// non Json

View File

@ -32,12 +32,15 @@ private void InitializeComponent()
this.chkLbActionGroups = new System.Windows.Forms.ListView();
this.chkLbActionMaps = new System.Windows.Forms.ListView();
this.pnlInput = new System.Windows.Forms.Panel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.btColors = new System.Windows.Forms.Button();
this.btSave = new System.Windows.Forms.Button();
this.btLayout = new System.Windows.Forms.Button();
this.cbxLayouts = new System.Windows.Forms.ComboBox();
this.drawPanel = new System.Windows.Forms.Panel();
this.gbxColors = new System.Windows.Forms.GroupBox();
this.lblFontSize = new System.Windows.Forms.Label();
this.tbFontSize = new System.Windows.Forms.TrackBar();
this.label2 = new System.Windows.Forms.Label();
this.btAcceptColors = new System.Windows.Forms.Button();
this.lblTextColor = new System.Windows.Forms.Label();
@ -47,15 +50,16 @@ private void InitializeComponent()
this.btCancelColors = new System.Windows.Forms.Button();
this.SFD = new System.Windows.Forms.SaveFileDialog();
this.colDlg = new System.Windows.Forms.ColorDialog();
this.tbFontSize = new System.Windows.Forms.TrackBar();
this.lblFontSize = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.txGuid1 = new System.Windows.Forms.TextBox();
this.txGuid2 = new System.Windows.Forms.TextBox();
this.txGuid3 = new System.Windows.Forms.TextBox();
this.btCreateDbgList = new System.Windows.Forms.Button();
this.tlPanel.SuspendLayout();
this.pnlInput.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.drawPanel.SuspendLayout();
this.gbxColors.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.tbFontSize)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// tlPanel
@ -120,6 +124,10 @@ private void InitializeComponent()
// pnlInput
//
this.tlPanel.SetColumnSpan(this.pnlInput, 2);
this.pnlInput.Controls.Add(this.btCreateDbgList);
this.pnlInput.Controls.Add(this.txGuid3);
this.pnlInput.Controls.Add(this.txGuid2);
this.pnlInput.Controls.Add(this.txGuid1);
this.pnlInput.Controls.Add(this.pictureBox1);
this.pnlInput.Controls.Add(this.btColors);
this.pnlInput.Controls.Add(this.btSave);
@ -131,6 +139,18 @@ private void InitializeComponent()
this.pnlInput.Size = new System.Drawing.Size(1292, 74);
this.pnlInput.TabIndex = 1;
//
// pictureBox1
//
this.pictureBox1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.BackgroundImage")));
this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pictureBox1.Cursor = System.Windows.Forms.Cursors.Hand;
this.pictureBox1.Location = new System.Drawing.Point(3, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(82, 71);
this.pictureBox1.TabIndex = 6;
this.pictureBox1.TabStop = false;
this.pictureBox1.DoubleClick += new System.EventHandler(this.pictureBox1_DoubleClick);
//
// btColors
//
this.btColors.Image = global::SCJMapper_V2.Properties.Resources.Settings;
@ -204,6 +224,31 @@ private void InitializeComponent()
this.gbxColors.Text = "Layout Settings";
this.gbxColors.Visible = false;
//
// lblFontSize
//
this.lblFontSize.AutoSize = true;
this.lblFontSize.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblFontSize.Location = new System.Drawing.Point(428, 35);
this.lblFontSize.Name = "lblFontSize";
this.lblFontSize.Size = new System.Drawing.Size(37, 30);
this.lblFontSize.TabIndex = 14;
this.lblFontSize.Text = "16";
//
// tbFontSize
//
this.tbFontSize.LargeChange = 2;
this.tbFontSize.Location = new System.Drawing.Point(248, 30);
this.tbFontSize.Maximum = 22;
this.tbFontSize.Minimum = 12;
this.tbFontSize.Name = "tbFontSize";
this.tbFontSize.Size = new System.Drawing.Size(160, 45);
this.tbFontSize.SmallChange = 2;
this.tbFontSize.TabIndex = 13;
this.tbFontSize.TickFrequency = 2;
this.tbFontSize.TickStyle = System.Windows.Forms.TickStyle.Both;
this.tbFontSize.Value = 16;
this.tbFontSize.Scroll += new System.EventHandler(this.tbFontSize_Scroll);
//
// label2
//
this.label2.AutoSize = true;
@ -299,40 +344,40 @@ private void InitializeComponent()
this.colDlg.AnyColor = true;
this.colDlg.FullOpen = true;
//
// tbFontSize
// txGuid1
//
this.tbFontSize.LargeChange = 2;
this.tbFontSize.Location = new System.Drawing.Point(248, 30);
this.tbFontSize.Maximum = 22;
this.tbFontSize.Minimum = 12;
this.tbFontSize.Name = "tbFontSize";
this.tbFontSize.Size = new System.Drawing.Size(160, 45);
this.tbFontSize.SmallChange = 2;
this.tbFontSize.TabIndex = 13;
this.tbFontSize.TickFrequency = 2;
this.tbFontSize.TickStyle = System.Windows.Forms.TickStyle.Both;
this.tbFontSize.Value = 16;
this.tbFontSize.Scroll += new System.EventHandler(this.tbFontSize_Scroll);
this.txGuid1.Location = new System.Drawing.Point(842, 2);
this.txGuid1.Name = "txGuid1";
this.txGuid1.Size = new System.Drawing.Size(338, 22);
this.txGuid1.TabIndex = 7;
this.txGuid1.Visible = false;
//
// lblFontSize
// txGuid2
//
this.lblFontSize.AutoSize = true;
this.lblFontSize.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblFontSize.Location = new System.Drawing.Point(428, 35);
this.lblFontSize.Name = "lblFontSize";
this.lblFontSize.Size = new System.Drawing.Size(37, 30);
this.lblFontSize.TabIndex = 14;
this.lblFontSize.Text = "16";
this.txGuid2.Location = new System.Drawing.Point(842, 25);
this.txGuid2.Name = "txGuid2";
this.txGuid2.Size = new System.Drawing.Size(338, 22);
this.txGuid2.TabIndex = 8;
this.txGuid2.Visible = false;
//
// pictureBox1
// txGuid3
//
this.pictureBox1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.BackgroundImage")));
this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pictureBox1.Location = new System.Drawing.Point(3, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(82, 71);
this.pictureBox1.TabIndex = 6;
this.pictureBox1.TabStop = false;
this.txGuid3.Location = new System.Drawing.Point(842, 48);
this.txGuid3.Name = "txGuid3";
this.txGuid3.Size = new System.Drawing.Size(338, 22);
this.txGuid3.TabIndex = 9;
this.txGuid3.Visible = false;
//
// btCreateDbgList
//
this.btCreateDbgList.Location = new System.Drawing.Point(1190, 24);
this.btCreateDbgList.Name = "btCreateDbgList";
this.btCreateDbgList.Size = new System.Drawing.Size(74, 24);
this.btCreateDbgList.TabIndex = 10;
this.btCreateDbgList.Text = "Create List";
this.btCreateDbgList.UseVisualStyleBackColor = true;
this.btCreateDbgList.Visible = false;
this.btCreateDbgList.Click += new System.EventHandler(this.btCreateDbgList_Click);
//
// FormLayout
//
@ -350,11 +395,12 @@ private void InitializeComponent()
this.Load += new System.EventHandler(this.FormLayout_Load);
this.tlPanel.ResumeLayout(false);
this.pnlInput.ResumeLayout(false);
this.pnlInput.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.drawPanel.ResumeLayout(false);
this.gbxColors.ResumeLayout(false);
this.gbxColors.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.tbFontSize)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
@ -383,5 +429,9 @@ private void InitializeComponent()
private System.Windows.Forms.TrackBar tbFontSize;
private System.Windows.Forms.Label lblFontSize;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TextBox txGuid3;
private System.Windows.Forms.TextBox txGuid2;
private System.Windows.Forms.TextBox txGuid1;
private System.Windows.Forms.Button btCreateDbgList;
}
}

View File

@ -31,9 +31,22 @@ public partial class FormLayout : Form
internal ActionItemList ActionList { get; set; } = null;
private bool IsDebug()
{
return File.Exists( "DEBUG_LAYOUT.txt" );
}
public FormLayout()
{
InitializeComponent( );
if ( IsDebug( ) ) {
// Show Debug items at startup
txGuid1.Visible = true;
txGuid2.Visible = true;
txGuid3.Visible = true;
btCreateDbgList.Visible = true;
}
}
/// <summary>
@ -190,11 +203,12 @@ private void Populate()
// if ( si.DeviceName == cbxDevices.SelectedItem.ToString( ) ) {
// matches the selected device
if ( MatchCriteria( si ) ) {
var ctrl = ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.FindItem( si.DeviceProdGuid, si.ControlInput );
bool firstInstance = ActionList.IsFirstInstance( si.DevicePidVid, si.InputTypeNumber );
var ctrl = ( cbxLayouts.SelectedItem as DeviceLayout ).DeviceController.FindItem( si.DevicePidVid, si.ControlInput, firstInstance );
if ( ctrl != null ) {
if ( ctrl.ShapeItems.Count > 0 ) {
var shape = ctrl.ShapeItems.Dequeue( );
shape.DispText = si.DispText;
shape.DispText = si.ModdedDispText;
shape.TextColor = MapProps.MapForeColor( si.ActionMap );
shape.BackColor = MapProps.MapBackColor( si.ActionMap );
m_displayList.Add( shape );
@ -291,7 +305,7 @@ private void btAcceptColors_Click( object sender, EventArgs e )
}
foreach ( ListViewItem item in chkLbActionMaps.Items ) {
item.ForeColor = MapProps.GroupColor( MapNameToGroup( item.ToolTipText) ).ForeColor;
item.ForeColor = MapProps.GroupColor( MapNameToGroup( item.ToolTipText ) ).ForeColor;
item.BackColor = MapProps.GroupColor( MapNameToGroup( item.ToolTipText ) ).BackColor;
}
@ -345,7 +359,35 @@ private void tbFontSize_Scroll( object sender, EventArgs e )
lblTest.Font = new Font( lblTest.Font.FontFamily, tbFontSize.Value ); ;
}
private bool m_checkAllToggle = true;
private void pictureBox1_DoubleClick( object sender, EventArgs e )
{
// select all groups
for ( int i = 0; i < chkLbActionGroups.Items.Count; i++ ) {
chkLbActionGroups.Items[i].Checked = m_checkAllToggle;
}
m_checkAllToggle = !m_checkAllToggle; // toggle
}
#endregion
#region DEBUG LIST
private DbgActionItemList DBG_LIST = null;
private void btCreateDbgList_Click( object sender, EventArgs e )
{
DBG_LIST = new DbgActionItemList( );
List<string> guids = new List<string>( );
if ( !string.IsNullOrEmpty( txGuid1.Text ) ) guids.Add( txGuid1.Text );
if ( !string.IsNullOrEmpty( txGuid2.Text ) ) guids.Add( txGuid2.Text );
if ( !string.IsNullOrEmpty( txGuid3.Text ) ) guids.Add( txGuid3.Text );
DBG_LIST.CreateDebugList( guids.ToArray( ) );
ActionList = DBG_LIST.DbgList;
}
#endregion
}
}

View File

@ -120,418 +120,416 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
QmCC
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
</value>
</data>
<data name="btSave.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAASaSURBVGhD1Zn9T1tVGMeLRuOii1mMMSYCi+8mvqBRY3zdmGiMS/zBn/1HdL8YwfmCQ8PccCHM
uBiNW1ic6OILhtCtbBVKW1s7GAFCZJeWl7YWZF0bHs/3ZHeee865d8dabtqbfEJ7ePp9vh9S1o4GiKiu
0R7WE9rDekJ7WE9oD+sJ5SD6ZsDmBcbXjD8ZZDPSsY2GOhs3DeSL+xjYjx7ow7uJfR13wOWh9uTeLZSN
P0eX8q+z4zeugCXLy8vsdvWvXC7H88V92I8e6INeJgKtqQ9vorK1m8h6jSj5CpUjL1Nx9CUOFkQiEYrF
YpRMJmliYoJmZmZofn6eMpkML7G2tkbFYpHK5TJtbGxwcBtn+B5mFhcX+WPw2MnJSZ6FTOTbu7AX+9Gj
vLCbznVuhUSb2NdRHrCBo7kfWojOv0qlMRb0W5uDSgTwGBlPAWkneqBP7uSjEOgX+zrKAzaQWz+9gyjG
yodfVMCCSgTkDE8BYdYGfdZDOyFQEPs6ygM2QMUzu+jS2V38q0zFAlKGp4Awa2P3QT+x75UbNlxgZKcr
FQtIGZ4CwqyMkcBF9hRyo1IBOcNLQJyVMRMIPu9KxQJShqeAMCtjJjD8rCsVC0gZngLCrIyZwNDTrgS7
mmksfOq/CwgZbgLRyFkK7mtyzMqYCfz6lCvx3nsp/OMBYwFcKCxTKpUUgdGfe3i+bq+NmcAvT7qSPv4I
DR9kP4nRU8YCbpcokIieoeDBZ3i+bq+NmcBPj3ty/ov7abi7hSKDPZSKj3gK4CkEcBtn+B5m7KfQVGqM
YkO9NLy/hefq9omYCZx87Kpkjj1E8UN30+mPm7VPEVPweOQgT7dHxkhg/fuWmsVM4LuHaxYzgW8frFnM
BPofqFnMBI7dV7OYCXxzjyvpI3fR7we2U6irSfuvSqUgD7nI1+21MRL4+6s7tUx+1kwjPU9Q5twJuliw
2Hj1LuQhF/nYo9sPzAS+3K6wcLiZwn07qLSeZWPEX5Ty+Txls9n/DXKQhwv54cOtZPUxCU0PM4EjTQrx
/Y00nzjOX1XxSrqyslJ1kIv8C8kTFOtu1PYwE/j8DoXgR42UvjBLhUKBlpaWNg3kZ6w5vk/Xw0yg73YF
/KLhvQ7ew+DrZmHnY5+uh5lA720KCEyn0xzLsigUClUdOx9wAU0PI4G1Q7cqIBDF/QL7dD3MBHpuUUAg
3v76BRfQ9DAT+HSbAgLn5uZ8gwtoepgJdN+sgMDZ2Vnf4AKaHmYCn2xVQOD09DRnamqKBgcHq46dD7iA
poeZQNeNCghEcb/gApoeZgL7tiggEP+B9wsuoOlhJtB5gwICU6mUb3ABTQ8jgdUPrldAIP6M4hfYp+th
IpD7673raPV9JwhMJBKceDxOAwMDVcfOB1xA6oBerN9VPx/oT79zDa3uvdYBAlHcL7iA1AG90E/s6ygP
2EDbH3sClO9gEu/+CwKj0ahvcAFhP/qgF/qJfR3lARsA7Ym3ArTwdgPl2xtotaOBB46Pj/sGF2B7sR89
0Ae90E/s67gDLguAVsZRhsXY9M+HZYTPi7EfPdCHdxP7Ou7UI9rD+oEC/wDpn39oHcs5EQAAAABJRU5E
rkJggg==
iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAABJpJREFUaEPV
mf1PW1UYx4tG46KLWYwxJgKL7ya+oFFjfN2YaIxL/MGf/Ud0vxjB+YJDw9xwIcy4GI1bWJzo4guG0K1s
FUpbWzsYAUJkl5aXthZkXRsez/dkd557zrl3x1pu2pt8Qnt4+n2+H1LWjgaIqK7RHtYT2sN6QntYT2gP
6wnlIPpmwOYFxteMPxlkM9KxjYY6GzcN5Iv7GNiPHujDu4l9HXfA5aH25N4tlI0/R5fyr7PjN66AJcvL
y+x29a9cLsfzxX3Yjx7og14mAq2pD2+isrWbyHqNKPkKlSMvU3H0JQ4WRCIRisVilEwmaWJigmZmZmh+
fp4ymQwvsba2RsVikcrlMm1sbHBwG2f4HmYWFxf5Y/DYyclJnoVM5Nu7sBf70aO8sJvOdW6FRJvY11Ee
sIGjuR9aiM6/SqUxFvRbm4NKBPAYGU8BaSd6oE/u5KMQ6Bf7OsoDNpBbP72DKMbKh19UwIJKBOQMTwFh
1gZ91kM7IVAQ+zrKAzZAxTO76NLZXfyrTMUCUoangDBrY/dBP7HvlRs2XGBkpysVC0gZngLCrIyRwEX2
FHKjUgE5w0tAnJUxEwg+70rFAlKGp4AwK2MmMPysKxULSBmeAsKsjJnA0NOuBLuaaSx86r8LCBluAtHI
WQrua3LMypgJ/PqUK/Heeyn84wFjAVwoLFMqlRSB0Z97eL5ur42ZwC9PupI+/ggNH2Q/idFTxgJulyiQ
iJ6h4MFneL5ur42ZwE+Pe3L+i/tpuLuFIoM9lIqPeArgKQRwG2f4Hmbsp9BUaoxiQ700vL+F5+r2iZgJ
nHzsqmSOPUTxQ3fT6Y+btU8RU/B45CBPt0fGSGD9+5aaxUzgu4drFjOBbx+sWcwE+h+oWcwEjt1Xs5gJ
fHOPK+kjd9HvB7ZTqKtJ+69KpSAPucjX7bUxEvj7qzu1TH7WTCM9T1Dm3Am6WLDYePUu5CEX+dij2w/M
BL7crrBwuJnCfTuotJ5lY8RflPL5PGWz2f8NcpCHC/nhw61k9TEJTQ8zgSNNCvH9jTSfOM5fVfFKurKy
UnWQi/wLyRMU627U9jAT+PwOheBHjZS+MEuFQoGWlpY2DeRnrDm+T9fDTKDvdgX8ouG9Dt7D4OtmYedj
n66HmUDvbQoITKfTHMuyKBQKVR07H3ABTQ8jgbVDtyogEMX9Avt0PcwEem5RQCDe/voFF9D0MBP4dJsC
Aufm5nyDC2h6mAl036yAwNnZWd/gApoeZgKfbFVA4PT0NGdqaooGBwerjp0PuICmh5lA140KCERxv+AC
mh5mAvu2KCAQ/4H3Cy6g6WEm0HmDAgJTqZRvcAFNDyOB1Q+uV0Ag/oziF9in62EikPvrveto9X0nCEwk
Epx4PE4DAwNVx84HXEDqgF6s31U/H+hPv3MNre691gECUdwvuIDUAb3QT+zrKA/YQNsfewKU72AS7/4L
AqPRqG9wAWE/+qAX+ol9HeUBGwDtibcCtPB2A+XbG2i1o4EHjo+P+wYXYHuxHz3QB73QT+zruAMuC4BW
xlGGxdj0z4dlhM+LsR890Id3E/s67tQj2sP6gQL/AOmff2gdyzkRAAAAAElFTkSuQmCC
</value>
</data>
<data name="btLayout.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
0HW+PUD8F0cdfEVoSwiLAAAAAElFTkSuQmCC
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
CIsAAAAASUVORK5CYII=
</value>
</data>
<metadata name="SFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View File

@ -14,6 +14,52 @@ namespace SCJMapper_V2.Layout
/// </summary>
class MapProps
{
public static string ModShoulderLeft = "←";//═
public static string ModShoulderRight = "→";
public static string ModAltLeft = "←Å";
public static string ModAltRight = "→Å";
public static string ModCtrlLeft = "←Ꞓ";
public static string ModCtrlRight = "→Ꞓ";
public static string ModShiftLeft = "←Ȿ";
public static string ModShiftRight = "→Ȿ";
/// <summary>
/// Returns a Layout Modifier string (char) for a given modifier
/// </summary>
/// <param name="modifier">The modifier string</param>
/// <returns></returns>
public static string ModS( string modifier )
{
if ( modifier == "shoulderl" ) {
return ModShoulderLeft;
}
else if ( modifier == "shoulderr" ) {
return ModShoulderRight;
}
else if ( modifier == "lalt" ) {
return ModAltLeft;
}
else if ( modifier == "ralt" ) {
return ModAltRight;
}
else if ( modifier == "lshift" ) {
return ModShiftLeft;
}
else if ( modifier == "rshift" ) {
return ModShiftRight;
}
else if ( modifier == "lctrl" ) {
return ModCtrlLeft;
}
else if ( modifier == "rctrl" ) {
return ModCtrlRight;
}
else {
return "⸮";
}
}
/// <summary>
/// Save Color Settings for the Layout
/// </summary>

View File

@ -32,5 +32,5 @@
// 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.44.0.79" )]
[assembly: AssemblyFileVersion( "2.44.0.79" )]
[assembly: AssemblyVersion( "2.45.0.80" )]
[assembly: AssemblyFileVersion( "2.45.0.80" )]

View File

@ -32,6 +32,7 @@ Device Layout Images and Maps:<br>
<br>
https://github.com/richardbuckle/EDRefCard
<br>
<br>
DDS Skydome Images:<br>
<br>
Canyon, Highway, Shiodome, BigSight, LA Heliport:<br>

View File

@ -1,12 +1,12 @@
SC Joystick Mapper V 2.44 - Build 79 BETA
SC Joystick Mapper V 2.45 - Build 80 BETA
(c) Cassini, StandardToaster - 07-Mar-2020
Contains 14 files + graphics:
SCJMapper.exe The program (V2.44)
SCJMapper.exe.config Program config (V2.44) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.44) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.44) - MUST be in the same folder as the Exe file
SCJMapper.exe The program (V2.45)
SCJMapper.exe.config Program config (V2.45) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.45) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.45) - MUST be in the same folder as the Exe file
Storage\*.scj Folder for collected assets (V2.35) - MUST be in the same folder as the Exe file
PTU_Storage\*.scj Folder for collected PTU (V2.37) - MUST be in the same folder as the Exe file
SharpDX.DirectInput.dll Managed DirectInput Assembly - MUST be in the same folder as the Exe file
@ -23,7 +23,7 @@ SCJMapper_QGuide V2.35beta.pdf Quick Guide (v2.35)
ReadMe.txt This file
graphics folder Skybox Images (V2.32) - graphics folder MUST be in the same folder as the Exe file
graphics\layouts folder Layout Images & defs (V2.44) - layouts folder MUST be in the graphics folder above
graphics\layouts folder Layout Images & defs (V2.45) - layouts folder MUST be in the graphics folder above
NOTE V 2.41+:
search order for defaultProfile.xml to build the action tree is:
@ -47,6 +47,10 @@ Scanned for viruses before packing...
cassini@burri-web.org
Changelog:
V 2.45 - BETA Build 80
- add Some more Layout files for devices
- update Layout to work with dual Joysticks of the same type and Gamepads
- fix for some Layout files and general fixes in the layout part
V 2.44 - BETA Build 79
- added Input device layout dialog and some layouts for the most common device controllers
NOTE: THIS IS VERY EARLY and may break or not show - use the GitHub Issue feature to report

View File

@ -27,8 +27,8 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>79</ApplicationRevision>
<ApplicationVersion>2.44.0.79</ApplicationVersion>
<ApplicationRevision>80</ApplicationRevision>
<ApplicationVersion>2.45.0.80</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -179,6 +179,7 @@
<Compile Include="Layout\ActionGroups.cs" />
<Compile Include="Layout\ActionItem.cs" />
<Compile Include="Layout\ActionItemList.cs" />
<Compile Include="Layout\DbgActionItemList.cs" />
<Compile Include="Layout\MapProps.cs" />
<Compile Include="Layout\ControllerJson.cs" />
<Compile Include="Layout\DeviceFile.cs" />

View File

@ -1330,27 +1330,27 @@ public ActionItemList ReportActionsSItemText()
sItem.ControlInput = acc.Input;
switch ( Act.ADeviceFromDevID( acc.DevID ) ) {
case Act.ActionDevice.AD_Keyboard:
sItem.InputType = "K";
sItem.InputType = "K1";
sItem.DeviceName = KeyboardCls.DeviceClass;
sItem.DeviceProdGuid = "";
sItem.DeviceProdGuid = ""; // not needed - generic
break;
case Act.ActionDevice.AD_Mouse:
sItem.InputType = "M";
sItem.InputType = "M1";
sItem.DeviceName = MouseCls.DeviceClass;
sItem.DeviceProdGuid = "";
sItem.DeviceProdGuid = ""; // not needed - generic
break;
case Act.ActionDevice.AD_Joystick:
int jsNum = JoystickCls.JSNum( acc.DevInput ) - 1;
if ( jsNum >= 0 ) {
sItem.DeviceName = ActionMaps.jsN[jsNum];
sItem.DeviceProdGuid = ActionMaps.jsN_prodGUID[jsNum];
sItem.InputType = "J";
sItem.InputType = $"J{JoystickCls.JSNum( acc.DevInput )}";
}
break;
case Act.ActionDevice.AD_Gamepad:
sItem.InputType = "G";
sItem.InputType = "G1";
sItem.DeviceName = GamepadCls.DevNameCIG;
sItem.DeviceProdGuid = GamepadCls.DevGUIDCIG ;
sItem.DeviceProdGuid = GamepadCls.DevGUIDCIG;
break;
default: break;
}//switch

Binary file not shown.

BIN
graphics/layouts/f710.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 KiB

View File

@ -1,10 +1,10 @@
{
"MapName" : "Logitec G940 Stick + Throttle",
"MapName" : "Logitech G940 Stick + Throttle",
"MapImage" : "g940.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Logitec G940 Stick",
"DeviceName": "Logitech G940 Stick",
"DeviceProdGuid": ["{C2A8046D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":2034, "Y":604, "Width":652, "Height":54, "Cmt": "Primary trigger half-press"},
@ -31,7 +31,7 @@
},
{
"InputType": "J",
"DeviceName": "Logitec G940 Throttle",
"DeviceName": "Logitech G940 Throttle",
"DeviceProdGuid": ["{C2A9046D-0000-0000-0000-504944564944}"],
"Controls": [

View File

@ -1,10 +1,10 @@
{
"MapName" : "Logitec G940 Pedals",
"MapName" : "Logitech G940 Pedals",
"MapImage" : "g940pedals.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "Logitec G940 Pedals",
"DeviceName": "Logitech G940 Pedals",
"DeviceProdGuid": ["{C2AA046D-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "x", "Type": "Digital", "X":2264, "Y":588, "Width":1332, "Height":162, "Cmt": "Right pedal (unconfirmed)"},

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

View File

@ -0,0 +1,33 @@
{
"MapName" : "Elecom JC-U3613M (X-Input)",
"MapImage" : "gp-jcu3613m.jpg",
"InputDevices" :[
{
"InputType": "G1",
"DeviceName": "Elecom JC-U3613M",
"DeviceProdGuid": ["{028E045E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input":"x", "Type": "Digital", "X":2625, "Y":1178, "Width":1192, "Height":54, "Cmt": "X"},
{ "Input":"a", "Type": "Digital", "X":2625, "Y":1083, "Width":1192, "Height":54, "Cmt": "A"},
{ "Input":"b", "Type": "Digital", "X":2625, "Y":988, "Width":1192, "Height":54, "Cmt": "B"},
{ "Input":"y", "Type": "Digital", "X":2625, "Y":894, "Width":1192, "Height":54, "Cmt": "Y"},
{ "Input":"shoulderl", "Type": "Digital", "X":74, "Y":510, "Width":1392, "Height":108, "Cmt": "Left bumper - shoulderl"},
{ "Input":"shoulderr", "Type": "Digital", "X":2368, "Y":510, "Width":1442, "Height":108, "Cmt": "Right bumper - shoulderr"},
{ "Input":"triggerl_btn", "Type": "Digital", "X":74, "Y":406, "Width":1392, "Height":54, "Cmt": "Left trigger - triggerl_btn"},
{ "Input":"triggerr_btn", "Type": "Digital", "X":2368, "Y":406, "Width":1442, "Height":54, "Cmt": "Right trigger - triggerr_btn"},
{ "Input":"back", "Type": "Digital", "X":74, "Y":706, "Width":1192, "Height":54, "Cmt": "Back"},
{ "Input":"start", "Type": "Digital", "X":2625, "Y":706, "Width":1192, "Height":54, "Cmt": "Start"},
{ "Input":"thumbl", "Type": "Digital", "X":134, "Y":1542, "Width":1032, "Height":108, "Cmt": "Left stick button thumbl"},
{ "Input":"thumbr", "Type": "Digital", "X":2765, "Y":1542, "Width":1052, "Height":108, "Cmt": "Right stick button - thumbr"},
{ "Input":"dpad_up", "Type": "Digital", "X":134, "Y":864, "Width":1032, "Height":108, "Cmt": "dpad_up"},
{ "Input":"dpad_right", "Type": "Digital", "X":134, "Y":974, "Width":1032, "Height":108, "Cmt": "dpad_right"},
{ "Input":"dpad_down", "Type": "Digital", "X":134, "Y":1084, "Width":1032, "Height":108, "Cmt": "dpad_down"},
{ "Input":"dpad_left", "Type": "Digital", "X":134, "Y":1194, "Width":1032, "Height":108, "Cmt": "dpad_left"},
{ "Input":"thumblx", "Type": "Analogue", "X":2765, "Y":1322, "Width":1052, "Height":108, "Cmt": "thumbry"},
{ "Input":"thumbly", "Type": "Analogue", "X":2765, "Y":1432, "Width":1052, "Height":108, "Cmt": "thumbrx"},
{ "Input":"thumbrx", "Type": "Analogue", "X":134, "Y":1322, "Width":1032, "Height":108, "Cmt": "thumbly"},
{ "Input":"thumbry", "Type": "Analogue", "X":134, "Y":1432, "Width":1032, "Height":108, "Cmt": "thumblx"} ]
}
]
}

View File

@ -0,0 +1,33 @@
{
"MapName" : "XPad Logitech F710",
"MapImage" : "f710.jpg",
"InputDevices" :[
{
"InputType": "G1",
"DeviceName": "Logitech F710",
"DeviceProdGuid": ["{028E045E-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input":"x", "Type": "Digital", "X":2625, "Y":1178, "Width":1192, "Height":54, "Cmt": "X"},
{ "Input":"a", "Type": "Digital", "X":2625, "Y":1083, "Width":1192, "Height":54, "Cmt": "A"},
{ "Input":"b", "Type": "Digital", "X":2625, "Y":988, "Width":1192, "Height":54, "Cmt": "B"},
{ "Input":"y", "Type": "Digital", "X":2625, "Y":894, "Width":1192, "Height":54, "Cmt": "Y"},
{ "Input":"shoulderl", "Type": "Digital", "X":74, "Y":510, "Width":1392, "Height":108, "Cmt": "Left bumper - shoulderl"},
{ "Input":"shoulderr", "Type": "Digital", "X":2368, "Y":510, "Width":1442, "Height":108, "Cmt": "Right bumper - shoulderr"},
{ "Input":"triggerl_btn", "Type": "Digital", "X":74, "Y":406, "Width":1392, "Height":54, "Cmt": "Left trigger - triggerl_btn"},
{ "Input":"triggerr_btn", "Type": "Digital", "X":2368, "Y":406, "Width":1442, "Height":54, "Cmt": "Right trigger - triggerr_btn"},
{ "Input":"back", "Type": "Digital", "X":74, "Y":706, "Width":1192, "Height":54, "Cmt": "Back"},
{ "Input":"start", "Type": "Digital", "X":2625, "Y":706, "Width":1192, "Height":54, "Cmt": "Start"},
{ "Input":"thumbl", "Type": "Digital", "X":134, "Y":1542, "Width":1032, "Height":108, "Cmt": "Left stick button thumbl"},
{ "Input":"thumbr", "Type": "Digital", "X":2765, "Y":1542, "Width":1052, "Height":108, "Cmt": "Right stick button - thumbr"},
{ "Input":"dpad_up", "Type": "Digital", "X":134, "Y":864, "Width":1032, "Height":108, "Cmt": "dpad_up"},
{ "Input":"dpad_right", "Type": "Digital", "X":134, "Y":974, "Width":1032, "Height":108, "Cmt": "dpad_right"},
{ "Input":"dpad_down", "Type": "Digital", "X":134, "Y":1084, "Width":1032, "Height":108, "Cmt": "dpad_down"},
{ "Input":"dpad_left", "Type": "Digital", "X":134, "Y":1194, "Width":1032, "Height":108, "Cmt": "dpad_left"},
{ "Input":"thumbry", "Type": "Analogue", "X":2765, "Y":1322, "Width":1052, "Height":108, "Cmt": "thumbry"},
{ "Input":"thumbrx", "Type": "Analogue", "X":2765, "Y":1432, "Width":1052, "Height":108, "Cmt": "thumbrx"},
{ "Input":"thumbly", "Type": "Analogue", "X":134, "Y":1322, "Width":1032, "Height":108, "Cmt": "thumbly"},
{ "Input":"thumblx", "Type": "Analogue", "X":134, "Y":1432, "Width":1032, "Height":108, "Cmt": "thumblx"} ]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 KiB

View File

@ -1,6 +1,6 @@
{
"MapName" : "T16000M",
"MapImage" : "T16000M.jpg",
"MapName" : "T.16000M Joystick (right)",
"MapImage" : "t16000m.jpg",
"InputDevices" :[
{
"InputType": "J",

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

View File

@ -0,0 +1,68 @@
{
"MapName" : "T.16000M DUO Joystick (left-right)",
"MapImage" : "t16000mduo-left-right.jpg",
"InputDevices" :[
{
"InputType": "J1",
"DeviceName": "T16000M-left",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1299, "Y":792, "Width":660, "Height":108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":137, "Y":726, "Width":770, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":140, "Y":509, "Width":770, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":1267, "Y":589, "Width":770, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":1272, "Y":1056, "Width":770, "Height":54, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":1272, "Y":1107, "Width":770, "Height":54, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1272, "Y":1157, "Width":770, "Height":54, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1595, "Y":1450, "Width":770, "Height":54, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":1595, "Y":1399, "Width":770, "Height":54, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":1595, "Y":1347, "Width":770, "Height":54, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":16, "Y":1112, "Width":770, "Height":54, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":16, "Y":1164, "Width":770, "Height":54, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":16, "Y":1214, "Width":770, "Height":54, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":16, "Y":1730, "Width":770, "Height":54, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":16, "Y":1679, "Width":770, "Height":54, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":16, "Y":1629, "Width":770, "Height":54, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":728, "Y":229, "Width":770, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":728, "Y":280, "Width":770, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":728, "Y":333, "Width":770, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":728, "Y":385, "Width":770, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":134, "Y":982, "Width":770, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":711, "Y":1824, "Width":770, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":134, "Y":930, "Width":770, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":134, "Y":880, "Width":770, "Height":54, "Cmt": "Stick roll" }
]
},
{
"InputType": "J2",
"DeviceName": "T16000M-right",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1997, "Y":792, "Width":660, "Height":108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":2915, "Y":726, "Width":770, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":1814, "Y":509, "Width":770, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":2910, "Y":509, "Width":770, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":1933, "Y":953, "Width":770, "Height":54, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":1933, "Y":1003, "Width":770, "Height":54, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1933, "Y":1054, "Width":770, "Height":54, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1618, "Y":1677, "Width":770, "Height":54, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":1618, "Y":1626, "Width":770, "Height":54, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":1618, "Y":1574, "Width":770, "Height":54, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":3164, "Y":1122, "Width":770, "Height":54, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":3164, "Y":1172, "Width":770, "Height":54, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":3164, "Y":1223, "Width":770, "Height":54, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":3166, "Y":1721, "Width":770, "Height":54, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":3166, "Y":1669, "Width":770, "Height":54, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":3166, "Y":1619, "Width":770, "Height":54, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":2395, "Y":230, "Width":770, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":2395, "Y":280, "Width":770, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":2395, "Y":333, "Width":770, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":2395, "Y":385, "Width":770, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2982, "Y":995, "Width":770, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":2382, "Y":1824, "Width":770, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":2982, "Y":943, "Width":770, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":2982, "Y":893, "Width":770, "Height":54, "Cmt": "Stick roll" }
]
}
]
}

View File

@ -0,0 +1,68 @@
{
"MapName" : "T.16000M DUO Joystick (right-left)",
"MapImage" : "t16000mduo-left-right.jpg",
"InputDevices" :[
{
"InputType": "J2",
"DeviceName": "T16000M-left",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1299, "Y":792, "Width":660, "Height":108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":137, "Y":726, "Width":770, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":140, "Y":509, "Width":770, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":1267, "Y":589, "Width":770, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":1272, "Y":1056, "Width":770, "Height":54, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":1272, "Y":1107, "Width":770, "Height":54, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1272, "Y":1157, "Width":770, "Height":54, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1595, "Y":1450, "Width":770, "Height":54, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":1595, "Y":1399, "Width":770, "Height":54, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":1595, "Y":1347, "Width":770, "Height":54, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":16, "Y":1112, "Width":770, "Height":54, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":16, "Y":1164, "Width":770, "Height":54, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":16, "Y":1214, "Width":770, "Height":54, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":16, "Y":1730, "Width":770, "Height":54, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":16, "Y":1679, "Width":770, "Height":54, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":16, "Y":1629, "Width":770, "Height":54, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":728, "Y":229, "Width":770, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":728, "Y":280, "Width":770, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":728, "Y":333, "Width":770, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":728, "Y":385, "Width":770, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":134, "Y":982, "Width":770, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":711, "Y":1824, "Width":770, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":134, "Y":930, "Width":770, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":134, "Y":880, "Width":770, "Height":54, "Cmt": "Stick roll" }
]
},
{
"InputType": "J1",
"DeviceName": "T16000M-right",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1997, "Y":792, "Width":660, "Height":108, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":2915, "Y":726, "Width":770, "Height":54, "Cmt": "Bottom button" },
{ "Input": "button3", "Type": "Digital", "X":1814, "Y":509, "Width":770, "Height":54, "Cmt": "Left-hand button" },
{ "Input": "button4", "Type": "Digital", "X":2910, "Y":509, "Width":770, "Height":54, "Cmt": "Right-hand button" },
{ "Input": "button5", "Type": "Digital", "X":1933, "Y":953, "Width":770, "Height":54, "Cmt": "Left bank top-left button" },
{ "Input": "button6", "Type": "Digital", "X":1933, "Y":1003, "Width":770, "Height":54, "Cmt": "Left bank top-middle button" },
{ "Input": "button7", "Type": "Digital", "X":1933, "Y":1054, "Width":770, "Height":54, "Cmt": "Left bank top-right button" },
{ "Input": "button8", "Type": "Digital", "X":1618, "Y":1677, "Width":770, "Height":54, "Cmt": "Left bank bottom-right button" },
{ "Input": "button9", "Type": "Digital", "X":1618, "Y":1626, "Width":770, "Height":54, "Cmt": "Left bank bottom-middle button" },
{ "Input": "button10", "Type": "Digital", "X":1618, "Y":1574, "Width":770, "Height":54, "Cmt": "Left bank bottom-left button" },
{ "Input": "button11", "Type": "Digital", "X":3164, "Y":1122, "Width":770, "Height":54, "Cmt": "Right bank top-right button" },
{ "Input": "button12", "Type": "Digital", "X":3164, "Y":1172, "Width":770, "Height":54, "Cmt": "Right bank top-middle button" },
{ "Input": "button13", "Type": "Digital", "X":3164, "Y":1223, "Width":770, "Height":54, "Cmt": "Right bank top-left button" },
{ "Input": "button14", "Type": "Digital", "X":3166, "Y":1721, "Width":770, "Height":54, "Cmt": "Right bank bottom-left button" },
{ "Input": "button15", "Type": "Digital", "X":3166, "Y":1669, "Width":770, "Height":54, "Cmt": "Right bank bottom-middle button" },
{ "Input": "button16", "Type": "Digital", "X":3166, "Y":1619, "Width":770, "Height":54, "Cmt": "Right bank bottom-right button" },
{ "Input": "hat1_up", "Type": "Digital", "X":2395, "Y":230, "Width":770, "Height":54, "Cmt": "PoV hat up" },
{ "Input": "hat1_right", "Type": "Digital", "X":2395, "Y":280, "Width":770, "Height":54, "Cmt": "PoV hat right" },
{ "Input": "hat1_down", "Type": "Digital", "X":2395, "Y":333, "Width":770, "Height":54, "Cmt": "PoV hat down" },
{ "Input": "hat1_left", "Type": "Digital", "X":2395, "Y":385, "Width":770, "Height":54, "Cmt": "PoV hat left" },
{ "Input": "rotz", "Type": "Analogue", "X":2982, "Y":995, "Width":770, "Height":54, "Cmt": "Stick twist" },
{ "Input": "slider1", "Type": "Analogue", "X":2382, "Y":1824, "Width":770, "Height":54, "Cmt": "Stick throttle slider" },
{ "Input": "x", "Type": "Analogue", "X":2982, "Y":943, "Width":770, "Height":54, "Cmt": "Stick pitch" },
{ "Input": "y", "Type": "Analogue", "X":2982, "Y":893, "Width":770, "Height":54, "Cmt": "Stick roll" }
]
}
]
}

View File

@ -1,11 +1,11 @@
{
"MapName" : "T16000MFCS",
"MapName" : "T.16000M FCS",
"MapImage" : "t16000mfcs.jpg",
"InputDevices" :[
{
"InputType": "J",
"DeviceName": "T16000M Stick",
"DeviceProdGuid": "{B10A044F-0000-0000-0000-504944564944}",
"DeviceProdGuid": ["{B10A044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":1804, "Y":844, "Width":642, "Height":54, "Cmt": "Primary trigger" },
{ "Input": "button2", "Type": "Digital", "X":2764, "Y":604, "Width":992, "Height":54, "Cmt": "Bottom button" },
@ -36,7 +36,7 @@
{
"InputType": "J",
"DeviceName": "T16000M Throttle",
"DeviceProdGuid": "{B687044F-0000-0000-0000-504944564944}",
"DeviceProdGuid": ["{B687044F-0000-0000-0000-504944564944}"],
"Controls": [
{ "Input": "button1", "Type": "Digital", "X":294, "Y":1244, "Width":792, "Height":54, "Cmt": "Thumb button" },
{ "Input": "button2", "Type": "Digital", "X":1774, "Y":1774, "Width":892, "Height":54, "Cmt": "Pinky button" },

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB