private void UpdateTruck(UITowTruck truck, bool hasTruckChanged, bool isTruckNew) { if (isTruckNew) { towTrucks.Add(truck); //Notify clients about new truck GetClients().addOrUpdateTruck(truck); } else { if (hasTruckChanged) { Util.WriteToLog("HUB: Truck " + truck.TruckNumber + " changed "); truck.LastUpdate = 0; //Notify clients about an existing truck only if truck has "changed" GetClients().addOrUpdateTruck(truck); } else { Util.WriteToLog("HUB: NO CHANGES TO " + truck.TruckNumber); truck.LastUpdate += Convert.ToInt32(ConfigurationManager.AppSettings["UpdateIntervalInMilliseconds"]) / 1000; //Notify clients about an existing truck only if truck has "changed" GetClients().updateLastUpdateTime(truck.TruckNumber, truck.LastUpdate, truck.LastMessage); } } }
private int CleanupTruckList(int iTruckDeleteCount, TowTruckData[] serviceTowTrucks) { for (int i = 0; i < towTrucks.Count(); i++) { try { UITowTruck uiTowTruck = towTrucks[i]; if (!serviceTowTrucks.Any(p => p.TruckNumber == uiTowTruck.TruckNumber.ToString())) { iTruckDeleteCount += 1; uiTowTruck.Old = true; //this ui tow truck is not in service any more. so remove it //towTrucks2.Remove(uiTowTruck); //Hub notification GetClients().deleteTruck(uiTowTruck.TruckNumber); } } catch (Exception ex) { Util.WriteToLog(ex.Message); } } towTrucks.RemoveAll(p => p.Old == true); return(iTruckDeleteCount); }
private bool HasTruckChanged(ref UITowTruck truck, TowTruckData serviceTowTruck) { var returnValue = false; if (truck.Lat != serviceTowTruck.Lat) { returnValue = true; } if (truck.Lon != serviceTowTruck.Lon) { returnValue = true; } if (truck.Speed != serviceTowTruck.Speed) { returnValue = true; } if (truck.Heading != serviceTowTruck.Heading) { returnValue = true; } if (truck.Heading != serviceTowTruck.Heading) { returnValue = true; } if (truck.BeatNumber != serviceTowTruck.BeatNumber.ToString()) { returnValue = true; } if (truck.LastMessage != serviceTowTruck.LastMessage.ToString()) { returnValue = true; } if (truck.DriverName != serviceTowTruck.DriverName.ToString()) { returnValue = true; } if (truck.ContractorName != serviceTowTruck.ContractorName.ToString()) { returnValue = true; } if (truck.Location != serviceTowTruck.Location.ToString()) { returnValue = true; } return(returnValue); }
public void UpdateAllTrucks() { UITowTruck truck = null; int iTruckUpdatesCount = 0; int iTruckDeleteCount = 0; try { TowTruckData[] serviceTowTrucks = GetAllTrucksInService(); var hasTruckChanged = false; var isTruckNew = false; lock (towTrucks) { for (int i = 0; i < serviceTowTrucks.Length; i++) { try { TowTruckData serviceTowTruck = serviceTowTrucks[i]; if (towTrucks.Any(p => p.TruckNumber.ToString() == serviceTowTruck.TruckNumber)) { truck = towTrucks.Single(p => p.TruckNumber == serviceTowTruck.TruckNumber); hasTruckChanged = HasTruckChanged(ref truck, serviceTowTruck); } else { //new tow truck iTruckUpdatesCount += 1; truck = new UITowTruck(); truck.LastUpdate = 0; truck.Old = false; isTruckNew = true; hasTruckChanged = true; } #region Set Truck Properties truck.TruckNumber = serviceTowTruck.TruckNumber == null ? "Not set" : serviceTowTruck.TruckNumber; truck.BeatNumber = serviceTowTruck.BeatNumber == null ? "Not set" : serviceTowTruck.BeatNumber; truck.BeatSegmentNumber = "Not set"; truck.Speed = serviceTowTruck.Speed; truck.Lat = serviceTowTruck.Lat; truck.Lon = serviceTowTruck.Lon; truck.Heading = serviceTowTruck.Heading; truck.LastMessage = serviceTowTruck.LastMessage.ToString(); truck.DriverName = serviceTowTruck.DriverName; truck.ContractorName = serviceTowTruck.ContractorName; truck.Location = serviceTowTruck.Location; #region State truck.VehicleState = serviceTowTruck.VehicleState; if (serviceTowTruck.VehicleState == "Waiting for Driver Login") { truck.VehicleStateIconUrl = "NIS.png"; } else if (serviceTowTruck.VehicleState == "Driver Logged On") { truck.VehicleStateIconUrl = "InService.png"; } else if (serviceTowTruck.VehicleState == "On Patrol") { truck.VehicleStateIconUrl = "InService.png"; } else if (serviceTowTruck.VehicleState == "On Assist") { truck.VehicleStateIconUrl = "OnAssist.png"; } else if (serviceTowTruck.VehicleState == "On Break") { truck.VehicleStateIconUrl = "OnBreak.png"; } else if (serviceTowTruck.Alarms) { if (serviceTowTruck.SpeedingAlarm) { truck.VehicleStateIconUrl = "MajorAlarm.png"; } else if (serviceTowTruck.OutOfBoundsAlarm) { truck.VehicleStateIconUrl = "MajorAlarm.png"; } } else { truck.VehicleStateIconUrl = "OCTA.png"; } #endregion #endregion UpdateTruck(truck, hasTruckChanged, isTruckNew); } catch (Exception ex) { Util.WriteToLog(ex.Message); } } iTruckDeleteCount = CleanupTruckList(iTruckDeleteCount, serviceTowTrucks); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks in local list: " + towTrucks.Count()); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks updated: " + iTruckUpdatesCount); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks deleted: " + iTruckDeleteCount); } } catch (Exception ex) { Util.WriteToLog(ex.Message); } }
void UpdateAllTrucks() { UITowTruck truck = null; int iTruckUpdatesCount = 0; int iTruckDeleteCount = 0; try { Util.WriteToLog(DateTime.Now + " Contacting Service"); TowTruckServiceRef.TowTruckServiceClient service = new TowTruckServiceRef.TowTruckServiceClient(); TowTruckData[] serviceTowTrucks = service.CurrentTrucks(); Util.WriteToLog(DateTime.Now + " " + serviceTowTrucks.Count() + " tow trucks retrieved from Service"); Boolean addTruck = false; Boolean truckHasChanged = false; lock (towTrucks) { for (int i = 0; i < serviceTowTrucks.Length; i++) { try { TowTruckData serviceTowTruck = serviceTowTrucks[i]; //check if this tow truck already exist in list if (towTrucks.Any(p => p.TruckNumber.ToString() == serviceTowTruck.TruckNumber)) { truck = towTrucks.Single(p => p.TruckNumber == serviceTowTruck.TruckNumber); addTruck = false; iTruckUpdatesCount += 1; if (truck.Lat != serviceTowTruck.Lat) { truckHasChanged = true; } if (truck.Lon != serviceTowTruck.Lon) { truckHasChanged = true; } if (truck.Speed != serviceTowTruck.Speed) { truckHasChanged = true; } if (truck.Heading != serviceTowTruck.Heading) { truckHasChanged = true; } if (truck.Heading != serviceTowTruck.Heading) { truckHasChanged = true; } if (truck.BeatNumber != serviceTowTruck.BeatNumber.ToString()) { truckHasChanged = true; } if (truck.LastMessage != serviceTowTruck.LastMessage.ToString()) { truckHasChanged = true; } if (truck.DriverName != serviceTowTruck.DriverName.ToString()) { truckHasChanged = true; } if (truck.ContractorName != serviceTowTruck.ContractorName.ToString()) { truckHasChanged = true; } if (truck.Location != serviceTowTruck.Location.ToString()) { truckHasChanged = true; } } else { //new tow truck iTruckUpdatesCount += 1; truck = new UITowTruck(); truck.LastUpdate = 0; truck.Old = false; addTruck = true; } truck.TruckNumber = serviceTowTruck.TruckNumber == null ? "Not set" : serviceTowTruck.TruckNumber; truck.BeatNumber = serviceTowTruck.BeatNumber == null ? "Not set" : serviceTowTruck.BeatNumber; truck.BeatSegmentNumber = "Not set"; truck.Speed = serviceTowTruck.Speed; truck.Lat = serviceTowTruck.Lat; truck.Lon = serviceTowTruck.Lon; truck.Heading = serviceTowTruck.Heading; truck.LastMessage = serviceTowTruck.LastMessage.ToString(); truck.DriverName = serviceTowTruck.DriverName; truck.ContractorName = serviceTowTruck.ContractorName; truck.Location = serviceTowTruck.Location; #region State truck.VehicleState = serviceTowTruck.VehicleState; if (serviceTowTruck.VehicleState == "Waiting for Driver Login") { truck.VehicleStateIconUrl = "NIS.png"; } else if (serviceTowTruck.VehicleState == "Driver Logged On") { truck.VehicleStateIconUrl = "InService.png"; } else if (serviceTowTruck.VehicleState == "On Patrol") { truck.VehicleStateIconUrl = "InService.png"; } else if (serviceTowTruck.VehicleState == "On Assist") { truck.VehicleStateIconUrl = "OnAssist.png"; } else if (serviceTowTruck.VehicleState == "On Break") { truck.VehicleStateIconUrl = "OnBreak.png"; } else if (serviceTowTruck.Alarms) { if (serviceTowTruck.SpeedingAlarm) { truck.VehicleStateIconUrl = "MajorAlarm.png"; } else if (serviceTowTruck.OutOfBoundsAlarm) { truck.VehicleStateIconUrl = "MajorAlarm.png"; } } else { truck.VehicleStateIconUrl = "OCTA.png"; } #endregion if (addTruck) { towTrucks.Add(truck); //Notify clients about new truck Hub.Clients.addOrUpdateTruck(truck); } else { if (truckHasChanged) { Util.WriteToLog("HUB: Truck " + truck.TruckNumber + " changed "); truck.LastUpdate = 0; //Notify clients about an existing truck only if truck has "changed" Hub.Clients.addOrUpdateTruck(truck); } else { Util.WriteToLog("HUB: NO CHANGES TO " + truck.TruckNumber); truck.LastUpdate += Convert.ToInt32(ConfigurationManager.AppSettings["UpdateIntervalInMilliseconds"]) / 1000; //Notify clients about an existing truck only if truck has "changed" Hub.Clients.updateLastUpdateTime(truck.TruckNumber, truck.LastUpdate, truck.LastMessage); } } } catch (Exception ex) { Util.WriteToLog(ex.Message); } } #region remove try { for (int i = 0; i < towTrucks.Count(); i++) { try { UITowTruck uiTowTruck = towTrucks[i]; if (!serviceTowTrucks.Any(p => p.TruckNumber == uiTowTruck.TruckNumber.ToString())) { iTruckDeleteCount += 1; uiTowTruck.Old = true; //this ui tow truck is not in service any more. so remove it //towTrucks2.Remove(uiTowTruck); //Hub notification Hub.Clients.deleteTruck(uiTowTruck.TruckNumber); } } catch (Exception ex) { Util.WriteToLog(ex.Message); } } towTrucks.RemoveAll(p => p.Old == true); } catch (Exception ex) { Util.WriteToLog(ex.Message); } #endregion Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks in local list: " + towTrucks.Count()); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks updated: " + iTruckUpdatesCount); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks deleted: " + iTruckDeleteCount); } } catch (Exception ex) { Util.WriteToLog(ex.Message); } }
void RunDemo() { try { Random ran = new Random(); int iTruckUpdatesCount = 0; int iTruckDeleteCount = 0; lock (towTrucks) { int NewTruckId = ran.Next(1, 15); if (towTrucks.Any(p => p.TruckNumber == NewTruckId.ToString())) { #region update UITowTruck truck = towTrucks.Single(p => p.TruckNumber == NewTruckId.ToString()); truck.Speed = ran.NextDouble() * 100; //add a degree to heading truck.Heading = truck.Heading + 10; truck.LastUpdate += ran.Next(0, 20); iTruckUpdatesCount += 1; truck.Lat = truck.Lat + ran.Next(0, 1000) / 1000; truck.Lon = truck.Lon + ran.Next(0, 1000) / 1000; if (truck.Lat < 33.6539 || truck.Lat > 33.7939) { truck.Lat = 33.7319; } if (truck.Lon < -117.9597 || truck.Lon > -117.6597) { truck.Lon = -117.7927; } // Notify the connected clients Hub.Clients.addOrUpdateTruck(truck); System.Diagnostics.Debug.WriteLine(DateTime.Now + " HUB: Updating Truck " + truck.TruckNumber); #endregion } else { #region add iTruckUpdatesCount += 1; UITowTruck truck = new UITowTruck(); truck.Old = false; truck.TruckNumber = NewTruckId.ToString(); truck.VehicleStateIconUrl = "NIS.png"; truck.VehicleState = "Waiting for Driver to Login in"; truck.Heading = 20; truck.BeatNumber = ran.Next().ToString(); truck.BeatSegmentNumber = ran.Next().ToString(); truck.ContractorId = 1; truck.Lat = 33.7319 + ran.Next(0, 1000) / 1000; truck.Lon = -117.7927 + ran.Next(0, 1000) / 1000; truck.Speed = 25; truck.LastUpdate = 0; towTrucks.Add(truck); // Notify the connected clients Hub.Clients.addOrUpdateTruck(truck); System.Diagnostics.Debug.WriteLine(DateTime.Now + " HUB: Adding Truck " + truck.TruckNumber); #endregion } #region remove var removeItem = false; //removeItem = NewId % 2 == 0; removeItem = iCounter % 20 == 0; if (removeItem) { UITowTruck truck = towTrucks.FirstOrDefault(); truck.Old = true; //towTrucks2.Remove(truck); Hub.Clients.deleteTruck(truck.TruckNumber); System.Diagnostics.Debug.WriteLine(DateTime.Now + " HUB: Removing Truck " + truck.TruckNumber); towTrucks.RemoveAll(p => p.Old == true); } #endregion } System.Diagnostics.Debug.WriteLine("================Server: Total Number of trucks in local list: " + towTrucks.Count()); System.Diagnostics.Debug.WriteLine("================Server: Total Number of trucks updated: " + iTruckUpdatesCount); System.Diagnostics.Debug.WriteLine("================Server: Total Number of trucks deleted: " + iTruckDeleteCount); iCounter += 1; } catch (Exception ex) { Util.WriteToLog(ex.Message); } }
public void UpdateAllTrucks() { UITowTruck truck = null; int iTruckUpdatesCount = 0; int iTruckDeleteCount = 0; try { TowTruckData[] serviceTowTrucks = GetAllTrucksInService(); var hasTruckChanged = false; var isTruckNew = false; var addTruck = true; lock (towTrucks) { for (int i = 0; i < serviceTowTrucks.Length; i++) { TowTruckData serviceTowTruck = serviceTowTrucks[i]; if (!String.IsNullOrEmpty(_contractorName)) { if (_contractorName == serviceTowTruck.ContractorName) { addTruck = true; } else { addTruck = false; } } else { addTruck = true; } if (addTruck) { try { if (towTrucks.Any(p => p.TruckNumber.ToString() == serviceTowTruck.TruckNumber)) { truck = towTrucks.Single(p => p.TruckNumber == serviceTowTruck.TruckNumber); hasTruckChanged = HasTruckChanged(ref truck, serviceTowTruck); } else { //new tow truck iTruckUpdatesCount += 1; truck = new UITowTruck(); truck.LastUpdate = 0; truck.Old = false; isTruckNew = true; hasTruckChanged = true; } #region Set Truck Properties truck.TruckNumber = serviceTowTruck.TruckNumber == null ? "Not set" : serviceTowTruck.TruckNumber; truck.BeatNumber = serviceTowTruck.BeatNumber == null ? "Not set" : serviceTowTruck.BeatNumber; truck.BeatSegmentNumber = "Not set"; truck.Speed = serviceTowTruck.Speed; truck.Lat = serviceTowTruck.Lat; truck.Lon = serviceTowTruck.Lon; truck.Heading = serviceTowTruck.Heading; truck.LastMessage = serviceTowTruck.LastMessage.ToString(); truck.DriverName = serviceTowTruck.DriverName; truck.ContractorName = serviceTowTruck.ContractorName; truck.Location = serviceTowTruck.Location; truck.SpeedingTime = serviceTowTruck.SpeedingTime.ToString(); truck.SpeedingValue = serviceTowTruck.SpeedingValue.ToString(); truck.OutOfBoundsMessage = serviceTowTruck.OutOfBoundsMessage; truck.OutOfBoundsTime = serviceTowTruck.OutOfBoundsTime.ToString(); truck.HasAlarm = serviceTowTruck.Alarms; truck.LastMessage = serviceTowTruck.LastMessage.ToShortTimeString(); #region State truck.VehicleState = serviceTowTruck.VehicleState; if (serviceTowTruck.VehicleState == "Waiting for Driver Login") { truck.VehicleStateIconUrl = "TBD.png"; } else if (serviceTowTruck.VehicleState == "Driver Logged On") { truck.VehicleStateIconUrl = "LoggedOn.png"; } else if (serviceTowTruck.VehicleState == "On Patrol") { truck.VehicleStateIconUrl = "OnPatrol.png"; } else if (serviceTowTruck.VehicleState == "On Incident") { truck.VehicleStateIconUrl = "OnAssist.png"; } else if (serviceTowTruck.VehicleState == "On Break" || serviceTowTruck.VehicleState == "On Lunch" || serviceTowTruck.VehicleState == "Roll In" || serviceTowTruck.VehicleState == "Roll Out") { truck.VehicleStateIconUrl = "NIS.png"; } else if (serviceTowTruck.Alarms) { //All alarms red (OnAlarm.pn) expect speeding is yellow truck.VehicleStateIconUrl = "Alarm.png"; if (serviceTowTruck.SpeedingAlarm) { truck.VehicleStateIconUrl = "Speeding.png"; } } #endregion #endregion serviceTowTruck = null; UpdateTruck(truck, hasTruckChanged, isTruckNew); } catch (Exception ex) { Util.WriteToLog(ex.Message, "Error.txt"); } } } iTruckDeleteCount = CleanupTruckList(iTruckDeleteCount, serviceTowTrucks); serviceTowTrucks = null; Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks in local list: " + towTrucks.Count(), "Update.txt"); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks updated: " + iTruckUpdatesCount, "Update.txt"); Util.WriteToLog(DateTime.Now + "================Server: Total Number of trucks deleted: " + iTruckDeleteCount, "Update.txt"); } } catch (Exception ex) { Util.WriteToLog(ex.Message, "Error.txt"); } }
//[OutputCache(CacheProfile = "TruckList")] public ActionResult UpdateAllTrucks() { List <UITowTruck> towTrucks = new List <UITowTruck>(); List <TruckState> truckStates = this.GetTruckStates(); try { if (HttpContext.Cache["Trucks"] != null) { towTrucks = (List <UITowTruck>)HttpContext.Cache["Trucks"]; Debug.WriteLine("Returning CACHED truck list: " + DateTime.Now); } else { using (TowTruckServiceClient service = new TowTruckServiceClient()) { TowTruckData[] serviceTowTrucks = service.CurrentTrucks(); for (int i = 0; i < serviceTowTrucks.Length; i++) { #region TowTruckData serviceTowTruck = serviceTowTrucks[i]; UITowTruck truck = new UITowTruck(); try { truck.LastUpdate = 0; truck.Old = false; #region Set Truck Properties truck.TruckNumber = serviceTowTruck.TruckNumber == null ? "Not set" : serviceTowTruck.TruckNumber; truck.BeatNumber = serviceTowTruck.BeatNumber == null ? "Not set" : serviceTowTruck.BeatNumber; truck.BeatSegmentNumber = "Not set"; truck.Speed = serviceTowTruck.Speed; truck.Lat = serviceTowTruck.Lat; truck.Lon = serviceTowTruck.Lon; truck.Heading = serviceTowTruck.Heading; //truck.UserContractorName = this.UsersContractorCompanyName; //the logged in user's contractor name association truck.DriverName = serviceTowTruck.DriverName; truck.ContractorName = serviceTowTruck.ContractorName; truck.Location = serviceTowTruck.OutOfBoundsMessage; if (serviceTowTruck.SpeedingTime.ToString() != "1/1/0001 12:00:00 AM" && serviceTowTruck.SpeedingTime.ToString() != "1/1/2001 12:00:00 AM") { truck.SpeedingTime = serviceTowTruck.SpeedingTime.ToString("hh:mm:ss tt"); } truck.SpeedingValue = serviceTowTruck.SpeedingValue.ToString(); truck.OutOfBoundsMessage = serviceTowTruck.OutOfBoundsMessage; if (serviceTowTruck.OutOfBoundsTime.ToString() != "1/1/0001 12:00:00 AM") { truck.OutOfBoundsTime = serviceTowTruck.OutOfBoundsTime.ToString("hh:mm:ss tt"); } truck.HasAlarm = serviceTowTruck.Alarms; if (serviceTowTruck.LastMessage.ToString() != "1/1/0001 12:00:00 AM") { truck.LastMessage = serviceTowTruck.LastMessage.ToString("hh:mm:ss"); } if (serviceTowTruck.StatusStarted.ToString() != "1/1/0001 12:00:00 AM") { truck.LastStatusChanged = serviceTowTruck.StatusStarted.ToString("hh:mm:ss tt"); } truck.VehicleState = serviceTowTruck.VehicleState; truck.VehicleStateIconUrl = truckStates.Where(p => p.TruckState1 == truck.VehicleState).FirstOrDefault().TruckIcon; if (serviceTowTruck.Alarms && String.IsNullOrEmpty(truck.VehicleState)) { //All alarms red (OnAlarm.png) expect speeding is yellow truck.VehicleStateIconUrl = "Alarm.png"; //Red if (serviceTowTruck.SpeedingAlarm) { truck.VehicleStateIconUrl = "Speeding.png"; //Yellow } } #endregion } catch (Exception ex) { Util.WriteToLog(ex.Message, "Error.txt"); } serviceTowTruck = null; towTrucks.Add(truck); truck = null; #endregion } int refreshRate = 0; Int32.TryParse(ConfigurationManager.AppSettings["ServerRefreshRate"].ToString(), out refreshRate); HttpContext.Cache.Add("Trucks", towTrucks, null, DateTime.Now.AddSeconds(refreshRate), Cache.NoSlidingExpiration, CacheItemPriority.High, null); serviceTowTrucks = null; Debug.WriteLine("Returning FRESH truck list: " + DateTime.Now); } } } catch (Exception ex) { Util.WriteToLog(ex.Message, "Error.txt"); } //check to see if current user is a contractor. Then filter to only "his/her" trucks" if (!String.IsNullOrEmpty(this.UsersContractorCompanyName)) { towTrucks = towTrucks.Where(p => p.ContractorName == this.UsersContractorCompanyName).ToList(); } return(Json(towTrucks.OrderBy(p => p.BeatNumber).ThenBy(p => p.TruckNumber), JsonRequestBehavior.AllowGet)); }