aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorXaviDCR92 <xavi.dcr@gmail.com>2017-09-16 03:21:15 +0200
committerXaviDCR92 <xavi.dcr@gmail.com>2017-09-16 03:21:15 +0200
commit6629a61c3bde7a79c7ac32d6bffbc72e31e91fc3 (patch)
tree7a23885577374b5a5760ae4514099feadae312cf /Source
parent0d7af34486f15d8f31f8474f17cad698923cadcb (diff)
downloadairport-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.c115
-rw-r--r--Source/Exe/AIRPORT.elfbin487972 -> 326388 bytes
-rw-r--r--Source/Font.c6
-rw-r--r--Source/Game.c71
-rw-r--r--Source/Game.h2
-rw-r--r--Source/GameGui.c6
-rw-r--r--Source/GameStructures.h17
-rw-r--r--Source/Gfx.c16
-rw-r--r--Source/LoadMenu.c2
-rw-r--r--Source/Makefile2
-rw-r--r--Source/System.c2
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
index b4f52e1..b6a9ea9 100644
--- a/Source/Exe/AIRPORT.elf
+++ b/Source/Exe/AIRPORT.elf
Binary files 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)
/* *************************************