[Résolu] SD init failed

Salut à tous !

Je développe actuellement un petit jeu, tout marche plutôt bien, pour finir j’ajoute la sauvegarde au jeu, je l’ajoute sur la GB en respectant ce topic : https://gamebuino.com/fr/academy/standalone/exportez-et-partager-votre-jeu

Pour tester la sauvegarde, je lance le jeu, j’éteins la GB avec le bouton On/Off, et là c’est le bug !

La GB me dit “SD init Failed” mais j’ai tout de même mon jeu ( mais sans sauvegarde ). Si je quitte le jeu ( start + porte ) j’ai ‘SD init Failed’ + “No games founds”. Si je rallume la GB avec le On/Off elle repart normalement.

Je tiens à dire que je n’ai pas ce problème avec les jeux de base ( Cats and coins, …, UFO Race )
Voici ce que j’ai testé :
Lancer un jeu (même le mien ) + Start + porte + lancer n’importe quel autre jeu ( même le mien ) --> ok
Lancer un jeu (même le mien ) + Reset ( le bouton caché sous la GB ) --> ok
Lancer un jeu ( sauf le mien ) + Off + On --> ok
Lancer mon jeu + Off + On --> j’ai mon jeu mais sans sauvegarde donc bug ( découverte du bug )
Faire un reset à l’étape “No games founds” --> redémarre mais ne change rien, bug

Je viens de formater la carte et tout réinstallé en suivant ce guide : https://gamebuino.com/fr/academy/workshop/start-with-your-gamebuino/update-and-install-games
–> Toujours le même problème

J’ai fait tous ces tests avec un Hello Word, sans .BMP ou .GMV donc je pense que cela ne vient pas de mon jeu :

#include <Gamebuino-Meta.h>

void setup() {
gb.begin();
}

void loop() {
while(!gb.update());
gb.display.clear();

gb.display.print(“hello, world”);
}

Si vous avez une idée je suis preneur :wink: la carte est une 8 Go formatée en FAT 32

Salut @Bedjes, je ne comprends pas bien ce que tu veux dire par “ajouter la sauvegarde”. Qu’as-tu mis sur ta carte SD exactement ?

Juste la sauvegarde du meilleur score, un int avec gb.save.set / gb.save.get

Copie ton code en entier pour qu’on puisse voir, il y a peut-être une erreur à ce niveau là.

tu as peut-être fait une erreur avec gb.save.set qui prends 2 paramètres :

const uint8_t BEST_SCORE_MEM_SLOT = 1;
int score = 35;//un nombre au pif juste pour tester
gb.save.set(BEST_SCORE_MEM_SLOT, score);
//...
gb.save.get(BEST_SCORE_MEM_SLOT);

Et il faut également faire attention à libérer l’emplacement mémoire avant de mettre autre chose dedans sinon le code ne marchera qu’une fois, donc :

int prevScore = gb.save.get(BEST_SCORE_MEM_SLOT);
gb.save.del(BEST_SCORE_MEM_SLOT);
gb.save.set(BEST_SCORE_MEM_SLOT, myScore);
int newScore = gb.save.get(BEST_SCORE_MEM_SLOT);

À mon avis l’erreur doit être quelque part par là.

Salut, merci pour la petite subtilité :wink:

Je ne libérais pas l’emplacement mémoire, je l’ai ajouté juste avant d’écrire sur la carte SD, mais cela ne règle pas le problème.

Voici un lien vers mon google drive, tu as le .bin pour tester directement et les .ino pour lire le code.

Je me sers de la sauvegarde dans le “Bertiman.ino”, dans le setup pour mettre les valeurs par défaut et charger le meilleur score, et dans le “mises_a_jour.ino”, fonction “Update_Best” pour enregistrer le nouveau best score si c’est le cas.

Je viens de remarquer que si je lance un programme depuis l’IDE Arduino ( peu importe le programme, même un Hello Word ) vers la gamebuino, j’ai le programme, ok, et que je fais start + porte ça me met “SD init failed…” + “no games found !” c’est normal ?

J’ai oublié de préciser, j’ai une GB Meta !

Ce que je ne comprends pas c’est que la sauvegarde marche tant que j’éteins pas la GB et si je fait Off/On c’est le drame :rofl:

OK, tu peux déjà essayer de retirer la partie config (qui pour le moment ne sert pas)
=> retire la ligne 27 et la ligne 30 et testes si ça marche mieux

Si c’est ça, on peut regarder les paramètre du config si tu veux le remettre.

Sinon, je te mets ce que j’ai utilisé pour “Invader of Yoda” basé sur le système de sauvegarde qu’avait utilisé Aurélien dans un autre programme:

#define NUM_HIGHSCORE 5
#define NAMELENGTH 12

int highscore[NUM_HIGHSCORE];
char name[NUM_HIGHSCORE][NAMELENGTH+1];

const uint16_t highscore_sound[] PROGMEM = {
  0x0005,0x140,0x150,0x15C,0x170,0x180,0x16C,0x154,0x160,0x174,0x184,0x14C,0x15C,0x168,0x17C,0x18C,0x0000};

void initHighscore(){
  for(byte thisScore = 0; thisScore < NUM_HIGHSCORE; thisScore++){
    highscore[thisScore] = gb.save.get(2*thisScore);
    gb.save.get(2*thisScore + 1, name[thisScore], NAMELENGTH+1);
  }
}

void saveHighscore(unsigned int test_score){
  if(test_score > highscore[NUM_HIGHSCORE-1]){//if it's a highscore
    if(drawNewHighscore(test_score)){
      gb.getDefaultName(name[NUM_HIGHSCORE-1]);
      gb.gui.keyboard("Name", name[NUM_HIGHSCORE-1]);
      highscore[NUM_HIGHSCORE-1] = test_score;
      for(byte i=NUM_HIGHSCORE-1; i>0; i--){ //bubble sorting FTW
        if(highscore[i-1] < highscore[i]){
          char tempName[NAMELENGTH];
          strcpy(tempName, name[i-1]);
          strcpy(name[i-1], name[i]);
          strcpy(name[i], tempName);
          unsigned int tempScore;
          tempScore = highscore[i-1];
          highscore[i-1] = highscore[i];
          highscore[i] = tempScore;
        }
        else{
          break;
        }
      }
      for(byte thisScore = 0; thisScore < NUM_HIGHSCORE; thisScore++){
        gb.save.set(2*thisScore, highscore[thisScore]);
        gb.save.set(2*thisScore + 1, name[thisScore]);
      }
    }
  }
  drawHighScores();
}

+1 pour retirer la partie config defaults qui ne semble pas utile dans ton cas et plutôt source de confusion.

Et sinon il y a aussi un point à noter, sauf erreur de ma part :
Quand tu utilise gb.save.* ton programme crée un fichier SAVE.SAV dans son dossier sur la carte SD. Donc a priori si tu lances un programme qui utilise ces fonctions juste en le téléversant dans la flash il ne sera pas rattaché à son répertoire sur la carte et ne pourra pas créer le fichier donc il risque d’y avoir un problème à un moment donné …

Et après pour l’histoire du loader qui plante quand tu quittes un programme que tu as téléversé je ne vois pas trop… mais ça peut être lié à la présence d’un fichier corrompu sur la carte (peut-être justement à cause de ce fichier SAVE qui serait créé de la mauvaise manière ?.. à voir)

Je te conseille de refaire un ménage sur ta carte SD, et de n’éxécuter ton code (celui qui utilise gb.save) que depuis le fichier .bin . en le chargeant bien depuis la carte et pas en le téléversant. (tu faisait peut-être déjà bien comme ça mais je le souligne au cas où…)

En tout cas de mon côté j’ai testé ton jeu à partir des fichiers sur ton drive, je n’ai pas eu de problème particulier, à part que comme il y a une valeur par défault sur le bloc utilisé pour le meilleur score à 9999 effectivement c’est toujours cette valeur là qui reste… Mais ça ça vient plutôt de la façon dont tu as écrit le code pour le coup.

Merci en tout cas pour le coup de pouce !

J’ai viré la partie config defaults, et le fichier SAVE.SAV
j’ai remis le .bin pour qu’il crée lui même le fichier .SAV proprement, toujours le même problème.

Le fait que quand je téléverse le jeu soit dans la flash j’ai compris ^^ voici donc pourquoi je “perdais” la sauvegarde, mais par contre je ne comprends pas pourquoi ça ne marche pas quand c’est le .bin qui travaille.

Dans la version qui est sur le drive, la valeur par défaut est 0, ce n’est plus 9999 normalement… je fais un nouvel upload. Tu peux me dire si en faisant les même tests que j’ai fait au début du topic tu as les mêmes résultats ? Et si avec la nouvelle version sur le drive, ton score est sauvegardé.

Au niveau de l’exemple de jicehel, ça ressemble à ce que j’ai trouvé sur UFO race, j’avais regardé vite fait.

Je vais finir par tester avec une autre carte sd :rofl:

Je viens de tester avec une autre carde sd… ça marche !

Je pense que ma première carte est juste corrompue :rofl: Merci en tout cas pour votre aide !

Bertiman… une production Bedjes Studio, bientôt sur le Gamebuino Store !

1 Like

J’ai retesté avec ton nouveau fichier. Je n’ai absolument aucun soucis de mon côté, tout marche très bien…

Dans mes souvenir il me semble que le loader de la carte SD peut parfois planter si un des dossiers de jeux est corrompu d’une manière ou d’une autre. Il y a un ou deux jeux comme ça je crois qui m’avaient fait planter tout le truc, leur icone s’échangeait avec celle d’un autre jeu et le loader avait tendance à planter selon le jeu qu’on choisissait… Je n’ai aucune idée si il peut s’agir de quelque chose comme ça dans ton cas.
Je n’ai pas d’autre idée pour t’aider vu que je n’arrive pas à reproduire ton problème :confused: .
Est-ce que ça plante aussi si tu n’as que ton jeu sur la carte SD ?

Ah super ! Solution simple finalement ^^ !
À bientôt sur le store alors :smiley:

Il faut mettre un “résolu” ou fermer la discussion ?

1 Like

Mets seulement [résolu] dans le titre, inutile de fermer le topic au cas où d’autres voudraient régir dessus.

1 Like

Ahhh je trouve pas comment faire :rofl:

1 Like

:smile:
Je l’ai fait pour toi :wink:

1 Like