From 6629a61c3bde7a79c7ac32d6bffbc72e31e91fc3 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Sat, 16 Sep 2017 03:21:15 +0200 Subject: * 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. --- Source/Aircraft.c | 115 +++++++++++++++++++++++++++++++++++------------- Source/Exe/AIRPORT.elf | Bin 487972 -> 326388 bytes Source/Font.c | 6 ++- Source/Game.c | 71 ++++++++++++++++++++++++++---- Source/Game.h | 2 + Source/GameGui.c | 6 ++- Source/GameStructures.h | 17 +++---- Source/Gfx.c | 16 +++---- Source/LoadMenu.c | 2 - Source/Makefile | 2 +- Source/System.c | 2 +- 11 files changed, 176 insertions(+), 63 deletions(-) (limited to 'Source') 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 index b4f52e1..b6a9ea9 100644 Binary files a/Source/Exe/AIRPORT.elf and b/Source/Exe/AIRPORT.elf differ 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) /* ************************************* -- cgit v1.2.3