Forcing Articulate to send cmi.exit "normal" while still allowing "suspend"

Feb 03, 2022

From the many other threads on this forum I see that by design, Articulate uses cmi.exit "suspend" when the course is exited. 

This is fine, except for the fact that the attempt number never changes on subsequent revisits (e.g. a person returns to re-take the course in 12 month's time after an earlier successful completion).  This is causing confusion for our users who restart at the "quiz results" page.

This has been replicated on SCORM Cloud, and Rustici Software have replied to my question stating that Articulate should only send "suspend" when a person closes the course but intents to resume, and "normal" when everything has been finished (they refer to it as "wrapping up").  I know Mike Rustici has blogged about this in the past.

Looking at the many suggestions posted over the last decade, editing the configuration file to force the DEFAULT_EXIT_TYPE = EXIT_TYPE_NORMAL is not the right answer here, as users do still need the facility to resume.

The question then:

How can I create an interaction on a button that manually sends cmi.exit "normal"?

The above can then be used on a "I've finished - save my score and exit" button.

We have tried manually executing JavaScript, but every combination is failing to send "normal" to the LMS.  On both our LMS's (and SCORM Cloud), we only see "suspend" sent by the player, so we assume none of the following methods work:

SCORM_CallLMSSetValue("cmi.exit", "normal");
lmsAPI.SCORM_CallLMSSetValue("cmi.exit", "normal");
SCORM2004_CallSetValue("cmi.exit", "normal")

Can somebody please advise how to send cmi.exit "normal"?

7 Replies
Nedim Ramic

Hi David,

You may wanna take a look at the following lines:

var EXIT_SUSPEND_IF_COMPLETED = false; //determines if Suspend is sent for exit when SetReachedEnd is called - legacy driver defaulted to false
var EXIT_NORMAL_IF_PASSED = false; //determines if exit is Normal when Passed - legacy driver defaulted to false and always sends suspend

See what it does for you if var EXIT_NORMAL_IF_PASSED = true;
Check my screenshot.

David Clough

Hi

Thanks for your reply. While I appreciate there may be some value in this, its a setting that will have to be remembered and changed for every course's publish.  We need to achieve this inside Articulate otherwise somebody will overlook doing this in future.  I cannot believe Articulate doesn't have options for suspend/normal in its Exit Course trigger action.

Nedim Ramic

You can use SCORM2004_CallSetValue('cmi.exit', SCORM2004_NORMAL_EXIT); inside Articulate to send "cmi.exit, "normal". But this way you would have both ("cmi.exit", "suspend") and ("cmi.exit", "normal") reported by LMS (screenshot). You can control which one will be reported first. Other than that, I don't have any more suggestions. 

Nedim Ramic

Hi David,

This code is not documented as such. It was only me trying to enforce a "normal" exit, although the SetValue method is the standard SCORM2004 method that allows the SCO to persist data to the LMS. Please disregard it as I would always go with my suggestion in the first post. After additional testing, I found that only modifying EXIT_NORMAL_IF_PASSED to true would properly set "cmi.exit" to "normal". This line of code confirms that:

 if (EXIT_NORMAL_IF_PASSED == true && objLMS.GetStatus() == LESSON_STATUS_PASSED) {
      WriteToDebug("Passed status and config value set, overiding exit type to FINISH");
      ExitType = EXIT_TYPE_FINISH;
    }

So it will override EXIT_TYPE_SUSPEND.
blnResult = SCORM2004_CallSetValue("cmi.exit", SCORM2004_TranslateExitTypeToSCORM(DEFAULT_EXIT_TYPE)) && blnResult;

Referenced variables in scormdriver.js
var EXIT_NORMAL_IF_PASSED = false; //determines if exit is Normal when Passed - legacy driver defaulted to false and always sends suspend
var DEFAULT_EXIT_TYPE = EXIT_TYPE_SUSPEND;  //When the content is unloaded without an API function indicating the type of exit,
//what default behavior do you want to assume.  Use EXIT_TYPE_SUSPEND if you plan to
//call Finish when the content is complete.  Use EXIT_TYPE_FINISH if you do not plan
//to call Finish.
 
If Articulate or someone else know how to force "cmi.exit", "normal" directly from Storyline I would appreciate it if they could post it here. 
Kevin Budd

Hi David,

We've been experiencing issues with some SCORM packages and after some investigation we received the suggestion to update cmi.exit to Normal instead of Suspend. After reading about these variables I found this thread. 

Were you able to find any long term happiness with Nedim's suggestion to update EXIT_NORMAL_IF_PASSED = true?