diff options
| author | XaviDCR92 <xavi.dcr@gmail.com> | 2017-09-16 03:21:15 +0200 |
|---|---|---|
| committer | XaviDCR92 <xavi.dcr@gmail.com> | 2017-09-16 03:21:15 +0200 |
| commit | 6629a61c3bde7a79c7ac32d6bffbc72e31e91fc3 (patch) | |
| tree | 7a23885577374b5a5760ae4514099feadae312cf /Source | |
| parent | 0d7af34486f15d8f31f8474f17cad698923cadcb (diff) | |
| download | airport-6629a61c3bde7a79c7ac32d6bffbc72e31e91fc3.tar.gz | |
* Removed unneeded -g flag from Makefile.
* Aircraft now prevents collision against other aircraft if state == STATE_TAXIING.
* Game: new event handlers for new Aircraft collision prevention algorithm.
* Font: although not compulsory, _blend_effect_lum should be volatile.
* Other minor changes.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Aircraft.c | 115 | ||||
| -rw-r--r-- | Source/Exe/AIRPORT.elf | bin | 487972 -> 326388 bytes | |||
| -rw-r--r-- | Source/Font.c | 6 | ||||
| -rw-r--r-- | Source/Game.c | 71 | ||||
| -rw-r--r-- | Source/Game.h | 2 | ||||
| -rw-r--r-- | Source/GameGui.c | 6 | ||||
| -rw-r--r-- | Source/GameStructures.h | 17 | ||||
| -rw-r--r-- | Source/Gfx.c | 16 | ||||
| -rw-r--r-- | Source/LoadMenu.c | 2 | ||||
| -rw-r--r-- | Source/Makefile | 2 | ||||
| -rw-r--r-- | Source/System.c | 2 |
11 files changed, 176 insertions, 63 deletions
diff --git a/Source/Aircraft.c b/Source/Aircraft.c index cb99c09..7d7c799 100644 --- a/Source/Aircraft.c +++ b/Source/Aircraft.c @@ -80,6 +80,7 @@ static void AircraftAttitude(TYPE_AIRCRAFT_DATA* ptrAircraft); static void AircraftUpdateSpriteFromData(TYPE_AIRCRAFT_DATA* ptrAircraft);
static void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft);
static bool AircraftCheckCollision(TYPE_AIRCRAFT_DATA* ptrRefAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft);
+static bool AircraftCheckPath(TYPE_AIRCRAFT_DATA* ptrAicraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft);
void AircraftInit(void)
{
@@ -234,6 +235,7 @@ void AircraftHandler(void) {
TYPE_AIRCRAFT_DATA* ptrAircraft = &AircraftData[i];
uint8_t j;
+ bool collision_warning = false;
if (ptrAircraft->State == STATE_IDLE)
{
@@ -250,40 +252,102 @@ void AircraftHandler(void) {
TYPE_AIRCRAFT_DATA* ptrOtherAircraft = &AircraftData[j];
- if (i == j)
+ if (ptrOtherAircraft->State == STATE_IDLE)
{
continue;
}
- else if (j < i)
- {
- // Collision already calculated.
- continue;
- }
- if (AircraftData[j].State == STATE_IDLE)
+ if (i == j)
{
continue;
}
+ else
+ {
+ // Check whether aircraft should stop in order to avoid collision against
+ // other aircraft.
+ // WARNING: only STATE_TAXIING can be used to automatically stop an aircraft
+ // when calling GameStopFlight() or GameResumeFlightFromAutoStop().
+ collision_warning = AircraftCheckPath(ptrAircraft, ptrOtherAircraft);
+ }
+
+ if (j > i)
+ {
+ if (AircraftCheckCollision(ptrAircraft, ptrOtherAircraft) == true)
+ {
+ GameAircraftCollision(ptrAircraft->FlightDataIdx);
+ break;
+ }
+ }
+ else
+ {
+ // Collision already calculated.
+ }
- if (AircraftCheckCollision(ptrAircraft, ptrOtherAircraft) == true)
- {
- GameAircraftCollision(ptrAircraft->FlightDataIdx);
- break;
- }
}
+ if (collision_warning == true)
+ {
+ GameStopFlight(ptrAircraft->FlightDataIdx);
+ }
+ else
+ { + GameResumeFlightFromAutoStop(ptrAircraft->FlightDataIdx); + }
+
+
ptrAircraft->State = GameGetFlightDataStateFromIdx(ptrAircraft->FlightDataIdx);
}
}
+bool AircraftCheckPath(TYPE_AIRCRAFT_DATA* ptrAircraft, TYPE_AIRCRAFT_DATA* ptrOtherAircraft)
+{ + uint16_t currentTile = AircraftGetTileFromFlightDataIndex(ptrAircraft->FlightDataIdx);
+ uint16_t nextTile = 0; // Keep compiler happy
+ uint16_t otherAircraft_currentTile = AircraftGetTileFromFlightDataIndex(ptrOtherAircraft->FlightDataIdx);
+
+ switch (ptrAircraft->Direction)
+ {
+ case AIRCRAFT_DIR_EAST:
+ nextTile = currentTile + 1;
+ break;
+
+ case AIRCRAFT_DIR_WEST:
+ nextTile = currentTile - 1;
+ break;
+
+ case AIRCRAFT_DIR_NORTH:
+ nextTile = currentTile - GameGetLevelColumns();
+ break;
+
+ case AIRCRAFT_DIR_SOUTH:
+ nextTile = currentTile - GameGetLevelColumns();
+ break;
+
+ case AIRCRAFT_DIR_NO_DIRECTION:
+ // Fall through
+ default:
+ Serial_printf("AircraftCheckPath: Undefined direction\n");
+ return false;
+ }
+
+ if ( (otherAircraft_currentTile == nextTile)
+ ||
+ (otherAircraft_currentTile == currentTile) )
+ {
+ if (ptrOtherAircraft->Speed == 0)
+ {
+ // Make ptrAircraft stop if ptrOtherAircraft is nearby and not moving!
+ return true;
+ }
+ }
+
+ return false; +}
+
void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft)
{
switch(ptrAircraft->State)
{
- case STATE_STOPPED:
- ptrAircraft->Speed = 0;
- break;
-
case STATE_FINAL:
ptrAircraft->Speed = AircraftSpeedsTable[AIRCRAFT_SPEED_FINAL];
break;
@@ -300,6 +364,10 @@ void AircraftSpeed(TYPE_AIRCRAFT_DATA* ptrAircraft) ptrAircraft->Speed = AircraftSpeedsTable[AIRCRAFT_SPEED_GROUND];
break;
+ case STATE_USER_STOPPED:
+ // Fall through
+ case STATE_AUTO_STOPPED:
+ // Fall through
case STATE_READY_FOR_TAKEOFF:
// Fall through
case STATE_UNBOARDING:
@@ -688,21 +756,6 @@ TYPE_AIRCRAFT_DATA* AircraftFromFlightDataIndex(uint8_t index) }
return &AircraftData[idx];
-
- /*uint8_t i;
- TYPE_AIRCRAFT_DATA* ptrAircraft;
-
- for (i = 0; i < GAME_MAX_AIRCRAFT; i++)
- {
- ptrAircraft = &AircraftData[i];
-
- if (ptrAircraft->FlightDataIdx == index)
- {
- return ptrAircraft;
- }
- }
-
- return NULL;*/
}
void AircraftFromFlightDataIndexAddTargets(uint8_t index, uint16_t* targets)
diff --git a/Source/Exe/AIRPORT.elf b/Source/Exe/AIRPORT.elf Binary files differindex b4f52e1..b6a9ea9 100644 --- a/Source/Exe/AIRPORT.elf +++ b/Source/Exe/AIRPORT.elf diff --git a/Source/Font.c b/Source/Font.c index 5907594..3a216b8 100644 --- a/Source/Font.c +++ b/Source/Font.c @@ -24,7 +24,7 @@ * *************************************/
static char _internal_text[FONT_INTERNAL_TEXT_BUFFER_MAX_SIZE];
-static unsigned char _blend_effect_lum;
+static volatile unsigned char _blend_effect_lum;
bool FontLoadImage(char* strPath, TYPE_FONT * ptrFont)
{
@@ -107,6 +107,8 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) va_list ap;
+ // Do not print anything if either 1Hz or 2Hz flags are configured
+ // and 1/2Hz signal has not been yet emitted by Gfx.
if (ptrFont->flags & FONT_1HZ_FLASH)
{
if (Gfx1HzFlash() == false)
@@ -149,7 +151,7 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...) y += ptrFont->char_h;
break;
default:
- if ( (ptrFont->flags & FONT_WRAP_LINE) && (ptrFont->max_ch_wrap != 0) )
+ if ( (ptrFont->flags & FONT_WRAP_LINE) && (ptrFont->max_ch_wrap != 0) )
{
if (++line_count >= ptrFont->max_ch_wrap)
{
diff --git a/Source/Game.c b/Source/Game.c index 2fc14ad..614905d 100644 --- a/Source/Game.c +++ b/Source/Game.c @@ -2344,21 +2344,20 @@ void GameSelectAircraftFromList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFli break; } } - - Serial_printf("aircraftState = %d\n", aircraftState); - Serial_printf("AircraftIdx = %d\n", AircraftIdx); } else if (ptrPlayer->PadKeySinglePress_Callback(PAD_L1) == true) { - FL_STATE* AircraftState = &FlightData.State[ptrPlayer->FlightDataSelectedAircraft]; + FL_STATE* ptrAircraftState = &FlightData.State[ptrPlayer->FlightDataSelectedAircraft]; - if (*AircraftState == STATE_TAXIING) + if (*ptrAircraftState == STATE_TAXIING) { - *AircraftState = STATE_STOPPED; + *ptrAircraftState = STATE_USER_STOPPED; } - else if (*AircraftState == STATE_STOPPED) + else if ( (*ptrAircraftState == STATE_USER_STOPPED) + || + (*ptrAircraftState == STATE_AUTO_STOPPED) ) { - *AircraftState = STATE_TAXIING; + *ptrAircraftState = STATE_TAXIING; } } } @@ -3948,3 +3947,59 @@ void GameAircraftCollision(uint8_t AircraftIdx) GameAircraftCollisionFlag = true; GameAircraftCollisionIdx = AircraftIdx; } + +/* ******************************************************************************************* + * + * @name: void GameAircraftCollision(uint8_t AircraftIdx) + * + * @author: Xavier Del Campo + * + * @param: + * + * uint8_t AircraftIdx: + * Index from FlightData. + * + * @brief: + * Event triggered by Aircraft when aircraft A is getting close to non-moving aircraft B + * and a security stop must be done in order to avoid collision. + * + * *******************************************************************************************/ + +void GameStopFlight(uint8_t AircraftIdx) +{ + FL_STATE* ptrState = &FlightData.State[AircraftIdx]; + + if (*ptrState == STATE_TAXIING) + { + // Only allow auto stop under taxi + *ptrState = STATE_AUTO_STOPPED; + } +} + +/* ******************************************************************************************* + * + * @name: void GameAircraftCollision(uint8_t AircraftIdx) + * + * @author: Xavier Del Campo + * + * @param: + * + * uint8_t AircraftIdx: + * Index from FlightData. + * + * @brief: + * Event triggered by Aircraft when aircraft A is no longer getting close to aircraft B, so + * that taxiing can be resumed. + * + * *******************************************************************************************/ + +void GameResumeFlightFromAutoStop(uint8_t AircraftIdx) +{ + FL_STATE* ptrState = &FlightData.State[AircraftIdx]; + + if (*ptrState == STATE_AUTO_STOPPED) + { + // Only recovery to STATE_TAXIING is allowed. + *ptrState = STATE_TAXIING; + } +} diff --git a/Source/Game.h b/Source/Game.h index 5683cda..d6bbaf7 100644 --- a/Source/Game.h +++ b/Source/Game.h @@ -46,4 +46,6 @@ bool GameInsideLevelFromIsoPos(TYPE_ISOMETRIC_FIX16_POS* ptrIsoPos); void GameRemoveFlight(uint8_t idx, bool successful); void GameCalculateRemainingAircraft(void); void GameAircraftCollision(uint8_t AircraftIdx); +void GameStopFlight(uint8_t AicraftIdx); +void GameResumeFlightFromAutoStop(uint8_t AircraftIdx); #endif //__GAME_HEADER__ diff --git a/Source/GameGui.c b/Source/GameGui.c index 6ec89f2..a6eda0a 100644 --- a/Source/GameGui.c +++ b/Source/GameGui.c @@ -602,7 +602,7 @@ void GameGuiAircraftList(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlightData FontPrintText(&SmallFont, AIRCRAFT_LOCK_TARGET_TEXT_X, AIRCRAFT_LOCK_TARGET_TEXT_Y, "Lock target");
}
- if (ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] == STATE_STOPPED)
+ if (ptrFlightData->State[ptrPlayer->FlightDataSelectedAircraft] == STATE_USER_STOPPED)
{
GfxDrawButton(AIRCRAFT_STOP_X, AIRCRAFT_STOP_Y, PAD_L1);
FontPrintText(&SmallFont, AIRCRAFT_STOP_TEXT_X, AIRCRAFT_STOP_TEXT_Y, "Resume taxiing");
@@ -863,7 +863,9 @@ void GameGuiShowAircraftData(TYPE_PLAYER* ptrPlayer, TYPE_FLIGHT_DATA* ptrFlight "Holding" );
break;
- case STATE_STOPPED:
+ case STATE_USER_STOPPED:
+ // Fall through
+ case STATE_AUTO_STOPPED:
FontPrintText( &SmallFont,
AircraftDataDirection_X + AircraftDataState_X_Offset,
AircraftDataDirection_Y + (AIRCRAFT_DATA_FLIGHT_GSGPOLY4_H * j),
diff --git a/Source/GameStructures.h b/Source/GameStructures.h index 0b5358f..9c43163 100644 --- a/Source/GameStructures.h +++ b/Source/GameStructures.h @@ -46,7 +46,8 @@ typedef enum t_flstate STATE_CLIMBING,
STATE_APPROACH,
STATE_FINAL,
- STATE_STOPPED,
+ STATE_USER_STOPPED,
+ STATE_AUTO_STOPPED,
STATE_LANDED
}FL_STATE;
@@ -203,12 +204,12 @@ typedef struct typedef enum t_fontflags
{
- FONT_NOFLAGS = 0,
- FONT_CENTERED = 0x01,
- FONT_WRAP_LINE = 0x02,
- FONT_BLEND_EFFECT = 0x04,
- FONT_1HZ_FLASH = 0x08,
- FONT_2HZ_FLASH = 0x10
+ FONT_NOFLAGS = 1 << 0,
+ FONT_CENTERED = 1 << 1,
+ FONT_WRAP_LINE = 1 << 2,
+ FONT_BLEND_EFFECT = 1 << 3,
+ FONT_1HZ_FLASH = 1 << 4,
+ FONT_2HZ_FLASH = 1 << 5
}FONT_FLAGS;
typedef struct t_Font
@@ -220,7 +221,7 @@ typedef struct t_Font char init_ch;
uint8_t char_per_row;
uint8_t max_ch_wrap;
- FONT_FLAGS flags;
+ volatile FONT_FLAGS flags;
short spr_w;
short spr_h;
short spr_u;
diff --git a/Source/Gfx.c b/Source/Gfx.c index 5110442..798151c 100644 --- a/Source/Gfx.c +++ b/Source/Gfx.c @@ -179,18 +179,10 @@ void GfxSetPrimitiveList(void) void GfxDrawScene_Fast(void) { - enum - { - FPS_INFO_X = 16, - FPS_INFO_Y = 16 - }; - SystemDevMenu(); FontSetFlags(&SmallFont, FONT_NOFLAGS); - FontPrintText(&SmallFont, FPS_INFO_X, FPS_INFO_Y, "%d/%d", SystemGetFPS(), REFRESH_FREQUENCY); - if (System1SecondTick() == true) { one_second_show = one_second_show? false:true; @@ -213,10 +205,18 @@ bool GfxReadyForDMATransfer(void) void GfxDrawScene(void) { + enum + { + FPS_INFO_X = 16, + FPS_INFO_Y = 16 + }; + while ( (SystemRefreshNeeded() == false) || (GfxIsGPUBusy() == true) ); + FontPrintText(&SmallFont, FPS_INFO_X, FPS_INFO_Y, "%d/%d", SystemGetFPS(), REFRESH_FREQUENCY); + GfxDrawScene_Fast(); SystemCyclicHandler(); diff --git a/Source/LoadMenu.c b/Source/LoadMenu.c index 4aa6221..60b00a7 100644 --- a/Source/LoadMenu.c +++ b/Source/LoadMenu.c @@ -426,8 +426,6 @@ void ISR_LoadMenuVBlank(void) LOADING_BAR_Y + LOADING_BAR_HEIGHT + 8, strCurrentFile ); - //FontSetFlags(&SmallFont, FONT_NOFLAGS); - GfxDrawScene_Fast(); } diff --git a/Source/Makefile b/Source/Makefile index c6c98a0..1e058bc 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -17,7 +17,7 @@ DEFINE += -DNO_INTRO # Compiler flags LIBS= -lfixmath -CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors -g +CC_FLAGS = -Wall -Werror -c -Os -Wfatal-errors # Path definitions PSXSDK_PATH = /usr/local/psxsdk diff --git a/Source/System.c b/Source/System.c index 675b0aa..4cc7266 100644 --- a/Source/System.c +++ b/Source/System.c @@ -18,7 +18,7 @@ #define END_STACK_PATTERN (uint32_t) 0x18022015 #define BEGIN_STACK_ADDRESS (uint32_t*) 0x801FFF00 -#define STACK_SIZE 0x1000 +#define STACK_SIZE (4 << 10) // 4 KB #define I_MASK (*(volatile unsigned int*)0x1F801074) /* ************************************* |
