#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.