SafeDispatch/Safedispatch_4_0/RouteInfo.cs

373 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Drawing;
using MapGoogle;
using SafeMobileLib;
namespace Safedispatch_4_0
{
/// <summary>
/// This class implements a route
/// </summary>
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();
/// <summary>
/// The class constructor
/// </summary>
/// <param name="startTimeParam">start time</param>
/// <param name="endTimeParam">end time</param>
/// <parm name="vehNameParam">vehicle name</parm>
/// <param name="colorNameParam">route color</param>
/// <param name="nameParam">route name</param>
/// <param name="positionsParam">array with route positions</param>
/// <param name="actEventsParam">array with route events</param>
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];
}
/// <summary>
/// Computes the addresses of the positions
/// </summary>
public void ComputeAddresses(AxMappointControlx mapControl)
{
int contor = 0;
foreach (SMposition obj in positions)
{
Addresses[contor] = obj.m_address;
contor++;
}
}
/// <summary>
/// Computes the route "boundaries"
/// </summary>
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;
}
}
/// <summary>
/// Sets the current position in the route
/// </summary>
/// <param name="paramCurrentPosition">Position to be set</param>
public void SetCurrentPosition(int paramCurrentPosition)
{
currentPosition = paramCurrentPosition;
}
/// <summary>
/// Gets the current position in the route
/// </summary>
/// <returns>The current position</returns>
public SMposition GetCurrentPosition()
{
return (SMposition)positions[currentPosition];
}
/// <summary>
/// Sets the current position to zero
/// </summary>
public void ResetCurrentPosition()
{
currentPosition = 0;
}
/// <summary>
/// /Returns the position smaller than a given time and closest to it
/// </summary>
/// <param name="paramGivenTime"></param>
/// <returns></returns>
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];
}
}
/// <summary>
/// /Returns the position bigger than a given time and closest to it
/// </summary>
/// <param name="paramGivenTime"></param>
/// <returns></returns>
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];
}
}
/// <summary>
/// /Returns the position bigger than a given time and closest to it
/// </summary>
/// <param name="paramGivenTime"></param>
/// <returns></returns>
/// //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;
}
}
}