//private static List<UsbEndpointWriter> writers; //TODO: Implement multiple controller writers
 //private static List<UsbEndpointReader> readers; //TODO: Implement multiple controller writers
 public MainWindow()
 {
     System.Windows.Application.Current.MainWindow = this;
     InitializeComponent();
     ValidateRegistrySettings();
     jController = new JoystickController();
     cController = new ChatpadController();
     try
     {
         MyUsbFinder = new UsbDeviceFinder(1118, 1817);
         MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
         if (MyUsbDevice == null) //support other product id (knock-off?)
         {
             ErrorLogging.WriteLogEntry("USB Device (1118,1817) not found: ", ErrorLogging.LogLevel.Fatal);
             MyUsbFinder = new UsbDeviceFinder(1118, 657);
             MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
             if (MyUsbDevice == null)
             {
                 ErrorLogging.WriteLogEntry("USB Device (1118,657) not found: ", ErrorLogging.LogLevel.Fatal);
             }
         }
     }
     catch (Exception e)
     {
         ErrorLogging.WriteLogEntry(String.Format("No USB Device found: {0}", e.InnerException), ErrorLogging.LogLevel.Fatal);
     }
     try
     {
         IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
         if (!ReferenceEquals(wholeUsbDevice, null))
         {
             try
             {
                 wholeUsbDevice.SetConfiguration(1);
                 wholeUsbDevice.ClaimInterface(0);
                 reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
                 writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
                 reader.DataReceived += new EventHandler<EndpointDataEventArgs>(reader_DataReceived);
                 reader.DataReceivedEnabled = true;
             }
             catch (Exception e)
             {
                 ErrorLogging.WriteLogEntry(String.Format("Error opening endpoints: {0}", e.InnerException), ErrorLogging.LogLevel.Fatal);
             }
         }
         else
         {
             ErrorLogging.WriteLogEntry("Whole USB device is not implemented", ErrorLogging.LogLevel.Error);
         }
     }
     catch (Exception e)
     {
         ErrorLogging.WriteLogEntry(String.Format("Failure converting usb device to whole usb device: {0}", e.InnerException), ErrorLogging.LogLevel.Fatal);
     }
     try
     {
         timer.Start();
         InitializeChatpad();
         InitializeController();
     }
     catch (Exception e)
     {
         ErrorLogging.WriteLogEntry(String.Format("Error in init of chatpad or controller: {0}", e.InnerException), ErrorLogging.LogLevel.Fatal);
     }
     timer.Tick += new EventHandler(dispatcherTimer_Tick);
     timer.Interval = new TimeSpan(0, 0, 0, 1, 0);
     ni.Icon = new Icon(@"Images\controller.ico");
     ni.Visible = true;
     ni.Click +=
     delegate(object sender, EventArgs args)
     {
         this.Show();
         this.WindowState = WindowState.Normal;
     };
 }
        public static void OutputMappingForChatPad(byte[] response,ChatpadController cController, uint controllerIndex,MainWindow mw)
        {
            if (response[1] == 2 && response[3] == 240)
            {
                if (response[24] != 240) //Keep Alive for Chat pad with counting hex, no value in keeping
                {
                    if (response[25] != 0)
                    {
                        switch (response[25])
                        {
                            case 1:
                                {
                                    if (!orangeModifier)
                                    {
                                        shiftModifier = true;
                                    }
                                    else
                                    {
                                        capsLockModifier = !capsLockModifier;
                                        mw.CapsLockModifier();
                                    }
                                    break;
                                }
                            case 2:
                                {
                                    greenModifier = !greenModifier;
                                    mw.GreenModifier();
                                    break;
                                }
                            case 4:
                                {
                                    orangeModifier = !orangeModifier;
                                    mw.OrangeModifier();
                                    break;
                                }
                            case 8:
                                {
                                    peopleModifier = !peopleModifier;
                                    mw.PeopleModifier();
                                    break;
                                }
                        }
                    }

                    if (response[26] != 0)
                    {
                        string key = cController.GetChatPadKeyValue(response[26].ToString(), orangeModifier, greenModifier);
                        if (key.Length != 0)
                        {
                            if (!SpecialKeyAssignment(key))
                            {
                                if (!capsLockModifier && !shiftModifier)
                                {
                                    SendKeys.SendWait(key);
                                }
                                else
                                {
                                    SendKeys.SendWait(key.ToUpper());
                                }
                            }
                        }

                        if (response[26] != response[27] && response[27] != 0)
                        {
                            if (key.Length != 0)
                            {
                                key = cController.GetChatPadKeyValue(response[27].ToString(), orangeModifier, greenModifier);
                                if (!SpecialKeyAssignment(key))
                                {
                                    if (!capsLockModifier && !shiftModifier)
                                    {
                                        SendKeys.SendWait(key);
                                    }
                                    else
                                    {
                                        SendKeys.SendWait(key.ToUpper());
                                    }
                                }
                            }
                        }
                    }
                }
            }
            shiftModifier = false;
        }