V 2.36 - BETA Build 71 (experimental..)

- new feature - window for realtime monitoring of the controls (works also in background)
- add - silently dumps the CSV list along the backup xml file into MyDocuments
- improvement - try to add more usability for the config path setting
pull/104/head
bm98 6 years ago
parent 34d7a9e080
commit ba8c8cff3c

@ -55,11 +55,55 @@ namespace SCJMapper_V2.Devices
public virtual List<string> AnalogCommands { get { return new List<string>( ); } } // just return an empty one if not implemented
public abstract bool Activated { get; set; }
public void Deactivate() { this.Activated = false; }
public void Activate() { this.Activated = true; }
private Stack<bool> m_activeState = new Stack<bool>( );
/// <summary>
/// pushes the Activated state on a stack
/// </summary>
public void PushActiveState()
{
m_activeState.Push( Activated );
}
/// <summary>
/// Pop the Activated state from stack
/// </summary>
public void PopActiveState()
{
if ( m_activeState.Count > 0 )
Activated = m_activeState.Pop( );
}
public virtual void FinishDX( ) { }
public virtual void ApplySettings( ) { }
/// <summary>
/// returns the currently available input string
/// (does not retrieve new data but uses what was collected by GetData())
/// </summary>
/// <returns>An input string or an empty string if no input is available</returns>
public abstract string GetCurrentInput( );
/// <summary>
/// Find the last change the user did on that device
/// either new or from persistence
/// </summary>
/// <returns>An input string</returns>
public abstract string GetLastChange( );
/// <summary>
/// Returns the data for the requested input
/// Retrieves a new set of data from DX
/// </summary>
/// <param name="cmd">The input where the value is requested for</param>
/// <param name="data">The value for the input</param>
public abstract void GetCmdData( string cmd, out int data );
/// <summary>
/// Retrieves the input data from DX
/// </summary>
public abstract void GetData( );
static public string toXML( string blendedInput )

@ -89,6 +89,7 @@ namespace SCJMapper_V2.Devices.Gamepad
/// <returns>True for a match</returns>
static public new bool DevMatch( string devInput )
{
if ( string.IsNullOrEmpty( devInput ) ) return false;
return devInput.StartsWith( DeviceID );
}
@ -124,6 +125,8 @@ namespace SCJMapper_V2.Devices.Gamepad
/// <returns>An AC2 style input string</returns>
static public string FromAC1( string input )
{
if ( string.IsNullOrEmpty( input ) ) return "";
// input is something like a xi_something or compositions like triggerl_btn+thumbrx
// try easy: add xi1_ at the beginning; if xi_start subst with xi1_
string retVal = input.Replace( " ", "" );
@ -223,14 +226,7 @@ namespace SCJMapper_V2.Devices.Gamepad
}
}
public override bool Activated
{
get { return m_activated; }
set {
m_activated = value;
}
}
public override bool Activated { get => m_activated; set => m_activated = value; }
private bool Bit( GamepadButtonFlags set, GamepadButtonFlags check )
{
@ -384,14 +380,81 @@ namespace SCJMapper_V2.Devices.Gamepad
state.Gamepad.RightThumbY = (short)( val > 32767 ? 32767 * sign : val * sign );
}
/// <summary>
/// returns the currently available input string
/// (does not retrieve new data but uses what was collected by GetData())
/// </summary>
/// <returns>An input string or an empty string if no input is available</returns>
public override string GetCurrentInput()
{
string currentInput = string.Empty;
if ( ModButtonPressed( ) ) {
if ( ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) )
&& !Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.LeftThumb ) ) currentInput += "xi_thumblx+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) > Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) )
&& !Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.LeftThumb ) ) currentInput += "xi_thumbly+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) > Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) )
&& !Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.RightThumb ) ) currentInput += "xi_thumbrx+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) > Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) )
&& !Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.RightThumb ) ) currentInput += "xi_thumbry+";
if ( Math.Abs( (Int32)m_state.Gamepad.LeftTrigger ) > 0 ) currentInput += "xi_triggerl_btn+";
if ( Math.Abs( (Int32)m_state.Gamepad.RightTrigger ) > 0 ) currentInput += "xi_triggerr_btn+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.A ) ) currentInput += "xi_a+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.B ) ) currentInput += "xi_b+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.X ) ) currentInput += "xi_x+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.Y ) ) currentInput += "xi_y+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.Start ) ) currentInput += "xi_start+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.Back ) ) currentInput += "xi_back+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.DPadDown ) ) currentInput += "xi_dpad_down+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.DPadLeft ) ) currentInput += "xi_dpad_left+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.DPadRight ) ) currentInput += "xi_dpad_right+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.DPadUp ) ) currentInput += "xi_dpad_up+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.LeftShoulder ) ) currentInput += "xi_shoulderl+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.RightShoulder ) ) currentInput += "xi_shoulderr+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.LeftThumb ) ) currentInput += "xi_thumbl+";
if ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.RightThumb ) ) currentInput += "xi_thumbr+";
}
else {
// no button -> only non button items will reported - single events
if ( ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) ) ) currentInput = "xi_thumblx+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) > Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) ) ) currentInput = "xi_thumbly+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) > Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) ) ) currentInput = "xi_thumbrx+";
if ( ( Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.RightThumbY ) > Math.Abs( (Int32)m_state.Gamepad.RightThumbX ) ) ) currentInput = "xi_thumbry+";
if ( Math.Abs( (Int32)m_state.Gamepad.LeftTrigger ) > 0 ) currentInput = "xi_triggerl_btn+";
if ( Math.Abs( (Int32)m_state.Gamepad.RightTrigger ) > 0 ) currentInput = "xi_triggerr_btn+";
}
return currentInput.TrimEnd( new char[] { '+' } );
}
/// <summary>
/// Find the last change the user did on that device
/// </summary>
/// <returns>The last action as CryEngine compatible string</returns>
public override string GetLastChange()
public override string GetLastChange( )
{
if ( ModButtonPressed( ) ) {
m_lastItem = "";
m_lastItem = string.Empty;
if ( ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > m_senseLimit )
&& ( Math.Abs( (Int32)m_state.Gamepad.LeftThumbX ) > Math.Abs( (Int32)m_state.Gamepad.LeftThumbY ) )
&& !Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.LeftThumb ) ) m_lastItem += "xi_thumblx+";
@ -444,7 +507,7 @@ namespace SCJMapper_V2.Devices.Gamepad
if ( Math.Abs( (Int32)m_state.Gamepad.RightTrigger ) > 0 ) m_lastItem = "xi_triggerr_btn+";
}
return m_lastItem.TrimEnd( new char[] { '+' } ); ;
return m_lastItem.TrimEnd( new char[] { '+' } );
}
@ -489,38 +552,41 @@ namespace SCJMapper_V2.Devices.Gamepad
/// </summary>
private void UpdateUI()
{
// This function updated the UI with joystick state information.
string strText = "";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadDown ) > 0 ) ? "d" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadLeft ) > 0 ) ? "l" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadRight ) > 0 ) ? "r" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadUp ) > 0 ) ? "u" : " ";
m_gPanel.DPad = strText;
m_gPanel.TStickXL = m_state.Gamepad.LeftThumbX.ToString( );
m_gPanel.TStickYL = m_state.Gamepad.LeftThumbY.ToString( );
m_gPanel.TStickBtL = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.LeftThumb ) > 0 ) ? "pressed" : "_";
m_gPanel.TStickXR = m_state.Gamepad.RightThumbX.ToString( );
m_gPanel.TStickYR = m_state.Gamepad.RightThumbY.ToString( );
m_gPanel.TStickBtR = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.RightThumb ) > 0 ) ? "pressed" : "_";
m_gPanel.TriggerL = m_state.Gamepad.LeftTrigger.ToString( );
m_gPanel.TriggerR = m_state.Gamepad.RightTrigger.ToString( );
m_gPanel.ShoulderL = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.LeftShoulder ) > 0 ) ? "pressed" : "_";
m_gPanel.ShoulderR = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.RightShoulder ) > 0 ) ? "pressed" : "_";
m_gPanel.Start = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.Start ) > 0 ) ? "pressed" : "_";
m_gPanel.Back = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.Back ) > 0 ) ? "pressed" : "_";
string buttons = "";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.A ) ) ? "A" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.B ) ) ? "B" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.X ) ) ? "X" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.Y ) ) ? "Y" : "_";
m_gPanel.Button = buttons;
if ( Application.MessageLoop ) {
// This function updated the UI with joystick state information.
string strText = "";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadDown ) > 0 ) ? "d" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadLeft ) > 0 ) ? "l" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadRight ) > 0 ) ? "r" : " ";
strText += ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.DPadUp ) > 0 ) ? "u" : " ";
m_gPanel.DPad = strText;
m_gPanel.TStickXL = m_state.Gamepad.LeftThumbX.ToString( );
m_gPanel.TStickYL = m_state.Gamepad.LeftThumbY.ToString( );
m_gPanel.TStickBtL = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.LeftThumb ) > 0 ) ? "pressed" : "_";
m_gPanel.TStickXR = m_state.Gamepad.RightThumbX.ToString( );
m_gPanel.TStickYR = m_state.Gamepad.RightThumbY.ToString( );
m_gPanel.TStickBtR = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.RightThumb ) > 0 ) ? "pressed" : "_";
m_gPanel.TriggerL = m_state.Gamepad.LeftTrigger.ToString( );
m_gPanel.TriggerR = m_state.Gamepad.RightTrigger.ToString( );
m_gPanel.ShoulderL = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.LeftShoulder ) > 0 ) ? "pressed" : "_";
m_gPanel.ShoulderR = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.RightShoulder ) > 0 ) ? "pressed" : "_";
m_gPanel.Start = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.Start ) > 0 ) ? "pressed" : "_";
m_gPanel.Back = ( ( m_state.Gamepad.Buttons & GamepadButtonFlags.Back ) > 0 ) ? "pressed" : "_";
string buttons = "";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.A ) ) ? "A" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.B ) ) ? "B" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.X ) ) ? "X" : "_";
buttons += ( Bit( m_state.Gamepad.Buttons, GamepadButtonFlags.Y ) ) ? "Y" : "_";
m_gPanel.Button = buttons;
}
}
@ -582,7 +648,5 @@ namespace SCJMapper_V2.Devices.Gamepad
UpdateUI( ); // and update the GUI
}
}
}

@ -102,6 +102,19 @@ namespace SCJMapper_V2.Devices.Joystick
return DeviceID + input; // this will mostly not be as expected as it returns js1_ only ..
}
/// <summary>
/// Create a DevInput string if the input does look like not having a device ID
/// </summary>
/// <param name="input">A keyboard input</param>
/// <returns>DevInput</returns>
static public string DevInput( string input, int jsN )
{
if ( DevMatch( input ) )
return input; // already
else
return DeviceID.Replace( "1", jsN.ToString( "D" ) ) + input;
}
/// <summary>
/// Returns true if the input matches this device
/// </summary>
@ -672,17 +685,89 @@ namespace SCJMapper_V2.Devices.Joystick
}
}
// Property Mapping from DXinput to CryEngine string
private Dictionary<string, string> m_axiesDx2Cry = new Dictionary<string, string>( )
{
{"X","x"},
{"Y","y"},
{"Z","z"},
{"RotationX","rotx"},
{"RotationY","roty"},
{"RotationZ","rotz"}
};
// Property Mapping from CryEngine string to DxInput
private Dictionary<string, string> m_axiesCry2Dx = new Dictionary<string, string>( )
{
{"x","X"},
{"y","Y"},
{"z","Z"},
{"rotx","RotationX"},
{"roty","RotationY"},
{"rotz","RotationZ"}
};
/// <summary>
/// returns the currently available input string
/// (does not retrieve new data but uses what was collected by GetData())
/// NOTE: for Joystick when multiple inputs are available the sequence is
/// axis > button > hat > slider (wher prio is max itemNum > min itemNum)
/// </summary>
/// <returns>An input string or an empty string if no input is available</returns>
public override string GetCurrentInput()
{
string currentInput = string.Empty;
// get changed slider
int[] slider = m_state.Sliders;
int[] pslider = m_prevState.Sliders;
if ( DidAxisChange2( slider[0], pslider[0] ) ) currentInput = "slider1";
if ( DidAxisChange2( slider[1], pslider[1] ) ) currentInput = "slider2";
// get prio hat
int[] pov = m_state.PointOfViewControllers;
int[] ppov = m_prevState.PointOfViewControllers;
if ( pov[0] >= 0 ) currentInput = "hat1_" + HatDir( pov[0] );
if ( pov[1] >= 0 ) currentInput = "hat2_" + HatDir( pov[1] );
if ( pov[2] >= 0 ) currentInput = "hat3_" + HatDir( pov[2] );
if ( pov[3] >= 0 ) currentInput = "hat4_" + HatDir( pov[3] );
// get prio button
bool[] buttons = m_state.Buttons;
bool[] prevButtons = m_prevState.Buttons;
for ( int bi = 0; bi < buttons.Length; bi++ ) {
if ( m_ignoreButtons[bi] == false ) {
if ( buttons[bi] )
currentInput = "button" + ( bi + 1 ).ToString( );
}
}
// get axis
foreach ( KeyValuePair<string, string> entry in m_axiesDx2Cry ) {
PropertyInfo axisProperty = typeof( JoystickState ).GetProperty( entry.Key );
if ( DidAxisChange2( (int)axisProperty.GetValue( this.m_state, null ), (int)axisProperty.GetValue( this.m_prevState, null ) ) )
currentInput = entry.Value;
}
return currentInput;
}
/// <summary>
/// Find the last change the user did on that device
/// either new or from persistence
/// NOTE: reporting priority is:
/// axis > button > hat > slider (for buttons and hats this returns the newly pressed one when more than one is active)
/// </summary>
/// <returns>The last action as CryEngine compatible string</returns>
/// <returns>An input string</returns>
public override string GetLastChange()
{
// get changed slider
int[] slider = m_state.Sliders;
int[] pslider = m_prevState.Sliders;
if ( DidAxisChange2( slider[0], pslider[0] ) ) m_lastItem = "slider1";
if ( DidAxisChange2( slider[1], pslider[1] ) ) m_lastItem = "slider2";
// get new hat
int[] pov = m_state.PointOfViewControllers;
int[] ppov = m_prevState.PointOfViewControllers;
if ( pov[0] >= 0 ) if ( pov[0] != ppov[0] ) m_lastItem = "hat1_" + HatDir( pov[0] );
@ -690,31 +775,20 @@ namespace SCJMapper_V2.Devices.Joystick
if ( pov[2] >= 0 ) if ( pov[2] != ppov[2] ) m_lastItem = "hat3_" + HatDir( pov[2] );
if ( pov[3] >= 0 ) if ( pov[3] != ppov[3] ) m_lastItem = "hat4_" + HatDir( pov[3] );
// get new button
bool[] buttons = m_state.Buttons;
bool[] prevButtons = m_prevState.Buttons;
for ( int bi = 0; bi < buttons.Length; bi++ ) {
if ( m_ignoreButtons[bi] == false ) {
if ( buttons[bi] && buttons[bi] != prevButtons[bi] )
if ( buttons[bi] && ( buttons[bi] != prevButtons[bi] ) )
m_lastItem = "button" + ( bi + 1 ).ToString( );
}
}
// TODO: Expand this out into a joystick class (see commit for details)
Dictionary<string, string> axies = new Dictionary<string, string>( )
{
{"X","x"},
{"Y","y"},
{"Z","z"},
{"RotationX","rotx"},
{"RotationY","roty"},
{"RotationZ","rotz"}
};
foreach ( KeyValuePair<string, string> entry in axies ) {
// get changed axis
foreach ( KeyValuePair<string, string> entry in m_axiesDx2Cry ) {
PropertyInfo axisProperty = typeof( JoystickState ).GetProperty( entry.Key );
if ( DidAxisChange2( (int)axisProperty.GetValue( this.m_state, null ), (int)axisProperty.GetValue( this.m_prevState, null ) ) )
this.m_lastItem = entry.Value;
m_lastItem = entry.Value;
}
return m_lastItem;
@ -762,40 +836,42 @@ namespace SCJMapper_V2.Devices.Joystick
/// </summary>
private void UpdateUI()
{
// This function updated the UI with joystick state information.
string strText = null;
if ( Application.MessageLoop ) {
// This function updated the UI with joystick state information.
string strText = null;
m_jPanel.X = m_state.X.ToString( );
m_jPanel.Y = m_state.Y.ToString( );
m_jPanel.Z = m_state.Z.ToString( );
m_jPanel.X = m_state.X.ToString( );
m_jPanel.Y = m_state.Y.ToString( );
m_jPanel.Z = m_state.Z.ToString( );
m_jPanel.Xr = m_state.RotationX.ToString( );
m_jPanel.Yr = m_state.RotationY.ToString( );
m_jPanel.Zr = m_state.RotationZ.ToString( );
m_jPanel.Xr = m_state.RotationX.ToString( );
m_jPanel.Yr = m_state.RotationY.ToString( );
m_jPanel.Zr = m_state.RotationZ.ToString( );
int[] slider = m_state.Sliders;
int[] slider = m_state.Sliders;
m_jPanel.S1 = slider[0].ToString( );
m_jPanel.S2 = slider[1].ToString( );
m_jPanel.S1 = slider[0].ToString( );
m_jPanel.S2 = slider[1].ToString( );
int[] pov = m_state.PointOfViewControllers;
int[] pov = m_state.PointOfViewControllers;
m_jPanel.H1 = pov[0].ToString( );
m_jPanel.H2 = pov[1].ToString( );
m_jPanel.H3 = pov[2].ToString( );
m_jPanel.H4 = pov[3].ToString( );
m_jPanel.H1 = pov[0].ToString( );
m_jPanel.H2 = pov[1].ToString( );
m_jPanel.H3 = pov[2].ToString( );
m_jPanel.H4 = pov[3].ToString( );
// Fill up text with which buttons are pressed
bool[] buttons = m_state.Buttons;
// Fill up text with which buttons are pressed
bool[] buttons = m_state.Buttons;
int button = 0;
foreach ( bool b in buttons ) {
if ( b )
strText += ( button + 1 ).ToString( "00 " ); // buttons are 1 based
button++;
int button = 0;
foreach ( bool b in buttons ) {
if ( b )
strText += ( button + 1 ).ToString( "00 " ); // buttons are 1 based
button++;
}
m_jPanel.Button = strText;
}
m_jPanel.Button = strText;
}
@ -854,17 +930,6 @@ namespace SCJMapper_V2.Devices.Joystick
/// </summary>
public override void GetCmdData( string cmd, out int data )
{
// TODO: Expand this out into a joystick class (see commit for details)
Dictionary<string, string> axies = new Dictionary<string, string>( )
{
{"x","X"},
{"y","Y"},
{"z","Z"},
{"rotx","RotationX"},
{"roty","RotationY"},
{"rotz","RotationZ"}
};
data = 0;
// Make sure there is a valid device.
@ -905,7 +970,7 @@ namespace SCJMapper_V2.Devices.Joystick
}
try {
PropertyInfo axisProperty = typeof( JoystickState ).GetProperty( axies[cmd] );
PropertyInfo axisProperty = typeof( JoystickState ).GetProperty( m_axiesCry2Dx[cmd] );
data = (int)axisProperty.GetValue( this.m_state, null );
}
catch {
@ -961,7 +1026,5 @@ namespace SCJMapper_V2.Devices.Joystick
UpdateUI( ); // and update the GUI
}
}
}

@ -93,6 +93,21 @@ namespace SCJMapper_V2.Devices.Joystick
foreach ( JoystickCls j in this ) j.Activated = true;
}
/// <summary>
/// pushes the Activated state on a stack
/// </summary>
public void PushActiveState()
{
foreach ( JoystickCls j in this ) j.PushActiveState();
}
/// <summary>
/// Pop the Activated state from stack
/// </summary>
public void PopActiveState()
{
foreach ( JoystickCls j in this ) j.PopActiveState( );
}
/// <summary>
/// Show the jsN Reassign Dialog
/// </summary>
@ -155,7 +170,7 @@ namespace SCJMapper_V2.Devices.Joystick
/// </summary>
/// <param name="n">The JsN</param>
/// <returns>The instance or null if not found</returns>
public JoystickCls Find_jsN( int n )
public JoystickCls Find_InstanceForjsN( int n )
{
foreach ( JoystickCls j in this ) {
if ( j.JSAssignment == n ) return j;
@ -163,6 +178,19 @@ namespace SCJMapper_V2.Devices.Joystick
return null;
}
/// <summary>
/// Returns the JoystickCls Instance for an DevInstance number
/// </summary>
/// <param name="n">The instance [0..]</param>
/// <returns>The JoystickCls instance or null if not found</returns>
public JoystickCls Find_jsNForInstance( int n )
{
foreach ( JoystickCls j in this ) {
if ( j.DevInstance == n ) return j;
}
return null;
}
/// <summary>
/// Returns the Joystick instance for the given device name

@ -123,7 +123,7 @@ namespace SCJMapper_V2.Devices.Keyboard
/// </summary>
/// <param name="pressedKeys">The list of pressed DX keys</param>
/// <returns>The SC keycode string</returns>
public static string DXKeyboardCmd( List<Key> pressedKeys, bool modAndKey )
public static string DXKeyboardCmd( List<Key> pressedKeys, bool modAndKey, bool keyOnly )
{
string altMod = "";
string shiftMod = "";
@ -240,10 +240,15 @@ namespace SCJMapper_V2.Devices.Keyboard
}//for
if ( modAndKey ) {
key = altMod + shiftMod + ctrlMod + key;
if ( keyOnly ) {
; // key only
}
else {
key = altMod + shiftMod + ctrlMod + key;
}
}
else {
// mods only OR space to kill mods
// mods only if not killed
if ( !key.Contains( ClearMods ) ) key = altMod + shiftMod + ctrlMod;
}
@ -268,7 +273,7 @@ namespace SCJMapper_V2.Devices.Keyboard
private SharpDX.DirectInput.Keyboard m_device;
private KeyboardState m_state = new KeyboardState( );
private Control m_hwnd;
private IntPtr m_hwnd;
private bool m_activated = false;
@ -323,7 +328,7 @@ namespace SCJMapper_V2.Devices.Keyboard
/// </summary>
/// <param name="device">A DXInput device</param>
/// <param name="hwnd">The WinHandle of the main window</param>
public KeyboardCls( SharpDX.DirectInput.Keyboard device, Control hwnd )
public KeyboardCls( SharpDX.DirectInput.Keyboard device, IntPtr hwnd )
{
log.DebugFormat( "KeyboardCls ctor - Entry with {0}", device.Information.ProductName );
@ -351,34 +356,35 @@ namespace SCJMapper_V2.Devices.Keyboard
Activated_low = true;
}
public void Deactivate( )
{
this.Activated = false;
}
public void Activate( )
/// <summary>
/// returns the currently available input string
/// (does not retrieve new data but uses what was collected by GetData())
/// NOTE: for Keyboard this returns only the key, no modifiers
/// </summary>
/// <returns>An input string or an empty string if no input is available</returns>
public override string GetCurrentInput()
{
this.Activated = true;
return DXKeyboardCmd( m_state.PressedKeys, true, true );
}
/// <summary>
/// Find the last change the user did on that device
/// </summary>
/// <returns>The last action as CryEngine compatible string</returns>
/// <returns>The last action as with modifiers</returns>
public override string GetLastChange( )
{
return DXKeyboardCmd( m_state.PressedKeys, true );
return DXKeyboardCmd( m_state.PressedKeys, true, false );
}
/// <summary>
/// Find the last change the user did on that device
/// </summary>
/// <returns>The last action as CryEngine compatible string</returns>
/// <param name="modAndKey">True for mod and key, false for modifier only</param>
/// <returns>Last action mod and key or only modifier</returns>
public string GetLastChange( bool modAndKey )
{
return DXKeyboardCmd( m_state.PressedKeys, modAndKey );
return DXKeyboardCmd( m_state.PressedKeys, modAndKey, false);
}

@ -0,0 +1,316 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using SCJMapper_V2.Devices.Gamepad;
using SCJMapper_V2.Devices.Joystick;
using SCJMapper_V2.Devices.Keyboard;
using SCJMapper_V2.Devices.Mouse;
using SharpDX.DirectInput;
namespace SCJMapper_V2.Devices.Monitor
{
/// <summary>
/// Monitors the DirectX devices and reports Events to update the caller
/// </summary>
public class DeviceMonitoring
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger( MethodBase.GetCurrentMethod( ).DeclaringType );
public event EventHandler<DxDeviceEventArgs> DxDeviceEvent;
// call when the items are known.
private void DeviceStateUpdated( DxDeviceStates action )
{
if ( m_reportEvents ) {
DxDeviceEvent?.Invoke( this, new DxDeviceEventArgs( action ) );
}
}
private Thread m_monitoringThread = null;
// Thread polling
private static int m_pollInterval_ms = 50; //**** Take care...
public int PollIntervall
{
get => m_pollInterval_ms;
set {
m_pollInterval_ms = value;
m_pollInterval_ms = ( m_pollInterval_ms < 10 ) ? 10 : m_pollInterval_ms; // limit minimum to 10 ms
}
}
private static bool m_reportEvents = false;
public bool ReportEvents
{
get => m_reportEvents;
set {
m_reportEvents = value;
if ( m_reportEvents ) {
DeviceInst.GamepadRef?.Activate( );
DeviceInst.KeyboardRef?.Activate( );
DeviceInst.MouseRef?.Activate( );
DeviceInst.JoystickListRef.Activate( );
}
else {
DeviceInst.GamepadRef?.Deactivate( );
DeviceInst.KeyboardRef?.Deactivate( );
DeviceInst.MouseRef?.Deactivate( );
DeviceInst.JoystickListRef.Deactivate( );
}
}
}
/// <summary>
/// cTor: Enable continuous monitoring
/// </summary>
public DeviceMonitoring()
{
log.Debug( "DeviceMonitoring.cTor - Entry" );
// save the Activated States
DeviceInst.GamepadRef?.PushActiveState( );
DeviceInst.KeyboardRef?.PushActiveState( );
DeviceInst.MouseRef?.PushActiveState( );
DeviceInst.JoystickListRef.PushActiveState( );
DxMonitorThread dxMonitorThread = new DxMonitorThread( this );
m_monitoringThread = new Thread( dxMonitorThread.Run );
m_monitoringThread.Start( );
}
public void ShutMonitoring()
{
m_reportEvents = false;
// recover the Activated States
DeviceInst.GamepadRef?.PopActiveState( );
DeviceInst.KeyboardRef?.PopActiveState( );
DeviceInst.MouseRef?.PopActiveState( );
DeviceInst.JoystickListRef.PopActiveState( );
m_monitoringThread?.Abort( );
}
public class DxDeviceReport
{
public string Input = "";
public bool IsAxis = false; // true if an Axis is reported
}
/// <summary>
/// Reporting structure for DX devices
/// </summary>
public class DxDeviceStates
{
// Keyboard
public DxDeviceReport KeyboardIn = new DxDeviceReport( ) { Input = "", IsAxis = false };
// Mouse
public DxDeviceReport MouseIn = new DxDeviceReport( ) { Input = "", IsAxis = false };
// Gamepad
public DxDeviceReport GamepadIn = new DxDeviceReport( ) { Input = "", IsAxis = false };
// Joysticks
public DxDeviceReport[] JoystickIn = new DxDeviceReport[12] { new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
new DxDeviceReport(){ Input="", IsAxis=false },
};
public string Modifier = ""; // mod from Kbd
// state management
string m_prevKbdMod = string.Empty;
string m_prevKbd = string.Empty;
bool m_kbdEmpty = false;
string m_prevMouse = string.Empty;
string m_prevMouseMod = string.Empty;
bool m_mouseEmpty = false;
string m_prevGamepad = string.Empty;
string m_prevGamepadMod = string.Empty;
bool m_gamepadEmpty = false;
string[] m_prevJoystick = new string[12] { "", "", "", "", "", "", "", "", "", "", "", "" };
string[] m_prevJoystickMod = new string[12] { "", "", "", "", "", "", "", "", "", "", "", "" };
bool[] m_joystickEmpty = new bool[12] { false, false, false, false, false, false, false, false, false, false, false, false };
int m_timer = 3000 / m_pollInterval_ms;// 3sec
/// <summary>
/// This should assign a new input or an empty string for each item
/// </summary>
public void Update()
{
bool anyInput = false;
// keyboard input will be empty on release where other stay on their last input...
Modifier = DeviceInst.KeyboardRef?.GetLastChange( false ); // mod only
if ( !string.IsNullOrEmpty( Modifier ) ) {
Modifier += "+";
}
string input = string.Empty;
KeyboardIn.Input = string.Empty;
input = DeviceInst.KeyboardRef?.GetCurrentInput( ); // key only
if ( !string.IsNullOrEmpty( input ) ) {
// still pressed or newly pressed
if ( m_prevKbd == input ) {
// still pressed
if ( ( m_prevKbdMod != Modifier ) || m_kbdEmpty ) {
// but mod changed; or newly the same- report
KeyboardIn.Input = KeyboardCls.DevInput( Modifier + input );
m_prevKbdMod = Modifier;
anyInput = true;
}
}
else {
// new input
KeyboardIn.Input = KeyboardCls.DevInput( Modifier + input );
m_prevKbd = input;
m_prevKbdMod = Modifier;
anyInput = true;
}
}
m_kbdEmpty = string.IsNullOrEmpty( input );
MouseIn.Input = string.Empty;
input = DeviceInst.MouseRef?.GetCurrentInput( );
if ( !string.IsNullOrEmpty( input ) ) {
// still pressed or newly pressed
if ( m_prevMouse == input ) {
// still pressed
if ( ( m_prevMouseMod != Modifier ) || m_mouseEmpty ) {
// but mod changed - report
MouseIn.Input = MouseCls.DevInput( Modifier + input );
m_prevMouseMod = Modifier;
anyInput = true;
}
}
else {
// new input
MouseIn.Input = MouseCls.DevInput( Modifier + input );
m_prevMouse = input;
m_prevMouseMod = Modifier;
MouseIn.IsAxis = MouseCls.IsAxisCommand( MouseIn.Input );
anyInput = true;
}
}
m_mouseEmpty = string.IsNullOrEmpty( input );
GamepadIn.Input = string.Empty;
input = DeviceInst.GamepadRef?.GetCurrentInput( );
if ( !string.IsNullOrEmpty( input ) ) {
// still pressed or newly pressed
if ( m_prevGamepad == input ) {
// still pressed
if ( ( m_prevGamepadMod != Modifier ) || m_gamepadEmpty ) {
// but mod changed - report
GamepadIn.Input = GamepadCls.DevInput( Modifier + input );
m_prevGamepadMod = Modifier;
anyInput = true;
}
}
else {
// new input
GamepadIn.Input = GamepadCls.DevInput( Modifier + input );
m_prevGamepad = input;
m_prevGamepadMod = Modifier;
GamepadIn.IsAxis = GamepadCls.IsAxisCommand( GamepadIn.Input );
anyInput = true;
}
}
m_gamepadEmpty = string.IsNullOrEmpty( input );
//
foreach ( var js in DeviceInst.JoystickListRef ) {
JoystickIn[js.DevInstance].Input = string.Empty; // indicates no change
input = js.GetCurrentInput( ); // we get either a code or an empty string if released
if ( !string.IsNullOrEmpty( input ) ) {
// still pressed or newly pressed
if ( m_prevJoystick[js.DevInstance] == input ) {
// still pressed
if ( ( m_prevJoystickMod[js.DevInstance] != Modifier ) || m_joystickEmpty[js.DevInstance] ) {
// but mod changed - report
JoystickIn[js.DevInstance].Input = JoystickCls.DevInput( Modifier + input, js.JSAssignment );
m_prevJoystickMod[js.DevInstance] = Modifier;
anyInput = true;
}
}
else {
// new input
JoystickIn[js.DevInstance].Input = JoystickCls.DevInput( Modifier + input, js.JSAssignment );
m_prevJoystick[js.DevInstance] = input;
m_prevJoystickMod[js.DevInstance] = Modifier;
JoystickIn[js.DevInstance].IsAxis = JoystickCls.IsAxisCommand( JoystickIn[js.DevInstance].Input );
anyInput = true;
}
}
m_joystickEmpty[js.DevInstance] = string.IsNullOrEmpty( input );
}
if ( anyInput ) {
m_timer = 3000 / m_pollInterval_ms; // for any Input - wait again 3sec before sending modifier alone as input
}
else {
m_timer = ( m_timer < 0 ) ? 0 : m_timer - 1; // decrement and hold at 0
// check if it is time to send the modifier as input
if ( !string.IsNullOrEmpty( Modifier ) && ( m_timer <= 0 ) )
KeyboardIn.Input = KeyboardCls.DevInput( DeviceInst.KeyboardRef?.GetLastChange( false ) );
}
}
}
private static DxDeviceStates m_deviceStates = new DxDeviceStates( );
public DxDeviceStates GetState { get => m_deviceStates; }
class DxMonitorThread
{
private DeviceMonitoring m_context = null;
public DxMonitorThread( DeviceMonitoring context )
{
m_context = context;
}
/// <summary>
/// Thread routine to scan DxDevices
/// </summary>
public void Run()
{
while ( true ) {
if ( m_reportEvents ) {
if ( ( DeviceInst.KeyboardRef != null ) && DeviceInst.KeyboardRef.Activated ) DeviceInst.KeyboardRef.GetData( );
if ( ( DeviceInst.MouseRef != null ) && DeviceInst.MouseRef.Activated ) DeviceInst.MouseRef.GetData( );
if ( ( DeviceInst.GamepadRef != null ) && DeviceInst.GamepadRef.Activated ) DeviceInst.GamepadRef.GetData( );
foreach ( var js in DeviceInst.JoystickListRef ) {
if ( js.Activated ) js.GetData( );
}
// fill device states
m_deviceStates.Update( );
m_context?.DeviceStateUpdated( m_deviceStates );
}
try {
Thread.Sleep( m_pollInterval_ms );
}
catch {
break;
}
}
}
}
}
}

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SCJMapper_V2.Devices.Monitor
{
public class DxDeviceEventArgs
{
public DeviceMonitoring.DxDeviceStates DeviceStates { get; set; }
public string SelectedCtrl { get; set; }
public DxDeviceEventArgs( DeviceMonitoring.DxDeviceStates states )
{
DeviceStates = states;
}
}
}

@ -0,0 +1,537 @@
namespace SCJMapper_V2.Devices.Monitor
{
partial class FormDeviceMonitor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormDeviceMonitor));
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.lblJ_03 = new System.Windows.Forms.Label();
this.txJoystick03 = new System.Windows.Forms.TextBox();
this.txJoystick02 = new System.Windows.Forms.TextBox();
this.txJoystick01 = new System.Windows.Forms.TextBox();
this.txJoystick00 = new System.Windows.Forms.TextBox();
this.txGamepad = new System.Windows.Forms.TextBox();
this.txMouse = new System.Windows.Forms.TextBox();
this.txKeyboard = new System.Windows.Forms.TextBox();
this.lblJ_02 = new System.Windows.Forms.Label();
this.lblJ_01 = new System.Windows.Forms.Label();
this.lblJ_00 = new System.Windows.Forms.Label();
this.lblGamepad = new System.Windows.Forms.Label();
this.lblMouse = new System.Windows.Forms.Label();
this.lblKeyboard = new System.Windows.Forms.Label();
this.btTogMonitor = new System.Windows.Forms.Button();
this.IL = new System.Windows.Forms.ImageList(this.components);
this.lbxOther = new System.Windows.Forms.RichTextBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.flpToggle = new System.Windows.Forms.FlowLayoutPanel();
this.uC_Toggle1 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle2 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle3 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle4 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle5 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle6 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle7 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle8 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle9 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.uC_Toggle10 = new SCJMapper_V2.Devices.Monitor.UC_Toggle();
this.panel1 = new System.Windows.Forms.Panel();
this.chkReport = new System.Windows.Forms.CheckBox();
this.chkMonitorMouse = new System.Windows.Forms.CheckBox();
this.groupBox1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.flpToggle.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.lblJ_03);
this.groupBox1.Controls.Add(this.txJoystick03);
this.groupBox1.Controls.Add(this.txJoystick02);
this.groupBox1.Controls.Add(this.txJoystick01);
this.groupBox1.Controls.Add(this.txJoystick00);
this.groupBox1.Controls.Add(this.txGamepad);
this.groupBox1.Controls.Add(this.txMouse);
this.groupBox1.Controls.Add(this.txKeyboard);
this.groupBox1.Controls.Add(this.lblJ_02);
this.groupBox1.Controls.Add(this.lblJ_01);
this.groupBox1.Controls.Add(this.lblJ_00);
this.groupBox1.Controls.Add(this.lblGamepad);
this.groupBox1.Controls.Add(this.lblMouse);
this.groupBox1.Controls.Add(this.lblKeyboard);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Left;
this.groupBox1.ForeColor = System.Drawing.Color.Gainsboro;
this.groupBox1.Location = new System.Drawing.Point(175, 3);
this.groupBox1.Margin = new System.Windows.Forms.Padding(5, 3, 3, 3);
this.groupBox1.Name = "groupBox1";
this.tableLayoutPanel1.SetRowSpan(this.groupBox1, 2);
this.groupBox1.Size = new System.Drawing.Size(519, 144);
this.groupBox1.TabIndex = 6;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "...";
//
// lblJ_03
//
this.lblJ_03.AutoSize = true;
this.lblJ_03.ForeColor = System.Drawing.Color.Gainsboro;
this.lblJ_03.Location = new System.Drawing.Point(278, 108);
this.lblJ_03.Name = "lblJ_03";
this.lblJ_03.Size = new System.Drawing.Size(56, 13);
this.lblJ_03.TabIndex = 8;
this.lblJ_03.Text = "Joystick-3";
//
// txJoystick03
//
this.txJoystick03.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txJoystick03.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txJoystick03.ForeColor = System.Drawing.Color.Gainsboro;
this.txJoystick03.Location = new System.Drawing.Point(363, 105);
this.txJoystick03.Name = "txJoystick03";
this.txJoystick03.ReadOnly = true;
this.txJoystick03.Size = new System.Drawing.Size(145, 22);
this.txJoystick03.TabIndex = 7;
//
// txJoystick02
//
this.txJoystick02.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txJoystick02.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txJoystick02.ForeColor = System.Drawing.Color.Gainsboro;
this.txJoystick02.Location = new System.Drawing.Point(363, 77);
this.txJoystick02.Name = "txJoystick02";
this.txJoystick02.ReadOnly = true;
this.txJoystick02.Size = new System.Drawing.Size(145, 22);
this.txJoystick02.TabIndex = 6;
//
// txJoystick01
//
this.txJoystick01.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txJoystick01.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txJoystick01.ForeColor = System.Drawing.Color.Gainsboro;
this.txJoystick01.Location = new System.Drawing.Point(363, 49);
this.txJoystick01.Name = "txJoystick01";
this.txJoystick01.ReadOnly = true;
this.txJoystick01.Size = new System.Drawing.Size(145, 22);
this.txJoystick01.TabIndex = 5;
//
// txJoystick00
//
this.txJoystick00.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txJoystick00.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txJoystick00.ForeColor = System.Drawing.Color.Gainsboro;
this.txJoystick00.Location = new System.Drawing.Point(363, 21);
this.txJoystick00.Name = "txJoystick00";
this.txJoystick00.ReadOnly = true;
this.txJoystick00.Size = new System.Drawing.Size(145, 22);
this.txJoystick00.TabIndex = 4;
//
// txGamepad
//
this.txGamepad.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txGamepad.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txGamepad.ForeColor = System.Drawing.Color.Gainsboro;
this.txGamepad.Location = new System.Drawing.Point(99, 77);
this.txGamepad.Name = "txGamepad";
this.txGamepad.ReadOnly = true;
this.txGamepad.Size = new System.Drawing.Size(145, 22);
this.txGamepad.TabIndex = 3;
//
// txMouse
//
this.txMouse.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txMouse.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txMouse.ForeColor = System.Drawing.Color.Gainsboro;
this.txMouse.Location = new System.Drawing.Point(99, 49);
this.txMouse.Name = "txMouse";
this.txMouse.ReadOnly = true;
this.txMouse.Size = new System.Drawing.Size(145, 22);
this.txMouse.TabIndex = 2;
//
// txKeyboard
//
this.txKeyboard.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.txKeyboard.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.txKeyboard.ForeColor = System.Drawing.Color.Gainsboro;
this.txKeyboard.Location = new System.Drawing.Point(99, 21);
this.txKeyboard.Name = "txKeyboard";
this.txKeyboard.ReadOnly = true;
this.txKeyboard.Size = new System.Drawing.Size(145, 22);
this.txKeyboard.TabIndex = 1;
//
// lblJ_02
//
this.lblJ_02.AutoSize = true;
this.lblJ_02.ForeColor = System.Drawing.Color.Gainsboro;
this.lblJ_02.Location = new System.Drawing.Point(278, 80);
this.lblJ_02.Name = "lblJ_02";
this.lblJ_02.Size = new System.Drawing.Size(56, 13);
this.lblJ_02.TabIndex = 0;
this.lblJ_02.Text = "Joystick-2";
//
// lblJ_01
//
this.lblJ_01.AutoSize = true;
this.lblJ_01.ForeColor = System.Drawing.Color.Gainsboro;
this.lblJ_01.Location = new System.Drawing.Point(278, 52);
this.lblJ_01.Name = "lblJ_01";
this.lblJ_01.Size = new System.Drawing.Size(56, 13);
this.lblJ_01.TabIndex = 0;
this.lblJ_01.Text = "Joystick-1";
//
// lblJ_00
//
this.lblJ_00.AutoSize = true;
this.lblJ_00.ForeColor = System.Drawing.Color.Gainsboro;
this.lblJ_00.Location = new System.Drawing.Point(278, 24);
this.lblJ_00.Name = "lblJ_00";
this.lblJ_00.Size = new System.Drawing.Size(56, 13);
this.lblJ_00.TabIndex = 0;
this.lblJ_00.Text = "Joystick-0";
//
// lblGamepad
//
this.lblGamepad.AutoSize = true;
this.lblGamepad.ForeColor = System.Drawing.Color.Gainsboro;
this.lblGamepad.Location = new System.Drawing.Point(6, 80);
this.lblGamepad.Name = "lblGamepad";
this.lblGamepad.Size = new System.Drawing.Size(56, 13);
this.lblGamepad.TabIndex = 0;
this.lblGamepad.Text = "Gamepad";
//
// lblMouse
//
this.lblMouse.AutoSize = true;
this.lblMouse.ForeColor = System.Drawing.Color.Gainsboro;
this.lblMouse.Location = new System.Drawing.Point(6, 52);
this.lblMouse.Name = "lblMouse";
this.lblMouse.Size = new System.Drawing.Size(42, 13);
this.lblMouse.TabIndex = 0;
this.lblMouse.Text = "Mouse";
//
// lblKeyboard
//
this.lblKeyboard.AutoSize = true;
this.lblKeyboard.ForeColor = System.Drawing.Color.Gainsboro;
this.lblKeyboard.Location = new System.Drawing.Point(6, 24);
this.lblKeyboard.Name = "lblKeyboard";
this.lblKeyboard.Size = new System.Drawing.Size(55, 13);
this.lblKeyboard.TabIndex = 0;
this.lblKeyboard.Text = "Keyboard";
//
// btTogMonitor
//
this.btTogMonitor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btTogMonitor.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btTogMonitor.ForeColor = System.Drawing.Color.Gainsboro;
this.btTogMonitor.ImageIndex = 1;
this.btTogMonitor.ImageList = this.IL;
this.btTogMonitor.Location = new System.Drawing.Point(10, 10);
this.btTogMonitor.Margin = new System.Windows.Forms.Padding(10, 10, 3, 3);
this.btTogMonitor.Name = "btTogMonitor";
this.btTogMonitor.Size = new System.Drawing.Size(144, 54);
this.btTogMonitor.TabIndex = 4;
this.btTogMonitor.Tag = "§";
this.btTogMonitor.Text = "Monitoring";
this.btTogMonitor.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.btTogMonitor.UseVisualStyleBackColor = false;
this.btTogMonitor.Click += new System.EventHandler(this.btTogMonitor_Click);
//
// IL
//
this.IL.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("IL.ImageStream")));
this.IL.TransparentColor = System.Drawing.Color.Transparent;
this.IL.Images.SetKeyName(0, "Monitoring");
this.IL.Images.SetKeyName(1, "NotMonitoring");
//
// lbxOther
//
this.lbxOther.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.tableLayoutPanel1.SetColumnSpan(this.lbxOther, 2);
this.lbxOther.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbxOther.ForeColor = System.Drawing.Color.Gainsboro;
this.lbxOther.Location = new System.Drawing.Point(3, 253);
this.lbxOther.Name = "lbxOther";
this.lbxOther.Size = new System.Drawing.Size(698, 125);
this.lbxOther.TabIndex = 7;
this.lbxOther.Text = "";
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 170F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.lbxOther, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.groupBox1, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.flpToggle, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.panel1, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.btTogMonitor, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 70F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 80F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(704, 381);
this.tableLayoutPanel1.TabIndex = 8;
//
// flpToggle
//
this.tableLayoutPanel1.SetColumnSpan(this.flpToggle, 2);
this.flpToggle.Controls.Add(this.uC_Toggle1);
this.flpToggle.Controls.Add(this.uC_Toggle2);
this.flpToggle.Controls.Add(this.uC_Toggle3);
this.flpToggle.Controls.Add(this.uC_Toggle4);
this.flpToggle.Controls.Add(this.uC_Toggle5);
this.flpToggle.Controls.Add(this.uC_Toggle6);
this.flpToggle.Controls.Add(this.uC_Toggle7);
this.flpToggle.Controls.Add(this.uC_Toggle8);
this.flpToggle.Controls.Add(this.uC_Toggle9);
this.flpToggle.Controls.Add(this.uC_Toggle10);
this.flpToggle.Dock = System.Windows.Forms.DockStyle.Fill;
this.flpToggle.Location = new System.Drawing.Point(3, 153);
this.flpToggle.Name = "flpToggle";
this.flpToggle.Size = new System.Drawing.Size(698, 94);
this.flpToggle.TabIndex = 10;
//
// uC_Toggle1
//
this.uC_Toggle1.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle1.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle1.Label = "";
this.uC_Toggle1.Location = new System.Drawing.Point(0, 0);
this.uC_Toggle1.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle1.Name = "uC_Toggle1";
this.uC_Toggle1.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle1.Switch = false;
this.uC_Toggle1.TabIndex = 0;
//
// uC_Toggle2
//
this.uC_Toggle2.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle2.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle2.Label = "";
this.uC_Toggle2.Location = new System.Drawing.Point(64, 0);
this.uC_Toggle2.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle2.Name = "uC_Toggle2";
this.uC_Toggle2.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle2.Switch = false;
this.uC_Toggle2.TabIndex = 1;
//
// uC_Toggle3
//
this.uC_Toggle3.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle3.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle3.Label = "";
this.uC_Toggle3.Location = new System.Drawing.Point(128, 0);
this.uC_Toggle3.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle3.Name = "uC_Toggle3";
this.uC_Toggle3.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle3.Switch = false;
this.uC_Toggle3.TabIndex = 2;
//
// uC_Toggle4
//
this.uC_Toggle4.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle4.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle4.Label = "";
this.uC_Toggle4.Location = new System.Drawing.Point(192, 0);
this.uC_Toggle4.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle4.Name = "uC_Toggle4";
this.uC_Toggle4.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle4.Switch = false;
this.uC_Toggle4.TabIndex = 3;
//
// uC_Toggle5
//
this.uC_Toggle5.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle5.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle5.Label = "";
this.uC_Toggle5.Location = new System.Drawing.Point(256, 0);
this.uC_Toggle5.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle5.Name = "uC_Toggle5";
this.uC_Toggle5.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle5.Switch = false;
this.uC_Toggle5.TabIndex = 4;
//
// uC_Toggle6
//
this.uC_Toggle6.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle6.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle6.Label = "";
this.uC_Toggle6.Location = new System.Drawing.Point(320, 0);
this.uC_Toggle6.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle6.Name = "uC_Toggle6";
this.uC_Toggle6.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle6.Switch = false;
this.uC_Toggle6.TabIndex = 5;
//
// uC_Toggle7
//
this.uC_Toggle7.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle7.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle7.Label = "";
this.uC_Toggle7.Location = new System.Drawing.Point(384, 0);
this.uC_Toggle7.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle7.Name = "uC_Toggle7";
this.uC_Toggle7.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle7.Switch = false;
this.uC_Toggle7.TabIndex = 6;
//
// uC_Toggle8
//
this.uC_Toggle8.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle8.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle8.Label = "";
this.uC_Toggle8.Location = new System.Drawing.Point(448, 0);
this.uC_Toggle8.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle8.Name = "uC_Toggle8";
this.uC_Toggle8.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle8.Switch = false;
this.uC_Toggle8.TabIndex = 7;
//
// uC_Toggle9
//
this.uC_Toggle9.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle9.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle9.Label = "";
this.uC_Toggle9.Location = new System.Drawing.Point(512, 0);
this.uC_Toggle9.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle9.Name = "uC_Toggle9";
this.uC_Toggle9.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle9.Switch = false;
this.uC_Toggle9.TabIndex = 8;
//
// uC_Toggle10
//
this.uC_Toggle10.BackColor = System.Drawing.Color.Transparent;
this.uC_Toggle10.Dock = System.Windows.Forms.DockStyle.Top;
this.uC_Toggle10.Label = "";
this.uC_Toggle10.Location = new System.Drawing.Point(576, 0);
this.uC_Toggle10.Margin = new System.Windows.Forms.Padding(0);
this.uC_Toggle10.Name = "uC_Toggle10";
this.uC_Toggle10.Size = new System.Drawing.Size(64, 95);
this.uC_Toggle10.Switch = false;
this.uC_Toggle10.TabIndex = 9;
//
// panel1
//
this.panel1.Controls.Add(this.chkReport);
this.panel1.Controls.Add(this.chkMonitorMouse);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(3, 73);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(164, 74);
this.panel1.TabIndex = 11;
//
// chkReport
//
this.chkReport.AutoSize = true;
this.chkReport.ForeColor = System.Drawing.Color.Gainsboro;
this.chkReport.Location = new System.Drawing.Point(9, 44);
this.chkReport.Name = "chkReport";
this.chkReport.Size = new System.Drawing.Size(84, 17);
this.chkReport.TabIndex = 10;
this.chkReport.Tag = "§";
this.chkReport.Text = "List Actions";
this.chkReport.UseVisualStyleBackColor = true;
//
// chkMonitorMouse
//
this.chkMonitorMouse.AutoSize = true;
this.chkMonitorMouse.ForeColor = System.Drawing.Color.Gainsboro;
this.chkMonitorMouse.Location = new System.Drawing.Point(9, 16);
this.chkMonitorMouse.Name = "chkMonitorMouse";
this.chkMonitorMouse.Size = new System.Drawing.Size(127, 17);
this.chkMonitorMouse.TabIndex = 9;
this.chkMonitorMouse.Tag = "§";
this.chkMonitorMouse.Text = "Monitor mouse axis";
this.chkMonitorMouse.UseVisualStyleBackColor = true;
//
// FormDeviceMonitor
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
this.ClientSize = new System.Drawing.Size(704, 381);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
this.MinimumSize = new System.Drawing.Size(720, 420);
this.Name = "FormDeviceMonitor";
this.Tag = "§";
this.Text = "Device Monitor";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormDeviceMonitor_FormClosing);
this.Load += new System.EventHandler(this.FormDeviceMonitor_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.tableLayoutPanel1.ResumeLayout(false);
this.flpToggle.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label lblJ_03;
private System.Windows.Forms.TextBox txJoystick03;
private System.Windows.Forms.TextBox txJoystick02;
private System.Windows.Forms.TextBox txJoystick01;
private System.Windows.Forms.TextBox txJoystick00;
private System.Windows.Forms.TextBox txGamepad;
private System.Windows.Forms.TextBox txMouse;
private System.Windows.Forms.TextBox txKeyboard;
private System.Windows.Forms.Label lblJ_02;
private System.Windows.Forms.Label lblJ_01;
private System.Windows.Forms.Label lblJ_00;
private System.Windows.Forms.Label lblGamepad;
private System.Windows.Forms.Label lblMouse;
private System.Windows.Forms.Label lblKeyboard;
private System.Windows.Forms.Button btTogMonitor;
private System.Windows.Forms.RichTextBox lbxOther;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.ImageList IL;
private System.Windows.Forms.CheckBox chkMonitorMouse;
private System.Windows.Forms.FlowLayoutPanel flpToggle;
private UC_Toggle uC_Toggle1;
private UC_Toggle uC_Toggle2;
private UC_Toggle uC_Toggle3;
private UC_Toggle uC_Toggle4;
private UC_Toggle uC_Toggle5;
private UC_Toggle uC_Toggle6;
private UC_Toggle uC_Toggle7;
private UC_Toggle uC_Toggle8;
private UC_Toggle uC_Toggle9;
private UC_Toggle uC_Toggle10;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.CheckBox chkReport;
}
}

@ -0,0 +1,197 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using SCJMapper_V2.Actions;
using SCJMapper_V2.Devices.Joystick;
using SCJMapper_V2.Translation;
namespace SCJMapper_V2.Devices.Monitor
{
/// <summary>
/// Allows continuos monitoring of Device Events
/// NOTE: Disable any other device reporting while this form is open..
/// </summary>
internal partial class FormDeviceMonitor : Form
{
private bool m_monitor = false;
private DeviceMonitoring m_dx = null;
private ActionTree m_atRef = null;
private DeviceMonitoring.DxDeviceStates m_prevStates = new DeviceMonitoring.DxDeviceStates( );
private class TogWrap
{
public UC_Toggle Toggle = null;
public string Cmd = "";
public string Label = "";
public TogWrap( UC_Toggle tog, string cmd, string lbl )
{
Toggle = tog;
Cmd = cmd;
Label = lbl;
Toggle.Label = Label;
}
}
private Dictionary<string, TogWrap> m_toggles = new Dictionary<string, TogWrap>( );
private enum Togs
{
Freelook
}
public ActionTree ActionTree { set => m_atRef = value; }
public FormDeviceMonitor()
{
InitializeComponent( );
}
private void FormDeviceMonitor_Load( object sender, EventArgs e )
{
Tx.LocalizeControlTree( this );
lblKeyboard.Text = Tx.Translate( "xKeyboard" );
lblMouse.Text = Tx.Translate( "xMouse" );
lblGamepad.Text = Tx.Translate( "xGamepad" );
lblJ_00.Text = Tx.Translate( "xJoystick" ) + "-0";
lblJ_01.Text = Tx.Translate( "xJoystick" ) + "-1";
lblJ_02.Text = Tx.Translate( "xJoystick" ) + "-2";
lblJ_03.Text = Tx.Translate( "xJoystick" ) + "-3";
// get Toggles
var t = new TogWrap( uC_Toggle1, "v_view_freelook_mode", "Freelook" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle2, "v_ifcs_toggle_esp", "ESP" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle3, "v_toggle_landing_system", "Landing System" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle4, "v_toggle_weapon_gimbal_lock", "Gimbal Lock Tgt" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle5, "v_target_toggle_pinned_focused", "Pin focused" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle6, "v_power_toggle_group_1", "Pwr Shields" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle7, "v_power_toggle_group_2", "Pwr Weapons" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle8, "v_power_toggle_group_3", "Pwr Drive" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle9, "v_power_toggle", "Power" ); m_toggles.Add( t.Cmd, t );
t = new TogWrap( uC_Toggle10, "v_toggle_running_lights", "Lights" ); m_toggles.Add( t.Cmd, t );
m_dx = new DeviceMonitoring( );
m_dx.DxDeviceEvent += M_dx_DxDeviceEvent;
// start with monitoring OFF
m_monitor = false;
UpdateMonitor( );
}
// can be called from non UI thread
private void M_dx_DxDeviceEvent( object sender, DxDeviceEventArgs e )
{
this.Invoke( (MethodInvoker)delegate {
UpdateDeviceLabels( e.DeviceStates );
} );
}
private void FormDeviceMonitor_FormClosing( object sender, FormClosingEventArgs e )
{
m_dx?.ShutMonitoring( );
m_dx = null;
Thread.Sleep( 200 ); // should allow to get all settled..
}
private void btTogMonitor_Click( object sender, EventArgs e )
{
m_monitor = !m_monitor;
UpdateMonitor( );
}
private void UpdateMonitor()
{
if ( m_monitor ) {
btTogMonitor.ImageKey = "Monitoring";
m_dx.ReportEvents = true;
}
else {
btTogMonitor.ImageKey = "NotMonitoring";
m_dx.ReportEvents = false;
}
}
private void UpdateDeviceLabels( DeviceMonitoring.DxDeviceStates states )
{
if ( !string.IsNullOrEmpty( states.KeyboardIn.Input ) ) {
txKeyboard.Text = states.KeyboardIn.Input;
UpdateAssignmentList( states.KeyboardIn.Input );
}
if ( !string.IsNullOrEmpty( states.MouseIn.Input ) ) {
if ( chkMonitorMouse.Checked ) {
txMouse.Text = states.MouseIn.Input;
UpdateAssignmentList( states.MouseIn.Input );
}
else {
if ( states.MouseIn.IsAxis == false ) {
// only non axis..
txMouse.Text = states.MouseIn.Input;
UpdateAssignmentList( states.MouseIn.Input );
}
}
}
if ( !string.IsNullOrEmpty( states.GamepadIn.Input ) ) {
txGamepad.Text = states.GamepadIn.Input;
UpdateAssignmentList( states.GamepadIn.Input );
}
int jsDev = 0;
if ( !string.IsNullOrEmpty( states.JoystickIn[jsDev].Input ) ) {
txJoystick00.Text = states.JoystickIn[jsDev].Input;
UpdateAssignmentList( states.JoystickIn[jsDev].Input );
}
jsDev = 1;
if ( !string.IsNullOrEmpty( states.JoystickIn[jsDev].Input ) ) {
txJoystick01.Text = states.JoystickIn[jsDev].Input;
UpdateAssignmentList( states.JoystickIn[jsDev].Input );
}
jsDev = 2;
if ( !string.IsNullOrEmpty( states.JoystickIn[jsDev].Input ) ) {
txJoystick02.Text = states.JoystickIn[jsDev].Input;
UpdateAssignmentList( states.JoystickIn[jsDev].Input );
}
jsDev = 3;
if ( !string.IsNullOrEmpty( states.JoystickIn[jsDev].Input ) ) {
txJoystick03.Text = states.JoystickIn[jsDev].Input;
UpdateAssignmentList( states.JoystickIn[jsDev].Input );
}
}
private void UpdateAssignmentList( string devInput )
{
if ( string.IsNullOrEmpty( devInput ) ) return;
var actions = m_atRef.GetAllActions( devInput );
// cheap
foreach ( var t in m_toggles ) {
if ( actions.Contains( t.Key ) ) {
t.Value.Toggle.ToggleState( );
}
}
if ( chkReport.Checked ) {
// show list
RTF.RTFformatter RTF = new RTF.RTFformatter { RColor = SCJMapper_V2.RTF.RTFformatter.ERColor.ERC_Gainsborow };
m_atRef.ListAllActionsRTF( devInput, RTF, true );
// have to check if throttle is used and if - add those to the list
string altDevInput = JoystickCls.MakeThrottle( devInput, true );
if ( altDevInput != devInput ) {
m_atRef.ListAllActionsRTF( altDevInput, RTF, true );
}
lbxOther.Rtf = RTF.RTFtext;
}
else {
lbxOther.Text = "";
}
}
}
}

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="IL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="IL.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABE
DwAAAk1TRnQBSQFMAgEBAgEAAbABAAGwAQABMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABwAMAATADAAEBAQABCAYAASQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AEEAAf8B9hIA
AfYB/6kAAfMBRgElARoQAAEaASUBRgHyfQAB8QFzAfEnAAHzAUYDJQEaDgABGgMlAUYB8nsAAQcDKAEI
JQAB8wFGBSUBGgwAARoFJQFGAfJ5AAEHBSgBCCMAAfMBRgclARoKAAEaByUBRgEbdwABmQcoAQghAAHz
AUYJJQEaCAABGgFGCCUBRgEbdQABmQIoBSkCKAEIHwAB8wFGCyUBGgYAARoBRgolAUYB83MAAQcBKAkp
ASgBCB0AAfMBRgwlAUYBGgQAARoBRgwlAUYB83EAAQcBKAspASgBCBsAAfMBRg4lAUYBGgIAARoBRg4l
AUYB828AAQcBKA0pASgBCBkAAf8BRhAlAUYCGgFGECUBRgH/bQABBwEoDkoBKQEoAQgYAAH/AUYRJQJG
ESUBRgH/bAABBwEoEFABSgEoAQgYAAEaAUYiJQFGARpsAAGZASgTUAEoAQgYAAEaAUYBJh8lAUYBGmwA
AZkBKBVQASgBCBgAARoBRgEmHCUBJgFGARpsAAGZASgXUAEoAQgYAAEaAUYBJholASYBRgEabAAB7wEp
GVABKAEIGAABGgFGASwXJQErASwBRgEabAAB7wEpG1ABKAEIGAABGgFGASwBKxQlASsBLAFGARpsAAHv
ASkdUAEoAQgYAAEaAUYBTQIrECUCKwFNAUYBGmwAAfEBKQ9QASkPUAEoAQgYAAEaAUYBTQFMECsBTAFN
AUYBGm0AAXMPUAEoAQgBKA9QASgBCBgAARoBRhJMAUYBGm4AAfEBKA1QASgBvAEAAfABKA9QASgBCBcA
ARoBRhJMAUYBGm8AAfEBKAFQAVEJUAEoAbwDAAHwASgPUAEoAQgVAAEaAUYUTAFGARpvAAHyASgBUAFX
BVABUQFQASgB8AUAAfABKAFQAVENUAEoAQgTAAEaAUYWTAFGARpvAAHyASgBUAFXA1ABVwFQASgB8AcA
AfABKAFQAVcNUAEoAQgRAAEaAUYYTAFGARpvAAHyASgBUAFXAVEBVwFRASgB8AkAAfABKAFRAVcBUQxQ
ASgBCA8AARoBRhpMAUYBGm8AAfIBKAFQAXgBVwEoAfALAAHwASgCVwxRAVABKAEIDQABGgFGHEwBRgEa
bwAB8wEoAVABKAHwDQAB8AEoAVcBeAxRAVABKAEICwABGgFGHkwBRgEabwAB9gGZAfYPAAG8ASgBVwF4
DFcBUQEoAQgJAAEaAUYPTAJND0wBRgEagQABvAEoAVcNeAFRASgBCAcAARoBRg5MAk0CUwJNDkwBRgEa
gQABvAEoDngBUQEoAfQFAAH2AUYOTAFNAlMCRgJTAU0OTAFGAf+BAAG8ASgNeAFXASgB/wUAAf8BRgFN
AVMBTQpMAU0CUwFGAhoBRgJTAU0KTAFNAVMBTQFGAf+CAAG8ASgMeAEoAfAHAAHzAUYBTQJTCU0CUwFG
ARoCAAEaAUYCUwlNA1MBRgEahAABCAEoCngBKAHwCQAB8wFGAU0CUwZNA1MBRgEaBAABGgFGA1MGTQNT
AUYBGoYAAQgBKQh4ASgB8AsAAfMBRgpTAUYBGgYAARoBRgpTAUYBGogAAQgBKQZ4ASgBvA0AARsBRghT
AUYBGggAARoBRghTAUYBGooAAQgBKQR4ASkBCA8AARsBRgZTAUYBGgoAARoBRgZTAUYBGowAAQgBKQJ4
ASkBCBEAARsBRgRTAUYBGgwAARoBRgRTAUYBGo4AAQgCKQEIEwABGwFGAlMBRgEaDgABGgFGAlMBRgEa
kAAB/wH0FQABGwJGARoQAAEaAkYBGqkAAv8SAAL//wD/AP8AcAABQgFNAT4HAAE+AwABKAMAAcADAAEw
AwABAQEAAQEFAAGAAQQWAAP/AQAM/wwADP8MAAz/DAAM/wwAB/8B+QL/AZ8B/wwAB/8B8AL/AQ8B/wwA
Av8BjwT/AeABfwH+AQcB/wwAAv8BBwT/AcABPwH8AQMB/wwAAf8B/gEDBP8BgAEfAfgBAQH/DAAB/wH8
AQEE/wEAAQ8B8AEAAf8MAAH/AfgBAAP/Af4BAAEHAeABAAF/DAAB/wHwAQABfwL/AfwBAAEDAcABAAE/
DAAB/wHgAQABPwL/AfgBAAEBAYABAAEfDAAB/wHAAQABHwL/AfAEAAEPDAAB/wGAAQABDwL/AfAEAAEP
DAAB/wIAAQcC/wH4BAABHwwAAf4CAAEDAv8B/AQAAT8MAAH8AgABAQL/Af4EAAF/DAAB+AMAA/8EAAH/
DAAB8AMAAX8C/wGAAgABAQH/DAAB4AMAAT8C/wHAAgABAwH/DAABwAMAAR8C/wHgAgABBwH/DAABgAMA
AQ8C/wHwAgABDwH/DAABgAMAAQcC/wH4AgABHwH/DAABgAEAASABAAEDAv8B+AIAAR8B/wwAAcABAAFw
AQABAQL/AfACAAEPAf8MAAHgAQAB+AIAAv8B4AIAAQcB/wwAAfABAQH8AgABfwH/AcACAAEDAf8MAAH4
AQMB/gIAAT8B/wGAAgABAQH/DAAB/AEHAf8CAAEfAf8EAAH/DAAB/gEPAf8BgAEAAQ8B/gQAAX8MAAH/
AR8B/wHAAQABBwH8BAABPwwAA/8B4AEAAQMB+AQAAR8MAAP/AfABAAEBAfAEAAEPDAAD/wH4AQABAQHw
BAABDwwAA/8B/AEAAQMB+AEAAQEBgAEAAR8MAAP/Af4BAAEHAfwBAAEDAcABAAE/DAAE/wEAAQ8B/gEA
AQcB4AEAAX8MAAT/AYABHwH/AQABDwHwAQAB/wwABP8BwAE/Af8BgAEfAfgBAQH/DAAE/wHgAX8B/wHA
AT8B/AEDAf8MAAT/AfAC/wHgAX8B/gEHAf8MAAT/AfkC/wHwAv8BDwH/DAAH/wH5Av8BnwH/DAAM/wwA
DP8MAAz/DAAM/wwACw==
</value>
</data>
</root>

@ -0,0 +1,70 @@
namespace SCJMapper_V2.Devices.Monitor
{
partial class UC_LED
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UC_LED));
this.IL = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// IL
//
this.IL.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("IL.ImageStream")));
this.IL.TransparentColor = System.Drawing.Color.Transparent;
this.IL.Images.SetKeyName(0, "LED-Round_off.png");
this.IL.Images.SetKeyName(1, "LED-Round_red.png");
this.IL.Images.SetKeyName(2, "LED-Round_green.png");
this.IL.Images.SetKeyName(3, "LED-Round_blue.png");
this.IL.Images.SetKeyName(4, "LED-Round_amber.png");
this.IL.Images.SetKeyName(5, "LED-Rect_off.png");
this.IL.Images.SetKeyName(6, "LED-Rect_red.png");
this.IL.Images.SetKeyName(7, "LED-Rect_green.png");
this.IL.Images.SetKeyName(8, "LED-Rect_blue.png");
this.IL.Images.SetKeyName(9, "LED-Rect_amber.png");
//
// UC_LED
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.DoubleBuffered = true;
this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Name = "UC_LED";
this.Size = new System.Drawing.Size(128, 128);
this.Load += new System.EventHandler(this.UC_LEDRound_Load);
this.Click += new System.EventHandler(this.UC_LED_Click);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ImageList IL;
}
}

@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SCJMapper_V2.Devices.Monitor
{
public partial class UC_LED : UserControl
{
private const int c_RoundOffset = 0;
private const int c_RectOffset = 5; // rect images start
private int m_colorOffset = 0;
private const int c_OFF = 4; // Amber
private const int c_ON = 2; // Green
public UC_LED()
{
InitializeComponent( );
}
private void UC_LEDRound_Load( object sender, EventArgs e )
{
this.BackgroundImage = IL.Images[m_colorOffset + ( ( m_switch ) ? c_ON : c_OFF )];
}
private bool m_switch = false;
private bool m_rectShape = false;
/// <summary>
/// Set the switch and its appearance
/// </summary>
public bool Switch { get => m_switch; set { m_switch = value; BackgroundImage = IL.Images[m_colorOffset + ( ( m_switch ) ? c_ON : c_OFF )]; } }
public void ON() { Switch = true; }
public void OFF() { Switch = false; }
/// <summary>
/// Selects the shape (true=Rect; false=Round)
/// </summary>
public bool RectShape { get => m_rectShape; set { m_rectShape = value; m_colorOffset = ( m_rectShape ) ? c_RectOffset : c_RoundOffset; } }
private void UC_LED_Click( object sender, EventArgs e )
{
Switch = !m_switch;
}
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,63 @@
namespace SCJMapper_V2.Devices.Monitor
{
partial class UC_SwitchRect
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UC_SwitchRect));
this.IL = new System.Windows.Forms.ImageList(this.components);
this.SuspendLayout();
//
// IL
//
this.IL.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("IL.ImageStream")));
this.IL.TransparentColor = System.Drawing.Color.Transparent;
this.IL.Images.SetKeyName(0, "OFF");
this.IL.Images.SetKeyName(1, "ON");
//
// UC_SwitchRect
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
this.CausesValidation = false;
this.DoubleBuffered = true;
this.Margin = new System.Windows.Forms.Padding(0);
this.Name = "UC_SwitchRect";
this.Size = new System.Drawing.Size(128, 128);
this.Load += new System.EventHandler(this.UC_SwitchRect_Load);
this.Click += new System.EventHandler(this.UC_SwitchRect_Click);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ImageList IL;
}
}

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SCJMapper_V2.Devices.Monitor
{
public partial class UC_SwitchRect : UserControl
{
public UC_SwitchRect()
{
InitializeComponent( );
}
private void UC_SwitchRect_Load( object sender, EventArgs e )
{
this.BackgroundImage = IL.Images[( m_switch ) ? "ON" : "OFF"];
}
private bool m_switch = false;
/// <summary>
/// Set the switch and its appearance
/// </summary>
public bool Switch { get => m_switch; set { m_switch = value; BackgroundImage = IL.Images[( m_switch ) ? "ON" : "OFF"]; } }
// toggle
private void UC_SwitchRect_Click( object sender, EventArgs e )
{
Switch = !m_switch;
}
}
}

@ -0,0 +1,311 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="IL.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="IL.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABM
KgAAAk1TRnQBSQFMAgEBAgEAARABAAEQAQABgAEAAYABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
BAABAgIAAYADAAEBAQABCAcAAQEXAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD//8A/wD/AP8A/wD/AP8A
/wARAHD/EABw//8ADwAG/2j0Bv8MAAb/aPQG//8ACwAF/wL0AfNo8gHzAvQF/wgABf8C9AHzaPIB8wL0
Bf//AAgABP8B9AHzAfIB8QHwaAcB8AHxAfIB8wH0BP8GAAT/AfQB8wHyAfEB8GgHAfAB8QHyAfMB9AT/
/wAHAAP/AfQB8wHxAQcB7AHqARQBQ2QRAUMBFAHqAewBBwHxAfMB9AP/BgAD/wH0AfMB8QEHAewB6gEU
AUNkEQFDARQB6gHsAQcB8QHzAfQD//8ABgAD/wH0AfMB8AHsAREBEGoPARABEQHsAfAB8wH0A/8EAAP/
AfQB8wHwAewBEQEQag8BEAERAewB8AHzAfQD//8ABQAC/wH0AfMBBwHrARFuDwERAesBBwHzAfQC/wQA
Av8B9AHzAQcB6wERbg8BEQHrAQcB8wH0Av//AAQAA/8B8wG8AREBEHAPARABEQG8AfMD/wIAA/8B8wG8
AREBEHAPARABEQG8AfMD//8AAwAC/wH0AfIB7AEQcg8BEAHsAfIB9AL/AgAC/wH0AfIB7AEQcg8BEAHs
AfIB9AL//wADAAL/AfQBkgERdA8BEQGSAfQC/wIAAv8B9AGSARF0DwERAZIB9AL//wADAAL/AfMBEXYP
AREB8wL/AgAC/wHzARF2DwERAfMC//8AAwAB/wH0AQcBEXYPAREBBwH0Af8CAAH/AfQBBwERdg8BEQEH
AfQB//8AAwAB/wH0AewBEHYPARAB7AH0Af8CAAH/AfQB7AEQdg8BEAHsAfQB//8AAwAB/wH0ARIBEA8P
DAsMHg4BDR8OAQweDAsPDwETAfQB/wIAAf8B9AESARAODwEOVyEBDhAPARMB9AH//wADAAH/AfQBFQ4P
DgsMHg4BDR8OAQweDgsNDwFDAfQB/wIAAf8B9AEVDQ9dIQ4PAUMB9AH//wADAAH/AfQBEQwPEAsMHg4B
DR8OAQweEAsLDwERAfQB/wIAAf8B9AERCw8BDl8hAQ4MDwERAfQB//8AAwAB/wH0ARELDwEOEAsMHg4B
DR8OAQweEAsBDgoPAREB9AH/AgAB/wH0AREKDwEOYSEBDgsPAREB9AH//wADAAH/AfQBEQoQAQ8RCwwe
DgENHw4BDB4RCwEPCRABEQH0Af8CAAH/AfQBEQkQAQ8RIUEOESEBDwoQAREB9AH//wADAAH/AfQBEQoQ
EgsMHg4BDR8OAQweEgsJEAERAfQB/wIAAf8B9AERCRAQIUUOECEKEAERAfQB//8AAwAB/wH0AREJEAEP
DQsBQxIVEEMOEQ4QCg8BDgEPDQsBDwgQAREB9AH/AgAB/wH0AREIEAEPDCEBEQEVARQBEAIOAREBFAES
O+oBEgEUARECDgEQARQBFQERDCEBDwkQAREB9AH//wADAAH/AfQBEQkQAQ4LCxQVEUMOEQ0QDg8BDgsL
AQ4IEAERAfQB/wIAAf8B9AERCBAMIQMUARABDgERARJB6gESAREBDgEQAxQBEQshCRABEQH0Af//AAMA
Af8B9AERCRAKCwERFRUQQw4RDhAODwMOCgsIEAERAfQB/wIAAf8B9AERCBAKIQFDAxQBEQEOARVF6gEV
AQ4BEQMUAUMKIQkQAREB9AH//wADAAH/AfQBEQkQCQsBERUVEUMOEQ0QDg8FDgkLCBABEQH0Af8CAAH/
AfQBEQgQCSEBEQMUARUBDgEVR+oBFQEOARUDFAERCSEJEAERAfQB//8AAwAB/wH0AREJEAkLFhUQQw4R
DhAODwUOCQsIEAERAfQB/wIAAf8B9AERCBAJIQQUAhFJ6gIRBBQJIQkQAREB9AH//wADAAH/AfQBEQkQ
CAsWFRFDDhENEA4PBw4ICwgQAREB9AH/AgAB/wH0AREIEAghBBQBFQEPARJJ6gESAQ8BFQQUCCEJEAER
AfQB//8AAwAB/wH0AREJEAgLFhUQQw4RDhAODwcOCAsIEAERAfQB/wIAAf8B9AERCBAHIQERAxQCFQER
S+oBEQIVAxQBEQchCRABEQH0Af//AAMAAf8B9AoRBwsBQxYVEEMOEQ0QDg8JDgcLCREB9AH/AgAB/wH0
CREHIQFDAhQDFQEUS+oBFAMVAhQBQwchChEB9AH//wADAAH/AfQKEQcLGBUQQw4RDhAMDwkOBwsJEQH0
Af8CAAH/AfQJEQchBRUBQwETS+oBEwFDBRUHIQoRAfQB//8AAwAB/wH0ChEHCxgVEEMPEQ4QCg8KDgcL
CREB9AH/AgAB/wH0CREHIQUVAUNNEgFDBRUHIQoRAfQB//8AAwAB/wH0ChEHCyAVEEMPEQwQBg8IDgcL
CREB9AH/AgAB/wH0CREHIQQVAkNNEgJDBBUHIQoRAfQB//8AAwAB/wH0ChEHCwwVARQBFQkUExUTQw0R
BBACDwkOBwsJEQH0Af8CAAH/AfQJEQchAxUDQ00SA0MDFQchChEB9AH//wADAAH/AfQKEQcLChUGFAET
GxQWFQlDAhECEAMPBw4HCwkRAfQB/wIAAf8B9AkRBycCFQNDARFNEgERA0MCFQcnChEB9AH//wADAAH/
AfQKEQcLCBUDFAETARI+6gESARQBQwERARACDwcOBwsJEQH0Af8CAAH/AfQJEQcnBkNNEgZDBycKEQH0
Af//AAMAAf8B9AoRBwsHFQMUARJD6gEUAREBEAIPBg4HCwkRAfQB/wIAAf8B9AkRBycFQwERTRIBEQVD
BycKEQH0Af//AAMAAf8B9AoRBwsGFQMUARJF6gETAREBEAIPBQ4HCwkRAfQB/wIAAf8B9AkRBycFQwER
TRMBEQVDBycKEQH0Af//AAMAAf8B9AERCUMHCwYVAhQBEkfqARMBEQEQAQ8FDgcLCEMBEQH0Af8CAAH/
AfQBEQhDBycEQwIRTRMCEQRDBycJQwERAfQB//8AAwAB/wH0AREJQwcLBRUCFAESSeoBFAERAg8EDgcL
CEMBEQH0Af8CAAH/AfQBEQhDBycGEU0TBhEHJwlDAREB9AH//wADAAH/AfQBEQlDBwsFFQIUS+oBEQEQ
AQ8EDgcLCEMBEQH0Af8CAAH/AfQBEQhDBycGEU0TBhEHJwlDAREB9AH//wADAAH/AfQBEQlDBwsEFQIU
ARNL6gEUARABDwQOBwsIQwERAfQB/wIAAf8B9AERCEMHJwYRTRMGEQcnCUMBEQH0Af//AAMAAf8B9AER
CUMHCwQVAhQBEkvqARIBEQIPAw4HCwhDAREB9AH/AgAB/wH0AREIQwcnBhFNEwYRBycJQwERAfQB//8A
AwAB/wH0AREJQwcLBBUCFE3qARECDwMOBwsIQwERAfQB/wIAAf8B9AERCEMHJwIQAREBEAIRTRQCEQEQ
ARECEAcnCUMBEQH0Af//AAMAAf8B9AERCUMHCwQVAhRN6gERARAEDgcLCEMBEQH0Af8CAAH/AfQBEQhD
BycFEAERTRQBEQUQBycJQwERAfQB//8AAwAB/wH0AREJFQcLBBUCFE3qAREBEAEPAw4HCwgVAREB9AH/
AgAB/wH0AREIFQcCBhBNFAYQBwIJFQERAfQB//8AAwAB/wH0AREJFQcLBBUCFE0SAREBEAEPAw4HCwgV
AREB9AH/AgAB/wH0AREIFQcCBhBNFAYQBwIJFQERAfQB//8AAwAB/wH0AREJFQcLBBUCFE0SAREBEAEP
Aw4HCwgVAREB9AH/AgAB/wH0AREIFQcCAg8EEE0UBBACDwcCCRUBEQH0Af//AAMAAf8B9AERCRUHCwQV
AhRNEgERARAEDgcLCBUBEQH0Af8CAAH/AfQBEQgVBwIEDwIQTRUCEAQPBwIJFQERAfQB//8AAwAB/wH0
AREJFQcLBBUCFE0SAREBDwQOBwsIFQERAfQB/wIAAf8B9AERCBUHAgQPAhBNFQIQBA8HAgkVAREB9AH/
/wADAAH/AfQBEQkVBwsEFQIUTRIBEQEPBA4HCwgVAREB9AH/AgAB/wH0AREIFQcCBA8CEE0VAhAEDwcC
CRUBEQH0Af//AAMAAf8B9AERCRUHCwUVARRNEgERAQ8EDgcLCBUBEQH0Af8CAAH/AfQBEQgVBwIFDwEQ
TRUBEAUPBwIJFQERAfQB//8AAwAB/wH0AREJFAcLBRUBFE0SAREBDwQOBwsIFAERAfQB/wIAAf8B9AER
CBQHAgMOAg8BEE0VARACDwMOBwIJFAERAfQB//8AAwAB/wH0AREJFAcLBRUBFE0TAREBDwQOBwsIFAER
AfQB/wIAAf8B9AERCBQHAgMOAg8BEE1DARACDwMOBwIJFAERAfQB//8AAwAB/wH0AREJFAcLBRUBFE0T
AREBDwQOBwsIFAERAfQB/wIAAf8B9AERCBQHAgQOAQ8BEE1DARABDwQOBwIJFAERAfQB//8AAwAB/wH0
AREJFAcLBRUBFE0TAREBDwQOBwsIFAERAfQB/wIAAf8B9AERCBQHAgQOAQ8BEE1DARABDwQOBwIJFAER
AfQB//8AAwAB/wH0AREJFAcLBRUBFE0TARABDwQOBwsIFAERAfQB/wIAAf8B9AERCBQHAgQOAQ8BEE1D
ARABDwQOBwIJFAERAfQB//8AAwAB/wH0AREJFAcLBRUBFE0TARABDwQOBwsIFAERAfQB/wIAAf8B9AER
CBQHLQQOAQ8BEE1DARABDwQOBy0JFAERAfQB//8AAwAB/wH0AREJFAcLBhVNEwEQAQ8EDgcLCBQBEQH0
Af8CAAH/AfQBEQgUBy0EDgEPARBNEQEQAQ8EDgctCRQBEQH0Af//AAMAAf8B9AERCRMHCwYVTRMBEAEP
BA4HCwgTAREB9AH/AgAB/wH0AREIEwctBQ4BEE0RARAFDgctCRMBEQH0Af//AAMAAf8B9AERCRMHCwYV
TRQBEAEPBA4HCwgTAREB9AH/AgAB/wH0AREIEwctBQ4BEE0RARAFDgctCRMBEQH0Af//AAMAAf8B9AER
CRMHCwYVTRQBEAEPBA4HCwgTAREB9AH/AgAB/wH0AREIEwctBQ4BEE0RARAFDgctCRMBEQH0Af//AAMA
Af8B9AERCRMHCwYVTRQBEAEPBA4HCwgTAREB9AH/AgAB/wH0AREIEwctBQ4BEE0RARAFDgctCRMBEQH0
Af//AAMAAf8B9AERCRMHCwYVTRQBEAEPBA4HCwgTAREB9AH/AgAB/wH0AREIEwctBQ5PEAUOBy0JEwER
AfQB//8AAwAB/wH0AREJEwcLBhVNFAEQAQ8EDgcLCBMBEQH0Af8CAAH/AfQBEQgTBy0EDgEPTxABDwQO
By0JEwERAfQB//8AAwAB/wH0AREJEwcLBhVNFAEQAQ8EDgcLCBMBEQH0Af8CAAH/AfQBEQgTBy0EDgEP
TxABDwQOBy0JEwERAfQB//8AAwAB/wH0AREJEgcLUxUBEAEPBA4HCwgSAREB9AH/AgAB/wH0AREIEgct
BA4BD08QAQ8EDgctCRIBEQH0Af//AAMAAf8B9AERCRIHC1MVARABDwQOBwsIEgERAfQB/wIAAf8B9AER
CBIHLQQOAQ9PEAEPBA4HLQkSAREB9AH//wADAAH/AfQBEQkSBwtTFQEPBQ4HCwgSAREB9AH/AgAB/wH0
AREIEgcCBA4BDwEQTQ8BEAEPBA4HAgkSAREB9AH//wADAAH/AfQBEQkSBwtTFQEPBQ4HCwgSAREB9AH/
AgAB/wH0AREIEgcCBA4BDwERTQ8BEQEPBA4HAgkSAREB9AH//wADAAH/AfQBEQkSBwsDFQFDTxUBDwUO
BwsIEgERAfQB/wIAAf8B9AERCBIHAgMOAQ8BEAERTQ8BEQEQAQ8DDgcCCRIBEQH0Af//AAMAAf8B9AER
CRIHCwMVA0NNFQEPBQ4HCwgSAREB9AH/AgAB/wH0AREIEgcCAw4BDwEQARFNDwERARABDwMOBwIJEgER
AfQB//8AAwAB/wH0AREJEgcLAhVRQwEPBQ4HCwgSAREB9AH/AgAB/wH0AREIEgcCAg4CDwEQARFNDwER
ARACDwIOBwIJEgERAfQB//8AAwAB/wH0AREJ6gcLAhVRQwEPBQ4HCwjqAREB9AH/AgAB/wH0AREI6gcC
BA8BEAERTQ8BEQEQBA8HAgnqAREB9AH//wADAAH/AfQBEQnqBwsBFVJDAQ8FDgcLCOoBEQH0Af8CAAH/
AfQBEQjqBwIEDwEQAUNNDgFDARAEDwcCCeoBEQH0Af//AAMAAf8B9AERCeoHCwEVUkMBDwUOBwsI6gER
AfQB/wIAAf8B9AERCOoHAgMPAhABQ00OAUMCEAMPBwIJ6gERAfQB//8AAwAB/wH0AREJ6gcLU0MBDwUO
BwsI6gERAfQB/wIAAf8B9AERCOoHAgMPARABEQFDTQ4BQwERARADDwcCCeoBEQH0Af//AAMAAf8B9AER
CeoHC1NDAQ8FDgcLCOoBEQH0Af8CAAH/AfQBEQjqBwIBDwMQAREBQ00OAUMBEQMQAQ8HAgnqAREB9AH/
/wADAAH/AfQBEQnqBwtTQwEPBQ4HCwjqAREB9AH/AgAB/wH0AREI6gcCBBABEQFDTQ4BQwERBBAHAgnq
AREB9AH//wADAAH/AfQBEQnqBwsGQ00RAQ8FDgcLCOoBEQH0Af8CAAH/AfQBEQjqBwIDEAIRAUNNDgFD
AhEDEAcCCeoBEQH0Af//AAMAAf8B9AERCW0HCwZDTREBDwUOBwsIbQERAfQB/wIAAf8B9AERCG0HJwMQ
AhEBFU0OARUCEQMQBycJbQERAfQB//8AAwAB/wH0AREJbQcLBkNNEQEPBQ4HCwhtAREB9AH/AgAB/wH0
AREIbQcnARADEQFDARVNDgEVAUMDEQEQBycJbQERAfQB//8AAwAB/wH0AREJbQcLBkNNEQEPBQ4HCwht
AREB9AH/AgAB/wH0AREIbQcnBBEBQwEVAQ9LDgEPARUBQwQRBycJbQERAfQB//8AAwAB/wH0AREJbQcL
BkNNEQYOBwsIbQERAfQB/wIAAf8B9AERCG0HJwQRAUMBFQERSw4BEQEVAUMEEQcnCW0BEQH0Af//AAMA
Af8B9AERCW0HCwVDThEGDgcLCG0BEQH0Af8CAAH/AfQBEQhtBycEEQJDARVLDgEVAkMEEQcnCW0BEQH0
Af//AAMAAf8B9AERCW0HCwVDARFNEAYOBwsIbQERAfQB/wIAAf8B9AERCG0HJwIRBEMBFQFDSQ4BQwEV
BEMCEQcnCW0BEQH0Af//AAMAAf8B9AERCW0HCwVDARFNEAYOBwsIbQERAfQB/wIAAf8B9AERCG0HJwZD
AhUBEEcOARACFQZDBycJbQERAfQB//8AAwAB/wH0AREJbQcLBUMBEU0QBg4HCwhtAREB9AH/AgAB/wH0
AREIbQcnBkMCFQEUARBFDgEQARQCFQZDBycJbQERAfQB//8AAwAB/wH0AREJbQcLBUMBEU0QBg4HCwht
AREB9AH/AgAB/wH0AREIbQcnB0MCFQEUAUNDDgFDARQCFQdDBycJbQERAfQB//8AAwAB/wH0AREJbQcL
BUMBEU0QBg4HCwhtAREB9AH/AgAB/wH0AREIbQcnBkMEFQIUAUMBDwIOOQACDgEPAUMCFAQVBkMHJwlt
AREB9AH//wADAAH/AfQBEQltBwsEQwIRTRAGDgcLCG0BEQH0Af8CAAH/AfQBEQhtBycLFUMUCxUHJwlt
AREB9AH//wADAAH/AfQBEQltBwsEQwIRTRAGDgcLCG0BEQH0Af8CAAH/AfQBEQhtByEOFT0UDhUHIQlt
AREB9AH//wADAAH/AfQBEQltBwsEQwIRTRAGDgcLCG0BEQH0Af8CAAH/AfQBEQhtByEPFQEUARU3FAEV
ARQPFQchCW0BEQH0Af//AAMAAf8B9AERCW0HCwRDAhEBEEsPARAGDgcLCG0BEQH0Af8CAAH/AfQBEQht
ByFZFQchCW0BEQH0Af//AAMAAf8B9AERCW0HCwVDAREBEEsPARAGDgcLCG0BEQH0Af8CAAH/AfQBEQht
ByEOFT0UDhUHIQltAREB9AH//wADAAH/AfQBEQltBwsBEQRDAREBQ0sPAUMFDgEABwsIbQERAfQB/wIA
Af8B9AERCG0HIQFDVxQBQwchCW0BEQH0Af//AAMAAf8B9AERCesHCwEPBEMBEQEVSw8BFQUOCAsI6wER
AfQB/wIAAf8B9AERCOsHIQERVxQBEQchCesBEQH0Af//AAMAAf8B9AERCesICwRDAREBFQEQSQ8BEAFD
BQ4ICwjrAREB9AH/AgAB/wH0AREI6wghVxQIIQnrAREB9AH//wADAAH/AfQBEQnrCAsBDwRDAREBFEkP
ARQBDwQOCQsI6wERAfQB/wIAAf8B9AERCOsJIVUUCSEJ6wERAfQB//8AAwAB/wH0AREJ6wkLARADQwER
AhVHDwEVAREEDgoLCOsBEQH0Af8CAAH/AfQBEQjrCSEBQ1MUAUMJIQnrAREB9AH//wADAAH/AfQBEQnr
CgsBEAFDAREBQwERARQBFUUPAhUEDgsLCOsBEQH0Af8CAAH/AfQBEQjrCiEBQ1EUAUMKIQnrAREB9AH/
/wADAAH/AfQBEQnrAUMLCwRDAhMBEEEPARABFAEVAQ8DDgsLAUMI6wERAfQB/wIAAf8B9AERCOsBQwsh
ARRNEwEUCyEBQwnrAREB9AH//wADAAH/AfQBEQnrARINCwERAkMBFQESARQBQwEQOw8BEAFDARQBEgFD
Aw4NCwESCOsBEQH0Af8CAAH/AfQBEQjrARIMIQERARUCFEUTAhQBFQERDCEBEgnrAREB9AH//wADAAH/
AfQBEQrrEgsBFQETARI76gESARMBFRILCesBEQH0Af8CAAH/AfQBEQnrZSEK6wERAfQB//8AAwAB/wH0
AREK6wESFwsXHgcBFx4XCwESCesBEQH0Af8CAAH/AfQBEQnrARJjIQESCusBEQH0Af//AAMAAf8B9AER
C+sBFRELER4dARIeEAsBFQrrAREB9AH/AgAB/wH0AREK6wEVYSEBFQvrAREB9AH//wADAAH/AfQBEQvs
AesBFA8LDh4SAQEfEgEOHg8LARQB6wrsAREB9AH/AgAB/wH0AREK7AHrARRfIQEUAesL7AERAfQB//8A
AwAC/wFDAesM7AESDgsNHg8BCR8PAQ0eDgsBEgvsAesBQwL/AgAC/wFDAesL7AESAQ9bIQEPARIM7AHr
AUMC//8AAwAC/wESAesN7AHrARIBFQsLDB4OAQ0fDgEMHgsLARUBEgHrDOwB6wESAv8CAAL/ARIB6wzs
AesBEgFDViEBDwFDARIB6w3sAesBEgL//wADAAL/AewBbXbsAW0B7AL/AgAC/wHsAW127AFtAewC//8A
AwAC/wHwARN27AETAbwC/wIAAv8B8AETduwBEwG8Av//AAQAAv8BQwHrdOwB6wFDAv8EAAL/AUMB63Ts
AesBQwL//wAFAAL/AQcBE3TsARMBBwL/BAAC/wEHARN07AETAQcC//8ABgAC/wH3Aepy7AHqAfcC/wYA
Av8B9wHqcuwB6gH3Av//AAcAAv8B9AFDAepw7AHqAUMB9AL/BgAC/wH0AUMB6nDsAeoBQwH0Av//AAgA
Av8B9AH3ARMB62zsAesBEwH3AfQC/wgAAv8B9AH3ARMB62zsAesBEwH3AfQC//8ACwAC/wEHAUMBEwFt
Aetm7AHrAW0BEwFDAQcC/wwAAv8BBwFDARMBbQHrZuwB6wFtARMBQwEHAv//AA8AAv8B8QGSAeoBFWQR
ARQBbQGSAfEC/xAAAv8B8QGSAeoBFWQRARQBbQGSAfEC//8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
/wD/AP8A/wD/AP8AGwABQgFNAT4HAAE+AwABKAQAAQICAAGAAwABAQEAAQEGAAEgFgAD/wEAIP8gACD/
IAAg/yAAIP8gAAH/DgAC/w4AAf8gAAH8DgABPwH8DgABPyAAAfAOAAEPAfAOAAEPIAAB4A4AAQcB4A4A
AQcgAAHgDgABBwHgDgABByAAAcAOAAEDAcAOAAEDIAABwA4AAQMBwA4AAQMgAAGADgABAQGADgABASAA
AYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4A
AQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGA
DgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEB
IAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGA
DgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEB
AYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4A
AQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAA
AYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4A
AQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGA
DgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEB
IAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGA
DgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEB
AYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4A
AQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAA
AYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4A
AQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGA
DgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEB
IAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGA
DgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEB
AYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4A
AQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAA
AYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4A
AQEBgA4AAQEgAAGADgABAQGADgABASAAAYAOAAEBAYAOAAEBIAABgA4AAQEBgA4AAQEgAAGADgABAQGA
DgABASAAAYAOAAEBAYAOAAEBIAABwA4AAQMBwA4AAQMgAAHADgABAwHADgABAyAAAeAOAAEHAeAOAAEH
IAAB4A4AAQcB4A4AAQcgAAHwDgABDwHwDgABDyAAAfwOAAE/AfwOAAE/IAAB/w4AAv8OAAH/IAAg/yAA
IP8gACD/IAAg/yAAIP8gACD/IAAg/yAAIP8gACD/IAAL
</value>
</data>
</root>

@ -0,0 +1,94 @@
namespace SCJMapper_V2.Devices.Monitor
{
partial class UC_Toggle
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose( bool disposing )
{
if ( disposing && ( components != null ) ) {
components.Dispose( );
}
base.Dispose( disposing );
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UC_Toggle));
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.lblContent = new System.Windows.Forms.Label();
this.ucLed = new SCJMapper_V2.Devices.Monitor.UC_LED();
this.flowLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// flowLayoutPanel1
//
this.flowLayoutPanel1.Controls.Add(this.ucLed);
this.flowLayoutPanel1.Controls.Add(this.lblContent);
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.TopDown;
this.flowLayoutPanel1.ForeColor = System.Drawing.Color.Gainsboro;
this.flowLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(64, 95);
this.flowLayoutPanel1.TabIndex = 0;
//
// lblContent
//
this.lblContent.Dock = System.Windows.Forms.DockStyle.Top;
this.lblContent.Location = new System.Drawing.Point(0, 40);
this.lblContent.Margin = new System.Windows.Forms.Padding(0);
this.lblContent.Name = "lblContent";
this.lblContent.Size = new System.Drawing.Size(62, 51);
this.lblContent.TabIndex = 1;
this.lblContent.Text = "label1";
this.lblContent.TextAlign = System.Drawing.ContentAlignment.TopCenter;
//
// ucLed
//
this.ucLed.BackColor = System.Drawing.Color.Transparent;
this.ucLed.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("ucLed.BackgroundImage")));
this.ucLed.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.ucLed.Dock = System.Windows.Forms.DockStyle.Left;
this.ucLed.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ucLed.Location = new System.Drawing.Point(0, 0);
this.ucLed.Margin = new System.Windows.Forms.Padding(0);
this.ucLed.Name = "ucLed";
this.ucLed.RectShape = false;
this.ucLed.Size = new System.Drawing.Size(62, 40);
this.ucLed.Switch = false;
this.ucLed.TabIndex = 0;
//
// UC_Toggle
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Transparent;
this.Controls.Add(this.flowLayoutPanel1);
this.Name = "UC_Toggle";
this.Size = new System.Drawing.Size(64, 95);
this.flowLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private UC_LED ucLed;
private System.Windows.Forms.Label lblContent;
}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SCJMapper_V2.Devices.Monitor
{
public partial class UC_Toggle : UserControl
{
public UC_Toggle()
{
InitializeComponent( );
ucLed.RectShape = true;
}
public bool Switch { get => ucLed.Switch; set => ucLed.Switch = value; }
public string Label { get => lblContent.Text; set => lblContent.Text = value; }
public void ToggleState()
{
ucLed.Switch = !ucLed.Switch;
}
}
}

@ -0,0 +1,340 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ucLed.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAADHxSURBVHhe7Z0HlGRXeedr1BMkTZImaHJ3T+ieTtVdqSun
7qquzjnnPHmUQYBEUEABSQYECAEWWBgkEGG9gEXwkhYtLJgksAHLJHMWG+HjI8GSJCTd/X633i29rpmR
ZK+P6RnVPec7013vvnu/7//l+17XOAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqjMAqj
MAqjMAqjMAqjMM6SsUKoSOiCjRs3XrRly5Yd27Zt27tr166y4uLiqt27dztLSkpcQm7+3bt3b618ViM/
VzKHudzDvaxhrcWahbFMh1H4WhmXyNiHUvfv3x+qrKxMVVdXdzidzgGXyzUmNOVzu+e8Xte8x+NZhPjd
7XbPCk26XM5R5nIP97IGa7Ema7OHtVfBIP7EAwWsES+9WDy2FCWVl5dHq6qqWurq6oY8Hte01+s+7PN4
jnm93hP1Xu/Jeo/nUr/Pc7kmr/eKQL33Sv7VZH3OHOZyT/Ze92HWYk3WZg/2Yk/2hgeLl8L4LxgAvXLT
pk0bduy4uJgQfvDgwYa6uppevFcr3Oc5rhWNUv2+q/1+78uDft8rAwHvtaGA9zr5+TVhv++18vPr7MRn
XGMOc7mHewP1nqtYizVZmz3Yiz3ZGx7gBZ7gzeKxMP6TB6Cu3rBhwybJ1QckLIedzqou8cpxCeELophj
9fWeS1GWePUrUKJWbNB3UzjouyUS8r4hEvTcGQ153yj/vjkW8twVDXjeEg1636pJfo7IZ1yz5tzJPdzL
GpaRXMfa7MFe7Mne8AAv8ARv8AivFs+F8f85AHEVoO7cubO8rKwsVlNT0+N2102IRy6iBMK4eOw12rOD
vhuEbo2EfH+mlRzyvD0acr8rHnS/Jxase280UPv+eLDuA7GA84OxQO2D8WDthyB+5jO59gBzmMs93Msa
rMWarC10I3uxJ3tr4xNe4ImoAI/wahnCKkuGwvh3DkAruvjiizdSfEnejdgVL7n6OJ4oiniVeOb1eCqe
Gwu5744FXffGQ673odRUxPXp1oTnG91N/h8OtYf/Zbw3/vjUQMNvF0bSTwo9fWS8RR0abX5mYTjz1OxA
+nfTfQ3/lznM5R7uZQ1tLKwpa7MHe2EM7A0POk1kU482BHiFZ3hHBmSxZCqMFzEA6kLJqbul2PJTjVO9
U7Ubjwf0iIBPmBYPfYtWTLDu/oZw3UNtDd5HhjrC/zw3mP790YkWBR2bfI6O59GJvN/tc49Z98/LWqzJ
2uzBXuzJ3jq95AwhGxHgFZ7hHRmQBZks2QrjDANwVhI6d+zYUSEtWFpAHPR46mbqve4jUpBdISC/ErCj
Qc8dcUKzhOpkqO5jnSnf98a7Yk8cHm9+9vB4RpTWLApsFoU2qxPTLeqkRZfOtKjLXoCYAzGfe1kDOip0
RNY+PJZR7MWe7K3TBalGeLIMgeLxCniGd2RAFmSy0kKhUDzNAJA1EjK3FRcXe2pqKtt0uK/3LAbrvSeD
Uo1LyH2thN43AHY86PrLdNT1+YHWoHh64zOHRtPqyFiTOjreJMrKiFdn1KXTzZoun21RV0BzLepKi64+
A10lZOboe4Quncmuc2Iquy57QOw5L3vDQ5PwAk/aELLFo3QU0n0I78iQTQuVbciGjMhqyVwYMgBi7fbt
20tMdZ9Tvt9zOdW3gHpzLOx9WyLsvi8drfviYFvwX+eGGtQiNNwgym9Ux8fT6uRUkygroy6fyYjy5N/p
tLp0IqGOjYTVkYF6tdjrVgvdtWquq0bNdlSpmfZKTXOd1Wq+26kWe+rU4T6POjJYr47LPdx7xUxar3WF
rHmZrM0exycwuEZ1aCS7/4LwMdQW+ld4g0d4hWd4RwZjBKZbQFZktmR/SY8ijlulaj7IqZs5wPFLry0e
dEVUPCku1Xci7Lq3MVL3yYEW/y9mBxICeFIooQ6PJNWR0aQ6MZFSl06l1WVTKXVSlHZ0MKDmRKFTLWVq
tGG3GopdonqDG1W370LV4V6tOupWqtbaFarV6dD/ttcVyeerVKdnjeqpX6v6ZC73cO9UywFtHMeGAtog
Lp9OiSGIsU2m1FHZ+7AQvCwKT3ODCQWP8ArP8I4MyIJM5kCJlIDM1lEzBeJLcuh8v2fPHqmVqps5gqV4
kvx5QjznGgHuxkTY+9ZkuO7+zkbf96d7Y08D8MJgXB0aTqgjIwnxxAZ1clwMYCymDouH483jqWI1ENks
yjxftdWep5XcJtRRm6XOOiGXQ3WdhrjWAcm8diHua6s7T681EN2s157rqNQR4uR4TIwtKdQghoAxYphx
4S+h4BWe4R0ZkAWZkC1bIDpHkRnZbXXBS2YQ9latX79+Mw9lBIiMR7yiXgomaaculfz5qpi0WImw5550
rO6hwTb/E9O9ETU3EBNwRdEjcXVsLKFOjEtoHw5L2Hapiaa9ql8rfY0obEVO4Si6W6jH7VC9Qn1eh+rP
o4HTfNbryc7nPmMYGES7rN3lXaONYVL2XOx16VRxUng5LjwdEd4ODcXUvPA60xdRw8I7MiALMiEbMiIr
MiM7GIAFmFjYnPNjpV357traYUKjhMkT4YD32ljIcyd5tDXp/tZEZ+jpia6AmukNqcXBqDoyHBOgxQCG
5HdR/Fi6RPUFNqoO10rVjtJFUUbhfaJErWCfQw1B9Q41LDQCBZ6jUdvPI34hax7zB+U+7tdGYTMIjKvL
vVKniommEnVIDOHYcEgiUVwdHYmJEUTVbF9ITQrvk12hp5FF1wYiGzIiKzIje54RnPORgJx/MY9kyYN4
gVG+9NPXxcKeOxIh1/u6mrw/ne6JSCgNifKDaqE/JMqPqKOi+IXuupziO1E8yrAUb5SO4rSyRaEoeDyY
pQmhydBSmsr7HWIe88eEtIFYRmE3BvbrtAyh3zIEikgM4ZjwujgQUnN9QYkEIoNEg+6U55+QDRmR1RgB
GIAF6cB6uHTO1gQrKHqsHj8l1t8v+XDKKD8Z9r6xUXJmd8r1i5E2r3iOX832BjSQhwcCakE8frL5gOoP
b9IFm1E84ZrQjtLxWpQ+ZindKHg6LBRxqBmhWSiapTkbmc+4zjzmc58xENYzxsA+GAP7EhVIEV2eVWow
sklNS9FIajgihejhwZCaFyOY7varsXav6hXZkBFZjRGAgcvpHAATsLEKw3MuFehWj6PRsrKyeJ11rCv5
8GhUQiKApMKuB3vS7n8bafOoiQ6vmumuF88PqEP99dKm1ajhxA7V5btA8nAWcB3mjbfbPF0r3VI4ykS5
87EsLcQdatGiQ1DCRrZrzDP3aOOwDIJ1jTGQMkxUgA8dEeCr/gI10rBDzUureWTQrw6J8c721qtJkWlU
ZOsVGZEVmZE94PMcAwswARswAisLs3NiIMiaTZs27dq3b58ve8hTO0JbFAn6XikF0h2pqOvBvrT71yh/
vMOjprs8aqHXp+bF66fbyrNVvXg9Od7k90EBHcXbvR2PxXuN0o2iD4uCjySzdLTBoY49D3HdzOU+YxjG
GHR0sBkChqcNQfiBLwyh2yvRQArFGeGdWmWhRwxaZJoU2cbaPapfZEXmhNQEYAAWYAI2YARWYGZhd9aP
levWrdtKoUOuq62t7Qv43LMRv+/qeMT7hlTE9UB3o/OJ4RaXGm93a+XP9XjUbKdTjTeVqt7AeinypBWz
lA/QhGC7x6MQvNR4OR6N8o6KElHq8UaHOiF0MpWlS9PP0WW2nyEzh/ncp43CGIOQiQ46KuRFBIpNagSM
oMt9ntQG66VbKNXnCAsi00w30c2tRlpdqjvtfALZwQAswARswAiswAzsshCevUPnfQ49zIsbPp97MhL0
noiHfTcIAO/uTNY8NpipVaOtdWqqwyWeItRRrcYa9+hDGVPZk+vtXj+Rp3jt7aIgPNco3SgbJV/e5FBX
ZBzqSouuaj6VzDXmMd8YB+sYY2B99jFRwRgC/NijAfzSMfQF1qqJ1B592jhHROvE0OvUcHOt6mqo/iUY
gAWYgI150cR2UHTWRgEYv5AXLHmNihzn8dSNh/ye4yLwa5Nh9zvaotU/Gcg41XCmRk2016rpjlo11Vap
RpK7VLfke9qtbvH6fpSP14vyjdebUG883ij+hFE6Chcyyr66xaFeJvTyVoe6xk5tS3/nOvOYb4yCdViP
dVnfbgjsb1JDLhoIn9QmpARtBFIXjDXuUrPtlWq2q1ZNiqwjLTVqSGRvi1f/BCzABGzACKzADOzA0MLy
rBtFVuivodd1uZwDQb/7cDToe1VD1PvWlrjz6z3JCjWQrlSjmSo12VajplorRPk7T1G+Cfm0ZxRixuvJ
z/mKx3NR2tWiPKPwV4iSXyn0qvYsXduRpetsZD4zc5jPfTmDsIyB9U8xBFs0gD/4NCnBbgSjDTulLqhQ
0+01aqylSg02Vaq+xgoFFmACNmAEVtb5QI2VCs661nDF5s2b1/PipFS2AV6m9Lqco5Gg53Kpfm9vitb+
dXus/OmeZJkaTJWr8ZZKNZ4pU0NS6Xd7bcq38r095Buv1zkexUtozld8TumWslHwqzsd6jVdDvU6oeu7
z0xcZx7zjWGwjjGGUwxB9ocP+DHRwJ4StBGIHDkjSO5Qky1larK1Ug2ly1WfYNAZL38aTMAGjMAKzMAO
DMESTLPQnh1jlTC9k8efTmdlKxYtLd9iIuJ5dWPUc29HvPKJ/lSleECFGm06qMaaDmjl95qcb/N8lK8L
PSvkk3uN15ObydP5iseDUd5rRIlG4Tf2ONRNUK9DvR7qc6ibbcTvfM515jE/ZxCWMbBuviGwP3yYaAB/
2gislJAzApEHuagJMIKJ5gNqrPmgGhEMiIJgkhZswAiswAzswBAswTQL7fIfK3gNauvWrfvJY7W11Z31
Htd0NOh9uYS5N2XClY+0h0tVX0OZGhYPGM+Uq+HkbtUfukh1SrVPwZevfJPvjfIpyC4V0PFC8jQheoni
7UoXhaLgW/od6lah2way9IbBU8lcYx7zuY/7jTGwrt0Q2Jf9dTQQfuDLbgSmLrAbQY90B0ORi6Qm2C2R
oFwcQNrcxjLVESlVzZHKR8AIrMAM7MBQUsEB69WysyIKrKaP5XVpfdbvru0P1ruPJMO+G5uidR9pC5b+
sSNSonriJWo4tU+NNmaf3nGSpsOkgKQLPgFNh/3TKV+8jkrdeL0J9XbF480o0Sj7dqE7hhzqzmGH+jOL
3giNZP81n3Gdecw3RsE6rGc3BJMaTDSAH/jKNwL4Rw5qAgpD/aDJt0oNx7bop4ujTftUv2DRFS1R4hh/
BKNExHcTmIEdGO6XKGCdDfC28bIe2vs5zTq4f3+4trq6A0uOh7zXpKTIaY4c+Hl7uET1JvapgWSphH3x
fFF+t+98/eSOM3ZAotqnkDI53yiffJsL+eJ9VO14I/maUJ2veJR4pygTxb5JFP3mUYe6CxpzqLechvic
68xjvjYIyxjyDYH92Jf94QN+TEqAzyVGYApDugOpB/Rhlv98fVg03LBbqFT1J/dJFChRLYIRWIGZjgKC
IViC6dkQBVYJo9uoXquqyhulp+2hqk1GvTdn4s5PtwSLVUdY+vvYHjWYKFaD8e2qL7hBdbpXaOVzrApI
tFJU0/meb5RvQr72elECXkmovkVCdk7xojy8WytdFPvWcYd6m9DdEw719sks3WMj8xnXmcd87uN+1mG9
nCFYqUFHA9kfPkxKMEaQHwmQB7k4x9DnBN4VajC8QQ0ntosBFKu++B7VFdmj2kPFKh2t/Uwy6rsF7MAQ
LMHU+tO0ZV0LrOOvZKheKWDqpaeNhXxXp2Pet2UCpb9sCUh/HytW/Yk9aiC6XfL+xVL1r9ahn4qfQxST
92mpqKqN8gmvpyhfvPAGy+vJ24RsPNYoHq9GmW8XpaLkd0w51DunHepdQn8+cyrxOdeZp43CMgbWyRmC
rM8+7Me+7G9Sgt0I7OkAOZAHuZCP+oZU11e/WuqBi9WQOMKgYNIbL1ZtwV0qEyz9JVEA7MAQLMEUbME4
C/XyGyt4u4U/iqgsK4u7nVVdwXrPAvksE3V+KlO/U7UGpM0L75ScJxTZIlX/hfqIF++nSDJ5n+KJvprW
iuqaAkvn/NMpX7zxVsvrCdlLFG8p3Sj83bMO9R6hv5izaN6h7hPiX/MZ15lnDIL7WcduCOzDfuzL/vlG
AJ+6JrC6A+RAHuQy7aFJBQOBC9VQdIukw52qN7pTtQd3qJbATgVm2VrAswCWYAq21htEyzINrJHKf7uE
Kichy+tyDdLTNsY8d2X8e3+OUJ3hXaonIu1eeKt+maLbs1L14P220G/yPocr9Ne0WFTZFFrkWrvyqdIJ
yRRtFHLkb0I3nmsUf68o8j2Wst8r9JcLDvW+xSy930bmM64zj/ncx/05Q5B1dWogGsh+7Mv+8GE3Al0T
WN0B/CMH8ph6wKQCol6fb6Wkgo1SCAsm0R2qJ7pLtQbFAIJ7fw522XMB16CVBpxgDNZZyJfR4LAiG/71
H3Nk/D73ZCLivS4dq3ug0XPJM82+S1RnSHK+CNkf3pzz/j4Bwd7y2UO/Kfpotai2KbjIucbzc8qX0Ey+
xksJ3YRxo3g8HKWi5PsPOdQDhx3qA0IfPHIq8TnXmcd87uN+Ywisy/rsw37sa4wgFwmswhB+4dteFOan
ArodugKiAAXhYFwMQDBq9V+i0t5LngE7MARLMAVbMLYOhpbVyPX+Bw9K9V9b3UEB0xDz3dYUOvBIyr1F
tdRvVR3+Lao7uEn1BNbnvN9e+OEd+ojXhH5b3qflouqm8NI5P0/5FG/3WF5PCMeDjeK10kXBDwp96KhD
ffiYQ30EOm4j+Z3Puc485nOfMQTWY13WZx/2sxuBTgdWYQif8GuvB5AHuZDPRAHkNlGAJ4d9oU2CzxbV
7t+qmjxbFNiBIViCKdiC8XLsBlatW7duC696VVRUJOhfo2HvlamY++6ka9vjDc6NqsW7SXWJcN1+Xs++
IJv7xfrxfnKi8f5cy2cL/Sbv03pRfVOAkYN12LeUT4gmb5PD8VrCOZ6MZxulf1QU/d9OONRfCf33k6cS
n3OdecYYuJ91WE9HA6s+YL+cEZiaQPiCP/jM1QNWKkAe5EI+EwV0LSDyUwv0+y/QabE3vEW1+TapVN1G
1eDe9jgFNFiCKdiCMViDeRb65TEu4LiSwx9yVX193Xgy7L02E3N+NF69UTXWblAZ9wYRbL3qql+renyr
9Ykf7RC58Pm8Pxf6BVT6b1owqnAKMXKxDvtG+RKqyd/G6/Fko3iU+zFR8scvdahPXOZQfw1dbiP5nc+5
zjzmG0NgHRMNWJ992I99dTqwCkP4gj/4hF+TCp4vCuhaQByh379aHxN31q9XrZ71Kl23QSXFcZqizo+A
JZiCLRhbR8N8dc2yGbr9422W2urq5pDfPdcovX8quP/bDbUXqSb3RarVt1G1e9eqLu/52b5fhDaHPngD
FXIu9+d5P8evJvSTb2nFqMYpyMjJhGU80yifXI73EtqN4rXSRdGfvMKhPiX06StPJT7nOvOYbwyBdViP
dXNGYNKB7A8f8ANfuh6wUgF8ny4KIGfumFjkJw1yLtBbf77q5nlI/UbV7L1INbouUunggW+DJZiCLRgv
t3ZQP/njpOrAgQNBclU44Dmalgo24b7ksXjVOpVxbVDtYgBd/vXi/efrlzntT/rMoc8Ler8J/ZJ3acmo
yinMyM2EZ7vy8V7COh5tFI+SP3OVQ/0P6GqH+qyN+J3Puc48YwjczzqsZzcC9mNf9ocP+IEv+IPPF4oC
5nBo6bnA+RIFiJJiAJ4NqqFmnUp4LnkMLMEUbMGY9wSsQnBZ1AH6VW/eYOHBheSqPn34E3f/ebRy/ZPx
qgtU2nmhanVL1e+9QL8vZ8J/rvgTbyAs0i/rE7/n834JtXgboZc8THVOgUaOJkzblY8XPyRKRKF/Yyn9
cy9zqM+/3KG+IPTFa54jfudzrjOP+dzH/axjNwL2YT/2ZX/4gB8dBYS/M0UB5EI+cy6A3LliUBvAKv1S
abv3QpWpu1AM4AIVFwzBEkzBFoytt4WWzSvkazii5KiysrIs7vPVjtC6ZGI1HwuWrVHxijUqVbNGZWpW
qnbXKtXpWqF68sK/Kf54946+mTdwTOVPW3Va7zehX/IxVTqFGrmacJ2vfDwbxRqlf+kVDvUw9Eobye98
boxBG8JpjID12Yf92Jf94QN+ThsFbB0Bculzgfxi0EoDPZIGuj2rVGvtSpWpXaOSVWtU5KBgJ1iCKdiC
se1YeFmcB5xvnf87qw8eTAZ8dRONUd+NjYGyrwT2r1SxgytVY5UIVHOe6nAVZXt/MYBc+BcAzMFPfvi3
V/723G/3fhP6qdYp2MjZhO2c8i2vzylelP3lVznUV6BrHep/C/Evv/M5140hmGhgjIB1WZ992M+kglOi
gFUL2DuCU9KAyKvTgMhv0oD+gxN3kWp1nqeaxGESlStVuGylSgXLvgKmYAvGYA3mYJ9VwZ92nM/pFF+d
Vl19sIFiJSW9a8Kz6x+C+4tUrLxIpaqKtAF0igGY/M+5v736z4V/AYgDFHv456QtV/lbud/u/fbQT+FG
7rZ7PsrEw7XiRdlfvc6hvib0t69+jvidz7muDcFuBFYkYF3Wt6eCJVHAagtNRwDf9jRgDoaWpAHTDVh1
QI+nSP9Ra1N1kUpWFKnwgSLVIFiCKdiCMVhbJ4LLwgB0CwhTzsrKdDTgOZSKe98YdW7658C+FSpWtkI1
VK5QLRiAWDdvxSxp/6z8T3XMiZmu/gn/AhgHKvbwzyNaU/nThpGDdeFn835CNQUcOTxf+Xj710TZX3+N
Q31D6Juve474nc+5zrx8I2A91mV9EwXYl/3hQ7eFVkcAn/Y0oA+GqANELt0NiJzIa68DzNFwr7dItddh
ACtU4uAKMYAVKi5YakwFWzAG6+XUCmoDKC0traupqWgSJo+m4963Bg6ufTyw16GiZQ7VUOFQzc4V2Td+
MADr9I9n5Pb2T+d/CZPkS1P93yQAcsDCaZs9/FOB046Z3H+K90voJpcTzo3y8XSj+G9f71CP3PAc8bsx
BOYZI+B+1jGpwB4FTC0AH/BjTwP6dFD4hn/TDeg6QORDTuQ17aB5V4BnIj0eSZViAOkqhxiAQ4X2O1RY
sARTsAVjsF5WBsDbKlglfWoi7D3ZFHe/039gzW/9+54zgBYxgC4xgPz+P1cASl4EGHv7tyT/E/4FWE7f
aL3ow+3hnxM8cjReSiuX837J6YR1PBvlfstS/HdudKjvCv2d9S+/8znXmcd87uN+EwVYl/XZh/2WpAGr
JdSng9QBVjdg6gB7O6gLQZE3vxAElz7vefrP0JsqHSpuGUB92erfgSnYgjFYW28ILSMDkMKktraqJR7y
XNYUc93rKSl6SkeAAw7ViAHU8Gas7QBICh9tAFIIAYS9ADRP/eztXy7/W9U/j25pxejL7eGfwxxyNi2d
8X5yO+EdD0fJKPzvb3Ko773+OeJ3Puc685jPfSYKsB7rsv6SNCD765bQ1g2YOgC+TTuIPMhlLwS1AYj8
2gAED3DhQKjD6dAGkCzPGoB/b9FTgum7wRaMl50B6BpADMBVU9kWD3uvbE64/8JTuuJpDCBmIoA2gGyh
k28A9g6AQmmJAdgKQNP+6fxvGQDVOA9yaNE4zrWHf3I41T0FHl5NmMfTjfJ/cPNzZIyA68zTUYCiUO5n
nSVpQPbRLaHsy/7GAODLtIOmEIR/uwEgn70TyDcA8OHNaJ0CxAAiYgC+vSueBtN4xHMVGIP1ckoB58MM
vanLWdmqDSDmvs9TjOXaaoAzGED+CaAxgPwOgAcuAJtfAGoDkHysDcDK/5zs2cM/Od3u/Ub5j94idGv2
X2ME9ijAffY0wLqmDjBnAqYdtBeC+jzAMgB7J3CKAYjcyP98BhDGAEoFP8EUbDEAsLYiwLLoAlbTknA6
VVddnZE8dQXW6i12POsXxkkBDZLLmqsd+sVPBOTtnyVnAJYBmBaQP9c6xQCsAyBjAPTfL8YATPFnDICc
nzMAUf4Pb8v+awyA63YD4P4XYwDws8QAhN9TDMDWCtoNIHcWILiQIvnugxQ1AClA6qh6mwFIodVcUlJS
abWBy+IgaDWnUryupA0g6LlcDOA+d8l5f8QAImIASTGAjBhARyECvGAEwADaxAAaxQCIABiAV1JAJlb3
XpwLjHE26yBoWbwmrg2A/2mDFoVChQhQv3fVH16MARRqgKUGwDG5MYBcBJAikAiAc4ExzmYdBS8LA9Df
+LVn69b9zsrKlG4DpWKtpw0UAwjbDUByW6ELeM4ATtcFcE7Ct5zROcWlfgqKAfjLVv++OeG6F2x5JwCs
rS+VWh4RgL9j548YayoqEhxWNMXc7wiWX/gEuYsiBktukqKG3FY4B3j+cwAMgI6JwpkCmk4qVHHhr8AU
bHkYBNbWa2HLwgD4+pcNO3bsKC4vL4/Egp6F5qTv7nDVRb/0lWT7WAyAqhYD0K9Ci6CFk8BTTwLBhU6J
jikpBhARA6CTigmWYBoNeQ5VlZdHwRrMwT6rgj/tWIM1wlRFxf5QJOSbyyT8b465tv+EVjAgIYw6ICUC
8a2d5mteCs8CTn0WAC48LSVd6gJQnIcoGndt+6kYAP9pxRwYg7UVAZaPAYhF7i4rK/OHfe6J5mT97an6
0kfMWQAGQEhrFcvWf/1beBp42qeB4MJ3I5AuTQHIGUBasGxO+O8I+d2TYAzWy8oAqAE4mDh4cJ8vEHCP
ZJKBm5vj1V9w7clacMgqBJecBYjAhfcB8t4HoAOQKMkZACeoRE+vpFGwbE4GbwFbMAZr6/uDloUBFG3e
vHk9/9EiT6kCPnd/Jhl8TVuD96PukqI/UgdQyXIglBbBsPAzFoKmDpAwSb58Kb0RlCsArfDPETAFoLe0
6I9gCaZgC8ZgDeZgn1XBn3bwYuJavsuGrzv1umraUongy9pTgfuDlRsex4JJA3QDOg3Y6gAKH3sdkEsD
1AF5acC0g1TX+VGAHEwrZk8F+UZADjfRgJbOGIMhfudz4/XMz1e+PfTr1u903m9V/6b9M+H/hd4JBA9z
BEz1H7Tyf1gwBEswBVswtr43aFl9mSQGsIXDoNraqsaGRPBke1PoXWl/yY9IA+Qx8hnPt80zgcJbwVm5
TfjvEzw4AKJYpmbS3i81lOT/H4MlmIItGFt/GIIBLJtxAQcTvK5cVVUVjUWC821N0Te1N7gedu3OGgAW
HbXOA7D03ImglQbs7eBL7e8CwIGoqNs/cRIOz8j/bjGADsEQLMEUbMHYOgRaFk8CzVhFVbpz58495eXl
9aGAb6StKfb6zrT/Y4Hytb+lG6gXi6at4cEQhc4p7aDVDbxgFJDKOtcRWKngbP/LINP+USPp8C/KJ/wH
BTswBEswBVswtjqAZfWnYeaPQ7bxsoLP7e7MNEau6cqE72+sL/6ZTgNSCyAYx5tNdANWFCD85Y6FxSso
jk4XBewdAQcsOhVgBBJ6OX0jD2sjsNIBOZpCjWod7zWGwAkeyiWs5xOfc90onvu4n3VYj3VZn33YT5/6
EfqFD/jRBz/Cn6n8T+f9S4o/K/zjDC3iFNr7xUmomXCaRm/xz8AQLMEUbMHYKgCX3XcErNu2du0lPKp0
O52pxmTkeGcm/vbutPfLruIVz3rEAHg2YKIAxWD+18KcKQqYjoADFZMKzpW/DkZ+nIHWj9xvvN9bsuJZ
sBMM7wFLMBVsK8AYrLOQL6+xxqoDSqurqyPRcGCioyVxW3dL5BORms1PEAW8hDUrCmSkFkBwezFookCu
FrAdDOVSgYB7rnw/AHLTEnNAhvfT+uEkeH/MufkJsAPDRDTE9wNEwNbK/8ui/88f+ouhOaSo2L/f4/d7
u1vSiVf0tCXe35Vy/V2dFIO0hNQChDnOuqkFThcFzMGQeUBkUoF5Skh+BWxO2nJGYNUEFGRU5YRovNUY
Ah5M/kaphHMIJRsyn3Gdecw3imcd1mNd1mcf9jPKhw+tfCv0w6cJ/brvx/tFHuQ6nffr3G95PwUzztLZ
UPv3YAeGYAmmtgOgZRf+zVhHjtq/f3+1x1OXaUzGDne1Nt7V0xr+m1DFRb8xtQAVbkwEpiPI1QICBjnx
pfIdQcirc794v3n1C+cgVUYqL/oNmIEdGIIlmFovgSzbL4li6HcDaFVqaipCkUhwqL01dX1/Z+OHu1Ou
H9TuyoY3XeGKEXAuAAC5PxY5Qyrg8MReD5xiBFZhSBVOK0ZoXmII1AeWMRDGjUHkE59znXnM5z674lmX
9dmH/dg3X/n2vA/fpwv95tyfp6McjplTP7y/Du9vdP1Df2fDh8EODMHS1v4t66+JWyFhagOhqqyszOX3
e9ozqcTJns70PQPt0c9FnVt+jYBYOdaO4IQ/gDDnAiYVmMMh0xXoE8LTGYFVGFJ904IRkvFOTuSMIZCv
Cd0ok+INj4ZQsiHzGdeZp0O9XfGW17M++7Af+7J/vvLNAx/4hn9z6GNCvz72dWWf+nHmr0O/YIJzxOu2
/BqswAzsAl5vG1iCKdiCcRbq5TvMS6LlLpcrEYuFxztb0zcOdqQ+0t8S+K6rpOgZDjiIAlg9fa9OBeYh
EalAQOIZuakHcq2hzQgIs+RaCi6qblov+m+8kpO4nCGIxxKyeUSrjcEyCLw6n/ic68xjPvdxf07xltez
D/uxL/vrnG9Tvin6jPKRA3mQy4R+Dn3MH37Q9nHq5y0tegaMwArMwA4MwdJ6CXTZf1UsQ39hFAcWFRX7
PcGgr7M53XhZX1fmnqGOxGfT/pLHaiUKuE09IMLz6BNAzKNiczZAvuS8PD8SEF51TWB1B7RcJiXglfmG
QMhGiRRteDKKhSjk8G7+NZ9xnXnM5758xWuvt0I++7I/fOicfxrPh/9c3he5MHKKX0I/x+Na+YIDeGQC
JY+BUX938zvADOzA0Hb4s+y934xVWCx9q7euLokld7SkX9vXkXpgsCP2t4Gy9U9SDxAJzAERgHAWrruC
vHqA4ukUI7C6A1otkxLwRo5f7YZAqKZKR4nkbRRqjCKfzDXmMZ/7uN+ueNZnHxPy2R8+4Cdf+ea41+R9
feInMvLAh57fKJ+0GBRMwAaMwArMpPhrAEPL+8+ar4tnYKnrJGntLt+7t7a+3t2SSiWO9nc13zXa1/TJ
odbgo3XF5z2L4Lo1lHTAOwO8CGneG8w3gvxIQHVNi5VLCVY0WGIIVmrIGYNlEHgz1TsKNsTvfM515hml
cz/r2BVvvN6EfPiAn3zPP0X5EuHM0z5T9JH33SXnPQsmYANGYAVmYAeGYGlhelaNIqrW3bt3H3A6nbFE
IjrS1dF83Uh/233jfZkvtccO/qJGogCtIUUhkYB8iBGYdwbok40R6HRg1QRU1bRW9NfkW0IvXphvCCY1
oDzyNR5sDOJMpBUuxHzuM6E+X/Ha62Vf9ocP+IEvrXxyvl35IgfKp9Yxnq+VLzLX7hajFyzABGzACKzA
DOysyv+s/N9EsdgLs+8KVnhDIX97JpM61NfVeutIf8uHR3sav9bg2fUrpxgBh0R4Qs4IbC+OmEigawKr
O6Cl0kfGtmjAWXu+IRCic8ZgRQYIpRrDMGQ+M3OYb5TOOqco3ub18AE/8AV/uuDL83ytfPH8XM4XeVF+
o2AAFmACNmAEVmAGdmBoYXlWDl0QFhcX76uurg5LT9vb3Nx0aX93y5uGups+MdyVeCRSs/l3RALSAaAA
jn5ekJcOdGFotYj2ugCv44w93xB4+YI3cFAaeZoq3RgEVXuORMn233MKF+I+7mcd1jtF8TavN/ke/nS1
b1M+rS6PeDnmNQUf8iI7GIAFmIANGIEVmJ1thd+ZBv9x5BaKGbfbGY/HI0OdbS3XDPe1v2t8oO2zI93J
7wfKNz6ZbwS8P2AeGukvlMYIJJTSR9tTgokG5F67IVCQkZu1MViRgUodhRqjyCdzjXnM5z7uZx3Wsyue
/YzX20M+/MEn1T5RjGimT/mskI/y8fygyIzsYAAWYAI2YARW1ksf58T/Jo4Fr+EviPfu3ev0+/2ZpqbG
md7u9uvHBjvfNzHQ+sXxnuSj9QfWP7XECIT4ggnTItr/stikBBMN7IZgIoKuEWzGQK5GkcYoDBklGzJz
mG+UzjqsZzzervic11sh37zcgeHygIdoliv2LOX7y9Y/hczIDgZgASZgA0ZgBWYWdufEQJC127dvL5Hi
JhiJRDol3B0e6Ou6dWKo6wOTw+0PT/U2/mOw4uInqy0joDjUbaLkTAonqmfzJpFOCbZoYDcEkxpyUUEI
5eG5EAUbSj0Tcd3M1UqX+423m1BvV7zd6+HLnPBR6dvzPfKg/HDlxU8iKzIjOxiABZiADU/8wMrC7Jwa
uh7IvjdYG00mY/1tbS0nh/q6bh8f6X5waqjjf00OpB6N1G39PUYAWMYQCJ32ZwcmGlBdk2tRgD0iUIjR
huGlxhhMdECZxjDw6BzZrhkvN0rX3i7EunaP14on11tebw54yPfG611CFLkUuzGRDRmRFZmRHQzAAkzA
5lzJ+2ca+ltFyXEccTY0NAx1tbdeNtTffSeATI50PDwz0vaDRn/pbyp3OFTNzqwh8F6hjgYCKvmUVhGw
zcmhMQRer6IAs0cF3rvHY1Eg3osy+YNMCOUaMp9xXXs5JPdxv93bWZ99jOIpUsn1FHqmxcNgUb5RfJXI
kQqU/gbZkFErX2RGdjAACzCx/jeQs7Ll+/eMlfS2Bw4cqPJ4PA2NjYmRzs72y4cHe+6YHO394PRoz/9c
GOv8XnfK9W81u4uepS5wEg0wBCKCAEtBpdOCgG4MwaQGcnAuKtiMAaI9Q5l2Mgq2E/PMPUbpxttZn33w
eBRPe8cDHaN4zaOQUb5zT9GzPSILMs2KbMiIrMiM7GAAFla/f04UfS80CG/6sXH2vQFPQyqVHO7qar9s
dKjv9umxgftnxno/Pz3c8Z3Rntj/CZRf9FQV0QAwhUxqwMMAHUMwX0LFuwV4pI4KNmOgOMNrjVEQvg1p
BdvJmsd87rMrvU8IY6PA4xUuc6Jn8jxKhz/4rBavDxzc+BQyIIuWSWRDRmRFZmQHA0v5HPWes6H/dGMl
IQ/r9/s9jTJGegSYkaH+W6bGB947Pdb3mdnR7m8sjHf8qDNR86vq3ec9awxBG4FlCHibeZ5Ax4BieMUK
Y+DLFogMxiAI2SjTThRv+Z8xj/nch0FRcxBpiDjmu/tIR6a4M7wQqVB8jfDalaz51cJ454+QAVmQaURk
Q0ZkRWZkt8L+S8LzTzd0TUDx4xdvSKcbhjrbW44O9fdePzE68M7ZyYGPLU72f2Vxovt704OZnyc9u35P
baBBtiKCPSqQHlAMxkBYbhRl0T3wN4kcKtFF8PIJ4RvFYhwQP2e/pzd7cMNcIgrh3XxRA0rXvbxRuhAP
tCAUDz/w1iA8wis8wzsyIAsyIRsyIisyIzsYZKF46Q7C3jpaxJqamlA8Hu5qbW1eGOjruXZibPCu2amR
B+cnBj63ONX3zUOT3Y+O9cQfi9Vte7JiuwAuhqCNwW4QGINlEKZwJEyjQNIFhsErWHjyEpLPUDRzKDR5
bc0c3uQULuuyvjE89mV/FB+v3fYkvMEjvMIzvE+ODb0FWZAJ2ZARWZHZkr0wZACE/tLpiooKTyQSaG1r
bp7p7+2+enx08LaZyZH3zE0NSzQYfHhxsveRIzO9P5wZSD2W8hVLy3jesyiA9EC1baKD3SDsKeNFk1E2
ZFe4/Ms+OhJJqIcHeIEneINHeIVneEcGZEEmZLMe7fL1bgXl5w0A0XUBLVEw6Es3Sa6Uavno8GD/q6fG
hu+amx67f3565KHF6aEvL071f+fIdN8/Hprs/Hlv2v3rYMWWpw5KVKgQxaAcYxQYhKElhnEGMnPMPSjb
GBdrEnmClVueYk/2hgd4gSd4g0d4hWd4RwZksbV55PuC8p9nAM5a3oKpqqryR6PRjpaWpune3u7LR4YG
bpieHLt7fmb8gfmZ0YcOzY48fHh26FtHZ4d+cGSm/8cL4+3/0tfk+VXcu+sPdaXnP1OxLaswYxB20krN
o/w53Au5ZC3WZG32YC/2ZG94gBd4gjd4hFd4hndkQBZksmQrjBcxAIoC8SKeiUu7FGtoaOjrbGubH+jr
u2psZOim6amxty3MTrz/0NzExw/NjX3+yOzIV4/NDj9ybH74B8cXhn50fH7onxbH234x3B56vDNe9ZsG
f/EfwlVbn/IcWPd0XcmaZ6p3FT17EAMR4mc+41q4cutTzOUe7mUN1mJN1mYP9jo8P/aFxfmJTyzOTN4/
Mzl+NzzBGzzCKzzDu/UeP4VeQfn/gQFoq+mTJYRWut3ueDKZ7NeGMKAN4YaZqfE3z01PvntxfvJDh+cn
Hjq6MPl5Uc5Xji2Of/P4/Oh3j86NfP/Ewsijx+cGf3hsfujHJxaGfnpiYfBnx+cHlhCfcY05zOUe7mUN
1mLN7NoTD7EXe7I3PMALPMGb1+tNwqvV2/MSZ0Hx/wkDENfwiLS0tPQg3tUYj/e2tbXNSIV92ejwwLUT
EyO3zE5PvmV+duLewwvTHzi0OPVXRw9Nf+rYwuTnji5OfOnY4oQYxcRXjy1MfB2FHp0f/dbRhbFva5Kf
+Sx7TebIXH0P98oarMWarM0e7MWe7A0P8AJPKN56jHtOPclbTkNHBMIqfyhRXV1dHwgEmtLp9FBXe/vi
YH//FaOjw6+amhi7aWZq4o6sQUy9c3F++r5Dc9P3H5qf/pDQRw/Ni0IXpz9+eN4i+ZnPstdkjszlHu5l
DdZiTdZmD/ZiT/aGB3ixQn3B4/8Lx3lC5+Nx5Frpr3319fUp8m9ra+tUT0/P0YGBgSuHhwevGR8dfvXE
2MgNk5PjN0vYvm16cvz26amJO5eQfMY15jCXe7iXNViLNVmbPdiLPS1vp6WDl8L4Ew4UsNr8VRItV03N
QR/5OBKJtJKbM5nMOOG6q6t9sU8UKpX6sYGB3pMQP/MZ15jT0tIywT3cyxqsxZq2v87B0wtKX8YD5dBv
Z7+7aNOm3Ry9cvbOn1nxwiWhmxYN4mc+4xoPZ5jLPZaH076xVkHhhVEYhVEYhVEYhVEYhVEYhVEYhVEY
hVEYhVEYhVEYhVEYhVEYhVEYhVEYhVEYhXEWDIfj/wE7zRDKTZKqNwAAAABJRU5ErkJggg==
</value>
</data>
</root>

@ -135,7 +135,7 @@ namespace SCJMapper_V2.Devices.Mouse
private MouseState m_state = new MouseState( );
private MouseState m_prevState = new MouseState( );
private Control m_hwnd;
private IntPtr m_hwnd;
private bool m_activated = false;
private string m_lastItem = "";
@ -191,7 +191,7 @@ namespace SCJMapper_V2.Devices.Mouse
/// </summary>
/// <param name="device">A DXInput device</param>
/// <param name="hwnd">The WinHandle of the main window</param>
public MouseCls( SharpDX.DirectInput.Mouse device, Control hwnd )
public MouseCls( SharpDX.DirectInput.Mouse device, IntPtr hwnd )
{
log.DebugFormat( "MouseCls cTor - Entry with {0}", device.Information.ProductName );
@ -221,19 +221,52 @@ namespace SCJMapper_V2.Devices.Mouse
Activated_low = true;
}
/// <summary>
/// Returns the number of buttons
/// </summary>
public int NumberOfButtons { get { return m_state.Buttons.Length; } }
// Property Mapping from DXinput to CryEngine string
private Dictionary<string, string> m_axiesDx2Cry = new Dictionary<string, string>( )
{
{"X","maxis_x"},
{"Y","maxis_y"},
{"Z","mwheel_"},
};
public void Deactivate()
{
this.Activated = false;
}
public void Activate()
/// <summary>
/// returns the currently available input string
/// (does not retrieve new data but uses what was collected by GetData())
/// NOTE: for Mouse when multiple inputs are available the sequence is
/// axis > button > hat > slider (wher prio is max itemNum > min itemNum)
/// </summary>
/// <returns>An input string or an empty string if no input is available</returns>
public override string GetCurrentInput()
{
this.Activated = true;
}
string currentChange = "";
public int NumberOfButtons { get { return m_state.Buttons.Length; } }
// get axis
foreach ( KeyValuePair<string, string> entry in m_axiesDx2Cry ) {
PropertyInfo axisProperty = typeof( MouseState ).GetProperty( entry.Key );
if ( DidAxisChange2( (int)axisProperty.GetValue( m_state, null ), (int)axisProperty.GetValue( m_prevState, null ), true ) ) {
currentChange = entry.Value;
if ( entry.Key == "Z" ) currentChange += "down";
}
else if ( DidAxisChange2( (int)axisProperty.GetValue( m_state, null ), (int)axisProperty.GetValue( m_prevState, null ), false ) ) {
currentChange = entry.Value;
if ( entry.Key == "Z" ) currentChange += "up";
}
}
// get prio button
bool[] buttons = m_state.Buttons;
bool[] prevButtons = m_prevState.Buttons;
for ( int bi = 0; bi < buttons.Length; bi++ ) {
if ( buttons[bi] )
currentChange = "mouse" + ( bi + 1 ).ToString( );
}
return currentChange;
}
/// <summary>
/// Find the last change the user did on that device
@ -244,33 +277,27 @@ namespace SCJMapper_V2.Devices.Mouse
/// <returns>The last action as CryEngine compatible string</returns>
public override string GetLastChange()
{
// TODO: Expand this out into a joystick class (see commit for details)
Dictionary<string, string> axies = new Dictionary<string, string>( )
{
{"X","maxis_x"},
{"Y","maxis_y"},
{"Z","mwheel_"},
};
foreach ( KeyValuePair<string, string> entry in axies ) {
// get changed axis
foreach ( KeyValuePair<string, string> entry in m_axiesDx2Cry ) {
PropertyInfo axisProperty = typeof( MouseState ).GetProperty( entry.Key );
if ( DidAxisChange2( (int)axisProperty.GetValue( this.m_state, null ), (int)axisProperty.GetValue( this.m_prevState, null ), true ) ) {
this.m_lastItem = entry.Value;
if ( entry.Key == "Z" ) this.m_lastItem += "down";
if ( DidAxisChange2( (int)axisProperty.GetValue( m_state, null ), (int)axisProperty.GetValue( m_prevState, null ), true ) ) {
m_lastItem = entry.Value;
if ( entry.Key == "Z" ) m_lastItem += "down";
}
else if ( DidAxisChange2( (int)axisProperty.GetValue( this.m_state, null ), (int)axisProperty.GetValue( this.m_prevState, null ), false ) ) {
this.m_lastItem = entry.Value;
if ( entry.Key == "Z" ) this.m_lastItem += "up";
else if ( DidAxisChange2( (int)axisProperty.GetValue( m_state, null ), (int)axisProperty.GetValue( m_prevState, null ), false ) ) {
m_lastItem = entry.Value;
if ( entry.Key == "Z" ) m_lastItem += "up";
}
}
// get new button
bool[] buttons = m_state.Buttons;
bool[] prevButtons = m_prevState.Buttons;
for ( int bi = 0; bi < buttons.Length; bi++ ) {
if ( buttons[bi] && buttons[bi] != prevButtons[bi] )
if ( buttons[bi] && ( buttons[bi] != prevButtons[bi] ) )
m_lastItem = "mouse" + ( bi + 1 ).ToString( );
}
return m_lastItem;
}
@ -378,50 +405,5 @@ namespace SCJMapper_V2.Devices.Mouse
}
// mwheel_up, mwheel_down
public static string MouseCmd( MouseEventArgs e )
{
string mbs = "";
switch ( e.Button ) {
case MouseButtons.Left: {
mbs = "mouse1";
break;
}
case MouseButtons.Middle: {
mbs = "mouse3";
break;
}
case MouseButtons.Right: {
mbs = "mouse2";
break;
}
case MouseButtons.XButton1: {
mbs = "mouse4";
break;
}
case MouseButtons.XButton2: {
mbs = "mouse5";
break;
}
}
return mbs;
}
}
}

75
FormMain.Designer.cs generated

@ -88,6 +88,7 @@
this.tdiAddMod3 = new System.Windows.Forms.ToolStripMenuItem();
this.tc1 = new System.Windows.Forms.TabControl();
this.tabJS1 = new System.Windows.Forms.TabPage();
this.UC_JoyPanel = new SCJMapper_V2.Devices.Joystick.UC_JoyPanel();
this.panel1 = new System.Windows.Forms.Panel();
this.btClip = new System.Windows.Forms.Button();
this.txRebind = new System.Windows.Forms.TextBox();
@ -143,6 +144,7 @@
this.meShowToggleTable = new System.Windows.Forms.ToolStripMenuItem();
this.meShowOptionsDialog = new System.Windows.Forms.ToolStripMenuItem();
this.meShowDeviceTuningDialog = new System.Windows.Forms.ToolStripMenuItem();
this.meShowDeviceMonitoringDialog = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
this.msBtConfig = new System.Windows.Forms.ToolStripDropDownButton();
this.meSettingsDialog = new System.Windows.Forms.ToolStripMenuItem();
@ -156,7 +158,6 @@
this.msSelectMapping = new System.Windows.Forms.ToolStripDropDownButton();
this.tsLblMappings = new System.Windows.Forms.ToolStripLabel();
this.IL2 = new System.Windows.Forms.ImageList(this.components);
this.UC_JoyPanel = new SCJMapper_V2.Devices.Joystick.UC_JoyPanel();
this.cmCopyPaste.SuspendLayout();
this.panel2.SuspendLayout();
this.cmMouseEntry.SuspendLayout();
@ -561,14 +562,14 @@
this.tdiAddMod2,
this.tdiAddMod3});
this.cmAddDel.Name = "cmAddDel";
this.cmAddDel.Size = new System.Drawing.Size(261, 479);
this.cmAddDel.Size = new System.Drawing.Size(261, 457);
this.cmAddDel.Opening += new System.ComponentModel.CancelEventHandler(this.cmAddDel_Opening);
//
// tdiCollapseAll
//
this.tdiCollapseAll.ForeColor = System.Drawing.Color.MediumBlue;
this.tdiCollapseAll.Name = "tdiCollapseAll";
this.tdiCollapseAll.Size = new System.Drawing.Size(220, 22);
this.tdiCollapseAll.Size = new System.Drawing.Size(260, 22);
this.tdiCollapseAll.Tag = "§";
this.tdiCollapseAll.Text = "Collapse to selected";
this.tdiCollapseAll.Click += new System.EventHandler(this.tdiCollapseAll_Click);
@ -577,7 +578,7 @@
//
this.tdiExpandAll.ForeColor = System.Drawing.Color.MediumBlue;
this.tdiExpandAll.Name = "tdiExpandAll";
this.tdiExpandAll.Size = new System.Drawing.Size(220, 22);
this.tdiExpandAll.Size = new System.Drawing.Size(260, 22);
this.tdiExpandAll.Tag = "§";
this.tdiExpandAll.Text = "Expand all Mappings";
this.tdiExpandAll.Click += new System.EventHandler(this.tdiExpandAll_Click);
@ -585,12 +586,12 @@
// tdiSGroup1
//
this.tdiSGroup1.Name = "tdiSGroup1";
this.tdiSGroup1.Size = new System.Drawing.Size(217, 6);
this.tdiSGroup1.Size = new System.Drawing.Size(257, 6);
//
// tdiAssignBinding
//
this.tdiAssignBinding.Name = "tdiAssignBinding";
this.tdiAssignBinding.Size = new System.Drawing.Size(220, 22);
this.tdiAssignBinding.Size = new System.Drawing.Size(260, 22);
this.tdiAssignBinding.Tag = "§";
this.tdiAssignBinding.Text = "Assign Mapping";
this.tdiAssignBinding.Click += new System.EventHandler(this.tdiAssignBinding_Click);
@ -598,7 +599,7 @@
// tdiBlendBinding
//
this.tdiBlendBinding.Name = "tdiBlendBinding";
this.tdiBlendBinding.Size = new System.Drawing.Size(220, 22);
this.tdiBlendBinding.Size = new System.Drawing.Size(260, 22);
this.tdiBlendBinding.Tag = "§";
this.tdiBlendBinding.Text = "Disable Mapping";
this.tdiBlendBinding.Click += new System.EventHandler(this.tdiBlendBinding_Click);
@ -606,7 +607,7 @@
// tdiClearBinding
//
this.tdiClearBinding.Name = "tdiClearBinding";
this.tdiClearBinding.Size = new System.Drawing.Size(220, 22);
this.tdiClearBinding.Size = new System.Drawing.Size(260, 22);
this.tdiClearBinding.Tag = "§";
this.tdiClearBinding.Text = "Clear Mapping";
this.tdiClearBinding.Click += new System.EventHandler(this.tdiClearBinding_Click);
@ -614,12 +615,12 @@
// tdiSGroup2
//
this.tdiSGroup2.Name = "tdiSGroup2";
this.tdiSGroup2.Size = new System.Drawing.Size(217, 6);
this.tdiSGroup2.Size = new System.Drawing.Size(257, 6);
//
// tdiAddBinding
//
this.tdiAddBinding.Name = "tdiAddBinding";
this.tdiAddBinding.Size = new System.Drawing.Size(220, 22);
this.tdiAddBinding.Size = new System.Drawing.Size(260, 22);
this.tdiAddBinding.Tag = "§";
this.tdiAddBinding.Text = "Add Mapping";
this.tdiAddBinding.Click += new System.EventHandler(this.tsiAddBinding_Click);
@ -627,7 +628,7 @@
// tdiDelBinding
//
this.tdiDelBinding.Name = "tdiDelBinding";
this.tdiDelBinding.Size = new System.Drawing.Size(220, 22);
this.tdiDelBinding.Size = new System.Drawing.Size(260, 22);
this.tdiDelBinding.Tag = "§";
this.tdiDelBinding.Text = "Delete Mapping";
this.tdiDelBinding.Click += new System.EventHandler(this.tdiDelBinding_Click);
@ -635,7 +636,7 @@
// tdiSGroup3
//
this.tdiSGroup3.Name = "tdiSGroup3";
this.tdiSGroup3.Size = new System.Drawing.Size(217, 6);
this.tdiSGroup3.Size = new System.Drawing.Size(257, 6);
//
// tdiTxDefActivationMode
//
@ -662,12 +663,12 @@
// tdiSGroup4
//
this.tdiSGroup4.Name = "tdiSGroup4";
this.tdiSGroup4.Size = new System.Drawing.Size(217, 6);
this.tdiSGroup4.Size = new System.Drawing.Size(257, 6);
//
// tdiAddMod1
//
this.tdiAddMod1.Name = "tdiAddMod1";
this.tdiAddMod1.Size = new System.Drawing.Size(220, 22);
this.tdiAddMod1.Size = new System.Drawing.Size(260, 22);
this.tdiAddMod1.Tag = "0";
this.tdiAddMod1.Text = "Mod:";
this.tdiAddMod1.Visible = false;
@ -676,7 +677,7 @@
// tdiAddMod2
//
this.tdiAddMod2.Name = "tdiAddMod2";
this.tdiAddMod2.Size = new System.Drawing.Size(220, 22);
this.tdiAddMod2.Size = new System.Drawing.Size(260, 22);
this.tdiAddMod2.Tag = "1";
this.tdiAddMod2.Text = "Mod:";
this.tdiAddMod2.Visible = false;
@ -685,7 +686,7 @@
// tdiAddMod3
//
this.tdiAddMod3.Name = "tdiAddMod3";
this.tdiAddMod3.Size = new System.Drawing.Size(220, 22);
this.tdiAddMod3.Size = new System.Drawing.Size(260, 22);
this.tdiAddMod3.Tag = "2";
this.tdiAddMod3.Text = "Mod:";
this.tdiAddMod3.Visible = false;
@ -718,6 +719,15 @@
this.tabJS1.TabIndex = 0;
this.tabJS1.Text = "Joystick 1";
//
// UC_JoyPanel
//
this.UC_JoyPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.UC_JoyPanel.JsAssignment = 0;
this.UC_JoyPanel.Location = new System.Drawing.Point(3, 3);
this.UC_JoyPanel.Name = "UC_JoyPanel";
this.UC_JoyPanel.Size = new System.Drawing.Size(284, 333);
this.UC_JoyPanel.TabIndex = 0;
//
// panel1
//
this.tlpanel.SetColumnSpan(this.panel1, 3);
@ -1157,7 +1167,7 @@
this.lbxOther.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbxOther.Location = new System.Drawing.Point(3, 33);
this.lbxOther.Name = "lbxOther";
this.lbxOther.Size = new System.Drawing.Size(332, 618);
this.lbxOther.Size = new System.Drawing.Size(332, 572);
this.lbxOther.TabIndex = 3;
this.lbxOther.Text = "";
this.lbxOther.WordWrap = false;
@ -1250,7 +1260,7 @@
//
this.meResetDefaults.Image = global::SCJMapper_V2.Properties.Resources.RSI;
this.meResetDefaults.Name = "meResetDefaults";
this.meResetDefaults.Size = new System.Drawing.Size(153, 22);
this.meResetDefaults.Size = new System.Drawing.Size(169, 38);
this.meResetDefaults.Tag = "§";
this.meResetDefaults.Text = "Reset defaults !";
this.meResetDefaults.Click += new System.EventHandler(this.meResetDefaults_Click);
@ -1259,7 +1269,7 @@
//
this.meResetEmpty.Image = global::SCJMapper_V2.Properties.Resources.NPad;
this.meResetEmpty.Name = "meResetEmpty";
this.meResetEmpty.Size = new System.Drawing.Size(153, 22);
this.meResetEmpty.Size = new System.Drawing.Size(169, 38);
this.meResetEmpty.Tag = "§";
this.meResetEmpty.Text = "Reset empty !";
this.meResetEmpty.Click += new System.EventHandler(this.meResetEmpty_Click);
@ -1326,7 +1336,8 @@
this.msBtShow.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.meShowToggleTable,
this.meShowOptionsDialog,
this.meShowDeviceTuningDialog});
this.meShowDeviceTuningDialog,
this.meShowDeviceMonitoringDialog});
this.msBtShow.Image = global::SCJMapper_V2.Properties.Resources.Monitor;
this.msBtShow.ImageTransparentColor = System.Drawing.Color.Magenta;
this.msBtShow.Name = "msBtShow";
@ -1338,7 +1349,7 @@
// meShowToggleTable
//
this.meShowToggleTable.Name = "meShowToggleTable";
this.meShowToggleTable.Size = new System.Drawing.Size(228, 22);
this.meShowToggleTable.Size = new System.Drawing.Size(250, 22);
this.meShowToggleTable.Tag = "§";
this.meShowToggleTable.Text = "Show Toggle Table...";
this.meShowToggleTable.Click += new System.EventHandler(this.meShowToggleTable_Click);
@ -1346,7 +1357,7 @@
// meShowOptionsDialog
//
this.meShowOptionsDialog.Name = "meShowOptionsDialog";
this.meShowOptionsDialog.Size = new System.Drawing.Size(228, 22);
this.meShowOptionsDialog.Size = new System.Drawing.Size(250, 22);
this.meShowOptionsDialog.Tag = "§";
this.meShowOptionsDialog.Text = "Show Options Dialog...";
this.meShowOptionsDialog.Click += new System.EventHandler(this.meShowOptionsDialog_Click);
@ -1354,11 +1365,19 @@
// meShowDeviceTuningDialog
//
this.meShowDeviceTuningDialog.Name = "meShowDeviceTuningDialog";
this.meShowDeviceTuningDialog.Size = new System.Drawing.Size(228, 22);
this.meShowDeviceTuningDialog.Size = new System.Drawing.Size(250, 22);
this.meShowDeviceTuningDialog.Tag = "§";
this.meShowDeviceTuningDialog.Text = "Show Device Tuning Dialog...";
this.meShowDeviceTuningDialog.Click += new System.EventHandler(this.meShowDeviceTuningDialog_Click);
//
// meShowDeviceMonitoringDialog
//
this.meShowDeviceMonitoringDialog.Name = "meShowDeviceMonitoringDialog";
this.meShowDeviceMonitoringDialog.Size = new System.Drawing.Size(250, 22);
this.meShowDeviceMonitoringDialog.Tag = "§";
this.meShowDeviceMonitoringDialog.Text = "Show Device Monitoring Dialog...";
this.meShowDeviceMonitoringDialog.Click += new System.EventHandler(this.meShowDeviceMonitoringDialog_Click);
//
// toolStripSeparator6
//
this.toolStripSeparator6.Name = "toolStripSeparator6";
@ -1484,15 +1503,6 @@
this.IL2.Images.SetKeyName(1, "Locked");
this.IL2.Images.SetKeyName(2, "RSI");
//
// UC_JoyPanel
//
this.UC_JoyPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.UC_JoyPanel.JsAssignment = 0;
this.UC_JoyPanel.Location = new System.Drawing.Point(3, 3);
this.UC_JoyPanel.Name = "UC_JoyPanel";
this.UC_JoyPanel.Size = new System.Drawing.Size(284, 333);
this.UC_JoyPanel.TabIndex = 0;
//
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@ -1666,6 +1676,7 @@
private System.Windows.Forms.ToolStripStatusLabel tsLblSupport;
private System.Windows.Forms.ToolStripDropDownButton msBtDump;
private System.Windows.Forms.ToolStripMenuItem tdiExpandAll;
private System.Windows.Forms.ToolStripMenuItem meShowDeviceMonitoringDialog;
}
}

@ -20,6 +20,7 @@ using SCJMapper_V2.Devices.Mouse;
using SCJMapper_V2.Devices.Gamepad;
using SCJMapper_V2.Devices.Joystick;
using SCJMapper_V2.Devices.Options;
using SCJMapper_V2.Devices.Monitor;
using SCJMapper_V2.Translation;
namespace SCJMapper_V2
@ -494,7 +495,7 @@ namespace SCJMapper_V2
// Helper: collect the joysticks here
struct myDxJoystick
{
public SharpDX.DirectInput.Joystick js;
public Joystick js;
public string prodName;
}
@ -515,10 +516,10 @@ namespace SCJMapper_V2
try {
log.Debug( " - Get Keyboard device" );
DeviceInst.KeyboardInst = new KeyboardCls( new SharpDX.DirectInput.Keyboard( directInput ), this );
DeviceInst.KeyboardInst = new KeyboardCls( new Keyboard( directInput ), this.Handle );
log.Debug( " - Get Mouse device" );
DeviceInst.MouseInst = new MouseCls( new SharpDX.DirectInput.Mouse( directInput ), this );
DeviceInst.MouseInst = new MouseCls( new Mouse( directInput ), this.Handle );
}
catch ( Exception ex ) {
@ -549,7 +550,7 @@ namespace SCJMapper_V2
}
else {
myDxJoystick myJs = new myDxJoystick( );
myJs.js = new SharpDX.DirectInput.Joystick( directInput, instance.InstanceGuid );
myJs.js = new Joystick( directInput, instance.InstanceGuid );
myJs.prodName = instance.ProductName;
dxJoysticks.Add( myJs );
log.DebugFormat( " - Create the device interface for: {0}", myJs.prodName );
@ -565,7 +566,7 @@ namespace SCJMapper_V2
// make the GP the first device if there is one.
if ( dxGamepad != null ) {
log.Debug( " - Add first Gamepad panel" );
tc1.TabPages[tabs].Text = Tx.Translate("xGamepad") + " ";
tc1.TabPages[tabs].Text = Tx.Translate( "xGamepad" ) + " ";
UC_GpadPanel uUC_GpadPanelNew = new UC_GpadPanel( ); tc1.TabPages[tabs].Controls.Add( uUC_GpadPanelNew );
Tx.LocalizeControlTree( uUC_GpadPanelNew );
@ -604,7 +605,7 @@ namespace SCJMapper_V2
}
// common part
tc1.TabPages[tabs].Text = string.Format( "{0} {1}",Tx.Translate("xJoystick"), nJs + 1 ); // numbering is 1 based for the user
tc1.TabPages[tabs].Text = string.Format( "{0} {1}", Tx.Translate( "xJoystick" ), nJs + 1 ); // numbering is 1 based for the user
log.Debug( " - Create Joystick instance " + nJs.ToString( ) );
js = new JoystickCls( myJs.js, this, nJs, uUC_JoyPanelNew, tabs ); // does all device related activities for that particular item
DeviceInst.JoystickListRef.Add( js ); // add to joystick list
@ -720,7 +721,7 @@ namespace SCJMapper_V2
// *** Timer Events
// polls the devices to get the latest update
private void timer1_Tick( object sender, System.EventArgs e )
private void timer1_Tick( object sender, EventArgs e )
{
// Handle Kbd modifier timeout for joystick
m_modifierTimeout -= timer1.Interval; // decrement timeout
@ -1006,6 +1007,15 @@ namespace SCJMapper_V2
timer1.Enabled = true;
}
private void meShowDeviceMonitoringDialog_Click( object sender, EventArgs e )
{
timer1.Enabled = false; // must be off while a modal window is shown, else DX gets crazy
var MONITOR = new FormDeviceMonitor { ActionTree = m_AT };
MONITOR.ShowDialog( this );
MONITOR = null; // get rid and create a new one next time..
timer1.Enabled = true;
}
// *** Settings
@ -1047,7 +1057,7 @@ namespace SCJMapper_V2
JoystickCls j = null;
// for all supported jsN devices
for ( int i = 0; i < JoystickCls.JSnum_MAX; i++ ) {
j = DeviceInst.JoystickListRef.Find_jsN( i + 1 );
j = DeviceInst.JoystickListRef.Find_InstanceForjsN( i + 1 );
if ( j != null ) {
newTree.ActionMaps.jsN[i] = j.DevName; newTree.ActionMaps.jsNGUID[i] = j.DevInstanceGUID;
}
@ -1158,7 +1168,7 @@ namespace SCJMapper_V2
private void tsiOpen_Click( object sender, EventArgs e )
{
if ( OFD.ShowDialog( this ) == System.Windows.Forms.DialogResult.OK ) {
if ( OFD.ShowDialog( this ) == DialogResult.OK ) {
rtb.LoadFile( OFD.FileName, RichTextBoxStreamType.PlainText );
btGrab.BackColor = MyColors.DirtyColor;
}
@ -1166,7 +1176,7 @@ namespace SCJMapper_V2
private void tsiSaveAs_Click( object sender, EventArgs e )
{
if ( SFD.ShowDialog( this ) == System.Windows.Forms.DialogResult.OK ) {
if ( SFD.ShowDialog( this ) == DialogResult.OK ) {
rtb.SaveFile( SFD.FileName, RichTextBoxStreamType.PlainText );
}
}
@ -1186,7 +1196,7 @@ namespace SCJMapper_V2
m_prevActivationMode = ActivationMode.Default; // switch Closing handling OFF in case we don't show anything
if ( m_AT.CanAssignBinding ) {
tdiAssignBinding.Text = Tx.Translate( tdiAssignBinding) + ": " + JoystickCls.MakeThrottle( lblLastJ.Text, cbxThrottle.Checked );
tdiAssignBinding.Text = Tx.Translate( tdiAssignBinding ) + ": " + JoystickCls.MakeThrottle( lblLastJ.Text, cbxThrottle.Checked );
}
tdiAssignBinding.Visible = m_AT.CanAssignBinding; any2 = any2 || m_AT.CanAssignBinding; // Assign
tdiBlendBinding.Visible = m_AT.CanDisableBinding; any2 = any2 || m_AT.CanDisableBinding; // Blend
@ -1339,7 +1349,7 @@ namespace SCJMapper_V2
if ( SCMappings.IsValidMappingName( txMappingName.Text ) ) {
Dump( );
if ( SCMappings.MappingFileExists( txMappingName.Text ) ) {
cancel = ( MessageBox.Show( "File exists, shall we overwrite ?", "Save XML", MessageBoxButtons.YesNo ) == System.Windows.Forms.DialogResult.No );
cancel = ( MessageBox.Show( "File exists, shall we overwrite ?", "Save XML", MessageBoxButtons.YesNo ) == DialogResult.No );
}
if ( !cancel ) {
rtb.SaveFile( SCMappings.MappingFileName( txMappingName.Text ), RichTextBoxStreamType.PlainText );
@ -1352,6 +1362,14 @@ namespace SCJMapper_V2
UpdateDDMapping( txMappingName.Text );
AppSettings.Instance.MyMappingName = txMappingName.Text; AppSettings.Instance.Save( );// last used - persist
txMappingName.BackColor = MyColors.SuccessColor;
// autosave CSV
string csvList = string.Format( "-- {0} - SC Joystick Mapping ({1}) --\n{2}", DateTime.Now, txMappingName.Text,
m_AT.ReportActionsCSV( true, true ) );
using (StreamWriter sw = File.CreateText(TheUser.MappingCsvFileName(txMappingName.Text)) ) {
sw.Write( csvList );
}
}
}
else {
@ -1426,7 +1444,7 @@ namespace SCJMapper_V2
// find the device for the action if it is an axis (analog command)
string command = ActionTreeNode.CommandFromActionText( nodeText );
if ( JoystickCls.IsAxisCommand( command ) ) {
dev = DeviceInst.JoystickListRef.Find_jsN( JoystickCls.JSNum( command ) );
dev = DeviceInst.JoystickListRef.Find_InstanceForjsN( JoystickCls.JSNum( command ) );
}
else if ( GamepadCls.IsAxisCommand( command ) ) {
dev = DeviceInst.GamepadRef;
@ -1573,11 +1591,11 @@ namespace SCJMapper_V2
{
string devInput = Act.DevInput( lblLastJ.Text, InputMode );
RTF.RTFformatter RTF = new RTF.RTFformatter( );
m_AT.FindAllActionsRTF( devInput, RTF );
m_AT.ListAllActionsRTF( devInput, RTF );
// have to check if throttle is used and if - add those to the list
string altDevInput = JoystickCls.MakeThrottle( devInput, true );
if ( altDevInput != devInput ) {
m_AT.FindAllActionsRTF( altDevInput, RTF );
m_AT.ListAllActionsRTF( altDevInput, RTF );
}
lbxOther.Rtf = RTF.RTFtext;
}

@ -128,7 +128,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA8
EAAAAk1TRnQBSQFMAgEBCQEAATABFAEwARQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
EAAAAk1TRnQBSQFMAgEBCQEAAUABFAFAARQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -469,15 +469,6 @@
VEPFEv0j3g3A94woz3mmbBnHX//Z
</value>
</data>
<metadata name="OFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>133, 17</value>
</metadata>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>209, 17</value>
</metadata>
<metadata name="SFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>421, 17</value>
</metadata>
<data name="btSaveMyMapping.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH
@ -550,6 +541,15 @@
Tesk88046SuRb2gfwdMB6S/DHs/UzS4d0QAAAABJRU5ErkJggg==
</value>
</data>
<metadata name="OFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>133, 17</value>
</metadata>
<metadata name="timer1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>209, 17</value>
</metadata>
<metadata name="SFD.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>421, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>555, 17</value>
</metadata>
@ -581,118 +581,118 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADc
GQAAAk1TRnQBSQFMAgEBAwEAAfABAQHwAQEBMAEAATABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABwAMAATADAAEBAQABCAYAASQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/2sAHP8JAAH/SAAB/wL0
AfME8AHzAvQB/0MAAf8B8wG6HKwBugHzAf9KAAH/AfIBBwG0AYsMawGLAfcBvAHzAf8aAAH0AfABBwHv
ApIB7wEHAfAB9BgAAf8B8wGyIKwBsgHzAf9GAAHzAfcWawG7AfQVAAH/AfEB9wHvAQcCvALxArwBBwHv
AfcB8QH/FAAB/wEJJKwBCQH/QwAB9AG7GmsBuwH0EgAB8QGSAe8B8ArxAfAB7wGSAfESAAH/AQkmrAEJ
Af9BAAHzAmsaigJrAfQPAAH/AfAB7wHwDvEB8AHvAfAB/w8AAf8B8yisAfMB/0AAAfcBaxyKAWsBuw4A
AfQBvAEHBPEB8AH3AZABiwJrAosBkQG8BPEBBwG8AfQOAAH/KqwB/z8AAfQBax4GAWsB/wwAAf8BvAEH
BPEBkQprAZEBvAPxAQcBvAH/DQAB8yqsAfM/AAHzAWseigFrAfMMAAHwAQcD8QG7A2sCigGLAvMBiwOK
AmsBkQPxAQcB8A0AAboqrAG6PwAB9AFrHooBawHzCwAB8QHvA/EB9wFrAYoEBgG7Av8BtAQGAYoBawGR
A/EB7wHxCwAB/wGyBqwXsw6sAf8+AAH/AWseigFrAfQKAAH/AZIB8ALxAe8BawEGBYoBkALzAYsFigEG
AWsBkQLxAfABkgH/CgAB/wesAbMBZgINGWYBswesAf8/AAGQHooBiwsAAfEBBwPxAWsRBgGKAWsBvALx
AQcB8QoAAf8GrAGzAa0BDQEQBQ0GQwpmBUMBrQGzBqwB/z0AAf8B9AEHAYoBkBmKAYsBkAEGAbwKAAH/
AZID8QGRE4oBBgGRA/EBkgH/CQAB/wasAbMBrQkNBUMIZgVDAQ0BrQGzBqwB/zgAAf8BGwEaAXkBUgMr
AWsCkBeLApABgQGRCwAB8wHvAvIB8QFrCYoCawmKAWsBvALyAe8B8wkAAf8GrAGzAa0NDQFDBWYCQwFm
AkMEDQGtAbMGrAH/NgAB8wGZAisBMQUyAUsBawKzAZATiwKQAbMBkAFrAfILAAHwAQcC8gHvAYoGiwGK
AYsBuwK8AbsBiwGKBosBigGRAvIBBwHwCQAB/wasArMODQJDA2YEQwUNArMGrAH/NAAB9AGZASsKMgFL
AWsBkAKzEZADswGKAWsB8gwAAQcB8ALyAZEBigWQAYoBiwG8BPEBvAGLAYoFkAGKAYsC8gHwAQcJAAH/
BqwCsw8NBkMHDQKzBqwB/zMAAfMBKwExDDIBTAHqAYoFswmQBbMBgQFrAQcB/w0AAfcB8QLyAosBswG6
AbMCkAEGAe8G8gHvAQYCkAGzAboBswGQAWsC8gHxAfcJAAH/BqwCswINAmUEDQRmAWUHZgENAmYBZQEN
ARACDQKzBqwB/zMAAXkQMgFMAeoBawGKAYEBkAGzB5ABswGQAbMBigFrAZEBvAH/DwABkgPyAYsBkAH0
Af8BGQKzAWsB8AbyAfEBawKzAfQB/wEZAbMBawHwAvIBkgkAAf8GrAKzAQ0BQwGzAdsBiwINAWwBugHb
AbMDiwG0A7oB2wG0AUMBswHbAbMEDQKzBqwB/zIAAf8BKxIyATEBTAFKAQYJswGKAbsB8wH/EgABkgPy
AYsBswH0Af8BGQKzAWsB8gbzAfIBawKzAfQB/wEZAbMBawHwAvIBkgkAAf8GrAKzAg0BtAHbAbMCDQGz
A9sCkAGLAbQF2wFsAYsC2wFmAg8BDQKzBqwB/zIAAfMBKxQyAUoBigmzAYoBuxQAAfcB8gHzAfIBiwGQ
AbMBugOzAYoBuwH/BPMB/wG7AYoDswG6ArMBawHyAfMB8gH3CQAB/wasArMCDQGQAtsBZgENAbQC2wG0
A4sBkAO0AtsBiwFsAtsBiwMPArMGrAH/MgAB9AErFDIBbAuzAWsB/xMAAQcB8AH0AfIBkQGQBrMBiwH0
BP8B9AGLAZAGswGLAfIB9AHwAQcJAAH/BqwCswEPAQ0BbALbAbQBiwLbAbMHDQFmAtsBtAFmAtsBkAEK
Ag8CswasAf8yAAH/ASsTMgFSAWsLswGKAfMTAAHwAbwB9AHzAbsBigazAYoBiwG7AvMBuwGLAYoGswGB
AZEB8wH0AbwB8AkAAf8GrAKzAQ8BDQFmBtsBiwYNAYsD2wGzAQ0BtAHbAbQBDQIPArMGrAH/MwABUhMy
AVEBiguzAYoBuxMAAfMB7wH/AfMB8gFrAbMBuQazAYoCawGKCLMBigHwAfMB9AHvAfMJAAH/BqwCswEP
Ag0BugXbAbQBZgQNAZAD2wG0AWYBDQGRAtsBZgEKAQ8CswasAf8zAAEaATESMgFKAZAMswGREwAB/wGS
AfQB/wHzAbQBigHaAbkPswHaAbMBkQHzAf8B9AGSAf8JAAH/BqwBuQGzAg8BDQG0AtsBtATbAZABDQFm
AbQD2wGLAQ0BDwEKAYsC2wFsAQ4BDwGzAbkGrAH/MwAB/wErATIBUxAyAWwNswFrAf8TAAHxAbwB/wLz
AWsBswHaDrkB2gG5AWsB8AHzAf8BvAHxCgAB/wasAboBswEPAQ4BCgGLAtsBZgFsAbQD2wFsAboC2wG6
AWwEDQFmAtsBkAEKAQ8BswG6BqwB/zQAARoBKwJZD1MBbA2zAQYB9BMAAf8BkgH0Af8B8wG7AWsC2gW5
AvQFuQLaAYoB9wHzAf8B9AGSAf8KAAH/BqwBugGzAQ8CCgFsAtsBiwENAQ8BiwLbAZABugHbAboBFQYN
AboB2wG0AQ0BDwGzAboGrAH/NQABGgErATICWQ1TAWwNswGKAfMUAAGSAQcC/wHzAbUBawG5AtoCuQHc
Av8B3AK5A9oBigGRAfMC/wEHAZILAAH/BqwBugGzAQ4BCgEPAUMD2wO6AtsCtALbBLoDiwG0AtsBDQEP
AbMBugasAf82AAH0AZkBMQVZCVMBbA2zAYoB8hQAAfcB7wG8Av8B8wG7AWsBkAPaAdsC9ATaAbMBawH3
AfMC/wG8Ae8BkgsAAf8GrAG6AbMBDgEKAQ4BDQG6BdwC2wG6AZEB3AHbA9wB4QG0ApEBtALcAWwBCgGz
AboGrAH/OAAB9AGZASsBMQEyAVMBWQdTAVkBbAGzDLkBigHyFAABkgHxAe8B8QL/AvMBtAFrAZACuQLf
ArkBswGKAZEB8QHzAv8B8QHvAfEBkgsAAf8GrAG6AbMBDgMKAZEB3AbbAbQBZgG6BNsB3AG0A5EBugHc
AYsBDQGzAboGrAH/OgAB/wHzARoBMQlTAWwBswy5AYoB9BQAAZIB8gHwAe8BvAL/AfQC8wG7AZEBiwJr
AYsBkAG1AfIB8wH0Av8BvAHvAfAB8gGSCwAB/wasAboBswEOAgoCDQdDAw0CQwNmAUMBDQFDAQ0CQwIN
AbMBugasAf88AAGZATEJUwFLAZAB2gm5AdoBuQFrAf8UAAGSAvIB8QHvAQcB9AL/AfQI8wH0Av8B9AEH
Ae8B8QLyAZILAAH/BqwBugGzAg4BCgcOAQ8CDQIPAQ4FDQEPAQ0BDwEQAQ8CCgGzAboGrAH/PAABUgpT
AVIBawLaCLkB2gGzAbsVAAGSBPICkgEHAfQK/wH0AQcCkgTyAZILAAH/BqwBugGzCgoCDwINAg4BDwQN
AQ8CDgEPAQoCDgGzAboGrAH/OwAB9gExC1kBSgGBA9oEuQPaAYoB9BUAAZIB8gHzAvIBkgH/AfEB9wHv
AbwC8wL/AvMBvAHvAfcB8QH/AZIC8gHzAfIBkgsAAf8GrAG6AbkBCgIOBwoBDgEPAQ0BDwIKAQ4BDwIN
Ag8BDgEKAQ4CCgEOAbkBugasAf87AAEbATELWQFSAewBgQHaAd8E2gHfAbkBBgG8FgAB7wHxAfMC8gHv
AfQCAAH0AfABBwHvApIB7wEHAfAB9AIAAfQB7wLyAfMB8QHvCwAB/wasAdsBuQEKAQ4BCgUOAQoBDgMP
AQ4BCgEOAQoBDgIPAQ0BDwMKAw4BuQHbBqwB/zsAAZkBUgtZAVMBdAG8AYsBBgGQAbkBswGBAQYBkQHy
FwABBwHwAfQC8gEHAfIOAAHyAQcC8gH0AfABBwsAAf8GrAK6AQ4BAAYKAQ4BCgMOAQoBDgIKAQ4CCgIO
AQoDDgIAAroGrAH/OwABdAFTDFkBKwH/AQAB8wHwAbsBvAHzAf8ZAAHxAQcB/wLzArwOAAK8AvMB/wEH
AfELAAH/BqwBswHbAWwaDQFsAdsBswasAf87AAFSDVkBMQH/IAAB9AHvAf8B9AHzAfIB7wHzDAAB8wHv
AfIB8wH0Af8B7wH0CwAB/wesAbkB2xq6AdsBuQesAf87AAFSDVkBMQHzIQABBwHyAf8C8wHwAfcB9AoA
AfQB9wHwAvMB/wHyAQcMAAH/CKwBshqzAbIIrAH/OwABUg1ZATEBGyEAAfMB7wL/AvMBvAH3AfMIAAHz
AfcBvALzAv8B7wHzDAAB/yysAf87AAFSDVkBMQEbIgAC8AH/AfQC8wHwAe8BvAHyAfQC/wH0AfIBvAHv
AfAC8wH0Af8C8A4AAboqrAG6PAABeQFTDFkBMQH0IgAB9AGSAfMB/wH0A/MB8AEHAe8CkgHvAQcB8APz
AfQB/wHzAZIB9A4AAfMqrAHzPAABGgFSDFkBKwH/IwAB8gH3AfIC/wzzAv8B8gH3AfIPAAH/KqwB/zwA
Af8BMQxZAZklAAHzAZIB8AP/CPMD/wHwAZIB8xAAAf8B8yisAfMB/z0AARoBUgFeCVkBMQH0JgAB9AHw
Ae8B8gT/AvQE/wHyAe8B8AH0EgAB/wEJJqwBCQH/PwABmQFSAV4G5QFZATEBGikAAfMBBwH3AbwB8gHz
Av8B8wHyAbwB9wEHAfMVAAH/AQkkrAEJAf9BAAEaAVIBMQFSAVkBWAFSATEBdAEbLAAB/wHxAQcB7wKS
Ae8BBwHxAf8YAAH/AfMBsiCsAbIB8wH/RAAB8wEaAZkBGgHzAf9SAAH/AfMBuxusAbMBuwHzAf+hABz/
OgABQgFNAT4HAAE+AwABKAMAAcADAAEwAwABAQEAAQEFAAGAAQQWAAP/AQAN/wHAAgABAwH+BgAD/wEA
AQ8H/wH+BAABfwYAAv8B4AIAAX8C/wHgAQcC/wH4BAABHwYAAv8BgAIAAR8C/wIAAv8B8AQAAQ8GAAH/
Af4DAAEHAf8B/gIAAX8B/wHgBAABBwYAAf8B/AMAAQMB/wH4AgABHwH/AcAEAAEDBgAB/wH8AwABAwH/
AfACAAEPAf8BwAQAAQMGAAH/AfgDAAEBAf8B4AIAAQcB/wHABAABAwYAAf8B+AMAAQEB/wHgAgABBwH/
AcAEAAEDBgAB/wH4AwABAQH/AcACAAEDAf8BgAQAAQEGAAH/AfgDAAEBAf8BgAIAAQEB/wGABAABAQYA
Af8B/AMAAQMB/wGAAgABAQH/AYAEAAEBBgAB/wHwAwABAwH/BAAB/wGABAABAQYAAf4EAAEHAf8EAAH/
AYAEAAEBBgAB+AQAAQcB/wQAAf8BgAQAAQEGAAHgBAABDwH/BAAB/wGABAABAQYAAcAEAAEfAf8EAAH/
AYAEAAEBBgABwAQAAX8B/wQAAf8BgAQAAQEGAAGAAwABAwL/BAAB/wGABAABAQYAAYADAAEPAv8EAAH/
AYAEAAEBBgABgAMAAQcC/wQAAf8BgAQAAQEGAAGAAwABBwL/BAAB/wGABAABAQYAAcADAAEHAv8EAAH/
AYAEAAEBBgABwAMAAQcC/wQAAf8BgAQAAQEGAAHAAwABAwL/AYACAAEBAf8BgAQAAQEGAAHgAwABAwL/
AYACAAEBAf8BgAQAAQEGAAHwAwABAwL/AcACAAEDAf8BgAQAAQEGAAH4AwABAwL/AcACAAEDAf8BgAQA
AQEGAAH+AwABAwL/AcACAAEDAf8BgAQAAQEGAAH/AYACAAEDAv8BwAIAAQMB/wGABAABAQYAAf8B4AIA
AQMC/wHAAgABAwH/AYAEAAEBBgAB/wHgAgABBwL/AcACAAEDAf8BgAQAAQEGAAH/AcACAAEHAv8BwAIA
AQMB/wGABAABAQYAAf8BwAIAAQ8C/wHAAWABBgEDAf8BgAQAAQEGAAH/AcACAAEfAv8BwAF/Af4BAwH/
AYAEAAEBBgAB/wHAAQABIAF/Av8BwAF/Af4BAwH/AYAEAAEBBgAB/wHAAQABPwP/AcABPwH8AQMB/wGA
BAABAQYAAf8BwAEAAT8D/wHgAR8B+AEHAf8BgAQAAQEGAAH/AcABAAE/A/8B4AEPAfABBwH/AYAEAAEB
BgAB/wHAAQABPwP/AfACAAEPAf8BwAQAAQMGAAH/AcABAAE/A/8B8AIAAQ8B/wHABAABAwYAAf8BwAEA
AT8D/wH4AgABHwH/AcAEAAEDBgAB/wHAAQABfwP/AfwCAAE/Af8BwAQAAQMGAAH/AeABAAF/A/8B/gIA
AX8B/wHgBAABBwYAAf8B8AEABf8BgAEBAv8B8AQAAQ8GAAH/AfgBAQX/AeABBwL/AfgEAAEfBgAB/wH+
AQcJ/wH+BAABfwYADf8BwAIAAQMB/wYACw==
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADa
GQAAAk1TRnQBSQFMAgEBAwIAAQIBAAECATABAAEwAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
AcADAAEwAwABAQEAAQgGAAEkGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ
AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm
AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz
AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm
AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm
AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA
ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm
AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm
ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm
AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA
AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ
AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz
AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/
AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA
AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM
AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm
ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ
AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/
ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM
ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm
AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM
AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA
AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA
ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7
Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/9rABz/CQAB/0gAAf8C9AHz
BPAB8wL0Af9DAAH/AfMBuhysAboB8wH/SgAB/wHyAQcBtAGLDGsBiwH3AbwB8wH/GgAB9AHwAQcB7wKS
Ae8BBwHwAfQYAAH/AfMBsiCsAbIB8wH/RgAB8wH3FmsBuwH0FQAB/wHxAfcB7wEHArwC8QK8AQcB7wH3
AfEB/xQAAf8BCSSsAQkB/0MAAfQBuxprAbsB9BIAAfEBkgHvAfAK8QHwAe8BkgHxEgAB/wEJJqwBCQH/
QQAB8wJrGooCawH0DwAB/wHwAe8B8A7xAfAB7wHwAf8PAAH/AfMorAHzAf9AAAH3AWscigFrAbsOAAH0
AbwBBwTxAfAB9wGQAYsCawKLAZEBvATxAQcBvAH0DgAB/yqsAf8/AAH0AWseBgFrAf8MAAH/AbwBBwTx
AZEKawGRAbwD8QEHAbwB/w0AAfMqrAHzPwAB8wFrHooBawHzDAAB8AEHA/EBuwNrAooBiwLzAYsDigJr
AZED8QEHAfANAAG6KqwBuj8AAfQBax6KAWsB8wsAAfEB7wPxAfcBawGKBAYBuwL/AbQEBgGKAWsBkQPx
Ae8B8QsAAf8BsgasF7MOrAH/PgAB/wFrHooBawH0CgAB/wGSAfAC8QHvAWsBBgWKAZAC8wGLBYoBBgFr
AZEC8QHwAZIB/woAAf8HrAGzAWYCDRlmAbMHrAH/PwABkB6KAYsLAAHxAQcD8QFrEQYBigFrAbwC8QEH
AfEKAAH/BqwBswGtAQ0BEAUNBkMKZgVDAa0BswasAf89AAH/AfQBBwGKAZAZigGLAZABBgG8CgAB/wGS
A/EBkROKAQYBkQPxAZIB/wkAAf8GrAGzAa0JDQVDCGYFQwENAa0BswasAf84AAH/ARsBGgF5AVIDKwFr
ApAXiwKQAYEBkQsAAfMB7wLyAfEBawmKAmsJigFrAbwC8gHvAfMJAAH/BqwBswGtDQ0BQwVmAkMBZgJD
BA0BrQGzBqwB/zYAAfMBmQIrATEFMgFLAWsCswGQE4sCkAGzAZABawHyCwAB8AEHAvIB7wGKBosBigGL
AbsCvAG7AYsBigaLAYoBkQLyAQcB8AkAAf8GrAKzDg0CQwNmBEMFDQKzBqwB/zQAAfQBmQErCjIBSwFr
AZACsxGQA7MBigFrAfIMAAEHAfAC8gGRAYoFkAGKAYsBvATxAbwBiwGKBZABigGLAvIB8AEHCQAB/was
ArMPDQZDBw0CswasAf8zAAHzASsBMQwyAUwB6gGKBbMJkAWzAYEBawEHAf8NAAH3AfEC8gKLAbMBugGz
ApABBgHvBvIB7wEGApABswG6AbMBkAFrAvIB8QH3CQAB/wasArMCDQJlBA0EZgFlB2YBDQJmAWUBDQEQ
Ag0CswasAf8zAAF5EDIBTAHqAWsBigGBAZABsweQAbMBkAGzAYoBawGRAbwB/w8AAZID8gGLAZAB9AH/
ARkCswFrAfAG8gHxAWsCswH0Af8BGQGzAWsB8ALyAZIJAAH/BqwCswENAUMBswHbAYsCDQFsAboB2wGz
A4sBtAO6AdsBtAFDAbMB2wGzBA0CswasAf8yAAH/ASsSMgExAUwBSgEGCbMBigG7AfMB/xIAAZID8gGL
AbMB9AH/ARkCswFrAfIG8wHyAWsCswH0Af8BGQGzAWsB8ALyAZIJAAH/BqwCswINAbQB2wGzAg0BswPb
ApABiwG0BdsBbAGLAtsBZgIPAQ0CswasAf8yAAHzASsUMgFKAYoJswGKAbsUAAH3AfIB8wHyAYsBkAGz
AboDswGKAbsB/wTzAf8BuwGKA7MBugKzAWsB8gHzAfIB9wkAAf8GrAKzAg0BkALbAWYBDQG0AtsBtAOL
AZADtALbAYsBbALbAYsDDwKzBqwB/zIAAfQBKxQyAWwLswFrAf8TAAEHAfAB9AHyAZEBkAazAYsB9AT/
AfQBiwGQBrMBiwHyAfQB8AEHCQAB/wasArMBDwENAWwC2wG0AYsC2wGzBw0BZgLbAbQBZgLbAZABCgIP
ArMGrAH/MgAB/wErEzIBUgFrC7MBigHzEwAB8AG8AfQB8wG7AYoGswGKAYsBuwLzAbsBiwGKBrMBgQGR
AfMB9AG8AfAJAAH/BqwCswEPAQ0BZgbbAYsGDQGLA9sBswENAbQB2wG0AQ0CDwKzBqwB/zMAAVITMgFR
AYoLswGKAbsTAAHzAe8B/wHzAfIBawGzAbkGswGKAmsBigizAYoB8AHzAfQB7wHzCQAB/wasArMBDwIN
AboF2wG0AWYEDQGQA9sBtAFmAQ0BkQLbAWYBCgEPArMGrAH/MwABGgExEjIBSgGQDLMBkRMAAf8BkgH0
Af8B8wG0AYoB2gG5D7MB2gGzAZEB8wH/AfQBkgH/CQAB/wasAbkBswIPAQ0BtALbAbQE2wGQAQ0BZgG0
A9sBiwENAQ8BCgGLAtsBbAEOAQ8BswG5BqwB/zMAAf8BKwEyAVMQMgFsDbMBawH/EwAB8QG8Af8C8wFr
AbMB2g65AdoBuQFrAfAB8wH/AbwB8QoAAf8GrAG6AbMBDwEOAQoBiwLbAWYBbAG0A9sBbAG6AtsBugFs
BA0BZgLbAZABCgEPAbMBugasAf80AAEaASsCWQ9TAWwNswEGAfQTAAH/AZIB9AH/AfMBuwFrAtoFuQL0
BbkC2gGKAfcB8wH/AfQBkgH/CgAB/wasAboBswEPAgoBbALbAYsBDQEPAYsC2wGQAboB2wG6ARUGDQG6
AdsBtAENAQ8BswG6BqwB/zUAARoBKwEyAlkNUwFsDbMBigHzFAABkgEHAv8B8wG1AWsBuQLaArkB3AL/
AdwCuQPaAYoBkQHzAv8BBwGSCwAB/wasAboBswEOAQoBDwFDA9sDugLbArQC2wS6A4sBtALbAQ0BDwGz
AboGrAH/NgAB9AGZATEFWQlTAWwNswGKAfIUAAH3Ae8BvAL/AfMBuwFrAZAD2gHbAvQE2gGzAWsB9wHz
Av8BvAHvAZILAAH/BqwBugGzAQ4BCgEOAQ0BugXcAtsBugGRAdwB2wPcAeEBtAKRAbQC3AFsAQoBswG6
BqwB/zgAAfQBmQErATEBMgFTAVkHUwFZAWwBswy5AYoB8hQAAZIB8QHvAfEC/wLzAbQBawGQArkC3wK5
AbMBigGRAfEB8wL/AfEB7wHxAZILAAH/BqwBugGzAQ4DCgGRAdwG2wG0AWYBugTbAdwBtAORAboB3AGL
AQ0BswG6BqwB/zoAAf8B8wEaATEJUwFsAbMMuQGKAfQUAAGSAfIB8AHvAbwC/wH0AvMBuwGRAYsCawGL
AZABtQHyAfMB9AL/AbwB7wHwAfIBkgsAAf8GrAG6AbMBDgIKAg0HQwMNAkMDZgFDAQ0BQwENAkMCDQGz
AboGrAH/PAABmQExCVMBSwGQAdoJuQHaAbkBawH/FAABkgLyAfEB7wEHAfQC/wH0CPMB9AL/AfQBBwHv
AfEC8gGSCwAB/wasAboBswIOAQoHDgEPAg0CDwEOBQ0BDwENAQ8BEAEPAgoBswG6BqwB/zwAAVIKUwFS
AWsC2gi5AdoBswG7FQABkgTyApIBBwH0Cv8B9AEHApIE8gGSCwAB/wasAboBswoKAg8CDQIOAQ8EDQEP
Ag4BDwEKAg4BswG6BqwB/zsAAfYBMQtZAUoBgQPaBLkD2gGKAfQVAAGSAfIB8wLyAZIB/wHxAfcB7wG8
AvMC/wLzAbwB7wH3AfEB/wGSAvIB8wHyAZILAAH/BqwBugG5AQoCDgcKAQ4BDwENAQ8CCgEOAQ8CDQIP
AQ4BCgEOAgoBDgG5AboGrAH/OwABGwExC1kBUgHsAYEB2gHfBNoB3wG5AQYBvBYAAe8B8QHzAvIB7wH0
AgAB9AHwAQcB7wKSAe8BBwHwAfQCAAH0Ae8C8gHzAfEB7wsAAf8GrAHbAbkBCgEOAQoFDgEKAQ4DDwEO
AQoBDgEKAQ4CDwENAQ8DCgMOAbkB2wasAf87AAGZAVILWQFTAXQBvAGLAQYBkAG5AbMBgQEGAZEB8hcA
AQcB8AH0AvIBBwHyDgAB8gEHAvIB9AHwAQcLAAH/BqwCugEOAQAGCgEOAQoDDgEKAQ4CCgEOAgoCDgEK
Aw4CAAK6BqwB/zsAAXQBUwxZASsB/wEAAfMB8AG7AbwB8wH/GQAB8QEHAf8C8wK8DgACvALzAf8BBwHx
CwAB/wasAbMB2wFsGg0BbAHbAbMGrAH/OwABUg1ZATEB/yAAAfQB7wH/AfQB8wHyAe8B8wwAAfMB7wHy
AfMB9AH/Ae8B9AsAAf8HrAG5AdsaugHbAbkHrAH/OwABUg1ZATEB8yEAAQcB8gH/AvMB8AH3AfQKAAH0
AfcB8ALzAf8B8gEHDAAB/wisAbIaswGyCKwB/zsAAVINWQExARshAAHzAe8C/wLzAbwB9wHzCAAB8wH3
AbwC8wL/Ae8B8wwAAf8srAH/OwABUg1ZATEBGyIAAvAB/wH0AvMB8AHvAbwB8gH0Av8B9AHyAbwB7wHw
AvMB9AH/AvAOAAG6KqwBujwAAXkBUwxZATEB9CIAAfQBkgHzAf8B9APzAfABBwHvApIB7wEHAfAD8wH0
Af8B8wGSAfQOAAHzKqwB8zwAARoBUgxZASsB/yMAAfIB9wHyAv8M8wL/AfIB9wHyDwAB/yqsAf88AAH/
ATEMWQGZJQAB8wGSAfAD/wjzA/8B8AGSAfMQAAH/AfMorAHzAf89AAEaAVIBXglZATEB9CYAAfQB8AHv
AfIE/wL0BP8B8gHvAfAB9BIAAf8BCSasAQkB/z8AAZkBUgFeBuUBWQExARopAAHzAQcB9wG8AfIB8wL/
AfMB8gG8AfcBBwHzFQAB/wEJJKwBCQH/QQABGgFSATEBUgFZAVgBUgExAXQBGywAAf8B8QEHAe8CkgHv
AQcB8QH/GAAB/wHzAbIgrAGyAfMB/0QAAfMBGgGZARoB8wH/UgAB/wHzAbsbrAGzAbsB8wH/oQAc/zoA
AUIBTQE+BwABPgMAASgDAAHAAwABMAMAAQEBAAEBBQABgAEEFgAD/wEADf8BwAIAAQMB/gYAA/8BAAEP
B/8B/gQAAX8GAAL/AeACAAF/Av8B4AEHAv8B+AQAAR8GAAL/AYACAAEfAv8CAAL/AfAEAAEPBgAB/wH+
AwABBwH/Af4CAAF/Af8B4AQAAQcGAAH/AfwDAAEDAf8B+AIAAR8B/wHABAABAwYAAf8B/AMAAQMB/wHw
AgABDwH/AcAEAAEDBgAB/wH4AwABAQH/AeACAAEHAf8BwAQAAQMGAAH/AfgDAAEBAf8B4AIAAQcB/wHA
BAABAwYAAf8B+AMAAQEB/wHAAgABAwH/AYAEAAEBBgAB/wH4AwABAQH/AYACAAEBAf8BgAQAAQEGAAH/
AfwDAAEDAf8BgAIAAQEB/wGABAABAQYAAf8B8AMAAQMB/wQAAf8BgAQAAQEGAAH+BAABBwH/BAAB/wGA
BAABAQYAAfgEAAEHAf8EAAH/AYAEAAEBBgAB4AQAAQ8B/wQAAf8BgAQAAQEGAAHABAABHwH/BAAB/wGA
BAABAQYAAcAEAAF/Af8EAAH/AYAEAAEBBgABgAMAAQMC/wQAAf8BgAQAAQEGAAGAAwABDwL/BAAB/wGA
BAABAQYAAYADAAEHAv8EAAH/AYAEAAEBBgABgAMAAQcC/wQAAf8BgAQAAQEGAAHAAwABBwL/BAAB/wGA
BAABAQYAAcADAAEHAv8EAAH/AYAEAAEBBgABwAMAAQMC/wGAAgABAQH/AYAEAAEBBgAB4AMAAQMC/wGA
AgABAQH/AYAEAAEBBgAB8AMAAQMC/wHAAgABAwH/AYAEAAEBBgAB+AMAAQMC/wHAAgABAwH/AYAEAAEB
BgAB/gMAAQMC/wHAAgABAwH/AYAEAAEBBgAB/wGAAgABAwL/AcACAAEDAf8BgAQAAQEGAAH/AeACAAED
Av8BwAIAAQMB/wGABAABAQYAAf8B4AIAAQcC/wHAAgABAwH/AYAEAAEBBgAB/wHAAgABBwL/AcACAAED
Af8BgAQAAQEGAAH/AcACAAEPAv8BwAFgAQYBAwH/AYAEAAEBBgAB/wHAAgABHwL/AcABfwH+AQMB/wGA
BAABAQYAAf8BwAEAASABfwL/AcABfwH+AQMB/wGABAABAQYAAf8BwAEAAT8D/wHAAT8B/AEDAf8BgAQA
AQEGAAH/AcABAAE/A/8B4AEfAfgBBwH/AYAEAAEBBgAB/wHAAQABPwP/AeABDwHwAQcB/wGABAABAQYA
Af8BwAEAAT8D/wHwAgABDwH/AcAEAAEDBgAB/wHAAQABPwP/AfACAAEPAf8BwAQAAQMGAAH/AcABAAE/
A/8B+AIAAR8B/wHABAABAwYAAf8BwAEAAX8D/wH8AgABPwH/AcAEAAEDBgAB/wHgAQABfwP/Af4CAAF/
Af8B4AQAAQcGAAH/AfABAAX/AYABAQL/AfAEAAEPBgAB/wH4AQEF/wHgAQcC/wH4BAABHwYAAf8B/gEH
Cf8B/gQAAX8GAA3/AcACAAEDAf8GAAs=
</value>
</data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

@ -114,6 +114,7 @@
this.cbxUsePath.Size = new System.Drawing.Size(15, 14);
this.cbxUsePath.TabIndex = 5;
this.cbxUsePath.UseVisualStyleBackColor = true;
this.cbxUsePath.CheckedChanged += new System.EventHandler(this.cbxUsePath_CheckedChanged);
//
// txJS1
//

@ -127,7 +127,7 @@ namespace SCJMapper_V2
// DetectGamepad
if ( AppSettings.Instance.DetectGamepad != cbxDetectGamepad.Checked ) {
MessageBox.Show( Tx.Translate( "setNote1" ), Tx.Translate("setNote2") , MessageBoxButtons.OK, MessageBoxIcon.Information );
MessageBox.Show( Tx.Translate( "setNote1" ), Tx.Translate( "setNote2" ), MessageBoxButtons.OK, MessageBoxIcon.Information );
}
AppSettings.Instance.DetectGamepad = cbxDetectGamepad.Checked;
@ -154,6 +154,14 @@ namespace SCJMapper_V2
private void btDone_Click( object sender, EventArgs e )
{
if ( cbxUsePath.Checked ) {
string issue = SC.SCPath.CheckSCBasePath( fbDlg.SelectedPath );
if ( !string.IsNullOrEmpty( issue ) ) {
MessageBox.Show( this, issue, Tx.Translate( "setMsgBox" ), MessageBoxButtons.OK );
return;
}
}
SaveSettings( );
Canceled = false;
this.Hide( );
@ -207,8 +215,14 @@ namespace SCJMapper_V2
private void btChooseSCDir_Click( object sender, EventArgs e )
{
if ( fbDlg.ShowDialog( this ) == System.Windows.Forms.DialogResult.OK ) {
fbDlg.SelectedPath = txSCPath.Text;
if ( fbDlg.ShowDialog( this ) == DialogResult.OK ) {
txSCPath.Text = fbDlg.SelectedPath;
string issue = SC.SCPath.CheckSCBasePath( fbDlg.SelectedPath );
if ( !string.IsNullOrEmpty( issue ) ) {
MessageBox.Show( this, issue, Tx.Translate("setMsgBox"), MessageBoxButtons.OK );
}
}
}
@ -216,5 +230,17 @@ namespace SCJMapper_V2
{
}
private void cbxUsePath_CheckedChanged( object sender, EventArgs e )
{
if ( cbxUsePath.Checked ) {
string issue = SC.SCPath.CheckSCBasePath( fbDlg.SelectedPath );
if ( !string.IsNullOrEmpty( issue ) ) {
MessageBox.Show( this, issue, Tx.Translate( "setMsgBox" ), MessageBoxButtons.OK );
}
}
}
}
}

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// 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.35.0.70" )]
[assembly: AssemblyFileVersion( "2.35.0.70" )]
[assembly: AssemblyVersion( "2.36.0.71" )]
[assembly: AssemblyFileVersion( "2.36.0.71" )]

@ -75,7 +75,14 @@ namespace SCJMapper_V2.RTF
#region Text Color
private const string c_Colors = @"{\colortbl ;\red255\green0\blue0;\red0\green176\blue80;\red0\green77\blue187;\red173\green255\blue47;}"; // some colors (Black, Red, Green, Blue)
private const string c_Colors =
@"{\colortbl ;\red255\green0\blue0;" // Red
+ @"\red0\green176\blue80;" // MidGreen
+ @"\red0\green77\blue187;" // Blue
+ @"\red173\green255\blue47;" // Green
+ @"\red0\green100\blue0;" // DarkGreen
+ @"\red220\green220\blue220;" // Gainsborow
+ "}";
public enum ERColor
{
ERC_Black = 0,
@ -83,6 +90,8 @@ namespace SCJMapper_V2.RTF
ERC_MidGreen,
ERC_Blue,
ERC_Green,
ERC_DarkGreen,
ERC_Gainsborow,
}
private string m_fmtColor = @"\cf0";

@ -1,12 +1,12 @@
SC Joystick Mapper V 2.35 - Build 70 BETA
(c) Cassini, StandardToaster - 05-Jan-2018
SC Joystick Mapper V 2.36 - Build 71 BETA
(c) Cassini, StandardToaster - 05-Feb-2018
Contains 14 files + graphics:
SCJMapper.exe The program (V2.35)
SCJMapper.exe.config Program config (V2.35) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.35) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.35) - MUST be in the same folder as the Exe file
SCJMapper.exe The program (V2.36)
SCJMapper.exe.config Program config (V2.36) - MUST be in the same folder as the Exe file
de\SCJMapper.resources.dll German language (V2.36) - MUST be in the same folder as the Exe file
fr\SCJMapper.resources.dll French language (V2.36) - 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
SharpDX.DirectInput.dll Managed DirectInput Assembly - MUST be in the same folder as the Exe file
SharpDX.dll Managed DirectX Assembly - MUST be in the same folder as the Exe file
@ -43,6 +43,10 @@ Scanned for viruses before packing...
cassini@burri-web.org
Changelog:
V 2.36 - BETA Build 71
- new feature - window for realtime monitoring of the controls (works also in background)
- add - silently dumps the CSV list along the backup xml file into MyDocuments
- improvement - try to add more usability for the config path setting
V 2.35 - BETA Build 70
- add - GUI translation support (english, german, french so far..)
- add - provide CIG asset texts/translations for actions and maps

@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Win32;
using SCJMapper_V2.Translation;
namespace SCJMapper_V2.SC
{
@ -14,7 +15,7 @@ namespace SCJMapper_V2.SC
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod( ).DeclaringType );
private static bool hasInformed = false; // prevent msgbox chains..
private static bool m_hasInformed = false; // prevent msgbox chains..
/// <summary>
/// Try to locate the launcher from Alpha 3.0.0 public - e.g. E:\G\StarCitizen\RSI Launcher
@ -64,7 +65,39 @@ namespace SCJMapper_V2.SC
// one more would be here
/// <summary>
/// Checks if the base path is correct - i.e. the subfolders can be found
/// </summary>
/// <param name="basePath"></param>
/// <returns></returns>
static public string CheckSCBasePath( string basePath )
{
string issue = "";
if ( string.IsNullOrEmpty( basePath ) ) {
issue = Tx.Translate("scpEmptyString" ); // string.Format( "There is no vaild path given (empty string)" );
return issue; // no valid one can be found
}
if ( !Directory.Exists( basePath ) ) {
issue = Tx.Translate( "scpInvalidPath" ); // string.Format( "There is no vaild path given (invalid directory)" );
return issue; // no valid one can be found
}
//
basePath = Path.Combine( basePath, "StarCitizen" );
string scpX = "";
// SC 3.0 try LIVE
scpX = Path.Combine( basePath, "LIVE" );
if ( !Directory.Exists( scpX ) ) {
issue = string.Format( Tx.Translate( "scpClientDirNotFound" ).Replace("\\n","\n") , scpX );
//"Cannot find the SC Client Directory !!\n\nTried to look for:\n{0} \n\nPlease adjust the path in Settings\n"
return issue;
}
return issue;
}
/// <summary>
/// Returns the base SC install path from something like "E:\G\StarCitizen"
@ -91,14 +124,12 @@ namespace SCJMapper_V2.SC
// not found
log.WarnFormat( "SCBasePath - user defined folder does not exist: {0}", scp );
string issue = string.Format( Tx.Translate( "scpClientDirNotFound" ).Replace( "\\n", "\n" ), scp );
string issue = string.Format( "Cannot find the user defined SC Installation Path ({0})!!\n\n" +
"Enter the folder where CIGLauncher.exe is located", scp );
if ( !hasInformed )
System.Windows.Forms.MessageBox.Show( issue, "Cannot find the user defined SC Installation Path !!",
if ( !m_hasInformed )
System.Windows.Forms.MessageBox.Show( issue, Tx.Translate( "setMsgBox" ),
System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation );
hasInformed = true;
m_hasInformed = true;
return ""; // sorry path does not exist
}
@ -130,14 +161,13 @@ namespace SCJMapper_V2.SC
// nothing found
log.Warn( "SCBasePath - cannot find any valid SC path" );
// Issue a warning here to let the user know
string issue = string.Format( "Cannot find the SC Installation Path !!\n\n" +
"Use Settings to provide the path manually (don't forget to Check the Box left of the path to use it)\n\n" +
"Enter the folder where CIGLauncher.exe is located" );
string issue = Tx.Translate( "scpAutoPathFailed" ).Replace( "\\n", "\n" );
//string.Format( "Cannot find the SC Installation Path !!\nUse Settings to provide the path manually" );
if ( !hasInformed )
System.Windows.Forms.MessageBox.Show( issue, "Cannot find SC Installation Path !!",
if ( !m_hasInformed )
System.Windows.Forms.MessageBox.Show( issue, Tx.Translate( "setMsgBox"),
System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation );
hasInformed = true;
m_hasInformed = true;
}
return ""; // sorry did not found a thing..
}// get
@ -184,17 +214,14 @@ namespace SCJMapper_V2.SC
if ( Directory.Exists( scpX ) ) return scpX;
// Issue a warning here to let the user know
issue = string.Format( "Cannot find the SC Client Path !!\n\n" +
"Tried to look for:\n" +
"{0}\\LIVE \n" +
"The program cannot load or save in GameFolders\n\n" +
"Please submit a bug report, adding your complete SC game folder structure", scp );
issue = string.Format( Tx.Translate( "scpClientDirNotFound" ).Replace( "\\n", "\n" ), scpX );
//"Cannot find the SC Client Directory !!\n\nTried to look for:\n{0} \n\nPlease adjust the path in Settings\n"
log.WarnFormat( "SCClientPath - StarCitizen\\Live subfolder does not exist: {0}", scp );
// Issue a warning here to let the user know
if ( !hasInformed ) System.Windows.Forms.MessageBox.Show( issue, "Cannot find SC Client Path !!", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation );
hasInformed = true;
if ( !m_hasInformed ) System.Windows.Forms.MessageBox.Show( issue, Tx.Translate( "setMsgBox" ), System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation );
m_hasInformed = true;
return "";
}
@ -308,7 +335,7 @@ namespace SCJMapper_V2.SC
{
get {
log.Debug( "SCDataXML_p4k - Entry" );
string scp = SCClientPath;
string scp = SCClientPath;
if ( string.IsNullOrEmpty( scp ) ) return "";
//
scp = Path.Combine( scp, "Data.p4k" );

@ -27,8 +27,8 @@
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>70</ApplicationRevision>
<ApplicationVersion>2.35.0.%2a</ApplicationVersion>
<ApplicationRevision>71</ApplicationRevision>
<ApplicationVersion>2.36.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
@ -134,8 +134,34 @@
<Compile Include="Common\CloneableItems.cs" />
<Compile Include="Common\Commons.cs" />
<Compile Include="Devices\DeviceCls.cs" />
<Compile Include="Devices\Monitor\DeviceMonitoring.cs" />
<Compile Include="Devices\DeviceInst.cs" />
<Compile Include="Devices\DeviceList.cs" />
<Compile Include="Devices\Monitor\DxDeviceEventArgs.cs" />
<Compile Include="Devices\Monitor\FormDeviceMonitor.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Devices\Monitor\FormDeviceMonitor.Designer.cs">
<DependentUpon>FormDeviceMonitor.cs</DependentUpon>
</Compile>
<Compile Include="Devices\Monitor\UC_LED.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Devices\Monitor\UC_LED.Designer.cs">
<DependentUpon>UC_LED.cs</DependentUpon>
</Compile>
<Compile Include="Devices\Monitor\UC_SwitchRect.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Devices\Monitor\UC_SwitchRect.Designer.cs">
<DependentUpon>UC_SwitchRect.cs</DependentUpon>
</Compile>
<Compile Include="Devices\Monitor\UC_Toggle.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Devices\Monitor\UC_Toggle.Designer.cs">
<DependentUpon>UC_Toggle.cs</DependentUpon>
</Compile>
<Compile Include="Devices\Options\FormOptions.cs">
<SubType>Form</SubType>
</Compile>
@ -272,6 +298,18 @@
<DependentUpon>Strings.fr.resx</DependentUpon>
</Compile>
<Compile Include="Translation\Tx.cs" />
<EmbeddedResource Include="Devices\Monitor\FormDeviceMonitor.resx">
<DependentUpon>FormDeviceMonitor.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Devices\Monitor\UC_LED.resx">
<DependentUpon>UC_LED.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Devices\Monitor\UC_SwitchRect.resx">
<DependentUpon>UC_SwitchRect.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Devices\Monitor\UC_Toggle.resx">
<DependentUpon>UC_Toggle.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FormMain.resx">
<DependentUpon>FormMain.cs</DependentUpon>
<SubType>Designer</SubType>

@ -61,7 +61,7 @@ namespace SCJMapper_V2
/// <summary>
/// The application directory
/// </summary>
static public string AppDir { get => Path.GetDirectoryName( Application.ExecutablePath); }
static public string AppDir { get => Path.GetDirectoryName( Application.ExecutablePath); }
/// <summary>
@ -76,6 +76,18 @@ namespace SCJMapper_V2
return Path.Combine( UserDir, mapName + ".xml" );
}
/// <summary>
/// Returns the mapping file name + path into our user dir
/// </summary>
/// <param name="mapName">The mapping name</param>
/// <returns>A fully qualified filename</returns>
static public string MappingCsvFileName( string mapName )
{
log.Debug( "MappingCsvFileName - Entry" );
return Path.Combine( UserDir, mapName + ".csv" );
}
/// <summary>
/// Create a backupfile from the given file

@ -195,6 +195,15 @@ namespace SCJMapper_V2.Translation {
}
}
/// <summary>
/// Looks up a localized string similar to Monitoring.
/// </summary>
public static string btTogMonitor {
get {
return ResourceManager.GetString("btTogMonitor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Accept Edits.
/// </summary>
@ -321,6 +330,24 @@ namespace SCJMapper_V2.Translation {
}
}
/// <summary>
/// Looks up a localized string similar to Monitor mouse axis.
/// </summary>
public static string chkMonitorMouse {
get {
return ResourceManager.GetString("chkMonitorMouse", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Device Monitor.
/// </summary>
public static string FormDeviceMonitor {
get {
return ResourceManager.GetString("FormDeviceMonitor", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Flight Device Tuning.
/// </summary>
@ -853,6 +880,15 @@ namespace SCJMapper_V2.Translation {
}
}
/// <summary>
/// Looks up a localized string similar to Show Device Monitoring Dialog....
/// </summary>
public static string meShowDeviceMonitoringDialog {
get {
return ResourceManager.GetString("meShowDeviceMonitoringDialog", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Show Device Tuning Dialog....
/// </summary>
@ -979,6 +1015,51 @@ namespace SCJMapper_V2.Translation {
}
}
/// <summary>
/// Looks up a localized string similar to Cannot find the SC Installation Path !!\nUse Settings to provide the path manually.
/// </summary>
public static string scpAutoPathFailed {
get {
return ResourceManager.GetString("scpAutoPathFailed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Cannot find the SC Client Directory !!\n\nTried to look for:\n{0} \n\nPlease adjust the path in Settings\n.
/// </summary>
public static string scpClientDirNotFound {
get {
return ResourceManager.GetString("scpClientDirNotFound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There is no vaild path given (empty string).
/// </summary>
public static string scpEmptyString {
get {
return ResourceManager.GetString("scpEmptyString", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to There is no vaild path given (invalid directory).
/// </summary>
public static string scpInvalidPath {
get {
return ResourceManager.GetString("scpInvalidPath", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Path to the Star Citizen Installation.
/// </summary>
public static string setMsgBox {
get {
return ResourceManager.GetString("setMsgBox", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Changing the Gamepad option needs a restart of the application !!.
/// </summary>
@ -1348,6 +1429,24 @@ namespace SCJMapper_V2.Translation {
}
}
/// <summary>
/// Looks up a localized string similar to Keyboard.
/// </summary>
public static string xKeyboard {
get {
return ResourceManager.GetString("xKeyboard", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Mouse.
/// </summary>
public static string xMouse {
get {
return ResourceManager.GetString("xMouse", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to None.
/// </summary>

@ -714,4 +714,48 @@ benutzen sie Abbrechen um die Arbeit erst zu speichern.</value>
<value>Joystick</value>
<comment>0-General</comment>
</data>
<data name="meShowDeviceMonitoringDialog" xml:space="preserve">
<value>Geräte Überwachung...</value>
<comment>1-Main</comment>
</data>
<data name="btTogMonitor" xml:space="preserve">
<value>Überwachung</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="chkMonitorMouse" xml:space="preserve">
<value>Rapportiere Maus Achse</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="FormDeviceMonitor" xml:space="preserve">
<value>Überwachung von Eingabegeräten</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="xKeyboard" xml:space="preserve">
<value>Keyboard</value>
<comment>0-General</comment>
</data>
<data name="xMouse" xml:space="preserve">
<value>Mouse</value>
<comment>0-General</comment>
</data>
<data name="scpAutoPathFailed" xml:space="preserve">
<value>SC Installations Pfad nicht gefunden!!\nGeben sie den Pfad in Einstellungen von Hand ein.</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpClientDirNotFound" xml:space="preserve">
<value>SC Client Verzeichnis nicht gefunden !!\n\nDie benutze Vorgabe ist nicht gültig:\n{0} \n\nBitte korrigieren sie in Einstellungen\n</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpEmptyString" xml:space="preserve">
<value>Kein gültiger Pfad (leere Zeichenkette)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpInvalidPath" xml:space="preserve">
<value>Kein gültiger Pfad (ungültiges Verzeichnis)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="setMsgBox" xml:space="preserve">
<value>Pfad zur Star Citizen Installation</value>
<comment>2-Settings SCPath</comment>
</data>
</root>

@ -714,4 +714,48 @@ Annulez maintenant si vous voulez d'abord enregistrer votre travail.</value>
<value>Manette</value>
<comment>0-General</comment>
</data>
<data name="meShowDeviceMonitoringDialog" xml:space="preserve">
<value>Surveillance des appareils...</value>
<comment>1-Main</comment>
</data>
<data name="btTogMonitor" xml:space="preserve">
<value>Surveillance</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="chkMonitorMouse" xml:space="preserve">
<value>Rapport l'axis du souris</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="FormDeviceMonitor" xml:space="preserve">
<value>Surveillance des périphériques d'entrée</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="xKeyboard" xml:space="preserve">
<value>Clavier</value>
<comment>0-General</comment>
</data>
<data name="xMouse" xml:space="preserve">
<value>Souris</value>
<comment>0-General</comment>
</data>
<data name="scpAutoPathFailed" xml:space="preserve">
<value>Impossible de trouver le répertoire des clients SC !!\nUtilisez Configuration pour fournir le chemin manuellement</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpClientDirNotFound" xml:space="preserve">
<value>Impossible de trouver le répertoire des clients SC !!\n\nla valeur par défaut est invalide:\n{0} \n\nS'il vous plaît ajuster le chemin dans Configuration\n</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpEmptyString" xml:space="preserve">
<value>Il n'y a pas de chemin valide donné (chaîne vide)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpInvalidPath" xml:space="preserve">
<value>Il n'y a pas de chemin d'accès valide (répertoire invalide)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="setMsgBox" xml:space="preserve">
<value>Chemin du répertoire vers le Star Citizen installation</value>
<comment>2-Settings SCPath</comment>
</data>
</root>

Binary file not shown.

@ -714,4 +714,48 @@ Cancel now if you want to save your work first.</value>
<value>Joystick</value>
<comment>0-General</comment>
</data>
<data name="meShowDeviceMonitoringDialog" xml:space="preserve">
<value>Show Device Monitoring Dialog...</value>
<comment>1-Main</comment>
</data>
<data name="btTogMonitor" xml:space="preserve">
<value>Monitoring</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="chkMonitorMouse" xml:space="preserve">
<value>Monitor mouse axis</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="FormDeviceMonitor" xml:space="preserve">
<value>Device Monitor</value>
<comment>8-DeviceMonitor</comment>
</data>
<data name="xKeyboard" xml:space="preserve">
<value>Keyboard</value>
<comment>0-General</comment>
</data>
<data name="xMouse" xml:space="preserve">
<value>Mouse</value>
<comment>0-General</comment>
</data>
<data name="scpAutoPathFailed" xml:space="preserve">
<value>Cannot find the SC Installation Path !!\nUse Settings to provide the path manually</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpClientDirNotFound" xml:space="preserve">
<value>Cannot find the SC Client Directory !!\n\nTried to look for:\n{0} \n\nPlease adjust the path in Settings\n</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpEmptyString" xml:space="preserve">
<value>There is no vaild path given (empty string)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="scpInvalidPath" xml:space="preserve">
<value>There is no vaild path given (invalid directory)</value>
<comment>2-Settings SCPath</comment>
</data>
<data name="setMsgBox" xml:space="preserve">
<value>Path to the Star Citizen Installation</value>
<comment>2-Settings SCPath</comment>
</data>
</root>

@ -1016,10 +1016,36 @@ namespace SCJMapper_V2.Actions
}
/// <summary>
/// Find all actions that are mapped to this input
/// Find all actions that are mapped to this input
/// </summary>
/// <param name="input">The input string to find</param>
public List<string> FindAllActions( string input )
public List<string> GetAllActions( string input )
{
List<string> ret = new List<string>( );
if ( string.IsNullOrEmpty( input ) ) return ret; // nothing to find here...
if ( Act.IsDisabledInput( input ) ) return ret; // nothing to find here...
foreach ( ActionMapCls acm in ActionMaps ) {
// have to search Actions in Maps
foreach ( ActionCls ac in acm ) {
if ( ac.DefBinding == input ) {
ret.Add( ac.ActionName );
}
foreach ( ActionCommandCls acc in ac.InputList ) {
if ( acc.DevInput == input ) {
ret.Add( ac.ActionName );
}
}
}
}
return ret;
}
/// <summary>
/// Find and pretty list all actions that are mapped to this input
/// </summary>
/// <param name="input">The input string to find</param>
public List<string> ListAllActions( string input )
{
List<string> ret = new List<string>( );
if ( string.IsNullOrEmpty( input ) ) return ret; // nothing to find here...
@ -1055,11 +1081,11 @@ namespace SCJMapper_V2.Actions
}
/// <summary>
/// Find all actions that are mapped to this input
/// Find and pretty print all actions that are mapped to this input as RTF text
/// formatted as RTF text
/// </summary>
/// <param name="input">The input string to find</param>
public void FindAllActionsRTF( string input, RTF.RTFformatter rtf )
public void ListAllActionsRTF( string input, RTF.RTFformatter rtf, bool inverse = false )
{
if ( string.IsNullOrEmpty( input ) ) return; // nothing to find here...
if ( Act.IsDisabledInput( input ) ) return; // nothing to find here...
@ -1088,12 +1114,12 @@ namespace SCJMapper_V2.Actions
aMode = string.Format( "{0};{1};{2}", Tx.Translate( "mapModified" ), acc.ActivationMode.Name, acc.ActivationMode.MultiTap );
if ( acc.ActivationMode == ActivationMode.Default )
aMode = string.Format( "{0}", Tx.Translate( "mapDefault" ) );
rtf.RHighlightColor = RTF.RTFformatter.ERColor.ERC_Green;
rtf.RHighlightColor = ( inverse ) ? RTF.RTFformatter.ERColor.ERC_DarkGreen : RTF.RTFformatter.ERColor.ERC_Green;
rtf.Write( Tx.Translate( "mapMapped" ) );
rtf.WriteTab( SCUiText.Instance.Text( ac.ActionName ));
rtf.WriteTab( SCUiText.Instance.Text( acm.MapName) );
rtf.WriteTab( aMode.PadRight( 80 ) ); rtf.WriteLn( );
rtf.RHighlightColor = RTF.RTFformatter.ERColor.ERC_Black;
rtf.RHighlightColor = RTF.RTFformatter.ERColor.ERC_Black; // background
rtf.WriteLn( );
used = true;
}
@ -1338,12 +1364,14 @@ namespace SCJMapper_V2.Actions
}
return repList;
}
/// <summary>
/// Reports a summary list of the mapped items
/// </summary>
/// <returns></returns>
public string ReportActionsCSV( bool listModifiers )
/// <param name="listModifiers">Wether or not listing modifiers</param>
/// <param name="listNativeNames">Wether or not listing the profilenames (false by default)</param>
/// <returns>A string containing the CSV listing</returns>
public string ReportActionsCSV( bool listModifiers, bool listProfileNames = false )
{
log.Debug( "ReportActionsCSV - Entry" );
@ -1392,9 +1420,14 @@ namespace SCJMapper_V2.Actions
}
// action changed - restart collection
action = ac.ActionName;
rep = string.Format( "{0};{1};", SCUiText.Instance.Text( acm.MapName ),
SCUiText.Instance.Text( ac.ActionName ) ); // actionmap; action
// note: don't add trailing semicolons as the are applied in the output formatting
if ( listProfileNames ) {
rep = string.Format( "{0};{1};", acm.MapName, ac.ActionName ); // actionmap; action
}
else {
rep = string.Format( "{0};{1};", SCUiText.Instance.Text( acm.MapName ),
SCUiText.Instance.Text( ac.ActionName ) ); // actionmap; action
}
// note: don't add trailing semicolons as the are applied in the output formatting
if ( listModifiers ) {
kbA = "n.a.;;;;"; // defaults tag;input;mod-tag;mod-name;mod-mult
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.
Loading…
Cancel
Save