AirportFTAClass::AirportFTAClass( const AirportMovingData *moving_data_, const byte *terminals_, const byte num_helipads_, const byte *entry_points_, Flags flags_, const AirportFTAbuildup *apFA, byte delta_z_ ) : moving_data(moving_data_), terminals(terminals_), num_helipads(num_helipads_), flags(flags_), nofelements(AirportGetNofElements(apFA)), entry_points(entry_points_), delta_z(delta_z_) { /* Build the state machine itself */ this->layout = AirportBuildAutomata(this->nofelements, apFA); }
AirportFTAClass::AirportFTAClass( const AirportMovingData *moving_data_, const byte *terminals_, const byte *helipads_, const byte *entry_points_, Flags flags_, const AirportFTAbuildup *apFA, byte delta_z_ ) : moving_data(moving_data_), terminals(terminals_), helipads(helipads_), flags(flags_), nofelements(AirportGetNofElements(apFA)), entry_points(entry_points_), delta_z(delta_z_) { byte nofterminalgroups, nofhelipadgroups; /* Set up the terminal and helipad count for an airport. * TODO: If there are more than 10 terminals or 4 helipads, internal variables * need to be changed, so don't allow that for now */ uint nofterminals = AirportGetTerminalCount(terminals, &nofterminalgroups); if (nofterminals > MAX_TERMINALS) { DEBUG(misc, 0, "[Ap] only a maximum of %d terminals are supported (requested %d)", MAX_TERMINALS, nofterminals); assert(nofterminals <= MAX_TERMINALS); } uint nofhelipads = AirportGetTerminalCount(helipads, &nofhelipadgroups); if (nofhelipads > MAX_HELIPADS) { DEBUG(misc, 0, "[Ap] only a maximum of %d helipads are supported (requested %d)", MAX_HELIPADS, nofhelipads); assert(nofhelipads <= MAX_HELIPADS); } /* Get the number of elements from the source table. We also double check this * with the entry point which must be within bounds and use this information * later on to build and validate the state machine */ for (DiagDirection i = DIAGDIR_BEGIN; i < DIAGDIR_END; i++) { if (entry_points[i] >= nofelements) { DEBUG(misc, 0, "[Ap] entry (%d) must be within the airport (maximum %d)", entry_points[i], nofelements); assert(entry_points[i] < nofelements); } } /* Build the state machine itself */ layout = AirportBuildAutomata(nofelements, apFA); DEBUG(misc, 6, "[Ap] #count %3d; #term %2d (%dgrp); #helipad %2d (%dgrp); entries %3d, %3d, %3d, %3d", nofelements, nofterminals, nofterminalgroups, nofhelipads, nofhelipadgroups, entry_points[DIAGDIR_NE], entry_points[DIAGDIR_SE], entry_points[DIAGDIR_SW], entry_points[DIAGDIR_NW]); /* Test if everything went allright. This is only a rude static test checking * the symantic correctness. By no means does passing the test mean that the * airport is working correctly or will not deadlock for example */ uint ret = AirportTestFTA(nofelements, layout, terminals); if (ret != MAX_ELEMENTS) DEBUG(misc, 0, "[Ap] problem with element: %d", ret - 1); assert(ret == MAX_ELEMENTS); #ifdef DEBUG_AIRPORT AirportPrintOut(nofelements, layout, DEBUG_AIRPORT); #endif }