////////////////////////////////////////////////////////////////////////////////
//
// PathPoints
//
// Module to manage Path Points list
//
////////////////////////////////////////////////////////////////////////////////

variables
{
  struct PathPointPos
  {
    double latitude;
    double longitude;
    double elevation;
    int64  timeStampTai; // TAI ms since 2004
  } ;
  
  struct PathPoints
  {
    word count;    // 0 <= count <= maxCount
    word maxCount; // 1 <= maxCount <= elcount(pos)
    struct PathPointPos pos[40];
  } ;
}

////////////////////////////////////////////////////////////////////////////////
// assign to path point

void API_PathPointPosAssign(struct PathPointPos a, struct PathPointPos b)
{
  a.latitude     = b.latitude     ;
  a.longitude    = b.longitude    ;
  a.elevation    = b.elevation    ;
  a.timestampTai = b.timestampTai ;
}

void API_PathPointPosAssign(struct PathPointPos a, double latitude, double longitude, double elevation, int64 timestampTai)
{
  a.latitude     = latitude     ;
  a.longitude    = longitude    ;
  a.elevation    = elevation    ;
  a.timestampTai = timestampTai ;
}

////////////////////////////////////////////////////////////////////////////////
// initialize path points structure
// maxCount is the max number of path points in the list

void API_PathPointsInit(struct PathPoints pathPoints, word maxCount)
{
  if (maxCount > elCount(pathPoints.pos))
  {
    write("changed max path points from %d to %d.", maxCount, elCount(pathPoints.pos)) ;
    maxCount = elCount(pathPoints.pos) ;
  }
  if (maxCount < 1)
  {
    write("changed max path points from %d to %d.", maxCount, 1) ;
    maxCount = elCount(pathPoints.pos) ;
  }
  
  pathPoints.count = 0 ;
  pathPoints.maxCount = maxCount ;
}

////////////////////////////////////////////////////////////////////////////////
// clear the path points list

void API_PathPointsReset(struct PathPoints pathPoints)
{
  pathPoints.count = 0 ;
}

////////////////////////////////////////////////////////////////////////////////
// add a path point to the list

void API_PathPointsAdd(struct PathPoints pathPoints, double latitude, double longitude, double elevation, int64 timestampTai)
{
  struct PathPointPos pos ;

  API_PathPointPosAssign(pos, latitude, longitude, elevation, timestampTai) ;
  API_PathPointsAdd(pathPoints, pos);
}

void API_PathPointsAdd(struct PathPoints pathPoints, struct PathPointPos pos)
{
  word i ;
  
  if (pathPoints.count == pathPoints.maxCount)
    pathPoints.count -= 1 ;

  for (i = pathPoints.count ; i > 0 ; --i)
  {
    API_PathPointPosAssign(pathPoints.pos[i], pathPoints.pos[i-1]) ;
  }
  
  API_PathPointPosAssign(pathPoints.pos[0], pos) ;
  pathPoints.count += 1 ;
}

////////////////////////////////////////////////////////////////////////////////
// check if ppPos has the same position as the latest position in the list

int API_PathPointsEqualLocation(struct PathPoints pathPoints, struct PathPointPos ppPos)
{
  return
    (pathPoints.pos[0].latitude   == ppPos.latitude ) &&
    (pathPoints.pos[0].longitude  == ppPos.longitude) &&
    (pathPoints.pos[0].elevation  == ppPos.elevation) ; 
}

////////////////////////////////////////////////////////////////////////////////
// EOF
////////////////////////////////////////////////////////////////////////////////
