//---------------------------------------
    // FUNCTIONS - UNITY3D (awake, start, update, reset)
    //---------------------------------------
    #region Unity3D Functions

    #region Start
    /// <summary>
    /// Start function - called on start-up of program
    /// </summary>
    void Start()
    {
        // --------------------
        // VULCANX COMMUNICATION, MPL HANDLERS
        // --------------------
        #region VulcanX Communication Initialization
        GameObject VIESYSHandle = GameObject.Find("VIESYS");
        VulcanXHandle = (VulcanXInterface)VIESYSHandle.GetComponent(typeof(VulcanXInterface));
        #endregion //VulcanX Communication Initialization

        f_HomePositionAngles = new float[MPL_NUM_ARM_JOINTS] {
            0f, 0f, 0f, 0f, 0f, 0f, 0f
        };
        f_HomeFingerAngles = new float[MPL_NUM_FINGER_JOINTS] {
            0f, 20f, 20f, 20f, 0f, 20f, 20f, 20f, 0f, 20f, 20f, 20f, 0f, 20f, 20f, 20f, 20f, 20f, 20f, 20f
        };

        // --------------------
        // GAME ELEMENTS SETUP
        // --------------------
        #region Game Elements Setup
        StartCoroutine(CommandRightMPLPosition(5, f_HomePositionAngles, f_HomeFingerAngles));
        #endregion //Game Elements Setup

        //Movement State (to Start)
        SetMovementState(i_MovementState);
    }//function - Start
    private void MapDelegates()
    {
        switch (m_name)
        {
        case "rThDistal":
            m_sliderGroupID = 0;
            m_valAA         = delegate() { return(VulcanXInterface.RightThumbAA()); };
            m_valMCP        = delegate() { return(VulcanXInterface.RightThumbFE()); };
            m_valPIP        = delegate() { return(VulcanXInterface.RightThumbMCP()); };
            m_valDIP        = delegate() { return(VulcanXInterface.RightThumbDIP()); };
            break;

        case "rIndDistal":
            m_sliderGroupID = 1;
            m_valAA         = delegate() { return(VulcanXInterface.RightIndexAA()); };
            m_valMCP        = delegate() { return(VulcanXInterface.RightIndexMCP()); };
            m_valPIP        = delegate() { return(VulcanXInterface.RightIndexPIP()); };
            m_valDIP        = delegate() { return(VulcanXInterface.RightIndexDIP()); };
            break;

        case "rMidDistal":
            m_sliderGroupID = 2;
            m_valAA         = delegate() { return(VulcanXInterface.RightMiddleAA()); };
            m_valMCP        = delegate() { return(VulcanXInterface.RightMiddleMCP()); };
            m_valPIP        = delegate() { return(VulcanXInterface.RightMiddlePIP()); };
            m_valDIP        = delegate() { return(VulcanXInterface.RightMiddleDIP()); };
            break;
        }
    }
    /// <summary>
    /// This method is called several times to complete the reset process.
    /// It uses yield to resume execution after two frames render.  It then
    /// sleeps for two seconds while the vMPL returns to its position prior
    /// to the reset while blanking the cameras.  Finally, it restores the
    /// cameras.
    /// </summary>
    /// <returns></returns>
    private IEnumerator FinishReset()
    {
        // Clear subscriber list now since transform updates don't need to
        // be sent while waiting for reset.
//        WorldInterface.Instance().ClearSubscribers();

        // Wait 2 frames to ensure that objects are destroyed.
        yield return(new WaitForEndOfFrame());

        yield return(new WaitForEndOfFrame());

        // It's safe to turn off the reset flag once old objects destroyed.
        m_reset = false;

        // Reset MPL via VulcanXInterface.
        VulcanXInterface vx = gameObject.GetComponent <VulcanXInterface>();

        if (vx == null)
        {
            throw new ApplicationException("VulcanXInterface not found.");
        }
        vx.Reset();

        // Reset WorldInterface internals.
//        WorldInterface wif = WorldInterface.Instance();
//        wif.ClearWorldObjects();
//        wif.AddWorldObjects();

        // Disable game objects so nothing else moves when physics turned
        // back on to move arm back to its pre-reset position.
        DisableGameObjects();

        // Blank cameras while arm moves.
        BlankCameras();

        // Start physics simulation.
        Time.timeScale = 1;

        // Give arm 2 seconds to move back to its position.
        yield return(new WaitForSeconds(2));

        // Pause simulation again and turn game objects back on.
//        WorldInterface.Instance().Paused = true;
        EnableGameObjects();
        RestoreCameras();
//		wif.ResetComplete();
    }
    void FixedUpdate()
    {
        lock (m_valLock)
        {
            //save actual joint values
            m_actVal[0]  = m_shFE.angle;
            m_actVal[1]  = m_shAA.angle;
            m_actVal[2]  = m_humRot.angle;
            m_actVal[3]  = m_elbFE.angle;
            m_actVal[4]  = m_wrRot.angle;
            m_actVal[5]  = m_wrDev.angle;
            m_actVal[6]  = m_wrFE.angle;
            m_actVal[7]  = m_finAA.angle;
            m_actVal[8]  = m_mcpFE.angle;
            m_actVal[9]  = m_proxFE.angle;
            m_actVal[10] = m_medFE.angle;

            //save commanded joint values
            m_cmdVal[0]  = VulcanXInterface.RightShoulderFE();
            m_cmdVal[1]  = VulcanXInterface.RightShoulderAA();
            m_cmdVal[2]  = VulcanXInterface.RightHumeralRot();
            m_cmdVal[3]  = VulcanXInterface.RightElbowFE();
            m_cmdVal[4]  = VulcanXInterface.RightWristRot();
            m_cmdVal[5]  = VulcanXInterface.RightWristDev();
            m_cmdVal[6]  = VulcanXInterface.RightWristFE();
            m_cmdVal[7]  = m_valAA();
            m_cmdVal[8]  = m_valMCP();
            m_cmdVal[9]  = m_valPIP();
            m_cmdVal[10] = m_valDIP();
        }

        m_contactForce.Normalize();
        // Unity 3.4+ call.
        //Debug.DrawRay(transform.position, m_contactForce, Color.yellow, 0.25f);
        //Debug.DrawRay(transform.position, m_contactForce*100, Color.yellow, 1.0f);
        // Multiply by position error of joints.

        // Send out summed force vector to VulcanXInterface.


        // Zero force vector in preparation for collision events after the
        // current time step.
        //m_contactForce = Vector3.zero;
    }