//------------------------------------------------------------------------------ // stepOwnshipPlayer() -- Step to the next local player //------------------------------------------------------------------------------ void SimStation::stepOwnshipPlayer() { Basic::PairStream* pl = getSimulation()->getPlayers(); if (pl != nullptr) { Simulation::Player* f = nullptr; Simulation::Player* n = nullptr; bool found = false; // Find the next player Basic::List::Item* item = pl->getFirstItem(); while (item != nullptr) { Basic::Pair* pair = static_cast<Basic::Pair*>(item->getValue()); if (pair != nullptr) { Simulation::Player* ip = static_cast<Simulation::Player*>(pair->object()); if ( ip->isMode(Simulation::Player::ACTIVE) && ip->isLocalPlayer() && ip->isClassType(typeid(Simulation::AirVehicle)) ) { if (f == nullptr) { f = ip; } // Remember the first if (found) { n = ip; ; break; } if (ip == getOwnship()) found = true; } } item = item->getNext(); } if (found && n == nullptr) n = f; if (n != nullptr) setOwnshipPlayer(n); pl->unref(); } }
//------------------------------------------------------------------------------ // setOwnshipByName() -- set our ownship by name //------------------------------------------------------------------------------ bool Station::setOwnshipByName(const char* const newOS) { bool set = false; Basic::PairStream* pl = 0; if (sim != 0) pl = sim->getPlayers(); // Look for this ownship in our list of players if (newOS != 0 && pl != 0) { Basic::Pair* p = pl->findByName(newOS); if (p != 0) { Player* newOwnship = (Player*) p->object(); if (newOwnship != ownship) { // Ok, we found the new ownship and it IS a different // player then the previous ownship ... setOwnshipPlayer( newOwnship ); set = true; } } // Cleanup pl->unref(); pl = 0; } return set; }
//------------------------------------------------------------------------------ // shutdownNotification() -- We're shutting down //------------------------------------------------------------------------------ bool Station::shutdownNotification() { // Tell the interoperability networks that we're shutting down if (networks != 0) { Basic::List::Item* item = networks->getFirstItem(); while (item != 0) { Basic::Pair* pair = (Basic::Pair*)(item->getValue()); Basic::Component* p = dynamic_cast<Basic::Component*>(pair->object()); p->event(SHUTDOWN_EVENT); item = item->getNext(); } } setSlotNetworks(0); // Tell the I/O devices that we're shutting down if (ioHandlers != 0) { Basic::List::Item* item = ioHandlers->getFirstItem(); while (item != 0) { Basic::Pair* pair = (Basic::Pair*)(item->getValue()); Basic::Component* p = dynamic_cast<Basic::Component*>(pair->object()); p->event(SHUTDOWN_EVENT); item = item->getNext(); } } setSlotIoHandler((Basic::PairStream*)0); // Tell our simulation to shut down Simulation* s = getSimulation(); if (s != 0) { s->event(SHUTDOWN_EVENT); } setOwnshipPlayer(0); // Inform our OTW interfaces if (otw != 0) { Basic::List::Item* item = otw ->getFirstItem(); while (item != 0) { Basic::Pair* pair = (Basic::Pair*)(item->getValue()); Basic::Component* p = dynamic_cast<Basic::Component*>(pair->object()); p->event(SHUTDOWN_EVENT); item = item->getNext(); } } setSlotOutTheWindow((Basic::PairStream*)0); // Zero (unref) our thread objects (of any). The thread's functions have ref()'d // these objects, so they won't be deleted until the threads terminate, which they // will based on our BaseClass::isShutdown() function. But at least we won't // mistakenly think that they're still around. tcThread = 0; netThread = 0; bgThread = 0; // remove the reset timer setSlotStartupResetTime(0); return BaseClass::shutdownNotification(); }
//------------------------------------------------------------------------------ // deleteData() -- delete member data //------------------------------------------------------------------------------ void Station::deleteData() { // Terminate any old threads setTcThread(0); setNetThread(0); setBgThread(0); // Clear our pointers setOwnshipPlayer(0); setSlotOutTheWindow((Basic::PairStream*)0); setSlotNetworks(0); setSlotIoHandler((Basic::PairStream*)0); setSlotSimulation(0); setSlotStartupResetTime(0); }