Coordinator TestUnits.lsl

From Second Life Wiki
Revision as of 14:49, 26 September 2007 by Periapse Linden (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
///////////////////////////////////////////////////////////////////////////////////
///////
///////
///////
///////            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 commmands will be :: seperated 
//   lists in string form.
//
//////////////////////////////////////////////
//        LINK MESSAGE commands
//////////////////////////////////////////////
//
//  link message commands will be recieved 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 posistion 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 posistion 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 posistion 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 );
        
        //initialze 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 paramaters
//////////                    
//////////      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