diff --git a/Devices/Gamepad/GamepadCls.cs b/Devices/Gamepad/GamepadCls.cs index 36fc0c7..a825a75 100644 --- a/Devices/Gamepad/GamepadCls.cs +++ b/Devices/Gamepad/GamepadCls.cs @@ -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; diff --git a/Layout/ActionItem.cs b/Layout/ActionItem.cs index fe66183..76615d8 100644 --- a/Layout/ActionItem.cs +++ b/Layout/ActionItem.cs @@ -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) + /// + /// Returnd the PID VID part of the device GUID in lowercase + /// or an empty string... + /// + 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... + + /// + /// Returns the Modifier for this item + /// i.e. + /// + 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+")"; + } + } + + /// + /// Returns the DispText with Modding added + /// + public string ModdedDispText + { + get { + return Modifier+DispText; + } + } + + } } diff --git a/Layout/ActionItemList.cs b/Layout/ActionItemList.cs index 3796f4a..2f7dfee 100644 --- a/Layout/ActionItemList.cs +++ b/Layout/ActionItemList.cs @@ -11,6 +11,70 @@ namespace SCJMapper_V2.Layout /// class ActionItemList : List { + 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; } + + /// + /// Add a JsN number and keep track of low and high + /// + /// + public void AddNumber( short n ) + { + m_lowN = ( n < m_lowN ) ? n : m_lowN; + m_highN = ( n > m_highN ) ? n : m_highN; + } + } + + + private Dictionary m_trackers = new Dictionary( ); + + private Tracker GetTracker( string pidVid ) + { + if ( m_trackers.ContainsKey( pidVid ) ) { + return m_trackers[pidVid]; + } + return null; + } + + /// + /// Returns true if the jsN number is the lower one + /// + /// Device pidvid + /// The JsN number + /// + public bool IsFirstInstance( string pidVid, short jsN ) + { + var tracker = GetTracker( pidVid ); + if ( tracker == null ) return true; + return ( jsN == tracker.LowN ); + } + + /// + /// Keep track of JsNs while adding stuff + /// + /// + 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 ); + } + + + /// /// Get the Devices contained in the List /// @@ -26,5 +90,7 @@ public List Devices return list; } } + + } } diff --git a/Layout/DbgActionItemList.cs b/Layout/DbgActionItemList.cs new file mode 100644 index 0000000..830020a --- /dev/null +++ b/Layout/DbgActionItemList.cs @@ -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 +{ + /// + /// Create an ActionItemList for Layout Debug + /// contains allmost all possible items ... + /// + 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 AI_POV( string aMap, short povNum, short jNum, string guid ) + { + var ail = new List( ); + 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 AI_Analog( string aMap, short jNum, string guid ) + { + var ail = new List( ); + 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 AI_Gamepad( string aMap ) + { + var ail = new List( ); + 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; + } + + + + + /// + /// Create a debug list for all the guids provided + /// + /// Array: At least one guid + 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 + } + + + } +} diff --git a/Layout/DeviceFile.cs b/Layout/DeviceFile.cs index c0fef4b..83597eb 100644 --- a/Layout/DeviceFile.cs +++ b/Layout/DeviceFile.cs @@ -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" }, ... - ] - } - } + ] + } + ] + } */ + + /// + /// The Device Mapping File + /// [DataContract] class DeviceFile { @@ -36,7 +43,7 @@ class DeviceFile public List InputDevices { get; set; } = new List( ); /// - /// Create all possible ShapeItems for this Device + /// Create all possible ShapeItems for this Mapping File /// public void CreateShapes() { @@ -48,17 +55,24 @@ public void CreateShapes() /// /// Find a Control entry with the given product guid and input command /// - /// the Device Prduct GUID - /// the Item (device property) + /// the Device Prduct PID VID string in lowecase + /// the Item (device property) + /// If true it looks for the InputTypeNumber 1 (InputType="x1") else for the next /// The found Control or Null - 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 ) } + /// + /// One Game Device + /// [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 DeviceProdGuid { get; set; } = new List( ); // The device product GUIDs as read by DirecInput [DataMember] public List Controls { get; set; } = new List( );// 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 + } + } + /// /// returns the PID VID part of the GUID (seems how this is composed in Win) /// @@ -88,7 +118,7 @@ public List DevicePIDVID get { var ret = new List( ); 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 DevicePIDVID /// /// Find a Control entry with the given input command /// - /// the Item (device property) + /// the Item (device property) /// The found Control or Null - 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( ); } } - } /// @@ -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 diff --git a/Layout/FormLayout.Designer.cs b/Layout/FormLayout.Designer.cs index e713e96..e8d06c2 100644 --- a/Layout/FormLayout.Designer.cs +++ b/Layout/FormLayout.Designer.cs @@ -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; } } \ No newline at end of file diff --git a/Layout/FormLayout.cs b/Layout/FormLayout.cs index b61bd11..a3ddc2a 100644 --- a/Layout/FormLayout.cs +++ b/Layout/FormLayout.cs @@ -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; + } } /// @@ -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 guids = new List( ); + 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 + + } } diff --git a/Layout/FormLayout.resx b/Layout/FormLayout.resx index 092f3dc..ad46bd5 100644 --- a/Layout/FormLayout.resx +++ b/Layout/FormLayout.resx @@ -120,418 +120,416 @@ - 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 - QmCC + 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 - rkJggg== + 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 - 0HW+PUD8F0cdfEVoSwiLAAAAAElFTkSuQmCC + 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 + CIsAAAAASUVORK5CYII= diff --git a/Layout/MapProps.cs b/Layout/MapProps.cs index 561361d..5e8c5cc 100644 --- a/Layout/MapProps.cs +++ b/Layout/MapProps.cs @@ -14,6 +14,52 @@ namespace SCJMapper_V2.Layout /// 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 = "→Ȿ"; + + /// + /// Returns a Layout Modifier string (char) for a given modifier + /// + /// The modifier string + /// + 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 "⸮"; + } + } + /// /// Save Color Settings for the Layout /// diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index d28c2f6..747a63b 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -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" )] diff --git a/README.md b/README.md index ccd6494..599b3ec 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Device Layout Images and Maps:

https://github.com/richardbuckle/EDRefCard
+
DDS Skydome Images:

Canyon, Highway, Shiodome, BigSight, LA Heliport:
diff --git a/ReadMe.txt b/ReadMe.txt index b2d3288..308c31d 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -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 diff --git a/SCJMapper-V2.csproj b/SCJMapper-V2.csproj index 735f9b8..df2c9c0 100644 --- a/SCJMapper-V2.csproj +++ b/SCJMapper-V2.csproj @@ -27,8 +27,8 @@ false false true - 79 - 2.44.0.79 + 80 + 2.45.0.80 false true @@ -179,6 +179,7 @@ + diff --git a/actions/ActionTree.cs b/actions/ActionTree.cs index 1bb83cb..61f4f17 100644 --- a/actions/ActionTree.cs +++ b/actions/ActionTree.cs @@ -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 diff --git a/graphics/layouts/MapToolbox.xlsx b/graphics/layouts/MapToolbox.xlsx index 4e365c7..1245fe7 100644 Binary files a/graphics/layouts/MapToolbox.xlsx and b/graphics/layouts/MapToolbox.xlsx differ diff --git a/graphics/layouts/f710.jpg b/graphics/layouts/f710.jpg new file mode 100644 index 0000000..8e5f467 Binary files /dev/null and b/graphics/layouts/f710.jpg differ diff --git a/graphics/layouts/g940.json b/graphics/layouts/g940.json index f222d48..5051be9 100644 --- a/graphics/layouts/g940.json +++ b/graphics/layouts/g940.json @@ -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": [ diff --git a/graphics/layouts/g940pedals.json b/graphics/layouts/g940pedals.json index 3c2ec72..466dac7 100644 --- a/graphics/layouts/g940pedals.json +++ b/graphics/layouts/g940pedals.json @@ -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)"}, diff --git a/graphics/layouts/gp-jcu3613m.jpg b/graphics/layouts/gp-jcu3613m.jpg new file mode 100644 index 0000000..5dea485 Binary files /dev/null and b/graphics/layouts/gp-jcu3613m.jpg differ diff --git a/graphics/layouts/gp-logif710.jpg b/graphics/layouts/gp-logif710.jpg new file mode 100644 index 0000000..3fd7f64 Binary files /dev/null and b/graphics/layouts/gp-logif710.jpg differ diff --git a/graphics/layouts/gpad-jc-u3613m.json b/graphics/layouts/gpad-jc-u3613m.json new file mode 100644 index 0000000..1245b3a --- /dev/null +++ b/graphics/layouts/gpad-jc-u3613m.json @@ -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"} ] + } + ] +} + diff --git a/graphics/layouts/gpad-logi-f710.json b/graphics/layouts/gpad-logi-f710.json new file mode 100644 index 0000000..5a4bb06 --- /dev/null +++ b/graphics/layouts/gpad-logi-f710.json @@ -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"} ] + } + ] +} + diff --git a/graphics/layouts/sabretooth.jpg b/graphics/layouts/sabretooth.jpg new file mode 100644 index 0000000..d1f35b1 Binary files /dev/null and b/graphics/layouts/sabretooth.jpg differ diff --git a/graphics/layouts/t16000m.json b/graphics/layouts/t16000m.json index ad55941..ea02b2d 100644 --- a/graphics/layouts/t16000m.json +++ b/graphics/layouts/t16000m.json @@ -1,6 +1,6 @@ { - "MapName" : "T16000M", - "MapImage" : "T16000M.jpg", + "MapName" : "T.16000M Joystick (right)", + "MapImage" : "t16000m.jpg", "InputDevices" :[ { "InputType": "J", diff --git a/graphics/layouts/t16000mduo-left-right.jpg b/graphics/layouts/t16000mduo-left-right.jpg new file mode 100644 index 0000000..2468ccd Binary files /dev/null and b/graphics/layouts/t16000mduo-left-right.jpg differ diff --git a/graphics/layouts/t16000mduo-left-right.json b/graphics/layouts/t16000mduo-left-right.json new file mode 100644 index 0000000..d9ffaaf --- /dev/null +++ b/graphics/layouts/t16000mduo-left-right.json @@ -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" } + ] + } + ] +} diff --git a/graphics/layouts/t16000mduo-right-left.json b/graphics/layouts/t16000mduo-right-left.json new file mode 100644 index 0000000..0707a38 --- /dev/null +++ b/graphics/layouts/t16000mduo-right-left.json @@ -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" } + ] + } + ] +} diff --git a/graphics/layouts/t16000mfcs.json b/graphics/layouts/t16000mfcs.json index bb4a85c..cd67639 100644 --- a/graphics/layouts/t16000mfcs.json +++ b/graphics/layouts/t16000mfcs.json @@ -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" }, diff --git a/graphics/layouts/vpc-wb-delta-left-right.jpg b/graphics/layouts/vpc-wb-delta-left-right.jpg new file mode 100644 index 0000000..4ec3fe1 Binary files /dev/null and b/graphics/layouts/vpc-wb-delta-left-right.jpg differ