# ****************************************************************************
# 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

   script_debug_writes  off

   script_variables
      bool tempVariable;

      bool mConsiderFuel                                 = false;

      WsfGeoPoint mCurrentPointIntercept;
     #double                 cSLOW_UPDATE_RATE           = 3.0;
      double                 cINTERCEPT_SPEED            = 1000;    # m/s
      string                 mOldPointStr                = "no point";
   end_script_variables



   precondition
      writeln_d("precondition pursue-point");

      if (!PROCESSOR.IsA_TypeOf("WSF_RIPR_PROCESSOR"))
      {
         return Failure("behavior not attached to a RIPR processor!");
      }

      string anOldPointStr = mOldPointStr;
      mOldPointStr = "no point";

      if (((WsfRIPRProcessor)PROCESSOR).GetRIPRCommanderProcessor().IsValid())
      {
         WsfRIPRJob currentJob = ((WsfRIPRProcessor)PROCESSOR).GetRIPRCommanderProcessor().GetJobFor(TIME_NOW, ((WsfRIPRProcessor)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())
               {
                  ########################################################################
                  ###   print output / comments for any point change
                  ########################################################################
                  mOldPointStr = "Job: " + currentJob.Name() + ", " + currentJob.GetDescription();
                  writeln_d("    - ", mOldPointStr);
                  if (mOldPointStr != anOldPointStr)
                  {
                     PLATFORM.Comment(mOldPointStr);
                  }

                  return true;
               }
            }
         }
      }
      return Failure("current job not a valid pursue-point job");
   end_precondition


   execute
      writeln_d(PLATFORM.Name(), " executing pursue-point, T=", TIME_NOW);

     #PROCESSOR.SetUpdateInterval(cSLOW_UPDATE_RATE);
      PLATFORM.GoToSpeed(cINTERCEPT_SPEED);
      extern double cDEFAULT_ALTITUDE;
      PLATFORM.GoToAltitude(cDEFAULT_ALTITUDE, 200);

      if (!mCurrentPointIntercept.IsValid())
      {
         #PLATFORM.Comment("ignoring invalid point");
         return;
      }
      double interceptAltitude = mCurrentPointIntercept.Altitude();
      if (interceptAltitude < 0)
      {
         #PLATFORM.Comment("ignoring invalid point");
         return;
      }

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

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

      ##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


