public void TestStreamControl()
        {
            var openPortResult =
                client.RequestConnectToPort(new ConnectionRequest()
            {
                Connect = true, ComPort = _comPort
            });

            Assert.IsNull(openPortResult.Error, "Port Open Failed");
            client.RequestPowerStatus(new PowerStatusRequest()
            {
                Write = true, PowerCode = 3
            });
            Task.Delay(5000).Wait();
            var stream = client.StreamRequestArmTrigger(new CallOptions());

            var cancel = new CancellationTokenSource();

            // receive
            Task.Run(async() =>
            {
                while (await stream.ResponseStream.MoveNext(cancel.Token))
                {
                    _writer.WriteLine($"Got new message! {stream.ResponseStream.Current}");
                }
            });

            var requestData = new ArmTriggerRequest()
            {
                ArmTrigger         = true,
                MaxTriggerTimeUs   = 10000,
                LaserConfiguration = new LaserStatusRequest()
                {
                    Intensity = 255, DurationUs = 45
                }
            };

            for (int i = 0; i < 3; i++)
            {
                stream.RequestStream.WriteAsync(requestData);
                Task.Delay(500).Wait();
            }

            cancel.Cancel();
        }
        public override Task <ArmTriggerResponse> RequestArmTrigger(ArmTriggerRequest request, ServerCallContext context)
        {
            captureMonopoly = true;
            var response           = new ArmTriggerResponse();
            var laserConfiguration = request.LaserConfiguration;

            response.Error = InvokeCommand("P", new[] { laserConfiguration.Intensity.ToString() }, true);
            if (response.Error != null)
            {
                goto exit;
            }

            response.Error = InvokeCommand("D", new[] { laserConfiguration.DurationUs.ToString() }, true);
            if (response.Error != null)
            {
                goto exit;
            }

            response.Error = InvokeCommand("M", new[] { request.MaxTriggerTimeUs.ToString() }, true);
            if (response.Error != null)
            {
                goto exit;
            }

            response.TriggerAutoDisarmed = false;
            if (request.ArmTrigger)
            {
                string outString = "";
                response.Error = InvokeCommandWithResponse("B", null, ref outString, calledByArmTrigger: true);
                if (response.Error != null)
                {
                    goto exit;
                }

                response.TriggerAutoDisarmed = outString == "1";
            }

exit:
            captureMonopoly = false;
            return(Task.FromResult(response));
        }