Remove game when another Flipper does a join.

This commit is contained in:
Derek Jamison 2023-03-06 21:41:32 -05:00
parent fda2fbcdbb
commit 97b7900a99
3 changed files with 53 additions and 1 deletions

View File

@ -20,10 +20,10 @@ Completed work:
- Receiving a Join game does an ACK (to cause game on joiner to start).
- Log game results & contact info onto SD card.
- Allow viewing past games/scores.
- A join ACK removes it from the list of available games.
Remaining work (for subghz version):
- A join ACK removes it from the list of available games.
- Config - Allow changing hard-coded CONTACT_INFO message.
- Refactor the code, so it has less duplication.
- Write tutorial.

View File

@ -1247,6 +1247,54 @@ static void remote_games_add(GameContext* game_context, GameEvent* game_event) {
furi_mutex_release(game_context->mutex);
}
static void remote_games_remove(GameContext* game_context, GameEvent* game_event) {
furi_assert(game_context);
furi_assert(game_event);
FURI_LOG_I(TAG, "Removing game number %d.", game_event->game_number);
GameInfo* game = remote_games_find(game_context, game_event->game_number + 1);
if(game && game->game_number == game_event->game_number) {
// We found the game, so remove it from the list.
FURI_LOG_I(TAG, "Found game to remove.");
// Check to see if the currently selected game is this game.
if(game_context->data->remote_selected_game == game) {
if(game_context->data->remote_selected_game->next_game) {
// Move to next available game.
game_context->data->remote_selected_game =
game_context->data->remote_selected_game->next_game;
} else {
// Move to first game.
game_context->data->remote_selected_game = game_context->data->remote_games;
}
if(game_context->data->remote_selected_game == game) {
game_context->data->remote_selected_game = NULL;
FURI_LOG_I(TAG, "Clearing remote_selected_game.");
}
}
// Remove the game from the list.
GameInfo* game_previous = remote_games_find(game_context, game->game_number);
if(!game_previous) {
game_context->data->remote_games = game->next_game;
if(game->sender_name) {
furi_string_free(game->sender_name);
}
free(game);
} else {
game_previous->next_game = game->next_game;
if(game->sender_name) {
furi_string_free(game->sender_name);
}
free(game);
}
FURI_LOG_I(TAG, "Done removing game.");
}
}
// Saves a game result to the file system.
// @param game_context pointer to a GameContext.
static void save_result(GameContext* game_context) {
@ -1868,12 +1916,15 @@ int32_t rock_paper_scissors_app(void* p) {
// Take ownership of the name and contact
event.sender_name = NULL;
event.sender_contact = NULL;
} else {
remote_games_remove(game_context, &event);
}
} else {
FURI_LOG_T(
TAG,
"Remote joining another Flipper on game %03u.",
event.game_number);
remote_games_remove(game_context, &event);
}
furi_mutex_release(game_context->mutex);
} else {

View File

@ -419,6 +419,7 @@ static bool remote_games_has_previous(GameContext* game_context);
static void remote_games_next(GameContext* game_context);
static void remote_games_previous(GameContext* game_context);
static void remote_games_add(GameContext* game_context, GameEvent* game_event);
static void remote_games_remove(GameContext* game_context, GameEvent* game_event);
// Saves a game result to the file system.
// @param game_context pointer to a GameContext.