private async Task Connect() { cts = new CancellationTokenSource(); IsCancellationRequested = false; InputFrame receivedFrame = null; isInitialized = true; // Connect with the robot try { Task.Run(async() => { receivedFrame = await rsiAdapter.Connect(Config.Port); }).Wait(cts.Token); } catch (OperationCanceledException) { rsiAdapter.Disconnect(); return; } lock (generatorSyncLock) { generator.Initialize(receivedFrame.Position); } lock (receivedDataSyncLock) { position = receivedFrame.Position; HomePosition = receivedFrame.Position; } // Send first response OutputFrame response = new OutputFrame() { Correction = RobotVector.Zero, IPOC = receivedFrame.IPOC }; rsiAdapter.SendData(response); Initialized?.Invoke(this, EventArgs.Empty); // Start loop for receiving and sending data while (!IsCancellationRequested) { long IPOC = await ReceiveDataAsync(); SendData(IPOC); } }
/// <param name="port">Port defined in RSI_EthernetConfig.xml</param> /// <param name="limits">robot limits</param> public KUKARobot(int port, RobotLimits limits) { rsiAdapter = new RSIAdapter(port); Limits = limits; worker = new BackgroundWorker() { WorkerSupportsCancellation = true }; worker.DoWork += async(sender, args) => { // Connect with the robot InputFrame receivedFrame = await rsiAdapter.Connect(); generator = new TrajectoryGenerator5(receivedFrame.Position); lock (receivedDataSyncLock) { IPOC = receivedFrame.IPOC; position = receivedFrame.Position; HomePosition = receivedFrame.Position; } // Send first response (prevent connection timeout) rsiAdapter.SendData(new OutputFrame() { Correction = new RobotVector(), IPOC = IPOC }); isInitialized = true; Initialized?.Invoke(); // Start loop for receiving and sending data while (!worker.CancellationPending) { await ReceiveDataAsync(); SendData(); } isInitialized = false; rsiAdapter.Disconnect(); }; }