private void OnReplyRecieved(BrickReply reply)
 {
     if (brickType == BrickType.NXT)
     {
         if (!((MonoBrick.NXT.Reply)reply).HasError)
         {
             Gtk.Application.Invoke(delegate {
                 replyStatusbar.Pop(1);
                 replyStatusbar.Push(1, "Received " + reply.Length + " bytes");
             });
         }
     }
 }
        public BrickReply OnTunnelCommand(BrickCommand command)
        {
            BrickReply   reply        = null;
            BrickCommand replyCommand = null;

            if (command is MonoBrick.NXT.Command)
            {
                var nxtCommand = new MonoBrick.NXT.Command(command.Data);
                switch (nxtCommand.CommandByte)
                {
                case MonoBrick.NXT.CommandByte.GetTunnelCommands:
                    replyCommand = new MonoBrick.NXT.Command(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte, true);
                    replyCommand.Append((byte)0x00);                             //no error
                    if (streamingSettings.EnableRTSP)
                    {
                        replyCommand.Append((byte)MonoBrick.NXT.CommandByte.GetTunnelRTSPSettings);
                        replyCommand.Append((byte)MonoBrick.NXT.CommandByte.StartTunnelRTSP);
                    }
                    if (streamingSettings.EnableGPS)
                    {
                        replyCommand.Append((byte)MonoBrick.NXT.CommandByte.GetTunnelGPSPosition);
                    }
                    if (streamingSettings.EnableSpeak)
                    {
                        replyCommand.Append((byte)MonoBrick.NXT.CommandByte.TunnelSpeak);
                    }
                    reply = new MonoBrick.NXT.Reply(replyCommand.Data);
                    break;

                case MonoBrick.NXT.CommandByte.GetTunnelRTSPSettings:
                    if (streamingSettings.EnableRTSP)
                    {
                        replyCommand = new MonoBrick.NXT.Command(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte, true);
                        replyCommand.Append((byte)0x00);                                 //no error
                        replyCommand.Append((Int32)streamingSettings.RTSPPort);
                        replyCommand.Append((Int32)streamingSettings.VideoPort);
                        reply = new MonoBrick.NXT.Reply(replyCommand.Data);
                    }
                    else
                    {
                        reply = new MonoBrick.NXT.Reply(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte, (byte)TunnelError.ErrorExecuting);
                    }
                    break;

                case MonoBrick.NXT.CommandByte.StartTunnelRTSP:
                    if (rtspServer.Start(clientIpAddress.ToString(), streamingSettings.RTSPPort, streamingSettings.VideoPort, streamingSettings.VideoQuality))
                    {
                        reply = new MonoBrick.NXT.Reply(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte);
                    }
                    else
                    {
                        reply = new MonoBrick.NXT.Reply(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte, (byte)TunnelError.ErrorExecuting);
                    }
                    break;

                default:
                    reply = new MonoBrick.NXT.Reply(MonoBrick.NXT.CommandType.ReplyCommand, nxtCommand.CommandByte, (byte)TunnelError.UnsupportedCommand);
                    break;
                }
            }
            else
            {
                throw new NotImplementedException("EV3 support has been implemented");
            }



            return(reply);
        }