* 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.
This commit is contained in:
XaviDCR92 2017-09-16 03:21:15 +02:00
parent 0d7af34486
commit 6629a61c3b
13 changed files with 226 additions and 109 deletions

View File

@ -6,26 +6,28 @@
#For example:
14:55
#Aircraft arrival (or departure) must be set relative to initial time, in HH:MM format.
ARRIVAL;PHX1802;100;00:10;0;360
ARRIVAL;PHX2015;100;00:10;0;360
ARRIVAL;PHX2016;100;00:40;0;360
ARRIVAL;PHX2017;100;00:50;0;360
ARRIVAL;PHX2018;100;01:40;0;360
ARRIVAL;PHX2019;100;01:20;0;360
ARRIVAL;PHX2020;100;02:00;0;360
ARRIVAL;PHX2021;100;00:05;0;360
ARRIVAL;PHX2022;100;00:15;0;360
ARRIVAL;PHX2023;100;00:45;0;360
ARRIVAL;PHX2024;100;01:45;0;360
ARRIVAL;PHX2025;100;01:20;0;360
ARRIVAL;PHX2026;100;01:10;0;360
DEPARTURE;PHX1000;100;00:05;19;180
DEPARTURE;PHX1001;100;00:15;19;180
DEPARTURE;PHX1002;100;00:30;19;180
DEPARTURE;PHX1003;100;00:45;19;180
DEPARTURE;PHX1004;100;01:10;19;180
DEPARTURE;PHX1280;100;01:30;19;180
DEPARTURE;PHX1332;100;00:50;21;180
DEPARTURE;PHX1333;100;01:00;19;180
DEPARTURE;PHX1334;100;01:15;21;180
DEPARTURE;PHX1336;100;01:20;21;180
#ARRIVAL;PHX1802;100;00:10;0;360
#ARRIVAL;PHX2015;100;00:10;0;360
#ARRIVAL;PHX2016;100;00:40;0;360
#ARRIVAL;PHX2017;100;00:50;0;360
#ARRIVAL;PHX2018;100;01:40;0;360
#ARRIVAL;PHX2019;100;01:20;0;360
#ARRIVAL;PHX2020;100;02:00;0;360
#ARRIVAL;PHX2021;100;00:05;0;360
#ARRIVAL;PHX2022;100;00:15;0;360
#ARRIVAL;PHX2023;100;00:45;0;360
#ARRIVAL;PHX2024;100;01:45;0;360
#ARRIVAL;PHX2025;100;01:20;0;360
#ARRIVAL;PHX2026;100;01:10;0;360
#DEPARTURE;PHX1000;100;00:05;19;180
#DEPARTURE;PHX1001;100;00:15;19;180
#DEPARTURE;PHX1002;100;00:30;19;180
#DEPARTURE;PHX1003;100;00:45;19;180
#DEPARTURE;PHX1004;100;01:10;19;180
#DEPARTURE;PHX1280;100;01:30;19;180
#DEPARTURE;PHX1332;100;00:50;21;180
#DEPARTURE;PHX1333;100;01:00;19;180
#DEPARTURE;PHX1334;100;01:15;21;180
#DEPARTURE;PHX1336;100;01:20;21;180
ARRIVAL;PHX2026;120;00:05;0;360
ARRIVAL;PHX2026;80;00:10;0;360

View File

@ -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 (ptrOtherAircraft->State == STATE_IDLE)
{
continue;
}
if (i == j)
{
continue;
}
else if (j < i)
else
{
// Collision already calculated.
continue;
// 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 (AircraftData[j].State == STATE_IDLE)
{
continue;
}
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)

Binary file not shown.

View File

@ -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)
{

View File

@ -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;
}
}

View File

@ -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__

View File

@ -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),

View File

@ -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;

View File

@ -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();

View File

@ -426,8 +426,6 @@ void ISR_LoadMenuVBlank(void)
LOADING_BAR_Y + LOADING_BAR_HEIGHT + 8,
strCurrentFile );
//FontSetFlags(&SmallFont, FONT_NOFLAGS);
GfxDrawScene_Fast();
}

View File

@ -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

View File

@ -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)
/* *************************************

View File

@ -6,26 +6,28 @@
#For example:
14:55
#Aircraft arrival (or departure) must be set relative to initial time, in HH:MM format.
ARRIVAL;PHX1802;100;00:10;0;360
ARRIVAL;PHX2015;100;00:10;0;360
ARRIVAL;PHX2016;100;00:40;0;360
ARRIVAL;PHX2017;100;00:50;0;360
ARRIVAL;PHX2018;100;01:40;0;360
ARRIVAL;PHX2019;100;01:20;0;360
ARRIVAL;PHX2020;100;02:00;0;360
ARRIVAL;PHX2021;100;00:05;0;360
ARRIVAL;PHX2022;100;00:15;0;360
ARRIVAL;PHX2023;100;00:45;0;360
ARRIVAL;PHX2024;100;01:45;0;360
ARRIVAL;PHX2025;100;01:20;0;360
ARRIVAL;PHX2026;100;01:10;0;360
DEPARTURE;PHX1000;100;00:05;19;180
DEPARTURE;PHX1001;100;00:15;19;180
DEPARTURE;PHX1002;100;00:30;19;180
DEPARTURE;PHX1003;100;00:45;19;180
DEPARTURE;PHX1004;100;01:10;19;180
DEPARTURE;PHX1280;100;01:30;19;180
DEPARTURE;PHX1332;100;00:50;21;180
DEPARTURE;PHX1333;100;01:00;19;180
DEPARTURE;PHX1334;100;01:15;21;180
DEPARTURE;PHX1336;100;01:20;21;180
#ARRIVAL;PHX1802;100;00:10;0;360
#ARRIVAL;PHX2015;100;00:10;0;360
#ARRIVAL;PHX2016;100;00:40;0;360
#ARRIVAL;PHX2017;100;00:50;0;360
#ARRIVAL;PHX2018;100;01:40;0;360
#ARRIVAL;PHX2019;100;01:20;0;360
#ARRIVAL;PHX2020;100;02:00;0;360
#ARRIVAL;PHX2021;100;00:05;0;360
#ARRIVAL;PHX2022;100;00:15;0;360
#ARRIVAL;PHX2023;100;00:45;0;360
#ARRIVAL;PHX2024;100;01:45;0;360
#ARRIVAL;PHX2025;100;01:20;0;360
#ARRIVAL;PHX2026;100;01:10;0;360
#DEPARTURE;PHX1000;100;00:05;19;180
#DEPARTURE;PHX1001;100;00:15;19;180
#DEPARTURE;PHX1002;100;00:30;19;180
#DEPARTURE;PHX1003;100;00:45;19;180
#DEPARTURE;PHX1004;100;01:10;19;180
#DEPARTURE;PHX1280;100;01:30;19;180
#DEPARTURE;PHX1332;100;00:50;21;180
#DEPARTURE;PHX1333;100;01:00;19;180
#DEPARTURE;PHX1334;100;01:15;21;180
#DEPARTURE;PHX1336;100;01:20;21;180
ARRIVAL;PHX2026;120;00:05;0;360
ARRIVAL;PHX2026;80;00:10;0;360