// Initialize this Joystick controller
        //--------------------------------------------------------------------------
        // Construction
        //--------------------------------------------------------------------------
        public JoystickController(DirectInput dinput, Guid guid)
        {
            this.directInputDevice = dinput.CreateDevice(guid);

            foreach (DIDEVICEOBJECTINSTANCE ddoi in this.directInputDevice.EnumObjects(DIDFT.AXIS))
                {
                if ((ddoi.dwType & (int)DIDFT.AXIS) != 0)   // can omit?
                    {
                    this.directInputDevice.SetRange(ddoi, -128, 127);
                    }
                }

            // We stick formatDesc in a member variable because we're not sure whether
            // we're allowed to free it right after the SetDataFormat call or whether
            // we're responsible for keeping it alive so long as we use the IDirectInputDevice8
            // instance.
            this.formatDesc = State.GetDataRetrievalDescriptor();
            this.directInputDevice.SetDataFormat(ref this.formatDesc);
        }
 public void SetDataFormat(ref DIDATAFORMAT pdf)
 {
     this.pInputDevice.SetDataFormat(pdf);
 }
 public static unsafe DIDATAFORMAT GetDataRetrievalDescriptor()
 {
     DIDATAFORMAT format = new DIDATAFORMAT();
     int cFields = typeof(State).GetFields().Length;
     format.Init(cFields);
     format.dwFlags    = (int)DIDF.ABSAXIS;
     format.dwDataSize = Marshal.SizeOf(typeof(State));
     //
     format.rgodf[0].Set(ref Guids.XAxis,  Marshal.OffsetOf(typeof(State), "x"),         DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.AXIS,    DIDOI.ASPECTPOSITION);
     format.rgodf[1].Set(ref Guids.YAxis,  Marshal.OffsetOf(typeof(State), "y"),         DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.AXIS,    DIDOI.ASPECTPOSITION);
     format.rgodf[2].Set(ref Guids.ZAxis,  Marshal.OffsetOf(typeof(State), "z"),         DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.AXIS,    DIDOI.ASPECTPOSITION);
     format.rgodf[3].Set(ref Guids.RZAxis, Marshal.OffsetOf(typeof(State), "rotationZ"), DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.AXIS,    DIDOI.ASPECTPOSITION);
     format.rgodf[4].Set(ref Guids.POV,    Marshal.OffsetOf(typeof(State), "pov"),       DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.POV,     DIDOI.NONE);
     format.rgodf[5].Set(null,             Marshal.OffsetOf(typeof(State), "button0"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[6].Set(null,             Marshal.OffsetOf(typeof(State), "button1"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[7].Set(null,             Marshal.OffsetOf(typeof(State), "button2"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[8].Set(null,             Marshal.OffsetOf(typeof(State), "button3"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[9].Set(null,             Marshal.OffsetOf(typeof(State), "button4"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[10].Set(null,            Marshal.OffsetOf(typeof(State), "button5"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[11].Set(null,            Marshal.OffsetOf(typeof(State), "button6"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[12].Set(null,            Marshal.OffsetOf(typeof(State), "button7"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[13].Set(null,            Marshal.OffsetOf(typeof(State), "button8"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[14].Set(null,            Marshal.OffsetOf(typeof(State), "button9"),   DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[15].Set(null,            Marshal.OffsetOf(typeof(State), "button10"),  DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     format.rgodf[16].Set(null,            Marshal.OffsetOf(typeof(State), "button11"),  DIDFT.MYSTERY|DIDFT.ANYINSTANCE|DIDFT.BUTTON,  DIDOI.NONE);
     //
     return format;
 }