protected void OnConnectButtonClicked(object sender, System.EventArgs e)
    {
        SpawnThread(delegate()
        {
            if (USBRadiobutton.Active)
            {
                brick = new MonoBrick.NXT.Brick <MonoBrick.NXT.Sensor, MonoBrick.NXT.Sensor, MonoBrick.NXT.Sensor, MonoBrick.NXT.Sensor>(new USB <MonoBrick.NXT.Command, MonoBrick.NXT.Reply>());
            }
            if (bluetoothRadiobutton.Active)
            {
                brick = new MonoBrick.NXT.Brick <MonoBrick.NXT.Sensor, Sensor, Sensor, Sensor>(new Bluetooth <MonoBrick.NXT.Command, MonoBrick.NXT.Reply>(comportCombobox.ActiveText));
            }
            if (networkRadiobutton.Active)
            {
                if (waitForConnectioncheckbutton.Active)
                {
                    brick = new MonoBrick.NXT.Brick <Sensor, Sensor, Sensor, Sensor>(new TunnelConnection <MonoBrick.NXT.Command, MonoBrick.NXT.Reply>(ushort.Parse(portSpinbutton.Text)));
                    Label networkLabel = new Label();
                    //label.HeightRequest = 160;
                    networkLabel.WidthRequest = 300;
                    string[] addresses        = NetworkHelper.GetLocalIPAddress();
                    for (int i = 0; i < addresses.Length; i++)
                    {
                        networkLabel.Text = networkLabel.Text + "Local IP address: " + addresses[i].PadRight(80) + "\n";
                    }
                    networkLabel.Text         = networkLabel.Text + "External IP Address: ";
                    Dialog networkDialog      = new Dialog("Wait for connection", this, Gtk.DialogFlags.DestroyWithParent);
                    networkDialog.TypeHint    = WindowTypeHint.Splashscreen;
                    networkDialog.BorderWidth = 4;
                    networkDialog.Modal       = true;
                    networkDialog.VBox.Add(networkLabel);
                    //dialog.VBox.Add (progressBar);
                    networkDialog.HasSeparator = false;
                    networkDialog.AddButton("Cancel", ResponseType.Close);
                    networkDialog.Response += delegate(object obj, ResponseArgs args){
                        brick.Connection.Close();
                    };
                    Gtk.Application.Invoke(delegate {
                        networkDialog.ShowAll();
                    });
                    networkLabel.Text = networkLabel.Text + Utilities.NetworkHelper.GetExternalIP();
                    //MonoBrick.ConnectionDelegate onNetworkConnection = delegate(){};
                    //brick.Connection.Connected += onNetworkConnection;
                    try{
                        brick.Connection.Open();                                //This will block and wait for a network connection
                    }
                    catch (Exception exception) {
                        //brick.Connection.Connected -= onNetworkConnection;
                        Gtk.Application.Invoke(delegate {
                            networkDialog.Destroy();
                        });
                        throw(exception);
                    }
                    //brick.Connection.Connected -= onNetworkConnection;
                    Gtk.Application.Invoke(delegate {
                        networkDialog.Destroy();
                    });
                }
                else
                {
                    brick = new MonoBrick.NXT.Brick <Sensor, Sensor, Sensor, Sensor>(new TunnelConnection <Command, Reply>(ipEntry.Text, ushort.Parse(portSpinbutton.Text)));
                }
            }
            System.Timers.Timer timer = new System.Timers.Timer(100);
            ProgressBar progress      = new ProgressBar();
            //progress.Fraction = 0.0;
            progress.Orientation = ProgressBarOrientation.LeftToRight;
            timer.Elapsed       += (obj1, obj2) => {
                progress.Pulse();
            };
            Label connectLabel = new Label("Opening connection...");
            //label.HeightRequest = 160;
            connectLabel.WidthRequest = 200;
            Dialog connectDialog      = new Dialog("Connecting to the NXT", this, Gtk.DialogFlags.DestroyWithParent);
            connectDialog.TypeHint    = WindowTypeHint.Splashscreen;
            connectDialog.Modal       = true;
            connectDialog.VBox.Add(connectLabel);
            connectDialog.HasSeparator = false;
            connectDialog.VBox.Add(progress);
            Gtk.Application.Invoke(delegate {
                connectDialog.ShowAll();
                timer.Start();
            });
            if (!brick.Connection.IsConnected)
            {
                try{
                    brick.Connection.Open();
                }
                catch (Exception ex) {
                    Gtk.Application.Invoke(delegate {
                        connectDialog.Destroy();
                        timer.Stop();
                    });
                    throw ex;
                }
            }
            brick.Connection.CommandSend   += OnCommandSend;
            brick.Connection.ReplyReceived += OnReplyRecieved;
            //brick.ConnectionOpened += OnConnected;
            brick.Connection.Disconnected += Disconnected;
            try{
                Gtk.Application.Invoke(delegate {
                    connectLabel.Text = "Retrieving brick information...";
                });

                DeviceInfo info         = brick.GetDeviceInfo();
                DeviceFirmware firmware = brick.GetDeviceFirmware();
                ushort batteryLevel     = brick.GetBatteryLevel();
                SetSensor[] setSensor   = new SetSensor[] {
                    delegate(Sensor sensor){ brick.Sensor1 = sensor; brick.Sensor1.Initialize(); },
                    delegate(Sensor sensor){ brick.Sensor2 = sensor; brick.Sensor2.Initialize(); },
                    delegate(Sensor sensor){ brick.Sensor3 = sensor; brick.Sensor3.Initialize(); },
                    delegate(Sensor sensor){ brick.Sensor4 = sensor; brick.Sensor4.Initialize(); },
                };
                ComboBox[] comboArray = new ComboBox[] { sensor1Combobox, sensor2Combobox, sensor3Combobox, sensor4Combobox };
                //Check if sensors should be initialized with something other than none
                for (int i = 0; i < 4; i++)
                {
                    Console.WriteLine(i);
                    Gtk.Application.Invoke(delegate {
                        connectLabel.Text = "Setting up sensor " + (i + 1);
                    });
                    if (comboArray[i].Active != 0)
                    {
                        try{
                            setSensor[i]((Sensor)comboArray[i].GetActiveValue());
                        }
                        catch (MonoBrickException nxtEx) {
                            if (nxtEx is MonoBrickException)
                            {
                                comboArray[i].Active = 0;                                        //unable to set the sensor value set the comboBox to none
                                setSensor[i](new Sensor(SensorType.NoSensor, SensorMode.Raw));
                            }
                            else
                            {
                                throw nxtEx;
                            }
                        }
                    }
                }
                Gtk.Application.Invoke(delegate {
                    UpdateDeviceInfo(info);
                    UpdateFirmwareInfo(firmware);
                    UpdateBatteryInfo(batteryLevel);
                });
                Connected();
                DisableAllTunnelInput();
                if (isConnectedViaNetwork())
                {
                    Gtk.Application.Invoke(delegate {
                        connectLabel.Text = "Checking tunnel settings...";
                    });
                    if (brickType == BrickType.NXT)
                    {
                        var reply = brick.Connection.SendAndReceive(new Command(CommandType.TunnelCommand, CommandByte.GetTunnelCommands, true));
                        if (!reply.HasError)
                        {
                            for (int i = 0; i < reply.Data.Length - 3; i++)
                            {
                                switch (reply.Data[i + 3])
                                {
                                case (byte)CommandByte.GetTunnelRTSPSettings:
                                    EnableVideoStreamInput();
                                    break;

                                case (byte)CommandByte.GetTunnelGPSPosition:
                                    EnableGPSInput();
                                    break;

                                case (byte)CommandByte.TunnelSpeak:
                                    EnableSpeakInput();
                                    break;
                                }
                            }
                        }
                        else
                        {
                            //The tunnel does not support any commands
                        }
                    }
                }
            }
            catch (MonoBrickException ex) {
                Gtk.Application.Invoke(delegate {
                    connectDialog.Destroy();
                    timer.Stop();
                });
                brick.Connection.Close();
                throw ex;
            }
            Gtk.Application.Invoke(delegate {
                connectDialog.Destroy();
                timer.Stop();
            });
        });
    }
	protected void OnConnectButtonClicked (object sender, System.EventArgs e)
	{
			SpawnThread(delegate()
            {
            	if(USBRadiobutton.Active){
					brick = new MonoBrick.NXT.Brick<MonoBrick.NXT.Sensor,MonoBrick.NXT.Sensor,MonoBrick.NXT.Sensor,MonoBrick.NXT.Sensor>(new USB<MonoBrick.NXT.Command,MonoBrick.NXT.Reply>());
				}
				if(bluetoothRadiobutton.Active){
				brick = new MonoBrick.NXT.Brick<MonoBrick.NXT.Sensor,Sensor,Sensor,Sensor>(new Bluetooth<MonoBrick.NXT.Command,MonoBrick.NXT.Reply>(comportCombobox.ActiveText));
				}
				if(networkRadiobutton.Active){
					if(waitForConnectioncheckbutton.Active){
						brick = new MonoBrick.NXT.Brick<Sensor,Sensor,Sensor,Sensor>(new TunnelConnection<MonoBrick.NXT.Command,MonoBrick.NXT.Reply>(ushort.Parse(portSpinbutton.Text)));
						Label networkLabel = new Label();
						//label.HeightRequest = 160;
						networkLabel.WidthRequest = 300;
						string[] addresses = NetworkHelper.GetLocalIPAddress();
							for(int i = 0; i < addresses.Length; i++){
							networkLabel.Text = networkLabel.Text + "Local IP address: " + addresses[i].PadRight(80)+"\n";
						}
						networkLabel.Text = networkLabel.Text+ "External IP Address: ";
						Dialog networkDialog = new Dialog ("Wait for connection", this, Gtk.DialogFlags.DestroyWithParent);
						networkDialog.TypeHint =  WindowTypeHint.Splashscreen;
						networkDialog.BorderWidth = 4;
						networkDialog.Modal = true;
				        networkDialog.VBox.Add (networkLabel);
						//dialog.VBox.Add (progressBar);
						networkDialog.HasSeparator = false;
						networkDialog.AddButton ("Cancel", ResponseType.Close);
						networkDialog.Response += delegate(object obj, ResponseArgs args){ 
							brick.Connection.Close();
						};
						Gtk.Application.Invoke (delegate {
							networkDialog.ShowAll();
						});
						networkLabel.Text = networkLabel.Text + Utilities.NetworkHelper.GetExternalIP();
						//MonoBrick.ConnectionDelegate onNetworkConnection = delegate(){};
						//brick.Connection.Connected += onNetworkConnection;
						try{
							brick.Connection.Open();//This will block and wait for a network connection
						}
						catch(Exception exception){
							//brick.Connection.Connected -= onNetworkConnection;
							Gtk.Application.Invoke (delegate {
								networkDialog.Destroy();
							});
							throw(exception);
						}
						//brick.Connection.Connected -= onNetworkConnection;
						Gtk.Application.Invoke (delegate {
							networkDialog.Destroy();
						});	
						
					}
					else{
						brick = new MonoBrick.NXT.Brick<Sensor,Sensor,Sensor,Sensor>(new TunnelConnection<Command,Reply>(ipEntry.Text, ushort.Parse(portSpinbutton.Text)));
					}
				}
				System.Timers.Timer timer = new System.Timers.Timer(100);
				ProgressBar progress = new ProgressBar();
				//progress.Fraction = 0.0;
				progress.Orientation = ProgressBarOrientation.LeftToRight;
				timer.Elapsed += (obj1,obj2) => {
					progress.Pulse();
				};
				Label connectLabel = new Label("Opening connection...");
				//label.HeightRequest = 160;
				connectLabel.WidthRequest = 200;
				Dialog connectDialog = new Dialog ("Connecting to the NXT", this, Gtk.DialogFlags.DestroyWithParent);
				connectDialog.TypeHint =  WindowTypeHint.Splashscreen;
				connectDialog.Modal = true;
				connectDialog.VBox.Add (connectLabel);
				connectDialog.HasSeparator = false;
				connectDialog.VBox.Add (progress);
				Gtk.Application.Invoke (delegate {
						connectDialog.ShowAll();
						timer.Start();
				});
				if(!brick.Connection.IsConnected){
					try{
						brick.Connection.Open();
					}
					catch(Exception ex){
						Gtk.Application.Invoke (delegate {
							connectDialog.Destroy();
							timer.Stop();
						});
						throw ex;
					}
				}
				brick.Connection.CommandSend += OnCommandSend;
				brick.Connection.ReplyReceived += OnReplyRecieved;
				//brick.ConnectionOpened += OnConnected;
				brick.Connection.Disconnected += Disconnected;
				try{
					Gtk.Application.Invoke (delegate {
						connectLabel.Text = "Retrieving brick information...";
					});
					
					DeviceInfo info = brick.GetDeviceInfo();
					DeviceFirmware firmware = brick.GetDeviceFirmware();
					ushort batteryLevel = brick.GetBatteryLevel();
					SetSensor[] setSensor = new SetSensor[]{
						delegate(Sensor sensor){brick.Sensor1 = sensor; brick.Sensor1.Initialize();},
						delegate(Sensor sensor){brick.Sensor2 = sensor; brick.Sensor2.Initialize();},
						delegate(Sensor sensor){brick.Sensor3 = sensor; brick.Sensor3.Initialize();},
						delegate(Sensor sensor){brick.Sensor4 = sensor; brick.Sensor4.Initialize();},
					};
					ComboBox[] comboArray = new ComboBox[]{sensor1Combobox, sensor2Combobox,sensor3Combobox, sensor4Combobox};
					//Check if sensors should be initialized with something other than none
					for(int i = 0; i < 4; i++){ 
						Console.WriteLine(i);
						Gtk.Application.Invoke (delegate {
							connectLabel.Text = "Setting up sensor " + (i+1);
						});
						if(comboArray[i].Active != 0){
							try{
								setSensor[i]((Sensor) comboArray[i].GetActiveValue());						
							}
							catch(MonoBrickException nxtEx){
								if(nxtEx is MonoBrickException){
									comboArray[i].Active = 0;//unable to set the sensor value set the comboBox to none
									setSensor[i](new Sensor(SensorType.NoSensor,SensorMode.Raw));
								}
								else
									throw nxtEx;
							}
						}
					}
					Gtk.Application.Invoke (delegate {
						UpdateDeviceInfo(info);
						UpdateFirmwareInfo(firmware);
						UpdateBatteryInfo(batteryLevel);
					});
					Connected();
					DisableAllTunnelInput();
					if(isConnectedViaNetwork()){
						Gtk.Application.Invoke (delegate {
							connectLabel.Text = "Checking tunnel settings...";
						});
						if(brickType == BrickType.NXT){
						var reply = brick.Connection.SendAndReceive(new Command(CommandType.TunnelCommand,CommandByte.GetTunnelCommands,true));
							if(!reply.HasError){
								for(int i = 0; i < reply.Data.Length-3; i++){
									switch(reply.Data[i+3]){
										case (byte)CommandByte.GetTunnelRTSPSettings:
											EnableVideoStreamInput();
											break;
										case (byte)CommandByte.GetTunnelGPSPosition:
											EnableGPSInput();
											break;
										case (byte)CommandByte.TunnelSpeak:
											EnableSpeakInput();
											break;
										}
									}
							}
							else{
								//The tunnel does not support any commands
							}
						}
					}
				}
				catch(MonoBrickException ex){
					Gtk.Application.Invoke (delegate {
						connectDialog.Destroy();
						timer.Stop();
					});
					brick.Connection.Close();
					throw ex;
				}
				Gtk.Application.Invoke (delegate {
					connectDialog.Destroy();
					timer.Stop();
				});
				
				
			});
	}