Coordinator TestUnits.lsl

From Second Life Wiki
Jump to: navigation, search
///////////////////////////////////////////////////////////////////////////////////
///////
///////
///////
///////            Coordinator_TestUnits
///////             
///////       
///////
///////  This is the coordinator script that maintains the record of testUnits. It should be 
///////  included in the coordinator.  
///////      
///////              
//////////////////////////////////////////////////////////////////////////////////////    
 
//Coordinator_TestUnits    .1 -> initial framework  6.28.2007
//Coordinator_Coordinator  .2 -> bug fixing and testing  7.8.2007
 
//////////////////////////////////////////////////////////////////////////////////////
//
//                  Command Protocol
//
//////////////////////////////////////////////////////////////////////////////////////
//
//   All commands will be :: separated 
//   lists in string form.
//
//////////////////////////////////////////////
//        LINK MESSAGE commands
//////////////////////////////////////////////
//
//  link message commands will be received and sent on the toAllChannel
//
//////// INPUT ///////////
//
// Reset - resets this script
// format example -> Reset
//
// ClearAll - empties all lists 
// format example -> ClearAll
//
// AddUnitToList - provides unit information of newly registered list 
// format example -> AddUnitToList::unitKey::00000-0000-0000-00000::unitName::TestUnit1::groupName::Group1
//
// UpdateUnitStatus - provides unit status information
// format example -> UpdateUnitStatus::unitKey::00000-0000-0000-00000::unitStatus::PASS
//
// ReportUnitStats - initiates a ReportStats output 
// format example -> ReportUnitStats
//
// RequestUnitCount - request for number of units registered
// format example -> RequestUnitCount
//
//////// OUTPUT ///////////
//
//  ReportStats - sends out unit information including status
//  format example -> ReportStats::unitKey::00000-0000-0000-00000::unitName::TestUnit1::groupName::Group1::status::PASS
//
// SetUnitCount - provides number of registered units
// format example -> SetUnitCount::1
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
 
 
 
// Global Variables
 
integer toAllChannel = -255;           // general channel - linked message
 
integer debug = 0;                     // level of debug message
integer debugChannel = DEBUG_CHANNEL;  // output channel for debug messages
 
 
      // The following lists are parameters associated with registered test units.
      // A specific unit will have the same list index on all of the lists. 
 
list unitKeys = [];                    // object keys list of registered test units
list unitNames = [];                   // list of registered unit names
list unitGroups = [];                  // list of registered unit group
 
list statusOfUnits = [];               // status of the registered test unit
                                       // PASS - unit completed test process successfully
                                       // FAIL - unit did not complete the process successfully
                                       // REGISTERED - unit is now ready for test
 
 
 
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   ParseCommand
//////////
//////////      Input:      string message - command to be parsed
//////////                    
//////////      Output:     no return value
//////////                    
//////////      Purpose:    This function calls various other functions or sets globals
//////////                    depending on message string. Allows external command calls
//////////                  from chat controlChannel
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
ParseCommand(string message)
{
    if(debug > 1)llSay(debugChannel, llGetScriptName()+ "->ParseCommand: " + message);
 
    //reset all scripts 
    if(message == "reset")
    {
        //reset this script 
        llResetScript();                   
    }
 
    //ClearAll()
    else if(message == "ClearAll")
    {
        //reset the lists to an empty state
        unitKeys = [];                    
        unitNames = [];                   
        unitGroups = [];                  
        statusOfUnits = [];
 
    }
 
    // AddUnitToList()
    // format example -> AddUnitToList::unitKey::00000-0000-0000-00000::unitName::TestUnit1::groupName::Group1
    else if(llSubStringIndex(message, "AddUnitToList::") != -1)
    {
        //parse string command into a list of elements
        list unitParameters = llParseString2List( message, ["::"], [""] );
 
        //find first variable name of concern - unitKey
        integer index = llListFindList( unitParameters, ["unitKey"] );
        //use the position of the variable name to update unitKey list 
        unitKeys += llList2List( unitParameters, index + 1, index + 1);                    
 
        //find variable name of concern - unitName
        index = llListFindList( unitParameters, ["unitName"] );
        //use the position of the variable name to update unitName list 
        unitNames += llList2List( unitParameters, index + 1, index + 1);                    
 
        //find variable name of concern - groupName
        index = llListFindList( unitParameters, ["groupName"] );
        //use the position of the variable name to update unitName list 
        unitGroups += llList2List( unitParameters, index + 1, index + 1);                   
 
        //add first status indication for unit
        statusOfUnits += ["REGISTERED"];
    }
 
    // UpdateUnitStatus()
    // format example -> UpdateUnitStatus::unitKey::00000-0000-0000-00000::unitStatus::PASS
    else if(llSubStringIndex(message, "UpdateUnitStatus::") != -1)
    {
        //parse string command into a parameter list
        list unitStatusParameters = llParseString2List( message, ["::"], [""] );
 
        //use variable name to find first variable of concern - unitKey
        integer commandIndex = llListFindList( unitStatusParameters, ["unitKey"] );
 
        //pull the unitKey value from the parameter list
        list CurrentUnitKey = llList2List( unitStatusParameters, commandIndex + 1, commandIndex + 1 );
 
        //use the unitKey to find the index for all the lists of the test unit
        integer keyIndex = llListFindList( unitKeys, CurrentUnitKey );
 
        //find the index of the unitStatus variable
        commandIndex = llListFindList( unitStatusParameters, ["unitStatus"] );
 
        // if unit met the registration time line
        if( llList2String( statusOfUnits, keyIndex ) != "LATE_REGISTRATION" )
        {
           //update the status list with the unitStatus provided by the command string               
           statusOfUnits = llListReplaceList( statusOfUnits, llList2List( unitStatusParameters, commandIndex + 1, commandIndex + 1) , keyIndex, keyIndex);
        }
    }
 
    //  ReportUnitStats()
    //  format example -> ReportStats::unitKey::00000-0000-0000-00000::unitName::TestUnit1::groupName::Group1::unitStatus::PASS
    else if(message == "ReportUnitStats")
    {
 
        //send link message on general channel reporting unit stats
        llMessageLinked(LINK_SET, toAllChannel, "SetUnitCount::" + (string)llGetListLength( unitKeys ), NULL_KEY );
 
        //initialize counter to zero to use as list index
        integer increment = 0;
        //get the size of the lists
        integer count = llGetListLength( unitKeys );
 
        //iterate through the lists reporting the unit parameters for them all, one at a time
        while( increment < count )
        {
           //send link message on general channel reporting unit stats
           llMessageLinked(LINK_SET, toAllChannel, "ReportStats::unitKey::" + llList2String( unitKeys, increment)
                                                            + "::unitName::" + llList2String( unitNames, increment)
                                                            + "::groupName::" + llList2String( unitGroups, increment)
                                                            + "::unitStatus::" + llList2String( statusOfUnits, increment)
                                    , NULL_KEY);
          //increment index counter
          increment++;
        } // end while
    }
 
    // RequestUnitCount - request for number of units registered
    // format example -> RequestUnitCount
    else if(message == "RequestUnitCount")
    {
        //send link message on general channel reporting unit stats
        llMessageLinked(LINK_SET, toAllChannel, "SetUnitCount::" + (string)llGetListLength( unitKeys ), NULL_KEY );
    }
 
} //end ParseCommand
 
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//////////      Function:   Initialize
//////////
//////////      Input:      no input parameters
//////////                    
//////////      Output:     no return value
//////////                    
//////////      Purpose:    This function initializes any variables or functions necessary
//////////                  to get us started
//////////                    
//////////      Issues:        no known issues 
//////////                    
//////////                    
/////////////////////////////////////////////////////////////////////////////////////////////////
Initialize()
{
 
 
}
 
///////////////////////////////////////////////////////////////////////////////////////
//STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE STATE//
///////////////////////////////////////////////////////////////////////////////////////
//                                                                                   //
//                                                                                   //
//                          DEFAULT STATE                                            //
//                                                                                   //
//                                                                                   //
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
default
{
///////////////////////////////////////////////////////
//  State Entry of default state                     //
///////////////////////////////////////////////////////
   state_entry()
    {
        Initialize();
    }
////////////////////////////////////////////////////////
//  On Rez of default state                           //
////////////////////////////////////////////////////////    
    on_rez(integer start_param)
    {
        Initialize();
    }
 
 
///////////////////////////////////////////////////////
//  Link Message of default state                    //
///////////////////////////////////////////////////////   
    link_message(integer sender_number, integer number, string message, key id)
    {
        //if link message is on the correct channel
        if(number == toAllChannel)
        {
            // 
            ParseCommand( message );
 
        }
 
    } //end of link message
 
 
} // end default