[#CODING4FUN] XBoxOne Controller and USB Rocket Launcher

Hello!

Let’s start in the end of the post with the output video

Now a little explanation on how to assemble this. I used the basis of my post about How to control with C# XBoxOne command. Then with a bit of code to control the rocket launcher, I get to connect both devices and the fun starts.

The complete solution includes 3 projects, 1 is responsible for controlling the Rocket Launcher, then the app WPF to coordinate signals of the remote control and the Lance missiles. Finally I have a PCL that is responsible for translating Int32 values from the command in command more basic type: up, down, left or right.

image

Actually, the work has not been very complicated, the only thing I had to keep in mind is the values that sends the controller. After seeing that the GamePad moves in the range of an Int32, the best thing was to define values for LeftFar > Left > Center > Right > RightFar, with values between – 20000 > – 10000 > 0 > 10000 > 20000. In this way a kind MoveControler helped me to translate these values the position of the joystick on the remote control.

public static MoveDirections CalculateDirectionY(float y, int yCoeficient)
{
var locationY = MoveDirections.DownFar;
var currentLocationY = y * yCoeficient;
if (currentLocationY > 20000)
{
locationY = MoveDirections.UpFar;
}
else if (currentLocationY > 10000)
{
locationY = MoveDirections.Up;
}
else if (currentLocationY > -10000)
{
locationY = MoveDirections.Center;
}
else if (currentLocationY > -20000)
{
locationY = MoveDirections.Down;
}
return locationY;
}

The example is pretty simple, since I use the classes that I have created in previous posts to control the Lance missiles. For example

private void ProcessMovements(MoveDirection moveDirection, bool fire)
{
switch (moveDirection.CombinedXy)
{
case MoveDirections.Center:
_rocket.StopMovements();
break;
case MoveDirections.Left:
case MoveDirections.LeftFar:
_rocket.MoveLeft();
break;
case MoveDirections.Right:
case MoveDirections.RightFar:
_rocket.MoveRight();
break;
case MoveDirections.Up:
case MoveDirections.UpFar:
_rocket.MoveUp();
break;
case MoveDirections.Down:
case MoveDirections.DownFar:
_rocket.MoveDown();
break;
default:
_rocket.StopMovements();
break;
}
if (fire)
{
_rocket.FireOnce();
}
MovementText = string.Format("direction: {0} – fire:{1}", moveDirection.CombinedXy, fire);
}

In this example I have left out the “corners”, I have to update the class RocketController to support this elegantly Winking smile

By the way, the full code can be downloaded from here: http://1drv.ms/1pQDQQx

Important: I deleted the NuGet packages so that the code is not very heavy, please download them again to be able to compile the solution.

References

https://elbruno.com/2014/06/27/coding4fun-xboxone-game-controller-c-fun-time/

http://1drv.ms/1pQDQQx

Saludos @ Home

El Bruno

image image image Google

[#CODING4FUN] XBoxOne Controller and USB Rocket Launcher

Hola!

Hoy empiezo por el final, primero el video con el output

Luego un poco de explicación sobre como montar esto. He partido sobre la base de mi post sobre cómo controlar con C# un mando de XBoxOne. Luego con un poco de código para controlar el lanza missiles, he llegado a conectar ambos dispositivos.

La solución completa incluye 3 proyectos, donde el 1ro se encarga de controlar el Rocket Launcher, luego la app WPF para coordinar las señales del mando y el lanza missiles. Por ultimo tengo un PCL que se encarga de traducir los valores Int32 del mando en comandos más basicos del tipo: up, down, left or right.

image

En realidad el trabajo no ha sido muy complicado, lo único que tuve que tener en cuenta es los valores que envía el controller. Despues de ver que el GamePad se mueve en el rango de un Int32, lo mejor fue definir los valores de LeftFar > Left > Center > Right > RightFar, con los valores entre -20000 > -10000 > 0 > 10000 > 20000. De esta forma una clase MoveControler me ayudaba a traducir la posición del joystick del mando en estos valores.

public static MoveDirections CalculateDirectionY(float y, int yCoeficient)
{
var locationY = MoveDirections.DownFar;
var currentLocationY = y * yCoeficient;
if (currentLocationY > 20000)
{
locationY = MoveDirections.UpFar;
}
else if (currentLocationY > 10000)
{
locationY = MoveDirections.Up;
}
else if (currentLocationY > -10000)
{
locationY = MoveDirections.Center;
}
else if (currentLocationY > -20000)
{
locationY = MoveDirections.Down;
}
return locationY;
}

El ejemplo es bastante simple, ya que utilizo las classes que he creado en posts anteriores para controlar el lanza misiles. Por ejemplo

private void ProcessMovements(MoveDirection moveDirection, bool fire)
{
switch (moveDirection.CombinedXy)
{
case MoveDirections.Center:
_rocket.StopMovements();
break;
case MoveDirections.Left:
case MoveDirections.LeftFar:
_rocket.MoveLeft();
break;
case MoveDirections.Right:
case MoveDirections.RightFar:
_rocket.MoveRight();
break;
case MoveDirections.Up:
case MoveDirections.UpFar:
_rocket.MoveUp();
break;
case MoveDirections.Down:
case MoveDirections.DownFar:
_rocket.MoveDown();
break;
default:
_rocket.StopMovements();
break;
}
if (fire)
{
_rocket.FireOnce();
}
MovementText = string.Format("direction: {0} – fire:{1}", moveDirection.CombinedXy, fire);
}

En este ejemplo he dejado fuera las “esquinas”, tengo que actualizar la clase RocketController para que soporte esto de forma elegante Winking smile

Por cierto, el código completo se puede descargar desde aqui: http://1drv.ms/1pQDQQx

Importante: he eliminado los packages NuGet para que el código no sea muy pesado, por favor descarga los mismos nuevamente para poder compilar la solución.

References

https://elbruno.com/2014/06/27/coding4fun-xboxone-game-controller-c-fun-time/

http://1drv.ms/1pQDQQx

Saludos @ Home

El Bruno

image image image Google

[#CODING4FUN] #XboxOne Game Controller + C# = fun time!

Hello!

A few days ago, MS team gives the capability to connect XBoxOne controller to a PC. This is a quite simple action: get the controller use the USB cable and… almost ready.

The great Scott Hanselman explains all of this in a post: how to install the drivers and how to configure the controls. When you’ve already done the Setup you can see the connected remote control and then just configure it.image

So at this point, you probably think: what can I do with this? The sky is the limit 😉

In this post I will share a couple of lines that show how to obtain an object of the Controller type in C# and then view the properties for the controller. First thing we could do is to see if we have a device of this type connected to our computer, we can do this with a couple of native APIs or this NuGet pckg and the following code.

using System.Linq;
using DeviceManagement;
namespace ConsoleApplication2
{
class DeviceInspection
{
public DeviceInfo GetXBoxController()
{
// you need nuget pkg https://devicemgr.codeplex.com/
// ClassName: "XB1UsbClass"
// Desc: "Microsoft Xbox One Controller"
var allClasses = DeviceInfoSet.GetAllClassesPresent();
var devices = allClasses.GetDevices();
return (from device in devices
where device.ClassName == "XB1UsbClass"
select device).FirstOrDefault();
}
}
}

However what is interesting is to see in real-time the values on the remote control. For this I created a 4.5 WPF app and added the following NuGet package: SharpDX.XInput 2.6.2 (link).

Once built the solution, you have to copy the dlls from SharpDx to the run directory and you’ll have “control” on your XBox One command !

XBox1Controller

Important: if the app does not work and you encounter this error, I recommend that DirectX reinstalls from this link.

The main view of the WPF app code is the following

using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Threading;
using SharpDX.XInput;
namespace ElBruno.GameController
{
public partial class MainWindow : INotifyPropertyChanged
{
DispatcherTimer _timer = new DispatcherTimer();
private string _leftAxis;
private string _rightAxis;
private string _buttons;
private Controller _controller;
public MainWindow()
{
DataContext = this;
Loaded += MainWindow_Loaded;
Closing += MainWindow_Closing;
InitializeComponent();
_timer = new DispatcherTimer {Interval = TimeSpan.FromMilliseconds(100)};
_timer.Tick += _timer_Tick;
_timer.Start();
}
void _timer_Tick(object sender, EventArgs e)
{
DisplayControllerInformation();
}
void DisplayControllerInformation()
{
var state = _controller.GetState();
LeftAxis = string.Format("X: {0} Y: {1}", state.Gamepad.LeftThumbX, state.Gamepad.LeftThumbY);
RightAxis = string.Format("X: {0} Y: {1}", state.Gamepad.RightThumbX, state.Gamepad.RightThumbX);
//Buttons = string.Format("A: {0} B: {1} X: {2} Y: {3}", state.Gamepad.Buttons.ToString(), state.Gamepad.LeftThumbY);
Buttons = string.Format("{0}", state.Gamepad.Buttons);
}
void MainWindow_Closing(object sender, CancelEventArgs e)
{
_controller = null;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
_controller = new Controller(UserIndex.One);
if (_controller.IsConnected) return;
MessageBox.Show("Game Controller is not connected … you know ;)");
App.Current.Shutdown();
}
#region Properties
public string LeftAxis
{
get
{
return _leftAxis;
}
set
{
if (value == _leftAxis) return;
_leftAxis = value;
OnPropertyChanged();
}
}
public string RightAxis
{
get
{
return _rightAxis;
}
set
{
if (value == _rightAxis) return;
_rightAxis = value;
OnPropertyChanged();
}
}
public string Buttons
{
get
{
return _buttons;
}
set
{
if (value == _buttons) return;
_buttons = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
}

 

References

http://www.hanselman.com/blog/HowToUseAnXboxOneControllerOnYourWindowsPC.aspx

https://devicemgr.codeplex.com/

http://www.microsoft.com/en-us/download/details.aspx?id=35

https://www.nuget.org/packages/SharpDX.XInput/2.6.2

Saludos @ Home

El Bruno

image image image Google

[#CODING4FUN] #XboxOne Game Controller + C# = fun time !!!

Hola! Hace un tiempo que tenemos la posibilidad de conectar los mandos de la XBoxOne a nuestro ordenador. Esto es simple, mando + cable USB y … casi listo. El gran Scott Hanselman explica en un post, cómo instalar los drivers (todavía no oficiales) y cómo configurar los mandos. Cuando has hecho la configuración ya puedes ver el mando conectado y luego solo queda configurar el mismo. image Pues bien hasta aquí la parte plug and play, lo que sigue es lo que seguro pensaste cuando leíste el post de Scott; ¿y qué puedo hacer con esto?. Aquí el cielo es el límite. En este post dejaré un par de líneas que muestran como obtener un objeto del tipo Controller en C# y luego ver las propiedades del mismo. Lo primero que podríamos hacer es ver si tenemos un device de este tipo conectado a nuestro ordenador, esto lo podemos hacer con un par de APIs nativas o con este NuGet pckg y el siguiente código. https://gist.github.com/elbruno/5d980a62502bb8ba910b Sin embargo lo interesante es poder ver en tiempo real los valores del mando. Para esto he creado una app WPF 4.5 y agregado el siguiente paquete NuGet: SharpDX.XInput 2.6.2 (link). Una vez compilado, he copiado las dlls correspondientes de SharpDx al directorio de ejecución y ya tengo “control” sobre mi mando de XBox One !!! XBox1Controller Importante: Si no te funciona la app y te encuentras con este error, te recomiendo que reinstalles DirectX desde este link. El código de la vista principal de la app WPF es el siguiente https://gist.github.com/elbruno/b69ecfede4d0d91f2835   Referencias http://www.hanselman.com/blog/HowToUseAnXboxOneControllerOnYourWindowsPC.aspx https://devicemgr.codeplex.com/ http://www.microsoft.com/en-us/download/details.aspx?id=35 https://www.nuget.org/packages/SharpDX.XInput/2.6.2 Saludos @ Home El Bruno

image image image Google

[#KINECT] KW4 Wants You!

Hello!

great news for me, a couple of days ago I have received the long awaited email that confirms me as “user / tester” (I can not think of a better word for it) for the new Kinect SDK, with the new Kinect for Windows the new version like the Kinect for the XBox One… UPS’s or FedEx guys are closing the boxes and see if it crosses the Atlantic faster than myself. I’ll review my NDA I’m going to start sharing information about this new great piece of software … Open-mouthed smile

By the way, you remember this ?

Greetings @ Sant Cugat

El Bruno

imageimageimageGoogle

[#KINECT] KW4 Wants You !!!

Hola!

pues eso, que hoy me ha llegado el tan esperado mail que me confirma como “usuario” (no se me ocurre una mejor palabra para definirlo) del nuevo Kinect SDK, el preparado para la versión de Windows de la Kinect de la XBox One … los amigos de UPS están cerrando las cajas y a ver si cruza el Atlántico rápido. Creo que mi NDA me dejará hablar de algo al respecto, así que a ver como lo negocio con los chicos que están cambiando de boss por estos días Open-mouthed smile

Por cierto, te acuerdas de esto?

Saludos @ Girona

El Bruno

image image image Google