public virtual INode GetNextNode(
                                                INode node,
                                                MultirotorClient client,
                                                IModel graph,
                                                Action<string> writeToMessageBox)
            {
                var outEdges = graph.Edges.Where(x => x.From == node).ToList();
                if (outEdges.Count > 1)
                {
                    writeToMessageBox("Error: Node " + node.Name + " has more than the 1 out edge ");
                    client.Dispose();
                    return null;
                }

                if (outEdges.Count == 0)
                {
                    if (recursionNodes.Count > 0)
                    {
                        return recursionNodes.Pop();
                    }

                    writeToMessageBox("Error: Node " + node.Name +
                                      " has no out edges and it is not the final node ");
                    client.Dispose();
                    return null;
                }

                return (INode)outEdges[0].To;
            }
        /// <summary>
        /// Main execution method
        /// </summary>
        /// <param name="programGraph"> Visual program to execute </param>
        /// <param name="writeToConsole"> Method to writing to console </param>
        public void Execute(IModel programGraph, Action<string> writeToConsole)
        {
            var curNode = this.GetInitNode(programGraph, writeToConsole);
            if (curNode == null)
            {
                return;
            }

            writeToConsole("Running your code");
            var client = new MultirotorClient();
            while (recursionLevel >= 0)
            {
                Execution.Exec.ExecuteNode(ref curNode, client, programGraph, writeToConsole);
                curNode = Execution.Exec.GetNextNode(curNode, client, programGraph, writeToConsole);
                if (curNode == null)
                {
                    return;
                }

                writeToConsole($"Node {curNode.Name} done");
            }

            client.Land();
            client.Dispose();
            writeToConsole("Program done");
        }
示例#3
0
            public override INode GetNextNode(INode node, MultirotorClient client, IModel graph, Action <string> writeToMessageBox)
            {
                var outEdges = graph.Edges.Where(x => x.From == node).ToList();

                if (outEdges.Count != 2)
                {
                    writeToMessageBox("Error: ifNode out edges count is not equal 2 ");
                    client.Dispose();
                    return(null);
                }

                IEdge edge = outEdges[0];

                if (this.condition)
                {
                    return((INode)(edge.Attributes.ToList()[0].StringValue == "true"
                        ? edge.To
                        : outEdges[1].To));
                }
                else
                {
                    return((INode)(edge.Attributes.ToList()[0].StringValue == "false"
                        ? edge.To
                        : outEdges[1].To));
                }
            }