public async static Task WsgHoming(
     [InputPin(PropertyMode = PropertyMode.Default, DefaultValue = DEFAULT_WSG_NAME)] string gripperName,
     CancellationToken cancel = default(CancellationToken))
 {
     var actionName = $"{DEFAULT_WSG_BASE_NAME}/{gripperName}/{DEFAULT_WSG_ACTION_NAME}";
     var result     = await MotionService.WsgGripperCommand(actionName, WsgCommand.Homing, 0, 0, 0, true, cancel);
 }
        public async static Task <Tuple <double, double, bool, bool, string> > WsgRelease(
            [InputPin(PropertyMode = PropertyMode.Default, DefaultValue = DEFAULT_WSG_NAME)] string gripperName,
            [InputPin(PropertyMode = PropertyMode.Default, DefaultValue = "0.05")] double openWidth,
            [InputPin(PropertyMode = PropertyMode.Default)] double speed = 0.15,
            CancellationToken cancel = default(CancellationToken))
        {
            var actionName = $"{DEFAULT_WSG_BASE_NAME}/{gripperName}/{DEFAULT_WSG_ACTION_NAME}";
            var result     = await MotionService.WsgGripperCommand(actionName, WsgCommand.Release, openWidth, speed, 0, true, cancel);

            var stalled     = result.State == (int)WsgState.Error;
            var reachedGoal = result.State == (int)WsgState.Idle;

            return(Tuple.Create(result.Width, result.Force, stalled, reachedGoal, result.Status));
        }