init
This commit is contained in:
308
processors/red_sam_battery_tactics.txt
Normal file
308
processors/red_sam_battery_tactics.txt
Normal file
@@ -0,0 +1,308 @@
|
||||
# ****************************************************************************
|
||||
# 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.
|
||||
# ****************************************************************************
|
||||
# * * ************************************** * *
|
||||
# * ****** Demonstration input file ****** *
|
||||
# * ****** UNCLASSIFIED ****** *
|
||||
# * * ************************************** * *
|
||||
|
||||
# this file defines a task manager implementing a generic sam battery
|
||||
|
||||
include_once weapons/sam/sam_launch_computer.txt
|
||||
|
||||
processor RED_SAM_BATTERY_TASK_MGR WSF_TASK_PROCESSOR
|
||||
|
||||
#script_debug_writes on
|
||||
#show_state_transitions
|
||||
#show_task_messages
|
||||
|
||||
track_update_interval 5.0 sec
|
||||
|
||||
script_variables
|
||||
string SENSOR_NAME;
|
||||
string WEAPON_NAME;
|
||||
|
||||
string ENVELOPE = "full_kinematic";
|
||||
|
||||
# the following variable declares the name of the mode used for tracking
|
||||
string SENSOR_ACQUIRE_MODE = "ACQUIRE";
|
||||
string SENSOR_TRACK_MODE = "TRACK";
|
||||
|
||||
# the following variable declares the minimum track quality to
|
||||
# attempt to engage the target
|
||||
double REQUIRED_TRACK_QUALITY = 0.49;
|
||||
|
||||
int SALVO_SIZE = 2;
|
||||
|
||||
# the following are used internally and should not be modified by the user
|
||||
string mAcquireTaskStr = "Acquire";
|
||||
string mTrackTaskStr = "Track";
|
||||
string mShootTaskStr = "Shoot";
|
||||
end_script_variables
|
||||
|
||||
# returns true if weapon is still active for given track
|
||||
script bool FiringNow()
|
||||
return (WeaponsActiveFor(TRACK.TrackId()) > 0);
|
||||
end_script
|
||||
|
||||
# return true if intercept results are known
|
||||
# (i.e. weapons have terminated for this TRACK)
|
||||
script bool InterceptResultsKnown()
|
||||
return (TimeSinceWeaponLastTerminatedFor(TRACK.TrackId()) > 0.0);
|
||||
end_script
|
||||
|
||||
# return true if TRACK is inside the intercept envelope
|
||||
script bool InInterceptEnvelopeOf(string aEnvelopeName)
|
||||
extern bool SAM_LaunchComputer(WsfTrack, WsfPlatform, string, double);
|
||||
return SAM_LaunchComputer(TRACK, PLATFORM, aEnvelopeName, 0.0);
|
||||
end_script
|
||||
|
||||
// returns true if acq_radar is tracking
|
||||
script bool HasDetected()
|
||||
return (TRACK.TrackQuality() > 0.55);
|
||||
end_script
|
||||
|
||||
// returns true if TTR is tracking in acquire mode
|
||||
script bool HasAcquired()
|
||||
return (TRACK.TrackQuality() > 0.75);
|
||||
end_script
|
||||
|
||||
// returns true if TTR is tracking in track mode
|
||||
script bool TrackingNow()
|
||||
return (TRACK.TrackQuality() > 0.95);
|
||||
end_script
|
||||
|
||||
# release resources
|
||||
script void ReleaseResources()
|
||||
CancelTask(TRACK.TrackId());
|
||||
end_script
|
||||
|
||||
# select a weapon and launch it
|
||||
# the selected weapon must be available, have sufficient rounds and not busy
|
||||
script bool LaunchWeapon()
|
||||
WsfWeapon weapon;
|
||||
WsfPlatform platform;
|
||||
foreach (WsfPlatform sub in PLATFORM.Subordinates())
|
||||
{
|
||||
weapon = sub.Weapon(WEAPON_NAME);
|
||||
if (weapon.IsTurnedOn() &&
|
||||
(weapon.QuantityRemaining() >= SALVO_SIZE) &&
|
||||
(TasksAssignedTo(sub, "", weapon.Name()) < 1))
|
||||
{
|
||||
bool canInterceptNow = InInterceptEnvelopeOf(ENVELOPE);
|
||||
if (canInterceptNow)
|
||||
{
|
||||
platform = sub;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool launched = false;
|
||||
if ((weapon.IsValid()) && (!platform.IsNull()))
|
||||
{
|
||||
launched = Fire(TRACK, mShootTaskStr, weapon.Name(), SALVO_SIZE, platform);
|
||||
if (launched)
|
||||
{
|
||||
writeln_d("*** T=", TIME_NOW, " ", platform.Name(), " ",
|
||||
TRACK.TargetName(), " R=", platform.SlantRangeTo(TRACK),
|
||||
" FIRE!!!!");
|
||||
}
|
||||
}
|
||||
return launched;
|
||||
end_script
|
||||
|
||||
# returns true if the TRACK has been assigned or the system has
|
||||
# local engage authority
|
||||
script bool IsAssignable()
|
||||
writeln_d(TIME_NOW, " ", PLATFORM.Name(), " IsAssignable()");
|
||||
writeln_d(" TaskReceivedFor(TRACK) ", TasksReceivedFor(TRACK.TrackId()));
|
||||
writeln_d(" OperatingLevelFor(ENGAGE) ", OperatingLevelFor("ENGAGE"));
|
||||
return ((PLATFORM == PLATFORM.Commander()) ||
|
||||
(TasksReceivedFor(TRACK.TrackId()) > 0) ||
|
||||
(OperatingLevelFor("ENGAGE") > 0));
|
||||
end_script
|
||||
|
||||
# determine the number of available weapons
|
||||
script int WeaponsAvailable(WsfPlatform aAssignee)
|
||||
int quantity = 0;
|
||||
WsfWeapon weapon = aAssignee.Weapon(WEAPON_NAME);
|
||||
if (weapon.IsTurnedOn())
|
||||
{
|
||||
quantity = weapon.QuantityRemaining();
|
||||
}
|
||||
return quantity;
|
||||
end_script
|
||||
|
||||
# determine total number of available weapons
|
||||
script int TotalWeaponsAvailable()
|
||||
int quantity = 0;
|
||||
foreach (WsfPlatform sub in PLATFORM.Subordinates())
|
||||
{
|
||||
quantity = quantity + WeaponsAvailable(sub);
|
||||
}
|
||||
return quantity;
|
||||
end_script
|
||||
|
||||
# begin tracking the current target
|
||||
script bool Engage()
|
||||
bool engaging = false;
|
||||
if (TotalWeaponsAvailable() < 1) return false;
|
||||
writeln_d(TIME_NOW, " ", PLATFORM.Name(), " WeaponsAvailable");
|
||||
foreach (WsfPlatform sub in PLATFORM.Subordinates())
|
||||
{
|
||||
# bypass this subordinate if it already has an assignment for this target
|
||||
writeln_d(" subordinate ", sub.Name());
|
||||
if (TasksAssignedTo(sub, TRACK.TrackId(), mTrackTaskStr) > 0)
|
||||
{
|
||||
writeln_d(" already assigned to ", TRACK.TargetName());
|
||||
continue;
|
||||
}
|
||||
|
||||
WsfSensor sensor = sub.Sensor(SENSOR_NAME);
|
||||
if (! sensor.IsValid())
|
||||
{
|
||||
writeln_d(" sensor ", SENSOR_NAME, " invalid");
|
||||
continue;
|
||||
}
|
||||
|
||||
// the system can only track so many targets
|
||||
if (sensor.ActiveRequestCount(SENSOR_TRACK_MODE) >=
|
||||
sensor.MaximumRequestCount(SENSOR_TRACK_MODE))
|
||||
{
|
||||
writeln_d(" maximum requests met");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (TRACK.BelievedAlive() &&
|
||||
InInterceptEnvelopeOf(ENVELOPE) &&
|
||||
(HasAcquired()))
|
||||
{
|
||||
// track the target
|
||||
engaging = StartTracking(TRACK, mTrackTaskStr, sensor.Name(), SENSOR_TRACK_MODE, sub);
|
||||
if (engaging)
|
||||
{
|
||||
writeln_d(" tracking engaged ", TRACK.TargetName());
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
writeln_d(" unable to track target ", TRACK.TargetName());
|
||||
}
|
||||
}
|
||||
|
||||
if (sensor.ActiveRequestCount(SENSOR_ACQUIRE_MODE) >=
|
||||
sensor.MaximumRequestCount(SENSOR_ACQUIRE_MODE)) continue;
|
||||
|
||||
if (TRACK.BelievedAlive() &&
|
||||
InInterceptEnvelopeOf(ENVELOPE) &&
|
||||
(HasDetected()))
|
||||
{
|
||||
// acquire the target
|
||||
engaging = StartTracking(TRACK, mAcquireTaskStr, sensor.Name(), SENSOR_ACQUIRE_MODE, sub);
|
||||
if (engaging) break;
|
||||
}
|
||||
else
|
||||
{
|
||||
writeln_d(" TRACK.TargetName() ", TRACK.TargetName());
|
||||
writeln_d(" TRACK.BelievedAlive() ", TRACK.BelievedAlive());
|
||||
writeln_d(" InInterceptEnvelopeOf(ENVELOPE) ", InInterceptEnvelopeOf(ENVELOPE));
|
||||
writeln_d(" TRACK.TrackQuality() ", TRACK.TrackQuality());
|
||||
writeln_d(" REQUIRED_TRACK_QUALITY ", REQUIRED_TRACK_QUALITY);
|
||||
writeln_d(" TRACK.TrackQuality() > REQUIRED_TRACK_QUALITY ", TRACK.TrackQuality() > REQUIRED_TRACK_QUALITY);
|
||||
}
|
||||
}
|
||||
|
||||
return engaging;
|
||||
end_script
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
evaluation_interval DETECTED 2.0 sec
|
||||
state DETECTED
|
||||
next_state DETECTED
|
||||
if (TRACK.IFF_Friend())
|
||||
{
|
||||
# cancel any tasks assigned against this track
|
||||
CancelTask(TRACK.TrackId());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
end_next_state
|
||||
|
||||
next_state ENGAGEABLE
|
||||
return (TRACK.BelievedAlive() &&
|
||||
(! TRACK.IFF_Friend()) &&
|
||||
IsAssignable());
|
||||
end_next_state
|
||||
end_state
|
||||
|
||||
evaluation_interval ENGAGEABLE 2.0 sec
|
||||
state ENGAGEABLE
|
||||
next_state DETECTED
|
||||
bool cancel = false;
|
||||
if (TRACK.BelievedDead() ||
|
||||
TRACK.IFF_Friend() ||
|
||||
((TasksAssignedFor(TRACK.TrackId(), "ENGAGE") < 1) &&
|
||||
(! IsAssignable())))
|
||||
{
|
||||
cancel = true;
|
||||
ReleaseResources();
|
||||
}
|
||||
return cancel;
|
||||
end_next_state
|
||||
|
||||
next_state ENGAGE
|
||||
Engage();
|
||||
|
||||
# wait until tracking target
|
||||
return (TrackingNow() &&
|
||||
(TasksAssignedFor(TRACK.TrackId(), mTrackTaskStr) > 0));
|
||||
end_next_state
|
||||
end_state
|
||||
|
||||
evaluation_interval ENGAGE 2.0 sec
|
||||
state ENGAGE
|
||||
next_state ENGAGEABLE
|
||||
bool cancel = false;
|
||||
if (TRACK.BelievedDead() ||
|
||||
(! TrackingNow()) ||
|
||||
(! IsAssignable()))
|
||||
{
|
||||
cancel = true;
|
||||
ReleaseResources();
|
||||
}
|
||||
return cancel;
|
||||
end_next_state
|
||||
|
||||
next_state FIRING
|
||||
bool launched = false;
|
||||
|
||||
if (TRACK.BelievedAlive() &&
|
||||
TrackingNow() &&
|
||||
! FiringNow() &&
|
||||
InInterceptEnvelopeOf(ENVELOPE))
|
||||
{
|
||||
launched = LaunchWeapon();
|
||||
}
|
||||
return launched;
|
||||
end_next_state
|
||||
end_state
|
||||
|
||||
evaluation_interval FIRING 2.0 sec
|
||||
state FIRING
|
||||
next_state ENGAGE
|
||||
return (TRACK.BelievedDead() ||
|
||||
! InInterceptEnvelopeOf(ENVELOPE) ||
|
||||
(! FiringNow() &&
|
||||
(TasksAssignedFor(TRACK.TrackId(), mShootTaskStr) < 1)) ||
|
||||
(TotalWeaponsAvailable() < 1) ||
|
||||
! TrackingNow());
|
||||
end_next_state
|
||||
end_state
|
||||
|
||||
end_processor
|
||||
Reference in New Issue
Block a user