HexapiBackground.IK.InverseKinematics.StartAsync C# (CSharp) Method

StartAsync() private method

private StartAsync ( ) : System.Threading.Tasks.Task
return System.Threading.Tasks.Task
        internal async Task StartAsync()
        {
            while (true)
            {
                if (_inputStream == null || _outputStream == null)
                {
                    await Task.Delay(500);
                    continue;
                }

                if (_movementStarted)
                {
                    if (_rangeDataEventArgs.LeftBlocked && _travelRotationY > 0)
                        _travelRotationY = 0;

                    if (_rangeDataEventArgs.CenterBlocked && _travelLengthZ < 0)
                        _travelLengthZ = 0;

                    if (_rangeDataEventArgs.RightBlocked && _travelRotationY < 0)
                        _travelRotationY = 0;

                    _travelRequest = (Math.Abs(_travelLengthX) > TravelDeadZone) || (Math.Abs(_travelLengthZ) > TravelDeadZone) || (Math.Abs(_travelRotationY) > TravelDeadZone);

                    IkLoop();

                    _lastLeg = false;

                    _outputStream.WriteString(GetServoPositions(_coxaAngle, _femurAngle, _tibiaAngle));
                }
                else
                    _outputStream.WriteString(TurnOffServos());

                await _outputStream.StoreAsync().AsTask();

                while (true)
                {
                    var bytesIn = await _inputStream.LoadAsync(1).AsTask();
                    if (bytesIn > 0)
                    {
                        if (_inputStream.ReadByte() == 0x2e)
                            break;
                    }
                    _outputStream.WriteBytes(_querySsc);
                    await _outputStream.StoreAsync().AsTask();
                }
            }
        }

Usage Example

        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            _deferral = taskInstance.GetDeferral();

            _display = new SparkFunSerial16X2Lcd();
            _xboxController = new XboxController(_display);
            _ntripClient = new NtripClient("172.16.0.237", 8000, "", "", "", _display); //172.16.0.227
            _ioTClient = new IoTClient(_display);
            _gps = new Gps.Gps( _display, _ntripClient);
            _inverseKinematics = new InverseKinematics(_display);
            _ikController = new IkController(_inverseKinematics, _display, _ioTClient, _gps); //Range and yaw/pitch/roll data from Arduino and SparkFun Razor IMU
            _navigator = new Navigator(_ikController, _display, _gps);
            _hexapi = new Hexapi(_ikController, _xboxController, _navigator, _display, _gps, _ioTClient);

            _initializeTasks.Add(_display.InitializeAsync());
            _initializeTasks.Add(_xboxController.InitializeAsync());
            _initializeTasks.Add(_ikController.InitializeAsync());
            _initializeTasks.Add(_ntripClient.InitializeAsync());
            _initializeTasks.Add(_gps.InitializeAsync());
            _initializeTasks.Add(_inverseKinematics.InitializeAsync());
            _initializeTasks.Add(_ioTClient.InitializeAsync());

            _startTasks.Add(_ntripClient.StartAsync());
            _startTasks.Add(_ikController.StartAsync());
            _startTasks.Add(_gps.StartAsync());
            _startTasks.Add(_inverseKinematics.StartAsync());
            //_startTasks.Add(_ioTClient.StartAsync());//only needed if expecting messages from the server

            //foreach (var d in await SerialDeviceHelper.ListAvailablePorts())
            //{
            //    await _ioTClient.SendEvent(d);
            //}

            await Task.WhenAll(_initializeTasks.ToArray());

            await Task.WhenAll(_startTasks.ToArray());
        }