We've been working with both a SCORM Driver and a SCORM Engine customer to better understand the time tracking functions made available in the SCORM Driver of late. The mechanisms themselves are worth understanding, so I'm going to explain them in a bit of depth here. Specifically, the methods we'll be discussing are:
- PauseTimeTracking()
- ResumeTimeTracking()
- SetSessionTime()
- GetSessionAccumulatedTime()
- GetPreviouslyAccumulatedTime()
Some general statements
- When an LMS launches a piece of content (specifically a SCO, for our purposes) for the first time, it begins tracking total_time. On the initial launch, that value is 0.
- As the SCO progresses, it is entitled to report to the LMS a value for session_time. During that session, in fact, the SCO may report session_time as often as it likes.
- At the end of the SCO's session, the LMS is responsible to combine the total_time from before the session with the last reported session_time from that session to arrive at a new total time. (old total_time + last reported session_time = new total_time)
- Timing, in the context of the session, is completely up to the content. The reason for this is that the content "knows" when a learner is engaged and should be qualifying for time spent. If a screen goes idle for 15 minutes, should those 15 minutes count? Probably not. This is not a trivial task for the content author, but it is a laudable one.
What the SCORM Driver functions actually do...
- PauseTimeTracking() and ResumeTimeTracking() actually work together. On launch, any SCORM Driver based SCO starts tracking time immediately. If, at any point, the content believe the learner should not be receiving credit for time spent, then PauseTimeTracking() should called, halting the timer. (Quietly, this also increments a variable that contains the time spent to this point.) When the learner resumes, then, ResumeTimeTracking() should be called, allowing the timer to continue.
- SetSessionTime(intMilliseconds) can be called at any point during the running of the SCO. This will push the passed value to the LMS as the current version of the session_time.
- GetSessionAccumulatedTime() does what it says. It returns the number of milliseconds spent in this session, as controlled by Pause and ResumeTimeTracking.
- GetPreviouslyAccumulatedTime() retrieves the value from the LMS for total_time, the time prior to this session.
Best Practices
- If your content is able to discern when a learner is engaged, it should make use of PauseTimeTracking() and ResumeTimeTracking to provide accurate measures to the LMS for session_time in the end.
- SetSessionTime() need never be called, as the SCORM Driver native functionality takes care of that for you. Skipping it is easier, and is less likely to confuse an LMS.
- GetSessionAccumulatedTime() is perfect for use if you want to display to the learner how much time they've earned in the course of this learning session.
- GetPreviouslyAccumulatedTime() + GetSessionAccumulatedTime() could be used to display to the user how much time they've spent on this SCO over the course of multiple sessions.
And, for you SCORM Engine clients out there (these are people using an LMS that includes a tool from Rustici Software on that side of the fence...):
What's the difference between total_time and total_time_tracked?
Well, put simply, the SCORM Engine doesn't trust the content to report useful data for time tracking purposes. So, just in case, the SCORM Engine maintains its own interpretation of time spent to that point. total_time_tracked is the SCORM Engine's impression of time spent. total_time is the SCORM standard version (as discussed above).