Exemple #1
0
        private void btnLuaRunPath_Click(object sender, EventArgs e)
        {
            try
            {
                string host     = txtHost.Text;
                int    port     = txtPort.Text.ToInt();
                int    actionId = txtAction.Text.ToInt();
                string pwd      = txtPwd.Text.Trim();
                _token.GameType = txtGameType.Text.ToInt();
                _token.ServerID = txtServerID.Text.ToInt();
                _token.RetailID = txtRetailID.Text.Trim();
                _token.Pid      = txtPid.Text.Trim();
                _token.Pwd      = EncodePwdAndUrlEncode(pwd);
                SetConfig(host, port, actionId, _token, pwd);

                string funName = string.Format("Action{0}", actionId);
                ScutWriter.getInstance().writeHead(_token.Sid, _token.Uid.ToInt());
                ScutWriter.getInstance().writeInt32("ActionId", actionId);
                if (!LuaRuntime.GetContext().TryCall <Action <UserToken> >(funName, _token))
                {
                    _responseLog.WriteFormatLine("请求出错:The {0} function is not exist in lua file.", funName);
                }
                var sendData = ScutWriter.generatePostData();
                TcpRequest.Instance().Send(host, port, sendData, null);
                ScutWriter.resetData();
            }
            catch (Exception ex)
            {
                _responseLog.WriteFormatLine("请求出错:{0}", ex);
            }
            finally
            {
                ResponseReflesh();
            }
        }
        public void HandleRequest(TcpRequest request)
        {
            _logger.LogMessage($"Handling Request: {request.RequestType}");
            switch (request.RequestType)
            {
            case AoTcpRequest.GetButtonInfo:
                HandleGetButtonInfo(request);
                break;

            case AoTcpRequest.GetButtonImage:
                HandleGetButtonImage(request);
                break;

            case AoTcpRequest.RegisterForUpdates:
                HandleRegisterForUpdates(request);
                break;

            case AoTcpRequest.StatValue:
                HandleRequestStatValue(request);
                break;

            case AoTcpRequest.ChangeStatValue:
                HandleChangeStatValue(request);
                break;

            case AoTcpRequest.EventBus:
                HandleEventBusRequest(request);
                break;
            }
        }
        private void HandleGetButtonImage(TcpRequest request)
        {
            _logger.LogMessage("Handling button image request");
            var buttonImageRequest = JsonConvert.DeserializeObject <ButtonImageRequest>(request.Body);

            var cardGroup = _appData.Game.GetCardGroup(buttonImageRequest.CardGroupId);

            byte[] imageAsBytes = null;
            var    imageId      = string.Empty;

            if (!buttonImageRequest.ButtonMode.HasValue || !buttonImageRequest.Index.HasValue)
            {
                SendButtonImageResponse(request.Socket, cardGroup.Name, cardGroup.ButtonImageAsBytes);
                return;
            }
            else
            {
                if (cardGroup.GetButton(buttonImageRequest.ButtonMode.Value, buttonImageRequest.ZoneIndex.Value, buttonImageRequest.Index.Value) is CardInfoButton cardButton)
                {
                    imageId      = cardButton.CardInfo.ImageId;
                    imageAsBytes = cardButton.CardInfo.ButtonImageAsBytes;
                }
            }

            SendButtonImageResponse(request.Socket, imageId, imageAsBytes);
        }
        private void HandleRegisterForUpdates(TcpRequest request)
        {
            _logger.LogMessage("Handling register for update request");

            var registerForUpdatesRequest = JsonConvert.DeserializeObject <RegisterForUpdatesRequest>(request.Body);

            _broadcastService.AddPort(registerForUpdatesRequest.Port);

            SendAllStats();

            var cardGroupInfoList = new List <CardGroupInfo>();
            var buttonInfoList    = new List <ButtonInfo>();

            foreach (var cardGroup in _appData.Game.AllCardGroups)
            {
                cardGroupInfoList.Add(new CardGroupInfo {
                    CardGroupId      = cardGroup.Id,
                    Name             = cardGroup.Name,
                    IsImageAvailable = cardGroup.ButtonImageAsBytes != null,
                    ImageId          = cardGroup.Name,
                    Zones            = (from zone in cardGroup.CardZones select zone.Name).ToList()
                });
                buttonInfoList.AddRange(cardGroup.GetButtonInfo());
            }

            SendRegisterForUpdatesResponse(request.Socket, cardGroupInfoList, buttonInfoList);
        }
        private void HandleGetButtonInfo(TcpRequest request)
        {
            _logger.LogMessage("Handling button info request");
            var getCardInfoRequest = JsonConvert.DeserializeObject <GetCardInfoRequest>(request.Body);
            var cardButton         = GetCardButton(getCardInfoRequest);

            SendCardInfoResponse(request.Socket, cardButton);
        }
        private void HandleEventBusRequest(TcpRequest request)
        {
            Send(request.Socket, new OkResponse().ToString());

            var eventBusRequest = JsonConvert.DeserializeObject <EventBusRequest>(request.Body);

            _crossAppEventBus.ReceiveMessage(eventBusRequest);
        }
Exemple #7
0
            protected override async Task Handle(TcpRequest <ServerStatus> request, CancellationToken cancellationToken)
            {
                var msg         = request.Message;
                var serverId    = new PolychatServerIdString(msg.ServerId);
                var sanitisedId = serverId.ToSanitisedUppercase();
                var server      = _polychatService.GetOnlineServerOrDefault(sanitisedId);

                if (server is not null)
                {
                    await _polychatService.ForwardMessage(sanitisedId, msg);

                    if (
                        msg.Status is
                        ServerStatus.Types.ServerStatusEnum.Stopped or ServerStatus.Types.ServerStatusEnum.Crashed
                        )
                    {
                        _polychatService.RemoveOnlineServer(sanitisedId);
                        _logger.LogInformation("Removed server {id} from the list of online servers.", sanitisedId);
                        request.ConnectedClient.StopListening();
                    }

                    var getChatChannelResult =
                        await _channelApi.GetChannelAsync(new(_polychatSettings.ChatChannelId), cancellationToken);

                    if (!getChatChannelResult.IsSuccess)
                    {
                        throw new Exception(getChatChannelResult.Error.Message);
                    }

                    var message           = $"Server {msg.Status.ToString().ToLowerInvariant()}.";
                    var chatMessage       = new PolychatChatMessageString(sanitisedId, message);
                    var sendMessageResult =
                        await _channelApi.CreateMessageAsync(new(_polychatSettings.ChatChannelId),
                                                             chatMessage.ToDiscordFormattedString(), ct : cancellationToken);

                    if (!sendMessageResult.IsSuccess)
                    {
                        throw new Exception(getChatChannelResult.Error?.Message ??
                                            "Could not forward message to Discord.");
                    }

                    _logger.LogInformation("Server {id} changed status to {newStatus}", sanitisedId,
                                           msg.Status);
                }
                else
                {
                    if (msg.Status == ServerStatus.Types.ServerStatusEnum.Started)
                    {
                        _logger.LogWarning(
                            "Server {id} has unexpectedly sent ServerStatus message before sending ServerInfo message.",
                            sanitisedId);
                    }
                    else
                    {
                        throw new KeyNotFoundException($"Could not find server {sanitisedId} in the list of online servers");
                    }
                }
            }
        private void HandleEventBusRequest(TcpRequest request)
        {
            SendOkResponse(request.Socket);

            _logger.LogMessage("Handling event bus request");
            var eventBusRequest = JsonConvert.DeserializeObject <EventBusRequest>(request.Body);

            _crossAppEventBus.ReceiveMessage(eventBusRequest);
        }
Exemple #9
0
            protected override async Task Handle(TcpRequest <ServerPlayerStatusChangedEvent> request, CancellationToken cancellationToken)
            {
                var serverId    = new PolychatServerIdString(request.Message.NewPlayersOnline.ServerId);
                var sanitisedId = serverId.ToSanitisedUppercase();
                var server      = _polychatService.GetOnlineServerOrDefault(sanitisedId);

                if (server is null)
                {
                    throw new KeyNotFoundException($"Could not find server {sanitisedId} in the list of online servers");
                }

                var playersOnline  = request.Message.NewPlayersOnline.PlayersOnline;
                var newPlayersList = request.Message.NewPlayersOnline.PlayerNames.ToList();

                if (request.Message.NewPlayerStatus is ServerPlayerStatusChangedEvent.Types.PlayerStatus.Left &&
                    newPlayersList.Contains(request.Message.PlayerUsername)
                    )
                {
                    newPlayersList.Remove(request.Message.PlayerUsername);
                    playersOnline = playersOnline == 0 ? playersOnline : playersOnline - 1;
                }
                else if (request.Message.NewPlayerStatus is ServerPlayerStatusChangedEvent.Types.PlayerStatus.Joined &&
                         !newPlayersList.Contains(request.Message.PlayerUsername)
                         )
                {
                    newPlayersList.Add(request.Message.PlayerUsername);
                    playersOnline += 1;
                }

                server.PlayersOnline     = playersOnline;
                server.OnlinePlayerNames = newPlayersList;

                _polychatService.AddOrUpdateOnlineServer(sanitisedId, server);
                await _polychatService.ForwardMessage(sanitisedId, request.Message);

                var messageStr = new PolychatChatMessageString(
                    sanitisedId,
                    $"{request.Message.PlayerUsername} has {request.Message.NewPlayerStatus.ToString().ToLower()} the game.");
                var getChatChannelResult =
                    await _channelApi.GetChannelAsync(new(_polychatSettings.ChatChannelId), cancellationToken);

                if (!getChatChannelResult.IsSuccess)
                {
                    throw new Exception(getChatChannelResult.Error.Message);
                }

                var sendMessageResult = await _channelApi.CreateMessageAsync(
                    new(_polychatSettings.ChatChannelId),
                    messageStr.ToDiscordFormattedString(),
                    ct : cancellationToken);

                if (!sendMessageResult.IsSuccess)
                {
                    throw new Exception(getChatChannelResult.Error?.Message ?? "Could not forward message to Discord.");
                }
            }
Exemple #10
0
            protected override void Handle(TcpRequest <ServerInfo> request)
            {
                var onlineServer = new OnlineServer(request.Message, request.ConnectedClient);
                var id           = new PolychatServerIdString(request.Message.ServerId);
                var sanitisedId  = id.ToSanitisedUppercase();

                _logger.LogInformation("Adding server {id} to the list of online servers...", sanitisedId);
                _polychatService.AddOrUpdateOnlineServer(sanitisedId, onlineServer);
                _logger.LogInformation("Added server {id} to the list of online servers.", sanitisedId);
            }
        protected override async Task Handle(TcpRequest <GenericCommandResult> request, CancellationToken cancellationToken)
        {
            var msg = request.Message;
            // we want an exception if failed, as the handler can't proceed if failed, hence Parse instead of TryParse;
            var parsedId         = ulong.Parse(request.Message.DiscordChannelId);
            var channelSnowflake = new Snowflake(parsedId);
            var getChannelResult = await _channelApi.GetChannelAsync(channelSnowflake, cancellationToken);

            if (!getChannelResult.IsSuccess || getChannelResult.Entity is null)
            {
                throw new Exception(getChannelResult.Error?.Message ?? $"Could not get channel with ID {parsedId}");
            }

            // because why would ColorTranslator use the established pattern of TryParse
            // when it can have only one method that throws if it fails to parse instead
            // FFS
            Color colour;

            try
            {
                colour = ColorTranslator.FromHtml(request.Message.Colour);
            }
            catch
            {
                colour = _colourPalette.Blue;
            }

            var sendCmdExecutedNotificationResult = await _channelApi.CreateMessageAsync(
                channelSnowflake,
                content : $"[{msg.ServerId}] Command `{msg.Command}` executed!",
                ct : cancellationToken);

            if (!sendCmdExecutedNotificationResult.IsSuccess)
            {
                _logger.LogError("Error while sending command output embed: {Error}",
                                 sendCmdExecutedNotificationResult.Error.Message);
            }

            var embeds = new List <Embed>();
            var output = msg.CommandOutput
                         .Chunk(1024)
                         .Select(chars => new string(chars.ToArray()))
                         .ToList();

            embeds
            .AddRange(output
                      .Select((str, i) => new Embed
            {
                Title  = $"[{i + 1}/{output.Count}] Command `{msg.Command}`'s output",
                Fields = new List <EmbedField>
                {
                    new("Output message", string.IsNullOrEmpty(str) ? "*No output*" : str !, false)
                },
Exemple #12
0
        private void UpdateActAgendaBarStatus(TcpRequest request)
        {
            var actAgendaBarStatusRequest = JsonConvert.DeserializeObject <ActAgendaBarStatusRequest>(request.Body);

            if (actAgendaBarStatusRequest == null)
            {
                return;
            }

            foreach (var toggleActAgendaBarAction in ToggleActAgendaBarAction.ListOf)
            {
                toggleActAgendaBarAction.SetStatus(actAgendaBarStatusRequest.IsVisible);
            }
            Send(request.Socket, new OkResponse().ToString());
        }
        private void HandleRequestStatValue(TcpRequest request)
        {
            var statValueRequest = JsonConvert.DeserializeObject <StatValueRequest>(request.Body);

            _logger.LogMessage($"Handling Stat Value request");

            var player = GetPlayer(statValueRequest.Deck);
            var stat   = GetStat(player, statValueRequest.StatType);

            var response = new StatValueResponse {
                Value = stat.Value
            };

            Send(request.Socket, response.ToString());
        }
        public void HandleRequest(TcpRequest request)
        {
            RequestReceivedRecently = true;

            Console.WriteLine("Handling Request: " + request.RequestType.ToString());
            switch (request.RequestType)
            {
            case AoTcpRequest.ConnectionIsAlive:
                HandleConnectionIsAliveRequest(request);
                break;

            case AoTcpRequest.EventBus:
                HandleEventBusRequest(request);
                break;
            }
        }
            protected override void Handle(TcpRequest <ServerPlayersOnline> request)
            {
                var serverId    = new PolychatServerIdString(request.Message.ServerId);
                var sanitisedId = serverId.ToSanitisedUppercase();
                var server      = _polychatService.GetOnlineServerOrDefault(sanitisedId);

                if (server is null)
                {
                    throw new KeyNotFoundException($"Could not find server {sanitisedId} in the list of online servers");
                }

                server.PlayersOnline     = request.Message.PlayersOnline;
                server.OnlinePlayerNames = request.Message.PlayerNames.ToList();

                _polychatService.AddOrUpdateOnlineServer(sanitisedId, server);
            }
Exemple #16
0
            protected override async Task Handle(TcpRequest <ChatMessage> request, CancellationToken cancellationToken)
            {
                var protoMessage = request.Message;
                var id           = new PolychatServerIdString(protoMessage.ServerId);
                var sanitisedId  = id.ToSanitisedUppercase();
                await _polychatService.ForwardMessage(sanitisedId, protoMessage);

                var getChatChannelResult =
                    await _channelApi.GetChannelAsync(new(_polychatSettings.ChatChannelId), cancellationToken);

                if (!getChatChannelResult.IsSuccess)
                {
                    throw new Exception(getChatChannelResult.Error.Message);
                }

                var messageTextContent    = protoMessage.Message;
                var sanitisedString       = new PolychatChatMessageString(messageTextContent).ToSanitisedString();
                var discordMessageInfo    = sanitisedString[..protoMessage.MessageOffset];
Exemple #17
0
        public Main()
        {
            InitializeComponent();
            rtxtResponse.ReadOnly = true;
            LuaRuntime.GetContext().RegisterFunc("LogWriteLine", _responseLog, _responseLog.GetType().GetMethod("WriteLine"));
            LuaRuntime.GetContext().RegisterFunc("LogWriteTable", _responseLog, _responseLog.GetType().GetMethod("WriteTable"));
            InitConfig();
            TcpRequest.Instance().ReceiveCompleted += OnReceiveCompleted;

            _watchThread = new Thread(obj =>
            {
                var instance = obj as Main;
                while (true)
                {
                    Thread.Sleep(100);
                }
            });
        }
Exemple #18
0
        private void UpdateInvestigatorImage(TcpRequest request)
        {
            var updateInvestigatorImageRequest = JsonConvert.DeserializeObject <UpdateInvestigatorImageRequest>(request.Body);

            if (updateInvestigatorImageRequest == null)
            {
                return;
            }

            foreach (var showDeckListAction in ShowDeckListAction.ListOf)
            {
                if (showDeckListAction.Deck == updateInvestigatorImageRequest.Deck)
                {
                    showDeckListAction.SetImageAsync(updateInvestigatorImageRequest.Bytes.AsImage());
                }
            }
            Send(request.Socket, new OkResponse().ToString());
        }
Exemple #19
0
        private void UpdateStatInfo(TcpRequest request)
        {
            var updateStatInfoRequest = JsonConvert.DeserializeObject <UpdateStatInfoRequest>(request.Body);

            if (updateStatInfoRequest == null)
            {
                return;
            }

            foreach (var trackStatAction in TrackStatAction.ListOf)
            {
                if ((trackStatAction.Deck == updateStatInfoRequest.Deck) &&
                    (trackStatAction.StatType == updateStatInfoRequest.StatType))
                {
                    trackStatAction.UpdateValue(updateStatInfoRequest.Value);
                }
            }
            Send(request.Socket, new OkResponse().ToString());
        }
Exemple #20
0
 private void ProcessRequest(object sender, TcpRequest req)
 {
     Logger.Trace("Begin ProcessRequest");
     Logger.Info("Requested command: {0}", req.PlayerRequest);
     if (!req.ResponseRequired)
     {
         _commandDictionary[(int)req.PlayerRequest].DynamicInvoke(req.Arguments);
         return;
     }
     try
     {
         var res = _commandDictionary[(int)req.PlayerRequest].DynamicInvoke(req.Arguments);
         _mbTcpHelper.SendResponse(req.PlayerRequest, res);
     }
     catch (Exception e)
     {
         Logger.Error(e, "Sending response failed");
     }
     Logger.Trace("End ProcessRequest");
 }
Exemple #21
0
            protected override async Task Handle(TcpRequest <GenericCommandResult> request, CancellationToken cancellationToken)
            {
                var msg = request.Message;
                // we want an exception if failed, as the handler can't proceed if failed, hence Parse instead of TryParse;
                var parsedId         = ulong.Parse(request.Message.DiscordChannelId);
                var channelSnowflake = new Snowflake(parsedId);
                var getChannelResult = await _channelApi.GetChannelAsync(channelSnowflake, cancellationToken);

                if (!getChannelResult.IsSuccess || getChannelResult.Entity is null)
                {
                    throw new Exception(getChannelResult.Error?.Message ?? $"Could not get channel with ID {parsedId}");
                }

                // because why would ColorTranslator use the established pattern of TryParse
                // when it can have only one method that throws if it fails to parse instead
                // FFS
                Color colour;

                try
                {
                    colour = ColorTranslator.FromHtml(request.Message.Colour);
                }
                catch
                {
                    colour = _colourPalette.Blue;
                }

                var embeds = new List <Embed>
                {
                    new()
                    {
                        Title  = $"Command `{msg.Command}` executed!",
                        Fields = new List <EmbedField>
                        {
                            new("Server", msg.ServerId, false)
                        },
                        Timestamp = DateTimeOffset.UtcNow,
                        Colour    = colour
                    }
                };
Exemple #22
0
        private void UpdateCardInfo(TcpRequest request)
        {
            var updateCardInfoRequest = JsonConvert.DeserializeObject <UpdateCardInfoRequest>(request.Body);

            if (updateCardInfoRequest == null)
            {
                return;
            }

            foreach (var cardButtonAction in CardButtonAction.ListOf)
            {
                if ((cardButtonAction.Deck == updateCardInfoRequest.Deck) &&
                    (cardButtonAction.CardButtonIndex == updateCardInfoRequest.Index) &&
                    cardButtonAction.IsVisible &&
                    cardButtonAction.ShowCardSet == updateCardInfoRequest.IsCardInSet)
                {
#pragma warning disable CS4014
                    cardButtonAction.UpdateButtonInfo(updateCardInfoRequest);
#pragma warning restore CS4014
                }
            }
            Send(request.Socket, new OkResponse().ToString());
        }
Exemple #23
0
        public void HandleRequest(TcpRequest request)
        {
            RequestReceivedRecently = true;

            Console.WriteLine("Handling Request: " + request.RequestType.AsString());
            switch (request.RequestType)
            {
            case AoTcpRequest.UpdateCardInfo:
                UpdateCardInfo(request);
                break;

            case AoTcpRequest.UpdateStatInfo:
                UpdateStatInfo(request);
                break;

            case AoTcpRequest.UpdateInvestigatorImage:
                UpdateInvestigatorImage(request);
                break;

            case AoTcpRequest.ActAgendaBarStatusRequest:
                UpdateActAgendaBarStatus(request);
                break;
            }
        }
Exemple #24
0
        private string GetResponse(TcpRequest request)
        {
            try
            {
                if (Client.TcpClient == null || !Client.TcpClient.Connected)
                {
                    Client.Connect(_ip, _port);
                }
            }
            catch (Exception e)
            {
                while (e.InnerException != null)
                {
                    e = e.InnerException;
                }
                return(e.Message);
            }
            Client.TcpClient.ReceiveBufferSize = Int32.MaxValue;

            var response = Client.WriteLineAndGetReply(JsonConvert.SerializeObject(request), TimeSpan.FromSeconds(30))?
                           .MessageString;

            return(response);
        }
        private void HandleChangeStatValue(TcpRequest request)
        {
            var changeStatValueRequest = JsonConvert.DeserializeObject <ChangeStatValueRequest>(request.Body);

            _logger.LogMessage($"Handling Change Stat Value request");

            var player = GetPlayer(changeStatValueRequest.Deck);
            var stat   = GetStat(player, changeStatValueRequest.StatType);

            if (changeStatValueRequest.Increase)
            {
                stat.Increase.Execute(null);
            }
            else
            {
                stat.Decrease.Execute(null);
            }

            var response = new StatValueResponse {
                Value = stat.Value
            };

            Send(request.Socket, response.ToString());
        }
Exemple #26
0
 private static void ArdManager_CommandReceived(IArdNetSystem Sender, IConnectedSystemEndpoint ConnectedSystem, TcpRequest Message)
 {
     Debug.WriteLine($"CMD: {Message.Request}");
     if (Message.Request == "VIBE")
     {
         _vibe.Blink(500);
     }
 }
Exemple #27
0
        public static void Main()
        {
            _mpu        = Mpu6050.StartNew(2);
            _mpuArgList = new ArrayList()
            {
                "", "", ""
            };
            _led  = new PinController.LedBlinker(2);
            _vibe = new PinController.LedBlinker(13);

            Debug.WriteLine("Init");
            _led.On();
            Thread.Sleep(100);
            _led.Off();


            var AppID         = "DDRTwistNShout";
            var serverUdpPort = 7348;
            var nanoConfig    = new ArdNetClientConfig(AppID, null, serverUdpPort);

            nanoConfig.TCP.HeartbeatConfig.HeartbeatInterval    = TimeSpan.FromMilliseconds(2000);
            nanoConfig.TCP.HeartbeatConfig.ForceStrictHeartbeat = true;
            nanoConfig.TCP.HeartbeatConfig.RespondToHeartbeats  = false;

            _ardManager = new ArdNetClientManager(SystemConfig.WiFiCredentials, nanoConfig);
            _ardManager.TcpEndpointConnected    += ArdManager_TcpEndpointConnected;
            _ardManager.TcpEndpointDisconnected += NanoClient_ServerDisconnected;
            _ardManager.StartWorkerThread();
            _ardManager.CommandReceived += ArdManager_CommandReceived;

            MpuValue data;
            var      spinCmd       = TcpRequest.CreateOutbound("SPIN", _mpuArgList);
            DateTime spinStartTime = DateTime.MinValue;

            while (true)
            {
                data = _mpu.GetData();
                //gyro data
                //x, y, z
                //_mpuArgList[0] = data.GyroX.ToString();
                //_mpuArgList[1] = data.GyroY.ToString();
                //_mpuArgList[2] = data.GyroZ.ToString();
                //Debug.WriteLine($"[{data.GyroX} {data.GyroY} {data.GyroZ}]");

                if (abs(data.GyroY) > 15000 && spinStartTime.Equals(DateTime.MinValue))
                {
                    spinStartTime = DateTime.UtcNow;
                }
                else if (abs(data.GyroY) < 5000 && !spinStartTime.Equals(DateTime.MinValue))
                {
                    var spinTime = (DateTime.UtcNow - spinStartTime).TotalMilliseconds;
                    Debug.WriteLine($"SPIN: {spinTime}");
                    spinStartTime = DateTime.MinValue;

                    if (spinTime > 800)
                    {
                        _ardManager.EnqueueTask(x => x.SendCommand(spinCmd));
                    }
                }


                Thread.Sleep(10);
            }
        }
        public void SetUp()
        {
            var mock = new Mock <ILogger <TcpRequest> >();

            _request = new TcpRequest(mock.Object);
        }
        public static void Main()
        {
#if platform_test && !platform_beetle
            Configuration.SetPinFunction(23, DeviceFunction.I2C1_DATA);
            Configuration.SetPinFunction(22, DeviceFunction.I2C1_CLOCK);
            _mpu = Mpu6050.StartNew(1);
#elif !platform_test && platform_beetle
            _mpu = Mpu6050.StartNew(2);
#endif
            _mpuArgList = new ArrayList()
            {
                "", "", ""
            };
            _led = new PinController.LedBlinker(2);
            _touchController.Init();
            _palmTouch = _touchController.OpenPin(27, new TouchPadConfig()
            {
                PinSelectMode = TouchPinSelectMode.GpioIndex
            });
            _triggerTouch = _touchController.OpenPin(13, new TouchPadConfig()
            {
                PinSelectMode = TouchPinSelectMode.GpioIndex
            });


            Debug.WriteLine("Init");
            _led.On();
            Thread.Sleep(100);
            _led.Off();


            var AppID         = "Esp32.HairTrigger";
            var serverUdpPort = 48597;
            var nanoConfig    = new ArdNetClientConfig(AppID, null, serverUdpPort);
            nanoConfig.TCP.HeartbeatConfig.HeartbeatInterval    = TimeSpan.FromMilliseconds(2000);
            nanoConfig.TCP.HeartbeatConfig.ForceStrictHeartbeat = true;
            nanoConfig.TCP.HeartbeatConfig.RespondToHeartbeats  = false;

            _ardManager = new ArdNetClientManager(SystemConfig.WiFiCredentials, nanoConfig);
            _ardManager.TcpEndpointConnected    += ArdManager_TcpEndpointConnected;
            _ardManager.TcpEndpointDisconnected += NanoClient_ServerDisconnected;
            _ardManager.StartWorkerThread();

            Debug.WriteLine("Loop");

            MpuValue data;
            DateTime now;
            while (true)
            {
                _   = _serverMsgHandle.WaitOne();
                now = DateTime.UtcNow;

                if (!_palmTouch.IsTouched())
                {
                    Thread.Sleep(10);
                    continue;
                }

                if ((now - _mpuLastSend).TotalMilliseconds > 75)
                {
                    data = _mpu.GetData();
                    //gyro data
                    //x, y, z
                    _mpuArgList[0] = data.GyroX.ToString();
                    _mpuArgList[1] = data.GyroY.ToString();
                    _mpuArgList[2] = data.GyroZ.ToString();

                    var request = TcpRequest.CreateOutbound("MPU", _mpuArgList);
                    _ardManager.EnqueueTask(x =>
                    {
                        _ = x.SendCommand(request);
                    });
                    _mpuLastSend = now;
                }

                now = DateTime.UtcNow;
                if (!_triggerIsDown && (now - _triggerLastSend).TotalMilliseconds > 50)
                {
                    if (_triggerTouch.IsTouched())
                    {
                        _ardManager.EnqueueTask(x => x.SendCommand(_triggerTcpRequest_Down));
                        _triggerIsDown   = true;
                        _triggerLastSend = now;
                    }
                }
                else if (_triggerIsDown && (now - _triggerLastSend).TotalMilliseconds > 10)
                {
                    if (!_triggerTouch.IsTouched())
                    {
                        _ardManager.EnqueueTask(x => x.SendCommand(_triggerTcpRequest_Up));
                        _triggerIsDown   = false;
                        _triggerLastSend = now;
                    }
                }
            }
        }
 private void HandleConnectionIsAliveRequest(TcpRequest request)
 {
     Send(request.Socket, new OkResponse().ToString());
 }