//---------------------------------------------------------------------

        void Update()
        {
            // Send Tilt Input frame rate independent
            if (NetworkManager.getInstance().isActiveConnection&& InputManager.getInstance().isActiveTiltInput)
            {
                // send TiltValues every 1/rate second (e.g 1/15 = 15 times per second)
                if (timeSinceLastStart >= 1f / Network.sendRate)
                {
                    // FIXME
                    //WbCompRPCWrapper.getInstance().setTiltInput(this.getSmoothAxisValues());

                    float tiltValue = this.getSmoothAxisValues();
                    if (tiltValue > 0f)
                    {
                        WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.DRIVING_STEER_RIGHT, tiltValue);
                    }
                    else if (tiltValue < 0f)
                    {
                        WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.DRIVING_STEER_LEFT, -tiltValue);
                    }


                    timeSinceLastStart = 0;
                }
                timeSinceLastStart += Time.deltaTime;
            }
        }
        //-----------------------------------------------------------------------------

        public void OnPointerUp(PointerEventData eventData)
        {
            this.isPressed = false;
            this.value     = 0f;

            WbCompStateSyncSending.getInstance().setVehicleInput(this.axisName, value);
        }
        //-----------------------------------------------------------------------------

        public void Update()
        {
            if (this.isPressed)
            {
                value = Mathf.MoveTowards(value, this.targetValue, this.responseSpeed * Time.deltaTime);

                WbCompStateSyncSending.getInstance().setVehicleInput(this.axisName, value);
            }
        }
        //-----------------------------------------------------------------------------

        private void updateInputValues(Vector2 delta)
        {
            // ------------------------------------------------------- //
            // Blendshape Order: 0 = UP, 1 = DOWN, 2 = LEFT, 3 = RIGHT //
            // ------------------------------------------------------- //

            // Thumbstick UP / Y-AXIS
            if (delta.y > 0 && delta.y > this.inputThreshold)
            {
                float blendshapeValue = Mathf.Lerp(0, 100f, Mathf.InverseLerp(0f, 1f, Mathf.Abs(delta.y)));
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(0, blendshapeValue);
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(1, 0);

                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_01_UP, Mathf.Clamp01(delta.y));
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_ROPE_UP, Mathf.Clamp01(delta.y));
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.UP, Mathf.Clamp01(delta.y));
            }

            // Thumbstick DOWN / Y-AXIS
            if (delta.y < 0 && Mathf.Abs(delta.y) > this.inputThreshold)
            {
                float blendshapeValue = Mathf.Lerp(0, 100f, Mathf.InverseLerp(0f, 1f, Mathf.Abs(delta.y)));
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(1, blendshapeValue);
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(0, 0);

                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_01_DOWN, Mathf.Clamp01(Mathf.Abs(delta.y)));
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_ROPE_DOWN, Mathf.Clamp01(Mathf.Abs(delta.y)));
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.DOWN, Mathf.Clamp01(Mathf.Abs(delta.y)));
            }

            // Thumbstick RESET Y-AXIS
            if ((Mathf.Abs(delta.y) > 0 || delta.y == 0) && Mathf.Abs(delta.y) < this.inputThreshold)
            {
                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_01_UP, 0f);
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_01_DOWN, 0f);
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_ROPE_UP, 0f);
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_ROPE_DOWN, 0f);
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.UP, delta.y);
                this.updateThumbstickDebugUI(ThumbstickAxis.DOWN, delta.y);
            }

            // ----------------------------------------

            // Thumbstick LEFT / X-AXIS
            if (delta.x < 0 && Mathf.Abs(delta.x) > this.inputThreshold)
            {
                float blendshapeValue = Mathf.Lerp(0, 100f, Mathf.InverseLerp(0f, 1f, Mathf.Abs(delta.x)));
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(2, blendshapeValue);
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(3, 0);

                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_MAIN_LEFT, Mathf.Clamp01(Mathf.Abs(delta.x)));
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_FORWARD, Mathf.Clamp01(Mathf.Abs(delta.x)));
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.LEFT, Mathf.Clamp01(Mathf.Abs(delta.x)));
            }

            // Thumbstick RIGHT / X-AXIS
            if (delta.x > 0 && delta.x > this.inputThreshold)
            {
                float blendshapeValue = Mathf.Lerp(0, 100f, Mathf.InverseLerp(0f, 1f, Mathf.Abs(delta.x)));
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(3, blendshapeValue);
                this.meshThumbstick.GetComponent <SkinnedMeshRenderer>().SetBlendShapeWeight(2, 0);

                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_MAIN_RIGHT, Mathf.Clamp01(delta.x));
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_BACKWARD, Mathf.Clamp01(delta.x));
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.RIGHT, Mathf.Clamp01(delta.x));
            }

            // Thumbstick RESET X-AXIS
            if ((Mathf.Abs(delta.x) > 0 || delta.x == 0) && Mathf.Abs(delta.x) < this.inputThreshold)
            {
                // send input key for vehicle interaction
                if (this.thumbstickType.Equals(ThumbstickType.Left))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_MAIN_LEFT, 0f);
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_MAIN_RIGHT, 0f);
                }
                if (this.thumbstickType.Equals(ThumbstickType.Right))
                {
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_FORWARD, 0f);
                    WbCompStateSyncSending.getInstance().setVehicleInput(InputKeys.TRUCKCRANE_BOOM_BACKWARD, 0f);
                }
                // debugging
                this.updateThumbstickDebugUI(ThumbstickAxis.LEFT, delta.x);
                this.updateThumbstickDebugUI(ThumbstickAxis.RIGHT, delta.x);
            }
        }