示例#1
0
        public void addTarget(Station targetStation, byte carType)
        {
            switch (carType)
            {
            case 5:
                carTask = new CarTask(stationDic["F28"], targetStation, stationDic["F28"], carType);
                break;

            case 6:
                carTask = new CarTask(stationDic["F29"], targetStation, stationDic["F29"], carType);
                break;

            case 7:
                carTask = new CarTask(stationDic["F30"], targetStation, stationDic["F30"], carType);
                break;

            case 8:
                carTask = new CarTask(stationDic["F31"], targetStation, stationDic["F31"], carType);
                break;

            default:
                return;
            }
            if (carTask != null)
            {
                mutexCar.WaitOne();
                if (!carTaskQueues[carType].Contains(carTask))
                {
                    carTaskQueues[carType].Enqueue(carTask);
                }
                mutexCar.ReleaseMutex();
                //mutexCar.WaitOne();
                //if (carTaskQueues[carType].Count == 0)
                //{
                //    carTaskQueues[carType].Enqueue(carTask);
                //    if (carQueues[carTaskQueues[carType].First().CarType].Count > 0)
                //    {
                //        MainGUI.RoadTableFrameHandler serialHander = new MainGUI.RoadTableFrameHandler();
                //        if (carQueues[carTaskQueues[carType].First().CarType].First() != null)
                //        {
                //            byte taskLen = serialHander.planRoadTable(mappingRoute, carQueues[carTaskQueues[carType].First().CarType].First().CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic);

                //        }
                //    }
                //}
                //else if (!carTaskQueues[carType].Contains(carTask))
                //{
                //    carTaskQueues[carType].Enqueue(carTask);
                //}
                //mutexCar.ReleaseMutex();
            }
        }
示例#2
0
        public override bool Equals(object obj)
        {
            CarTask task = (CarTask)obj;

            if (task.carType == this.carType)
            {
                if (task.endStation == this.endStation)
                {
                    if (task.startStation == this.startStation)
                    {
                        if (task.targetStation == this.targetStation)
                        {
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
示例#3
0
        private void runCarThread(object o)
        {
            int         reSend    = 3;
            CarTask     carTask   = (CarTask)o;
            Track       trackTogo = new Track();
            int         i;
            Queue <Car> carQueue = carQueues[carTask.CarType];

            if (carQueue.Count == 0)
            {
                return;
            }
            if (carTask.TargetStation == null || (carTask.StartStation.Equals(carTask.TargetStation)))
            {
                return;
            }

            List <Track> list1 = adjList.FindWay(adjList.Find(carTask.StartStation), adjList.Find(carTask.TargetStation));
            List <Track> list2 = adjList.FindWay(adjList.Find(carTask.TargetStation), adjList.Find(stationDic["F32"]));
            List <Track> list3 = adjList.FindWay(adjList.Find(stationDic["F32"]), adjList.Find(carTask.EndStation));
            List <Track> list  = new List <Track>(50);

            list.AddRange(list1);
            list.AddRange(list2);
            list.AddRange(list3);
            List <byte> cardList = new List <byte>(50);

            foreach (Track t in list)
            {
                cardList.Add(stationDic[t.EndStation].CardID);
            }
            Car car = null;

            mutexCar.WaitOne();
            if (carQueue.Count > 0)
            {
                car = carQueue.Dequeue();
            }
            else
            {
                return;
            }
            mutexCar.ReleaseMutex();
            car.TargetStation = carTask.TargetStation;
            carTask.StartStation.OccupiedCar = null;
            while (car.status != 0x53)
            {
                Thread.Sleep(200);
            }
            RoadTableFrameHandler serialHander = new RoadTableFrameHandler();

            car.taskLen = serialHander.planRoadTable(car.CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic);
            Thread.Sleep(5000);
            while (!car.remoteReady())
            {
                serialHander.planRoadTable(car.CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic);
                Thread.Sleep(5000);
                --reSend;
                if (reSend == 0)
                {
                    sp.Close();
                    Thread.Sleep(1000);
                    sp.Open();
                    reSend = 3;
                }
            }
            car.permitPass(sp);
            for (i = 0; i < list.Count; i++)
            {
                Track t = list[i];

                while (true)
                {
                    mutexStationTarget.WaitOne();
                    if (stationDic[t.StartStation].CardID == car.posCard || 0 == i || (cardList.IndexOf(car.posCard) >= i && cardList.IndexOf(car.posCard) <= i + 4))
                    {
                        if (t.StartStation == car.TargetStation.name || t.StartStation == "F32")
                        {
                            if (car.posCard == car.TargetStation.CardID || car.posCard == stationDic["F32"].CardID)
                            {
                                while (car.status == 0x53)
                                {
                                    Thread.Sleep(200);
                                }
                            }
                        }
                        if (stationDic[t.EndStation].targeted == false)
                        {
                            stationDic[t.EndStation].targeted = true;
                            car.permitPass(sp);
                            if (car.lastStation != null)
                            {
                                car.lastStation.targeted = false;
                            }
                            car.lastStation = stationDic[t.EndStation];
                            mutexStationTarget.ReleaseMutex();
                            break;
                        }
                        else
                        {
                            car.forbidPass(sp);
                        }
                    }

                    mutexStationTarget.ReleaseMutex();
                    Thread.Sleep(200);
                }
                trackTogo.clear();
                trackTogo.TrackPointList.AddRange(t.TrackPointList);
                car.run(trackTogo);
            }

            car.RealState     = CarState.CarStop;
            car.TargetStation = null;
            mutexCar.WaitOne();
            car.remoteTaskLen = 0;
            car.taskLen       = 0;
            carTask.EndStation.OccupiedCar = car;
            carQueue.Enqueue(car);
            mutexCar.ReleaseMutex();
        }