# ****************************************************************************
# CUI
#
# The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
#
# The use, dissemination or disclosure of data in this file is subject to
# limitation or restriction. See accompanying README and LICENSE for details.
# ****************************************************************************




behavior pursue-point_pathing

   script_variables
      bool tempVariable;
      WsfGeoPoint mCurrentPointIntercept;
      double                 cSLOW_UPDATE_RATE         = 3.0;
      double                 cINTERCEPT_SPEED          = 1000;    # m/s
   end_script_variables



   precondition
      writeln("precondition pursue-point_pathing");
      if (!PLATFORM.GetPathFinder().IsValid())
      {
         writeln("no path-finder available");
         return false;
      }
      if (PROCESSOR.GetRIPRCommanderProcessor().IsValid())
      {
         WsfRIPRJob currentJob = PROCESSOR.GetRIPRCommanderProcessor().GetJobFor(TIME_NOW, PROCESSOR);
         if (currentJob.IsValid())
         {
            // If we're supposed to fly towards a point, go for it!
            if (currentJob.Name() == "pursue-point")
            {
               mCurrentPointIntercept = (WsfGeoPoint)currentJob.GetData("targetPoint");
               if (mCurrentPointIntercept.IsValid())
               {
                  return true;
               }
            }
         }
      }
      return false;
   end_precondition


   execute
      writeln("executing pursue-point_pathing.");
      PROCESSOR.SetUpdateInterval(cSLOW_UPDATE_RATE);
      PLATFORM.GoToSpeed(cINTERCEPT_SPEED);
      extern double cDEFAULT_ALTITUDE;
      PLATFORM.GoToAltitude(cDEFAULT_ALTITUDE, 200);

      double interceptAltitude = mCurrentPointIntercept.Altitude();
      double interceptHeading  = PLATFORM.TrueBearingTo(mCurrentPointIntercept);
      double interceptRange    = PLATFORM.SlantRangeTo(mCurrentPointIntercept);

      writeln_d("    T=", TIME_NOW, ", range: ", interceptRange, " true-bearing: ", interceptHeading);

      WsfGeoPoint startGeoPoint = PLATFORM.Location();

      if (!PLATFORM.FindAndSetPath(startGeoPoint, mCurrentPointIntercept))
      {
         PLATFORM.FollowRoute("DEFAULT_ROUTE","CLOSEST_POINT");
      }

     #if ( (interceptAltitude - PLATFORM.Altitude()) > 5)
      if ( (interceptAltitude - PLATFORM.Altitude()) > 10000*MATH.M_PER_FT())
      {
         writeln_d("GoToAltitude: ",interceptAltitude);
         #PLATFORM.GoToAltitude(interceptAltitude);
      }

   end_execute

end_behavior

