コード例 #1
0
 public PackageDatagram(PackageDatagram p)
 {
     ID_start = p.ID_start;
     ID_finish = p.ID_finish;
     Size = p.Size;
     Way = new List<int>(p.Way);
     Request = p.Request;
     Start_time = p.Start_time;
     Finish_time = p.Finish_time;
     Ending = p.Ending;
 }
コード例 #2
0
        public void executePackage()
        {
            if (BufLogicalConnection.Count > 0)
            {
                if (!BufLogicalConnection[0].Permission)
                    return;

                if (TactsCurrent < TactsNeeded * BufLogicalConnection[0].Size / PackageLogicalConnection.MAX_SIZE_SERVICE)
                {
                    TactsCurrent++;
                    return;
                }

                TactsCurrent = 0;

                if (BufLogicalConnection[0].Service)
                    MainForm.CountServiceAccepted++;
                else
                    MainForm.CountInfoAccepted++;

                BufLogicalConnection[0].Way.RemoveAt(0);

                if (BufLogicalConnection[0].Request)
                {
                    if (BufLogicalConnection[0].Way.Count == 0)
                    {
                        MainForm.Count_service_sent++;

                        Node node_start = MainForm.findNodeInListById(BufLogicalConnection[0].ID_start, MainForm.Nodes);
                        Node node_finish = MainForm.findNodeInListById(BufLogicalConnection[0].ID_finish, MainForm.Nodes);

                        List<int> way_to_home = new List<int>(Ways.findWayNodeToNode(node_start, node_finish));
                        way_to_home.Reverse();

                        BufLogicalConnection[0] = new PackageLogicalConnection(BufLogicalConnection[0].ID_start, BufLogicalConnection[0].ID_finish, PackageLogicalConnection.MAX_SIZE_SERVICE, way_to_home, true, false, true, BufLogicalConnection[0].Start_time);

                        return;
                    }

                    foreach (Channel channel in MainForm.findNodeInListById(this.ID_end, MainForm.Nodes).directConnections)
                        if (channel.ID_end == BufLogicalConnection[0].Way[0])
                        {
                            if (BufLogicalConnection[0].Service)
                                MainForm.Count_service_sent++;
                            else
                                MainForm.CountInfoSent++;

                            channel.BufLogicalConnection.Add(new PackageLogicalConnection(BufLogicalConnection[0]));

                            BufLogicalConnection.RemoveAt(0);

                            return;
                        }
                }

                if (BufLogicalConnection[0].Way.Count == 0)
                {
                    if (BufLogicalConnection.Count > 1)
                    {
                        if (BufLogicalConnection[1].Service)
                            MainForm.Count_service_sent++;
                        else
                            MainForm.CountInfoSent++;

                        BufLogicalConnection[1].getPermission();
                    }

                    if (BufLogicalConnection.Count == 1)
                    {
                        BufLogicalConnection[0].Finish_time = MainForm.tacts_counter;
                        MainForm.accepted_logical_connection.Add(new PackageLogicalConnection(BufLogicalConnection[0]));
                    }

                    if (BufLogicalConnection.Count > 2 && BufLogicalConnection[1].Service && !BufLogicalConnection[2].Service)
                    {
                        BufLogicalConnection[0].Finish_time = MainForm.tacts_counter;
                        MainForm.accepted_logical_connection.Add(new PackageLogicalConnection(BufLogicalConnection[0]));
                    }

                    BufLogicalConnection.RemoveAt(0);

                    return;
                }

                //MainForm.Count_service_sent++;

                if (BufLogicalConnection.Count > 1)
                    BufLogicalConnection[1].getPermission();

                foreach (Channel channel in MainForm.findNodeInListById(BufLogicalConnection[0].Way[0], MainForm.Nodes).directConnections)
                    if (channel.ID_end == this.ID_start)
                    {
                        if (BufLogicalConnection[0].ID_start == channel.ID_start)
                        {
                            MainForm.Count_service_sent++;
                            channel.BufLogicalConnection.Insert(0, new PackageLogicalConnection(BufLogicalConnection[0]));
                            BufLogicalConnection.RemoveAt(0);
                            return;
                        }
                        else
                        {
                            if (channel.BufLogicalConnection.Count > 0)
                                channel.BufLogicalConnection[0].getPermission();
                            channel.BufLogicalConnection.Add(new PackageLogicalConnection(BufLogicalConnection[0]));
                            BufLogicalConnection.RemoveAt(0);
                            return;
                        }
                    }
            }
            else if (BufDatagram.Count > 0)
            {
                if (!MainForm.findNodeInListById(ID_start, MainForm.Nodes).State || !MainForm.findNodeInListById(ID_end, MainForm.Nodes).State)
                {
                    BufDatagram.RemoveAt(0);
                    TactsCurrent = 0;
                    return;
                }

                if (TactsCurrent < TactsNeeded * BufDatagram[0].Size / PackageDatagram.SizeServicePackage)
                {
                    TactsCurrent++;
                    return;
                }

                TactsCurrent = 0;

                if (BufDatagram[0].Request)
                    MainForm.CountInfoAccepted++;
                else
                    MainForm.CountServiceAccepted++;

                BufDatagram[0].Way.RemoveAt(0);

                if (BufDatagram[0].Request)
                {
                    if (BufDatagram[0].Way.Count == 0)
                    {
                        MainForm.Count_service_sent++;

                        Node node_start = MainForm.findNodeInListById(BufDatagram[0].ID_start, MainForm.Nodes);
                        Node node_finish = MainForm.findNodeInListById(BufDatagram[0].ID_finish, MainForm.Nodes);

                        List<int> way_to_home = new List<int>(Ways.findWayNodeToNode(node_start, node_finish));
                        way_to_home.Reverse();
                        way_to_home.RemoveAt(0);

                        BufDatagram[0] = new PackageDatagram(BufDatagram[0].ID_start, BufDatagram[0].ID_finish, PackageDatagram.SizeServicePackage, way_to_home, false, BufDatagram[0].Start_time, BufDatagram[0].Ending);

                        return;
                    }

                    foreach (Channel channel in MainForm.findNodeInListById(this.ID_end, MainForm.Nodes).directConnections)
                        if (channel.ID_end == BufDatagram[0].Way[0])
                        {
                            MainForm.CountInfoSent++;

                            channel.BufDatagram.Add(new PackageDatagram(BufDatagram[0]));

                            BufDatagram.RemoveAt(0);

                            return;
                        }
                }

                if (BufDatagram[0].Way.Count == 0)
                {
                    if (BufDatagram[0].Ending)
                    {
                        BufDatagram[0].Finish_time = MainForm.tacts_counter;
                        MainForm.accepted_datagram.Add(new PackageDatagram(BufDatagram[0]));
                    }

                    BufDatagram.RemoveAt(0);

                    return;
                }

                MainForm.Count_service_sent++;

                foreach (Channel channel in MainForm.findNodeInListById(BufDatagram[0].Way[0], MainForm.Nodes).directConnections)
                    if (channel.ID_end == this.ID_start)
                    {
                        channel.BufDatagram.Add(new PackageDatagram(BufDatagram[0]));
                        BufDatagram.RemoveAt(0);
                        return;
                    }
            }
        }