Tweaks to use the ATC/AI interaction framework and respond to downwind report with position in circuit
This commit is contained in:
parent
c76dd941f4
commit
3610b0235c
2 changed files with 77 additions and 4 deletions
|
@ -39,6 +39,7 @@ clearedToLand(false),
|
||||||
clearedToLineUp(false),
|
clearedToLineUp(false),
|
||||||
clearedToTakeOff(false),
|
clearedToTakeOff(false),
|
||||||
holdShortReported(false),
|
holdShortReported(false),
|
||||||
|
downwindReported(false),
|
||||||
longFinalReported(false),
|
longFinalReported(false),
|
||||||
longFinalAcknowledged(false),
|
longFinalAcknowledged(false),
|
||||||
finalReported(false),
|
finalReported(false),
|
||||||
|
@ -58,6 +59,7 @@ clearedToLand(false),
|
||||||
clearedToLineUp(false),
|
clearedToLineUp(false),
|
||||||
clearedToTakeOff(false),
|
clearedToTakeOff(false),
|
||||||
holdShortReported(false),
|
holdShortReported(false),
|
||||||
|
downwindReported(false),
|
||||||
longFinalReported(false),
|
longFinalReported(false),
|
||||||
longFinalAcknowledged(false),
|
longFinalAcknowledged(false),
|
||||||
finalReported(false),
|
finalReported(false),
|
||||||
|
@ -77,6 +79,7 @@ clearedToLand(false),
|
||||||
clearedToLineUp(false),
|
clearedToLineUp(false),
|
||||||
clearedToTakeOff(false),
|
clearedToTakeOff(false),
|
||||||
holdShortReported(false),
|
holdShortReported(false),
|
||||||
|
downwindReported(false),
|
||||||
longFinalReported(false),
|
longFinalReported(false),
|
||||||
longFinalAcknowledged(false),
|
longFinalAcknowledged(false),
|
||||||
finalReported(false),
|
finalReported(false),
|
||||||
|
@ -97,6 +100,7 @@ clearedToLand(false),
|
||||||
clearedToLineUp(false),
|
clearedToLineUp(false),
|
||||||
clearedToTakeOff(false),
|
clearedToTakeOff(false),
|
||||||
holdShortReported(false),
|
holdShortReported(false),
|
||||||
|
downwindReported(false),
|
||||||
longFinalReported(false),
|
longFinalReported(false),
|
||||||
longFinalAcknowledged(false),
|
longFinalAcknowledged(false),
|
||||||
finalReported(false),
|
finalReported(false),
|
||||||
|
@ -250,6 +254,13 @@ void FGTower::Update(double dt) {
|
||||||
// cout << " dt = " << dt << " timeSinceLastDeparture = " << timeSinceLastDeparture << '\n';
|
// cout << " dt = " << dt << " timeSinceLastDeparture = " << timeSinceLastDeparture << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(respond) {
|
||||||
|
if(!responseReqd) SG_LOG(SG_ATC, SG_ALERT, "ERROR - respond is true and responseReqd is false in FGTower::Update(...)");
|
||||||
|
Respond();
|
||||||
|
respond = false;
|
||||||
|
responseReqd = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate the eta of each plane to the threshold.
|
// Calculate the eta of each plane to the threshold.
|
||||||
// For ground traffic this is the fastest they can get there.
|
// For ground traffic this is the fastest they can get there.
|
||||||
// For air traffic this is the middle approximation.
|
// For air traffic this is the middle approximation.
|
||||||
|
@ -326,6 +337,33 @@ void FGTower::Update(double dt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FGTower::Respond() {
|
||||||
|
//cout << "Respond() called\n";
|
||||||
|
TowerPlaneRec* t = FindPlane(responseID);
|
||||||
|
if(t) {
|
||||||
|
// This will grow!!!
|
||||||
|
if(t->downwindReported) {
|
||||||
|
t->downwindReported = false;
|
||||||
|
int i = 1;
|
||||||
|
for(tower_plane_rec_list_iterator twrItr = circuitList.begin(); twrItr != circuitList.end(); twrItr++) {
|
||||||
|
if((*twrItr)->plane.callsign == responseID) break;
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
string trns = "Number ";
|
||||||
|
trns += ConvertNumToSpokenDigits(i);
|
||||||
|
trns += " ";
|
||||||
|
trns += t->plane.callsign;
|
||||||
|
if(display) {
|
||||||
|
globals->get_ATC_display()->RegisterSingleMessage(trns, 0);
|
||||||
|
}
|
||||||
|
freqClear = true; // FIXME - set this to come true after enough time to render the message
|
||||||
|
if(t->isUser && t->opType == TTT_UNKNOWN) {
|
||||||
|
t->opType = CIRCUIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Do one plane from the hold list
|
// Do one plane from the hold list
|
||||||
void FGTower::CheckHoldList(double dt) {
|
void FGTower::CheckHoldList(double dt) {
|
||||||
//cout << "ug\n";
|
//cout << "ug\n";
|
||||||
|
@ -388,7 +426,8 @@ void FGTower::CheckHoldList(double dt) {
|
||||||
trns += " Military";
|
trns += " Military";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(trfc->opType == STRAIGHT_IN || trfc->opType == TTT_UNKNOWN) {
|
//if(trfc->opType == STRAIGHT_IN || trfc->opType == TTT_UNKNOWN) {
|
||||||
|
if(trfc->opType == STRAIGHT_IN) {
|
||||||
double miles_out = CalcDistOutMiles(trfc);
|
double miles_out = CalcDistOutMiles(trfc);
|
||||||
if(miles_out < 2) {
|
if(miles_out < 2) {
|
||||||
trns += " on final";
|
trns += " on final";
|
||||||
|
@ -398,6 +437,7 @@ void FGTower::CheckHoldList(double dt) {
|
||||||
trns += " mile final";
|
trns += " mile final";
|
||||||
}
|
}
|
||||||
} else if(trfc->opType == CIRCUIT) {
|
} else if(trfc->opType == CIRCUIT) {
|
||||||
|
cout << "Getting leg of " << trfc->plane.callsign << '\n';
|
||||||
switch(trfc->leg) {
|
switch(trfc->leg) {
|
||||||
case FINAL:
|
case FINAL:
|
||||||
trns += " on final";
|
trns += " on final";
|
||||||
|
@ -412,7 +452,7 @@ void FGTower::CheckHoldList(double dt) {
|
||||||
trns += " turning base";
|
trns += " turning base";
|
||||||
break;
|
break;
|
||||||
case DOWNWIND:
|
case DOWNWIND:
|
||||||
trns += " in circuit";
|
trns += " in circuit"; // At the moment the user plane is generally flagged as unknown opType when downwind incase its a downwind departure which means we won't get here.
|
||||||
break;
|
break;
|
||||||
// And to eliminate compiler warnings...
|
// And to eliminate compiler warnings...
|
||||||
case TAKEOFF_ROLL: break;
|
case TAKEOFF_ROLL: break;
|
||||||
|
@ -552,7 +592,7 @@ void FGTower::CheckCircuitList(double dt) {
|
||||||
// Need to figure out which leg he's on
|
// Need to figure out which leg he's on
|
||||||
//cout << "rwy.hdg = " << rwy.hdg << " user hdg = " << user_hdg_node->getDoubleValue();
|
//cout << "rwy.hdg = " << rwy.hdg << " user hdg = " << user_hdg_node->getDoubleValue();
|
||||||
double ho = GetAngleDiff_deg(user_hdg_node->getDoubleValue(), rwy.hdg);
|
double ho = GetAngleDiff_deg(user_hdg_node->getDoubleValue(), rwy.hdg);
|
||||||
//cout << " ho = " << ho << '\n';
|
//cout << " ho = " << ho << " abs(ho = " << abs(ho) << '\n';
|
||||||
// TODO FIXME - get the wind and convert this to track, or otherwise use track somehow!!!
|
// TODO FIXME - get the wind and convert this to track, or otherwise use track somehow!!!
|
||||||
// If it's gusty might need to filter the value, although we are leaving 30 degrees each way leeway!
|
// If it's gusty might need to filter the value, although we are leaving 30 degrees each way leeway!
|
||||||
if(abs(ho) < 30) {
|
if(abs(ho) < 30) {
|
||||||
|
@ -1266,8 +1306,34 @@ void FGTower::ReportRunwayVacated(string ID) {
|
||||||
//cout << "Report Runway Vacated Called...\n";
|
//cout << "Report Runway Vacated Called...\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TowerPlaneRec* FGTower::FindPlane(string ID) {
|
||||||
|
tower_plane_rec_list_iterator twrItr;
|
||||||
|
// Do the approach list first
|
||||||
|
for(twrItr = appList.begin(); twrItr != appList.end(); twrItr++) {
|
||||||
|
if((*twrItr)->plane.callsign == ID) return(*twrItr);
|
||||||
|
}
|
||||||
|
// Then the circuit list
|
||||||
|
for(twrItr = circuitList.begin(); twrItr != circuitList.end(); twrItr++) {
|
||||||
|
if((*twrItr)->plane.callsign == ID) return(*twrItr);
|
||||||
|
}
|
||||||
|
// And finally the hold list
|
||||||
|
for(twrItr = holdList.begin(); twrItr != holdList.end(); twrItr++) {
|
||||||
|
if((*twrItr)->plane.callsign == ID) return(*twrItr);
|
||||||
|
}
|
||||||
|
SG_LOG(SG_ATC, SG_WARN, "Unable to find " << ID << " in FGTower::FindPlane(...)");
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void FGTower::ReportDownwind(string ID) {
|
void FGTower::ReportDownwind(string ID) {
|
||||||
|
//cout << "ReportDownwind(...) called\n";
|
||||||
// Tell the plane reporting what number she is in the circuit
|
// Tell the plane reporting what number she is in the circuit
|
||||||
|
TowerPlaneRec* t = FindPlane(ID);
|
||||||
|
if(t) {
|
||||||
|
t->downwindReported = true;
|
||||||
|
responseReqd = true;
|
||||||
|
} else {
|
||||||
|
SG_LOG(SG_ATC, SG_WARN, "WARNING: Unable to find plane " << ID << " in FGTower::ReportDownwind(...)");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ostream& operator << (ostream& os, tower_traffic_type ttt) {
|
ostream& operator << (ostream& os, tower_traffic_type ttt) {
|
||||||
|
|
|
@ -77,6 +77,7 @@ public:
|
||||||
bool clearedToTakeOff;
|
bool clearedToTakeOff;
|
||||||
// ought to add time cleared to depart so we can nag if necessary
|
// ought to add time cleared to depart so we can nag if necessary
|
||||||
bool holdShortReported;
|
bool holdShortReported;
|
||||||
|
bool downwindReported;
|
||||||
bool longFinalReported;
|
bool longFinalReported;
|
||||||
bool longFinalAcknowledged;
|
bool longFinalAcknowledged;
|
||||||
bool finalReported;
|
bool finalReported;
|
||||||
|
@ -152,6 +153,9 @@ private:
|
||||||
FGATCMgr* ATCmgr;
|
FGATCMgr* ATCmgr;
|
||||||
// This is purely for synactic convienience to avoid writing globals->get_ATC_mgr()-> all through the code!
|
// This is purely for synactic convienience to avoid writing globals->get_ATC_mgr()-> all through the code!
|
||||||
|
|
||||||
|
// Respond to a transmission
|
||||||
|
void Respond();
|
||||||
|
|
||||||
void CheckHoldList(double dt);
|
void CheckHoldList(double dt);
|
||||||
|
|
||||||
void CheckCircuitList(double dt);
|
void CheckCircuitList(double dt);
|
||||||
|
@ -160,6 +164,9 @@ private:
|
||||||
|
|
||||||
void CheckApproachList(double dt);
|
void CheckApproachList(double dt);
|
||||||
|
|
||||||
|
// Find a pointer to plane of callsign ID within the internal data structures
|
||||||
|
TowerPlaneRec* FindPlane(string ID);
|
||||||
|
|
||||||
// Figure out if a given position lies on the active runway
|
// Figure out if a given position lies on the active runway
|
||||||
// Might have to change when we consider more than one active rwy.
|
// Might have to change when we consider more than one active rwy.
|
||||||
bool OnActiveRunway(Point3D pt);
|
bool OnActiveRunway(Point3D pt);
|
||||||
|
|
Loading…
Reference in a new issue