using System; using System.Collections.Generic; using System.Collections; using System.Text; using System.Drawing; using MapGoogle; using SafeMobileLib; namespace Safedispatch_4_0 { /// /// This class implements a route /// public class RouteInfo { public Int32 startTime; public Int32 endTime; public Color colorName; public String routeName; public String vehicleName; public int nOfPositions; public ArrayList positions = new ArrayList(); public double[] corners; public bool checkedRoute; public int currentPosition = 0; public int lastPosition = 0; public int samePosCount = 0; // private Locationx[] locations; public String[] Addresses; private Pushpinx ppin; public uint speed; public uint engine; //0 unchecked 1 checked public bool Addr; public int currentLocIndex = 0; public ArrayList LocationArray = new ArrayList(); /// /// The class constructor /// /// start time /// end time /// vehicle name /// route color /// route name /// array with route positions /// array with route events public RouteInfo(Int32 startTimeParam, Int32 endTimeParam, String vehNameParam, Color colorNameParam, String nameParam, Boolean checkedRouteParam) { //int contor=0; startTime = startTimeParam; endTime = endTimeParam; colorName = colorNameParam; vehicleName = vehNameParam; routeName = nameParam; checkedRoute = checkedRouteParam; corners = new double[4]; } /// /// Computes the addresses of the positions /// public void ComputeAddresses(AxMappointControlx mapControl) { int contor = 0; foreach (SMposition obj in positions) { Addresses[contor] = obj.m_address; contor++; } } /// /// Computes the route "boundaries" /// public void ComputeCorners() { corners[0] = corners[2] = 181.00; corners[1] = corners[3] = -181.00; foreach (SMposition obj in positions) { if ((Math.Round(obj.m_lat) == 0) && (Math.Round(obj.m_lng) == 0)) continue; if (corners[0] > obj.m_lat) corners[0] = obj.m_lat; if (corners[1] < obj.m_lat) corners[1] = obj.m_lat; if (corners[2] > obj.m_lng) corners[2] = obj.m_lng; if (corners[3] < obj.m_lng) corners[3] = obj.m_lng; } } /// /// Sets the current position in the route /// /// Position to be set public void SetCurrentPosition(int paramCurrentPosition) { currentPosition = paramCurrentPosition; } /// /// Gets the current position in the route /// /// The current position public SMposition GetCurrentPosition() { return (SMposition)positions[currentPosition]; } /// /// Sets the current position to zero /// public void ResetCurrentPosition() { currentPosition = 0; } /// /// /Returns the position smaller than a given time and closest to it /// /// /// public SMposition LastPositionBeforeGivenTime(Int32 paramGivenTimeStart, Int32 paramGivenTimeEnd, out Int32 paramOutTimeEnd, bool back) { paramOutTimeEnd = paramGivenTimeEnd; if (paramGivenTimeStart >= startTime) { currentPosition = 0; while (((SMposition)positions[currentPosition]).m_time <= paramGivenTimeEnd) if (currentPosition < positions.Count - 1) currentPosition++; else return (SMposition)positions[positions.Count - 1]; if (currentPosition > 0) currentPosition--; if (currentPosition == lastPosition) samePosCount++; else { lastPosition = currentPosition; samePosCount = 0; } if (samePosCount > 4) { if (back) { if (currentPosition>0) currentPosition--; } else currentPosition++; samePosCount = 0; paramOutTimeEnd = ((SMposition)positions[currentPosition]).m_time; return (SMposition)positions[currentPosition]; } else return (SMposition)positions[currentPosition]; } else { return (SMposition)positions[0]; } } /// /// /Returns the position bigger than a given time and closest to it /// /// /// public SMposition FirstPositionBeforeGivenTime(Int32 paramGivenTime) { if (paramGivenTime > startTime) { currentPosition = 0; while (((SMposition)positions[currentPosition]).m_time < paramGivenTime) if (currentPosition < positions.Count-1) currentPosition++; else return (SMposition)positions[0]; if (currentPosition!=0) currentPosition--; return (SMposition)positions[currentPosition]; } else { return (SMposition)positions[positions.Count - 1]; } } /// /// /Returns the position bigger than a given time and closest to it /// /// /// /// //object used to perform various time/date conversions //private ConvertDT convDT = new ConvertDT(); public SMposition FirstPositionAfterGivenTime(Int32 paramGivenTime) { SMposition tmp = null; currentPosition = -1; foreach (SMposition obj in positions) { currentPosition++; if (obj.m_time > paramGivenTime) { tmp = obj; break; } } if (tmp == null) { tmp = (SMposition)positions[positions.Count - 1]; } SM.Debug("TIME GIVEN:" + paramGivenTime.ConvertGMTToLocal().GetDTFromSeconds().ToString() + "\n TIME FIND:" + tmp.m_time.ConvertGMTToLocal().GetDTFromSeconds().ToString()); return tmp; } public void SaveRouteLocations(ArrayList paramLocations, Color colorParam, Int32 StartTimeParam, Int32 StopTimeParam) { LocAndColor tmp = new LocAndColor(); //tmp.location = new Locationx[paramLocations.Length]; /*for (int i = 0; i < paramLocations.Length; i++) { //tmp.location[i] = paramLocations[i]; tmp.latlng.Add(paramLocations[i].Latitude); tmp.latlng.Add(paramLocations[i].Longitude); }*/ foreach (Double obj in paramLocations) tmp.latlng.Add(obj); tmp.color = colorParam; if ((StartTimeParam == 0) && (StopTimeParam == 0)) { tmp.startTime = startTime; tmp.endTime = endTime; } else { tmp.startTime = StartTimeParam; tmp.endTime = StopTimeParam; } LocationArray.Add(tmp); } public ArrayList GetRouteLocations() { return LocationArray; } public void ResetRouteLocations() { LocationArray.Clear(); } public void SetPushpin(Pushpinx pp) { ppin = pp; } public Pushpinx GetPushpin() { return ppin; } public Int32 GetInitialHeading() { return ((SMposition)positions[0]).m_heading; } } public class SimpleRoute { public ArrayList PositionList = new ArrayList(); public int currentPosition = 0; public Int32 startTime=0; public Int32 endTime=0; public int lastPosition = 0; public int samePosCount = 0; public SimpleRoute(ArrayList pos) { foreach (object obj in pos) PositionList.Add(obj); if (pos.Count > 0) { startTime = ((SMposition)pos[0]).m_time; endTime = ((SMposition)pos[pos.Count-1]).m_time; } } public SMposition FirstPositionAfterGivenTime(Int32 paramGivenTime) { SMposition tmp = null; currentPosition = -1; foreach (SMposition obj in PositionList) { currentPosition++; if (obj.m_time > paramGivenTime) { tmp = obj; break; } } if (tmp == null) { tmp = (SMposition)PositionList[PositionList.Count - 1]; } return tmp; } public SMposition FirstPositionBeforeGivenTime(Int32 paramGivenTime) { if (paramGivenTime > startTime) { currentPosition = 0; while (((SMposition)PositionList[currentPosition]).m_time < paramGivenTime) if (currentPosition < PositionList.Count - 1) currentPosition++; else return (SMposition)PositionList[PositionList.Count - 1]; if (currentPosition != 0) currentPosition--; return (SMposition)PositionList[currentPosition]; } else { return (SMposition)PositionList[0]; } } public SMposition LastPositionBeforeGivenTime(Int32 paramGivenTimeStart, Int32 paramGivenTimeEnd, out Int32 paramOutTimeEnd, bool back) { paramOutTimeEnd = paramGivenTimeEnd; if (paramGivenTimeStart >= startTime) { currentPosition = 0; while (((SMposition)PositionList[currentPosition]).m_time <= paramGivenTimeEnd) if (currentPosition < PositionList.Count - 1) currentPosition++; else return (SMposition)PositionList[PositionList.Count - 1]; if (currentPosition > 0) currentPosition--; if (currentPosition == lastPosition) samePosCount++; else { lastPosition = currentPosition; samePosCount = 0; } if (samePosCount > 4) { if (back) { if (currentPosition > 0) currentPosition--; } else currentPosition++; samePosCount = 0; paramOutTimeEnd = ((SMposition)PositionList[currentPosition]).m_time; return (SMposition)PositionList[currentPosition]; } else return (SMposition)PositionList[currentPosition]; } else { return (SMposition)PositionList[0]; } } public SMposition GetCurrentPosition() { return (SMposition)PositionList[currentPosition]; } public void ResetCurrentPosition() { currentPosition = 0; } public Int32 GetInitialHeading() { return ((SMposition)PositionList[0]).m_heading; } } }