public void trackTarget(){
        
        Target targetFromDashboard = null;
        String visionData = SmartDashboard.getString("VisionData", null);
        if (visionData == null) {
            // Only report error once
            if (!m_visionWidgetMissingReported) {
                System.out.println("VisionData is empty, does the SmartDashboard have the vision widget?");
                m_visionWidgetMissingReported = true;
            }
            Robot._gyroTarget = 0;
        }
        else if  (visionData.length() != 0) {
            //System.out.println("Vision Data : " + visionData);
            m_noTargetDetectedReported = false;
            targetFromDashboard = Target.loadFromString(visionData);
            double newAngleOffset = targetFromDashboard.getCenterAngleOffset() + m_ratio*(targetFromDashboard.getRightAngleOffset() - targetFromDashboard.getCenterAngleOffset());
            //System.out.println("Vision::" + targetFromDashboard.getBoundingRectBottom());
            // Only report angle offset when it changes
            if (((int)m_lastAngleOffset) != ((int)newAngleOffset)) {
                System.out.println("Target Angle Offset (From Dashboard) : " + targetFromDashboard.getCenterAngleOffset());
                m_lastAngleOffset = newAngleOffset;
            }
            Robot._gyroTarget = newAngleOffset;
            Robot._bottomPixel = targetFromDashboard.getBoundingRectBottom();
            Robot._topPixel = targetFromDashboard.getBoundingRectTop();
        }
        else {
            // No targets are being tracked
            if (!m_noTargetDetectedReported) {
                System.out.println("No target is detected.");
                m_noTargetDetectedReported = true;
            }
            Robot._gyroTarget = 0;
        }
    }