예제 #1
0
        bool Test()
        {
            //
            // TODO: Add code to start application here
            //
            sml.Kernel kernel = sml.Kernel.CreateKernelInNewThread("SoarKernelSML");

            // Make sure the kernel was ok
            if (kernel.HadError())
            {
                throw new Exception("Error initializing kernel: " + kernel.GetLastErrorDescription());
            }

            sml.Agent agent = kernel.CreateAgent("First");

            // We test the kernel for an error after creating an agent as the agent
            // object may not be properly constructed if the create call failed so
            // we store errors in the kernel in this case.  Once this create is done we can work directly with the agent.
            if (kernel.HadError())
            {
                throw new Exception("Error creating agent: " + kernel.GetLastErrorDescription());
            }

            bool ok = agent.LoadProductions("..\\Tests\\testcsharpsml.soar");

            if (!ok)
            {
                System.Console.Out.WriteLine("Load failed");
                return(false);
            }

            Agent  pAgent  = agent;             // So it's easier copying existing C++ code here
            Kernel pKernel = kernel;

            Identifier pInputLink = agent.GetInputLink();

            if (pInputLink == null)
            {
                throw new Exception("Error getting the input link");
            }

            // Some random adds
            Identifier    pID   = pAgent.CreateIdWME(pInputLink, "plane");
            StringElement pWME1 = pAgent.CreateStringWME(pID, "type", "Boeing747");
            IntElement    pWME2 = pAgent.CreateIntWME(pID, "speed", 200);

            // Then add some tic tac toe stuff which should trigger output
            Identifier    pSquare = pAgent.CreateIdWME(pInputLink, "square");
            StringElement pEmpty  = pAgent.CreateStringWME(pSquare, "content", "RANDOM");
            IntElement    pRow    = pAgent.CreateIntWME(pSquare, "row", 1);
            IntElement    pCol    = pAgent.CreateIntWME(pSquare, "col", 2);

            ok = pAgent.Commit();

            // Quick test of init-soar
            pAgent.InitSoar();

            // Update the square's value to be empty.  This ensures that the update
            // call is doing something.  Otherwise, when we run we won't get a match.
            pAgent.Update(pEmpty, "EMPTY");
            ok = pAgent.Commit();

            String myTestData = "my data";

            sml.Agent.RunEventCallback           runCall    = new sml.Agent.RunEventCallback(MyRunEventCallback);
            sml.Agent.ProductionEventCallback    prodCall   = new sml.Agent.ProductionEventCallback(MyProductionEventCallback);
            sml.Agent.PrintEventCallback         printCall  = new sml.Agent.PrintEventCallback(MyPrintEventCallback);
            sml.Agent.OutputEventCallback        outputCall = new sml.Agent.OutputEventCallback(MyOutputEventCallback);
            sml.Agent.XMLEventCallback           xmlCall    = new sml.Agent.XMLEventCallback(MyXMLEventCallback);
            sml.Agent.OutputNotificationCallback noteCall   = new sml.Agent.OutputNotificationCallback(MyOutputNotificationCallback);
            sml.Kernel.AgentEventCallback        agentCall  = new sml.Kernel.AgentEventCallback(MyAgentEventCallback);
            sml.Kernel.SystemEventCallback       systemCall = new sml.Kernel.SystemEventCallback(MySystemEventCallback);
            sml.Kernel.UpdateEventCallback       updateCall = new sml.Kernel.UpdateEventCallback(MyUpdateEventCallback);
            sml.Kernel.StringEventCallback       strCall    = new sml.Kernel.StringEventCallback(MyStringEventCallback);
            sml.Kernel.RhsFunction           rhsCall        = new sml.Kernel.RhsFunction(MyTestRhsFunction);
            sml.Kernel.ClientMessageCallback clientCall     = new sml.Kernel.ClientMessageCallback(MyTestClientMessageCallback);

            int runCallbackID    = agent.RegisterForRunEvent(sml.smlRunEventId.smlEVENT_AFTER_DECISION_CYCLE, runCall, myTestData);
            int prodCallbackID   = agent.RegisterForProductionEvent(sml.smlProductionEventId.smlEVENT_AFTER_PRODUCTION_FIRED, prodCall, myTestData);
            int printCallbackID  = agent.RegisterForPrintEvent(sml.smlPrintEventId.smlEVENT_PRINT, printCall, myTestData);
            int outputCallbackID = agent.AddOutputHandler("move", outputCall, myTestData);
            int noteCallbackID   = agent.RegisterForOutputNotification(noteCall, myTestData);
            int xmlCallbackID    = agent.RegisterForXMLEvent(sml.smlXMLEventId.smlEVENT_XML_TRACE_OUTPUT, xmlCall, myTestData);
            int agentCallbackID  = kernel.RegisterForAgentEvent(sml.smlAgentEventId.smlEVENT_BEFORE_AGENT_REINITIALIZED, agentCall, myTestData);
            int systemCallbackID = kernel.RegisterForSystemEvent(sml.smlSystemEventId.smlEVENT_SYSTEM_START, systemCall, myTestData);
            int updateCallbackID = kernel.RegisterForUpdateEvent(sml.smlUpdateEventId.smlEVENT_AFTER_ALL_OUTPUT_PHASES, updateCall, myTestData);
            int stringCallbackID = kernel.RegisterForStringEvent(sml.smlStringEventId.smlEVENT_EDIT_PRODUCTION, strCall, myTestData);
            int rhsCallbackID    = kernel.AddRhsFunction("test-rhs", rhsCall, myTestData);
            int clientCallbackID = kernel.RegisterForClientMessageEvent("test-client", clientCall, myTestData);

            // Running the agent will trigger most of the events we're listening for so
            // we can check that they're working correctly.
            agent.RunSelf(3);
            //kernel.RunAllAgents(3) ;

            // Trigger an agent event
            agent.InitSoar();

            ok = agent.UnregisterForRunEvent(runCallbackID);
            ok = ok && agent.UnregisterForProductionEvent(prodCallbackID);
            ok = ok && agent.UnregisterForPrintEvent(printCallbackID);
            ok = ok && agent.RemoveOutputHandler(outputCallbackID);
            ok = ok && agent.UnregisterForOutputNotification(noteCallbackID);
            ok = ok && agent.UnregisterForXMLEvent(xmlCallbackID);
            ok = ok && kernel.UnregisterForAgentEvent(agentCallbackID);
            ok = ok && kernel.UnregisterForSystemEvent(systemCallbackID);
            ok = ok && kernel.UnregisterForUpdateEvent(updateCallbackID);
            ok = ok && kernel.UnregisterForStringEvent(stringCallbackID);
            ok = ok && kernel.RemoveRhsFunction(rhsCallbackID);
            ok = ok && kernel.UnregisterForClientMessageEvent(clientCallbackID);

            if (!ok)
            {
                System.Console.Out.WriteLine("Failed to unregister an event");
                return(false);
            }

            // Close down the kernel (or for a remote connection disconnect from the kernel w/o closing it down).
            kernel.Shutdown();

            return(ok);
        }