Gestion de la Wiimote et de la SensorBar
Par Slug le vendredi, mars 20 2009, 11:35 - Mes sources - Lien permanent
Voici un code très simple et sans résultat spectaculaire.
Je début aussi
Le programme suivant affiche sur un écran noir, les coordonnées de la Wiimote (x,y mais aussi profondeur et angle).
Il affiche un point afin de savoir où l'on pointe que l'on peut changer de couleur avec le bouton A.
#include <stdio.h> #include <stdlib.h> #include <gccore.h> #include <wiiuse/wpad.h> #define gotoXY(x,y) printf("\x1b[%i;%iH", y, x) static void *xfb = NULL; static GXRModeObj *rmode = NULL; //------------------------------------------------------------------------------------- void Initialise() { //------------------------------------------------------------------------------------- // VIDEO VIDEO_Init(); // Mode d'affichage (NULL = par défaut) rmode = VIDEO_GetPreferredMode(NULL); // Allocation mémoire tampon xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode)); // Initialisation de l'affichage console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ); VIDEO_Configure(rmode); // Utilisation de la mémoire tampon xbf VIDEO_SetNextFramebuffer(xfb); // Autorise l'affichage VIDEO_SetBlack(false); // Rafraichi l'écran VIDEO_Flush(); VIDEO_WaitVSync(); if(rmode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); // PAD AND IR // Initialisation du pad WPAD_Init(); // Transmet la résolution de l'écran à l'interface de la Wiimote WPAD_SetVRes(WPAD_CHAN_ALL, rmode->fbWidth, rmode->xfbHeight); // Synchro Wiimote et SensorBar WPAD_SetDataFormat(WPAD_CHAN_0, WPAD_FMT_BTNS_ACC_IR); } //------------------------------------------------------------------------------------- // Fonction permettant l'affichage d'une ligne horizontale //------------------------------------------------------------------------------------- void DrawHLine(int x1, int x2, int y, int color) { //------------------------------------------------------------------------------------- int i; u32 *tmpfb = NULL; // Mémoire tampon temporaire y = 320 * y; x1 >>= 1; x2 >>= 1; for(i=x1; i <= x2; i++) { tmpfb = xfb; tmpfb[y + i] = color; } } //--------------------------------------------------------------------------------- // Fonction permettant l'affichage d'une ligne verticale //--------------------------------------------------------------------------------- void DrawVLine(int x, int y1, int y2, int color) { //--------------------------------------------------------------------------------- int i; u32 *tmpfb = NULL; // Mémoire tampon temporaire x >>= 1; for(i=y1; i <= y2; i++) { tmpfb = xfb; tmpfb[x + (640 * i) / 2] = color; } } //--------------------------------------------------------------------------------- // Fonction permettant d'afficher un carré //--------------------------------------------------------------------------------- void DrawBox(int x1, int x2, int y1, int y2, int color) { //--------------------------------------------------------------------------------- DrawHLine(x1, x2, y1, color); DrawHLine(x1, x2, y2, color); DrawVLine(x1, y1, y2, color); DrawVLine(x2, y1, y2, color); } //-------------------------------------------------------------------------------- // Fonction permettant de changer la couleur utilisée //--------------------------------------------------------------------------------- int changeColor(int color) { //--------------------------------------------------------------------------------- switch(color) { case COLOR_RED: color = COLOR_BLUE; break; case COLOR_BLUE: color = COLOR_GREEN; break; case COLOR_GREEN: color = COLOR_WHITE; break; case COLOR_WHITE: color = COLOR_RED; break; default: color = COLOR_RED; } return color; } //--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- Initialise(); // Structure remplie par WPAD_IR contenant les infos relatives à la position de la Wiimote ir_t ir; int color = COLOR_RED; while(1) { // On vérifie l'état des boutons WPAD_ScanPads(); // On met à jour les infos de la SensorBar WPAD_IR(WPAD_CHAN_0, &ir); // Variable récupérant le bouton pressé u32 pressed = WPAD_ButtonsDown(0); // Si on appui sur HOME on quitte le programme if (pressed & WPAD_BUTTON_HOME) exit(0); // Si on appui sur A on change de couleur if(pressed & WPAD_BUTTON_A) color = changeColor(color); // On efface l'écran afin de pouvoir mettre à jour l'affichage VIDEO_ClearFrameBuffer(rmode, xfb, COLOR_BLACK); // Positionnement à l'écran gotoXY(4, 4); printf("Coordonnees de la Wiimote: X=%f - Y=%f", ir.x, ir.y); gotoXY(4, 5); printf("Distance de la Wiimote: %f metres", ir.z); gotoXY(4, 6); printf("Angle de la Wiimote: %f", ir.angle); gotoXY(4, 7); printf("Validite des donnees: ir.valid=%d - ir.raw_valid=%d", ir.valid, ir.raw_valid); // Si la Wiimote est bien devant l'écran if(ir.valid) // On dessine le carré représentant le pointeur de la Wiimote DrawBox(ir.x, ir.x + 2, ir.y, ir.y + 2, color); VIDEO_WaitVSync(); } return 0; }
Bien, j'espère avoir suffisamment commenté le code pour que cela soit accessible et aussi surtout pour que l'on me corrige sur des notions mal comprises.