Dev NDS Kramateur

Tuto Liblobby

Salut !
Suite à des demandes pour les sources de DS2DS (à propos de LibLobby), j'ai décidé de faire le tuto le plus complet et simple possible (parce que je ne veux pas distribuer les sources de DS2DS (pour le moment Tongue)).

 

Pour toutes questions, LIEN.

Sommaire :
I) - Installation et inclusions.
II) - Initialisation de la librairie.
III) - Envoi et réception de données.
IV) - Aller plus loin : LibLobby et AS_lib.

 


I) - Installation et inclusions.

Tout d'abord, il vous faut LibLobby. Une fois téléchargé, dé-7zez-le directement dans le dossier "devkitpro". Voilà ! Vous avez installé LibLobby.

Maintenant, vous voulez créer un homebrew utilisant Lilobby. Allez donc dans le makefile de votre projet et cherchez :

Code:
ARM7_SELECTED = ARM7_BASIC
#ARM7_SELECTED = ARM7_MOD_DSWIFI
#ARM7_SELECTED = ARM7_MOD_LIBLOBBY
#ARM7_SELECTED = ARM7_MP3_DSWIFI
#ARM7_SELECTED = ARM7_MP3_LIBLOBBY
#ARM7_SELECTED = ARM7_MIKMOD_DSWIFI
#USE_EFS = YES


Mettez # devant ARM7_SELECTED = ARM7_BASIC et enlevez celle devant #ARM7_SELECTED = ARM7_MOD_LIBLOBBY ou #ARM7_SELECTED = ARM7_MP3_LIBLOBBY (UN seul des deux !!!) suivant que vous vouliez utiliser du mod ou du MP3 dans votre projet.

Enregistrez et fermez le makefile.

Ouvrez le dossier C:\devkitPro\liblobby\include et copiez les fichiers lobby.h / MessageQueue.h / 802.11.h dans le dossier source de votre projet.

Ouvrez votre projet et rajoutez en plus de vos includes :

Code
(c):
#include "MessageQueue.h" #include "802.11.h" #include "lobby.h"

 


II) - Initialisation de la librairie.

Une fois votre librairie installée et prête à l'emploi, il vous faut l'initialiser.
Avant toute chose, il faut savoir que LibLobby a besoin d'être actualisé le plus souvent possible. Le plus simple pour cela est de créer un "custumVBL" :

Code
(c):
PA_VBLFunctionInit(customVBL); //Vous pouvez mettre n'importe quoi a la place de customVBL, c'est vous qui choisissez.

Cette ligne doit être placée juste après l'initialisation de la PAlib et du VBL standard. Concrètement,  ça donne :

Code
(c):
int main(int argc, char ** argv) { PA_Init();    // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_VBLFunctionInit(customVBL); //la suite de votre programme


Ce customVBL implique que vous devez créer une fonction au début de votre programme qui s'appelle "custumVBL" (ou le nom que vous lui avez donné, cela n'a aucune importance) :

Code
(c):
#include       // Include for PA_Lib #include "MessageQueue.h"        // Includes for LibLobby #include "802.11.h" #include "lobby.h"   //Ici vos variables...   void customVBL(void) { IPC_RcvCompleteCheck();     //Cette fonction fait un scan WIFI et recoit toutes les informations qui ont ete transmises a cette DS. LOBBY_Update();                //Actualise LibLobby... }


Ensuite les initialisations obligatoires de LibLobby (dans main, à la suite de PA_VBLFunctionInit(customVBL);) :

Code
(c):
IPC_Init(); IPC_SetChannelCallback(0, &LWIFI_IPC_Callback);  //<==== Je n'ai toujours pas compris ce que c'est mais cette fonction ne gene pas... Laissez la ;-) LOBBY_Init();


En résumé :
Voilà ce que vous obtenez :

Code
(c):
#include       // Include for PA_Lib #include "MessageQueue.h"        // Includes for LibLobby #include "802.11.h" #include "lobby.h"   //Ici vos variables...   void customVBL(void) { IPC_RcvCompleteCheck();     //Cette fonction fait un scan WIFI et recoit toutes les informations qui ont ete; transmises à cette DS. LOBBY_Update();                //Actualise LibLobby... }   //Votre programme...   int main(int argc, char ** argv) { PA_Init();    // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_VBLFunctionInit(customVBL);   IPC_Init(); IPC_SetChannelCallback(0, &LWIFI_IPC_Callback); LOBBY_Init();   while(1){ //Des trucs.... }   return 0; } // End of main()  

 


III) - Envoi et réception de données.

C'est un peu la fonction principale de LibLobby... échanger des données !
Mais avant d'envoyer quoi que ce soit, il faut d'abord être prêt à recevoir quoi que ce soit Azn !
Pour cela, il faut déclarer les fonctions qui serviront à recevoir et à stocker ces données :

Code
(c):
LOBBY_SetStreamHandler(0x0001, &nom_de_votre_fonction_qui_recoit_des_donnees);


Petite précision vachement importante quand même : 0x0001 est le "canal" sur lequel "nom_de_votre_fonction_qui_recoit_des_donnees" pêche les infos qui sont envoyées à cette DS, vous pouvez mettre ce que vous voulez, de 0x0001 à 0x8000, pour ceux au dessus (plus de 0x8000), nous en reparlerons plus tard...

Donc dans votre code, en dessous de customVBL(void) vous allez mettre la fonction "nom_de_votre_fonction_qui_recoit_des_donnees", dans laquelle seront disponibles les données envoyées à cette DS sur le "canal" 0x0001 (uniquement. Pour les autres canaux, créez d'autres fonctions, de la même manière) :

Code
(c):
void customVBL(void) { IPC_RcvCompleteCheck(); LOBBY_Update(); }   void Echangedonnees(unsigned char *data, int length, LPLOBBY_USER from) {      //Cette fonction recois 3 choses : data : les donnees au format unsigned char / length qui est un entier envoye par l'autre DS (voir plus bas) / from : une variable au format LPLOBBY_USER : c'est le "nom" de la personne qui vous a envoye ces donnees }


NOTE : Cette fonction est exécutée à l'instant même où la DS reçoit des données (ici dans le "canal" 0x0001, il ne faut pas l'appeler durant votre programme !) et cela peu importe l'endroit "réel" où vous vous trouvez dans votre programme. Cela vous permet de recevoir des données tout en continuant à faire tourner votre programme.

Vous voilà fin près a recevoir des données !! Vous pouvez maintenant en envoyer !!
Pour cela, vous utiliserez :

Code
(c):
LOBBY_SendToUser(LPLOBBY_USER user,unsigned short stream, unsigned char *data, int length) ;  


-user : "nom" de la DS à laquelle les données sont envoyées; (pour connaitre le nom des autres DS, voir plus bas) (pas trop bas non plus !).
-stream : "canal" sur lequel vous envoyez les données (ex : 0x0001). Attention : si vous envoyez sur un canal que l'autre DS n'a pas initialisé, elle ne recevra rien...
-data : une chaîne de caractères qui sera envoyée. => Plus elle est longue, plus le temps pour l'envoyer sera long (logique...) mais vous pouvez allez jusqu'a 1000 caractères sans avoir le moindre problème.
-length : il peut servir à 2 choses : 1) La fonction envoi length caractères de data; 2) length est transmis à l'autre DS tel quel, vous pouvez donc envoyer un entier.

Voilà ! vous avez envoyé des données  Cheesy !! Mais à qui ??
Avant de trouver le nom au "format" LPLOBBY_USER des DS qui utilisent le Wifi en même temps que vous, il vous faut connaitre le nombre de DS, pour cela il existe une fonction :

Code
(c):
LOBBY_GetNumberOfKnownUsers() ;

Cette fonction renvoie le nombre d'utilisateurs de LibLobby actuellement proche de vous, sous la forme d'un unsigned short.

Ensuite il vous faut mettre des noms sur ces DS :

Code
(c):
LOBBY_GetUserByID(unsigned short id);

Renvoie le nom en LPLOBBY_USER de la DS numéro id (id peut aller de 0 à LOBBY_GetNumberOfKnownUsers() ; au delà, la fonction renvoi 0)

Pour trouver le nom de votre propre DS, vous pouvez faire :

Code
(c):
LOBBY_GetUserByID(USERID_MYSELF);

USERID_MYSELF correspond au numéro id de la DS sur laquelle le programme tourne.
Attention : N'envoyez pas de données à vous-même !!! (je ne sais pas ce que ça fait, mais c'est fortement déconseillé...)

En résumé :

Voilà un exemple qui liste les DS et qui envoie "Salut !" Si vous appuyez sur A :

Code
(c):
// Includes #include       // Include for PA_Lib   #include "MessageQueue.h" // Includes for LibLobby #include "802.11.h" #include "lobby.h"     void customVBL(void) { IPC_RcvCompleteCheck(); LOBBY_Update(); }     void Reception(unsigned char *data, int length, LPLOBBY_USER from) { PA_OutputText(1, 1, 20, "Recu: %s de %s      ", (char*)data, LOBBY_GetUserName(from)); //LOBBY_GetUserName(from) "convertit" le nom en LPLOBBY_USER de la DS "from" en un const char * }     int main(int argc, char ** argv) { PA_Init();    // Initializes PA_Lib PA_InitVBL(); // Initializes a standard VBL PA_InitText(0, 0); PA_InitText(1, 0); PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); //<======= indispensable pour que le homebrew tourne sous no$gba : le seul emu qui supporte bien le wifi DS <===> DS (vous n'êtes pas obligé de le mettre si vous voulez faire marcher votre homebrew sur DS). PA_VBLFunctionInit(customVBL); IPC_Init(); IPC_SetChannelCallback(0, &LWIFI_IPC_Callback); LOBBY_Init();   LOBBY_SetStreamHandler(0x0001, &Reception);   int select = 0; while (1) {   int max = LOBBY_GetNumberOfKnownUsers(); PA_OutputText(0, 1, 21, "Votre nom : %s \nUtilisateurs : %d  ",LOBBY_GetUserName(LOBBY_GetUserByID(USERID_MYSELF)), max);   if (Pad.Newpress.Down) select++; if (Pad.Newpress.Up) select--; if (max > 0) select %= max ;   if (Pad.Newpress.A) LOBBY_SendToUser(LOBBY_GetUserByID(select),0x0001,(unsigned char *)"Salut !",8) ;   int i; for (i = 0; i < max; i++) { LPLOBBY_USER user = LOBBY_GetUserByID(i) ; if (i == select) PA_OutputText(0, 2, 8+i, "->%s        ", LOBBY_GetUserName(user)); else PA_OutputText(0, 2, 8+i, "  %s       ", LOBBY_GetUserName(user)); }   PA_WaitForVBL(); }   return 0; } // End of main()


Vous pouvez aussi regarder l'exemple de la PAlib dans C:\devkitPro\PAlibExamples\Wifi\libLobby, je m'en suis inspiré pour créer le petit programme ci-dessus.


IV) - Aller plus loin : LibLobby et AS_lib

Vous voilà capable de créer plein de mini jeux, tout rigolos pour jouer à plusieurs, tout beaux pour le plaisir des yeux, mais pas tout musicaux... Et oui, si vous sélectionnez ARM7_SELECTED = ARM7_MP3_LIBLOBBY dans votre makefile, il ne faudra pas initialiser AS_lib et LibLobby n'importe comment ! Sinon, pas de son...  Cry

Voilà l'ordre dans lequel il faut faire les initialisations :

Code
(c):
//PAlib : PA_Init(); PA_InitVBL();   //LibLobby : PA_VBLFunctionInit(customVBL); IPC_Init(); IPC_SetChannelCallback(0, &LWIFI_IPC_Callback); LOBBY_Init(); PA_WaitForVBL();PA_WaitForVBL();PA_WaitForVBL(); LOBBY_SetStreamHandler(0x0001, &Reception);   //AS_Lib : AS_SetDefaultSettings(AS_PCM_8BIT, 11025, AS_SURROUND);

 



Et voilà, c'est tout pour le moment. Je vais faire un autre tuto regroupant toutes les fonctions de Lobby, mais vous en avez assez pour concocter de super petits jeux !!!  Cheesy

P.-S. Si quelque part j'ai écrit n'importe quoi (je veux dire : plus n'importe quoi que partout ailleurs), dites-le-moi ! Si vous avez des questions ou besoin de précisions, demandez-moi !!

Pub : Téléchargez DS2DS, parce que vous le valez bien !

Rechercher dans le site

© 2008 Tous droits réservés.