Ejemplo n.º 1
0
        //Thread: Update Passenger and BusLine info
        private void AtBusStopActivity()
        {
            RoadStop currentStop = StopBase.StopTable[Stops[localid % Stops.Count]];

            lock (currentStop)
            {
                //Passengers alight---------------------------------
                //Bus Report
                BusReportMsg alightMessage = new BusReportMsg();
                alightMessage.busLine  = this.BusLineName;
                alightMessage.isBoard  = false;
                alightMessage.stopName = currentStop.StopName;
                alightMessage.time     = System.DateTime.Now;
                alightMessage.busId    = (uint)BusLineNo;
                HashSet <ulong> alightAddresses = new HashSet <ulong>();

                //Terminal Stop
                if (localid % Stops.Count == Stops.Count - 1)
                {
                    foreach (Passenger p in this.OnBoard)
                    {
                        currentStop.Passengers.Add(p);
                    }
                    foreach (Passenger p in this.OnBoard)
                    {
                        alightAddresses.Add(p.CellPhoneAddress);
                    }
                    this.OnBoard.Clear();
                }
                //Other Stops
                else
                {
                    List <Passenger> removeList = new List <Passenger>();
                    foreach (Passenger p in this.OnBoard)
                    {
                        if (!p.NextAction().Equals(this.BusLineName))
                        {
                            removeList.Add(p);
                            currentStop.Passengers.Add(p);
                        }
                    }
                    foreach (Passenger p in removeList)
                    {
                        alightAddresses.Add(p.CellPhoneAddress);
                        //Remove on board
                        this.OnBoard.Remove(p);
                    }
                }
                alightMessage.cellPhoneAddrSet = alightAddresses;
                if (alightMessage.cellPhoneAddrSet.Count != 0)
                {
                    netComm.SendMsg(alightMessage);
                }

                //Pick up passengers---------------------------------
                List <Passenger> removeList2  = new List <Passenger>();
                BusReportMsg     boardMessage = new BusReportMsg();
                boardMessage.busLine  = this.BusLineName;
                boardMessage.isBoard  = true;
                boardMessage.stopName = currentStop.StopName;
                boardMessage.time     = System.DateTime.Now;
                boardMessage.busId    = (uint)BusLineNo;
                HashSet <ulong> boardAddresses = new HashSet <ulong>();

                foreach (Passenger p in currentStop.Passengers)
                {
                    if (p.NextAction().Equals(this.BusLineName))
                    {
                        this.OnBoard.Add(p);
                        boardAddresses.Add(p.CellPhoneAddress);
                        removeList2.Add(p);
                    }
                }
                foreach (Passenger p in removeList2)
                {
                    currentStop.Passengers.Remove(p);
                }

                //Bus Report
                boardMessage.cellPhoneAddrSet = boardAddresses;
                if (boardMessage.cellPhoneAddrSet.Count != 0)
                {
                    netComm.SendMsg(boardMessage);
                }

                OnBoardDesc = GetOnBoardDesc();
            }

            //Spend some time at the bus stop
            Thread.Sleep(rn.Next(1000, 6000));

            mre.WaitOne();
            Parent.Dispatcher.Invoke(new UpdateBusInfo(UpdateBusInfoDelegate));
        }