public void GPCallback(NluMgr.match_record record)
    {
        // make to upper case
        record.sim_command = record.sim_command.ToUpper();

        string text = "NLU : sim_command=<" + record.sim_command + ">";
        // subject 
        if (record.command_subject != null && record.command_subject != "")
            text += " : s=<" + record.command_subject + ">";
        // params
        foreach (NluMgr.sim_command_param param in record.parameters)
            text += " : p=<" + param.name + "," + param.value + ">";
        // missing params
        foreach (NluMgr.missing_sim_command_param param in record.missing_parameters)
            text += " : m=<" + param.name + ">";
        // readback
        if (record.readback != null && record.readback != "")
            text += " : r=<" + record.readback + ">";
        // feedback
        if (record.feedback != null && record.feedback != "")
            text += " : f=<" + record.feedback + ">";
		
		// save this one
#if ADD_NLU_RECORDS
		currCV.NLURecords.Add(record);
#endif
		if ( record.input != currCV.CV.Variations[currVariationIdx] )
			currCV.NLUResults.Add(text + " : input=<" + record.input + "> doesn't match Variation");
		else
			currCV.NLUResults.Add(text + " : input=<" + record.input + ">");
		
		// get next result
		currCV = NextResult();
		
		// kick off next one
		if ( currCV != null )
		{
        	NluMgr.GetInstance().Utterance(currCV.CV.Variations[currVariationIdx], "nurse");
		}
		else
		{
			// we're done, save the file
			Serializer<List<CommandVariationResult>> serializer = new Serializer<List<CommandVariationResult>>();
			serializer.Save("CommandVariationResult.xml",CVResults);
		}
    }	
	public void TestCommandVariations()
	{
		currCV = NextResult();
		if ( currCV == null )
			return;
		
        NluMgr.GetInstance().SetUtteranceCallback(new NluMgr.UtteranceCallback(GPCallback));
        NluMgr.GetInstance().SetErrorCallback(new NluMgr.ErrorCallback(GPErrorCallback));
       	NluMgr.GetInstance().Utterance(currCV.CV.Variations[currVariationIdx], "nurse");
	}
    public void GPErrorCallback(string data)
    {
#if ADD_NLU_RECORDS
		// save this one
		currCV.NLURecords.Add(null);
#endif
		currCV.NLUResults.Add("NLU ERROR <" + data + ">");
		
		// get next result
		currCV = NextResult();
		
		// kick off next one
		if ( currCV != null )
		{
        	NluMgr.GetInstance().Utterance(currCV.CV.Variations[currVariationIdx], "nurse");
		}
		else
		{
			// we're done, save the file
			Serializer<List<CommandVariationResult>> serializer = new Serializer<List<CommandVariationResult>>();
			serializer.Save("CommandVariationResult.xml",CVResults);
		}
	}	
	CommandVariationResult NextResult()
	{
		CommandVariationResult result=currCV;
		if ( currCV != null )
		{	
			++currVariationIdx;
			if ( currVariationIdx >= currCV.CV.Variations.Count )
			{
				// we're at the end of the current, do next one
				if ( currCVIdx < variations.Count )
				{
					result = new CommandVariationResult();
					result.CV = variations[currCVIdx];
					CVResults.Add(result);
					currCVIdx++;
					currVariationIdx = 0;
				}
				else
					result = null;		
			}
		}
		else
		{
			// brand new start it
			currCVIdx = 0;
			result = new CommandVariationResult();
			result.CV = variations[currCVIdx];
			CVResults.Add(result);
			currCVIdx++;
			currVariationIdx = 0;
		}
			
		return result;
	}