private PortDesc ensurePortAdded(NodeDesc ndesc, PortDesc pdesc)
        {
            if (ndesc.ownedPortIdToPortDesc.ContainsKey(pdesc.id))
            {
                var epd = ndesc.ownedPortIdToPortDesc[pdesc.id];
                if (epd.direction == Dir.UNKNOWN)
                {
                    epd.direction = pdesc.direction;
                }

                if (epd.direction != pdesc.direction)
                {
                    epd.direction = Dir.BIDIR;
                }

                if (epd.type != pdesc.type)
                {
                    throw new Exception("Port conflict. Tried to merge: " + pdesc.ToString() + " with existing " + epd.ToString());
                }

                return(epd);
            }
            else
            {
                ndesc.ownedPortIdToPortDesc.Add(pdesc.id, pdesc);
                return(pdesc);
            }
        }
Example #2
0
        private void btn_upload_Click(object sender, EventArgs e)
        {
            ArduinoSketchUploaderOptions options = new ArduinoSketchUploaderOptions();

            //options.ArduinoModel = ArduinoUploader.Hardware.ArduinoModel.UnoR3;
            options.ArduinoModel = ArduinoUploader.Hardware.ArduinoModel.NanoR3;
            options.FileName     = this.lbl_file.Text;

            PortDesc selectedPort = (PortDesc)this.cmb_ports.SelectedItem;

            options.PortName = selectedPort.DeviceId;


            ArduinoSketchUploader uploader = new ArduinoSketchUploader(options, null, null);

            this.lbl_msg.Text = "Uploading ...";

            uploader.UploadSketch();

            this.lbl_msg.Text = "Upload Completed.";
        }
        private void drawGraph()
        {
            var uiGraphAsset = ebxDataContainers.instances[assetGuid];
            var assetName    = uiGraphAsset.data.get("Name").castTo <ASimpleValue>().Val;

            Graph graph = new Graph(assetName);

            AArray nodes               = uiGraphAsset.data.get("Nodes").castTo <AArray>();
            var    splitNodes          = new HashSet <string>();
            var    portsGuidToPortDesc = new Dictionary <string, PortDesc>();
            /* target port guid, source vertex name */
            var jumpNodeEdges = new List <Tuple <string, string> >();

            int nodeNextIdx = 0;
            int portNextIdx = 0;

            foreach (var nodeRef in nodes.elements)
            {
                var  nodeInRef     = nodeRef.castTo <AIntRef>();
                var  nodeAStruct   = ebxDataContainers.instances[nodeInRef.instanceGuid].data;
                var  nodeName      = nodeAStruct.get("Name").castTo <ASimpleValue>().Val;
                bool isRoot        = Convert.ToBoolean(nodeAStruct.get("IsRootNode").castTo <ASimpleValue>().Val);
                var  nodeContainer = ebxDataContainers.instances[nodeInRef.instanceGuid];
                var  nodeType      = nodeContainer.data.name;
                var  nodeLabel     = "N" + nodeNextIdx.ToString() + ": " + nodeName + "\n[" + nodeType + "]";
                nodeNextIdx += 1;
                var nodeNode = graph.AddNode(nodeLabel);

                var ports = ebxDataContainers.getIntRefedObjsByTypeFor(nodeInRef.instanceGuid, "UINodePort");

                foreach (var dataContainer in ports)
                {
                    var portName = dataContainer.data.get("Name").castTo <ASimpleValue>().Val;
                    var portDesc = new PortDesc(portNextIdx, portName, nodeLabel);
                    portNextIdx += 1;

                    if (!portsGuidToPortDesc.ContainsKey(dataContainer.guid))
                    {
                        portsGuidToPortDesc.Add(dataContainer.guid, portDesc);
                    }
                }

                /* handling special nodes */
                if (nodeContainer.hasPartial("JumpNode"))
                {
                    var targetPortGuid = nodeAStruct.get("TargetPort").castTo <AIntRef>().instanceGuid;
                    jumpNodeEdges.Add(new Tuple <string, string>(targetPortGuid, nodeLabel));
                }
                else if (nodeContainer.hasPartial("SplitterNode"))
                {
                    splitNodes.Add(nodeLabel);
                }

                /* some visual formatting */
                nodeNode.Attr.LabelMargin = 3;
                nodeNode.Attr.Padding     = 2;
                nodeNode.Attr.Shape       = Shape.Box;

                if (isRoot)
                {
                    nodeNode.Attr.FillColor = Color.PaleVioletRed;
                }
                else if (nodeContainer.hasPartial("InstanceOutputNode"))
                {
                    nodeNode.Attr.FillColor = Color.LightBlue;
                }
                else if (nodeContainer.hasPartial("InstanceInputNode"))
                {
                    nodeNode.Attr.FillColor = Color.MediumPurple;
                }
                else
                {
                    nodeNode.Attr.FillColor = Color.LightGreen;
                }
            }

            /* draw ordinary edges */
            var connections = uiGraphAsset.data.get("Connections").castTo <AArray>();

            foreach (var connRef in connections.elements)
            {
                var conn           = ebxDataContainers.instances[connRef.castTo <AIntRef>().instanceGuid].data;
                var srcGuid        = conn.get("SourcePort").castTo <AIntRef>().instanceGuid;
                var targetGuid     = conn.get("TargetPort").castTo <AIntRef>().instanceGuid;
                var srcPortDesc    = portsGuidToPortDesc[srcGuid];
                var targetPortDesc = portsGuidToPortDesc[targetGuid];

                var connLabel = "";
                if (srcPortDesc.portName.Length > 0 || targetPortDesc.portName.Length > 0)
                {
                    connLabel = srcPortDesc.portName + " -> " + targetPortDesc.portName;
                }

                var edge = graph.AddEdge(srcPortDesc.nodeLabel, connLabel, targetPortDesc.nodeLabel);
                edge.Attr.Weight = 10;

                srcPortDesc.refCount    += 1;
                targetPortDesc.refCount += 1;
            }

            /* draw special edges */
            foreach (var jumpEdge in jumpNodeEdges)
            {
                var sourceNode     = jumpEdge.Item2;
                var targetPortGuid = jumpEdge.Item1;

                var targetPortDesc = portsGuidToPortDesc[targetPortGuid];
                var edge           = graph.AddEdge(sourceNode, "", targetPortDesc.nodeLabel);
                targetPortDesc.refCount += 1;

                /* visual formatting */
                edge.Attr.Weight = 1;
                edge.Attr.AddStyle(Style.Dotted);
                edge.Attr.Color = Color.OrangeRed;
            }

            foreach (var portDesc in portsGuidToPortDesc.Values)
            {
                if (portDesc.refCount < 1)
                {
                    var portLabel = "P" + portDesc.portIdx + ": " + portDesc.portName;
                    var portNode  = graph.AddNode(portLabel);

                    var portEdge = graph.AddEdge(portDesc.nodeLabel, "", portLabel);

                    /* visual formatting */
                    portNode.Attr.FillColor         = Color.Orange;
                    portNode.Attr.Shape             = Shape.Box;
                    portEdge.Attr.ArrowheadAtSource = ArrowStyle.None;
                    portEdge.Attr.ArrowheadAtTarget = ArrowStyle.None;
                }
            }

            this.SuspendLayout();
            /* bind graph to viewer; must be bound for RemoveNode/Edge to work */
            viewer.Graph = graph;

            /* remove split nodes */
            if (hideSplittersCheckbox.Checked)
            {
                var nodesToRemove = new List <Node>();
                var edgesToRemove = new List <Edge>();

                foreach (var splitNode in splitNodes)
                {
                    var node = graph.FindNode(splitNode);

                    foreach (var inEdge in node.InEdges)
                    {
                        var inNode = inEdge.SourceNode;

                        foreach (var outEdge in node.OutEdges)
                        {
                            var newEdge = graph.AddEdge(inNode.Id, outEdge.LabelText, outEdge.TargetNode.Id);
                            foreach (var style in outEdge.Attr.Styles)
                            {
                                newEdge.Attr.AddStyle(style);
                            }
                            newEdge.Attr.Color = outEdge.Attr.Color;

                            edgesToRemove.Add(outEdge);
                        }

                        edgesToRemove.Add(inEdge);
                    }

                    nodesToRemove.Add(node);
                }

                foreach (var node in nodesToRemove)
                {
                    graph.RemoveNode(node);
                }
            }

            /* some visual formatting */
            var layoutSettings = new SugiyamaLayoutSettings();

            graph.LayoutAlgorithmSettings = layoutSettings;

            this.ResumeLayout();
            /* assign it once again... */
            viewer.Graph = graph;
        }