public bool MoveRelAsync(char axis, int position)
        {
            mutex.WaitOne();
            double final_pos = GetPosition(axis) + (double)position;

            if (final_pos > motors[axis].limit || final_pos < 0)
            {
                return(false);
            }
            int rot = MicronToRotation(axis, position);

            if (!SelectChannel())
            {
                return(false);
            }
            if (!TMLLib.TS_SelectAxis(motors[axis].id))
            {
                return(false);
            }
            if (!TMLLib.TS_MoveRelative(rot, speed, acceleration, NO_ADDITIVE, TMLLib.UPDATE_IMMEDIATE, TMLLib.FROM_REFERENCE))
            {
                return(false);
            }
            mutex.ReleaseMutex();
            return(true);
        }
        private bool HomeAxis(byte axis_id)
        {
            Int32  position      = -100000000;
            Int32  home_position = 0;
            Int32  back_step     = 1000;
            double high_speed    = 20;
            double low_speed     = 1.0;
            double acceleration  = 0.6;

            if (!TMLLib.TS_SelectAxis(axis_id))
            {
                return(false);
            }
            if (!TMLLib.TS_MoveRelative(position, high_speed, acceleration, NO_ADDITIVE, TMLLib.UPDATE_IMMEDIATE, TMLLib.FROM_REFERENCE))
            {
                return(false);
            }
            if (!TMLLib.TS_SetEventOnLimitSwitch(TMLLib.LSW_NEGATIVE, TMLLib.TRANSITION_LOW_TO_HIGH, WAIT_EVENT, NO_STOP))
            {
                return(false);
            }
            if (!TMLLib.TS_SetEventOnMotionComplete(WAIT_EVENT, NO_STOP))
            {
                return(false);
            }
            if (!TMLLib.TS_MoveRelative(back_step, low_speed, acceleration, NO_ADDITIVE, TMLLib.UPDATE_IMMEDIATE, TMLLib.FROM_REFERENCE))
            {
                return(false);
            }
            if (!TMLLib.TS_SetEventOnMotionComplete(WAIT_EVENT, NO_STOP))
            {
                return(false);
            }
            if (!TMLLib.TS_SetPosition(home_position))
            {
                return(false);
            }
            return(true);
        }