In memory of Ben “bushing” Byer, who passed away on Monday, February 8th, 2016.

Difference between revisions of "Libwiikeyboard"

From WiiBrew
Jump to navigation Jump to search
m (lowercase title)
 
(12 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Infobox homebrewapp
+
{{lowercase title}}
| image      =
+
'''libwiikeyboard''' is included as part of [[libogc]] as an interface to an attached USB keyboard.
| title      = [[User:Davyg/libwiikeyboard|libwiikeyboard]]
 
| desc        = A library for usb keyboard usage
 
| type        = Library
 
| author      = davyg
 
| download    = http://wiibrew.org/wiki/Image:Libwiikeyboard.tar.bz2
 
| peripherals = {{USBKeyboard}}
 
}}
 
== Libwiikeyboard ==
 
  
=== Presentation ===
+
== Usage ==
  
A library who permit to use one or more usbkeyboard on the wii using libogc and devkitpro.<br>
+
Include -lwiikeyboard in your Makefile.
It use directly the USB function and not the /dev/usb/kbd therefore It's a bit complicated to use for a
 
more simple library but less powerful you can use [[User:Cboomf/libusbkbd|libusbkbd]]
 
  
=== Download ===
+
=== Initialize the keyboard subsystem: ===
 +
<source lang="cpp">
 +
KEYBOARD_Init(NULL);
 +
</source>
  
[[Include and .a|http://wiibrew.org/wiki/Image:Libwiikeyboard.tar.bz2]]<br>
+
=== Process an event: ===
[[Source|http://wiibrew.org/wiki/Image:Libwiikeyboard-src.tar.bz2]]
+
<source lang="cpp">
 +
keyboard_event ke;
 +
s32 res = KEYBOARD_GetEvent(&ke);
 +
if (res && (ke.type == KEYBOARD_RELEASED || ke.type == KEYBOARD_PRESSED))
 +
{
 +
// do something
 +
}
 +
</source>
  
=== Compilation ===
+
== Alternate usage - using stdin ==
  
<tt>make</tt>
+
<source lang="cpp">
 +
#include <gccore.h>
 +
#include <wiiuse/wpad.h>
 +
#include <wiikeyboard/keyboard.h>
  
=== Installation ===
+
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <string.h>
 +
#include <unistd.h>
  
<tt>make install</tt>
 
or<br>
 
copy lib/libwiikeyboard in libogc/lib/wii and include/* in libogc/include/wiikeyboard
 
  
=== Usage ===
+
static void *xfb = NULL;
 +
static GXRModeObj *rmode = NULL;
  
To initialize :
+
bool quitapp=false;
<source lang="cpp">
+
 
USB_Initialize();
+
void keyPress_cb( char sym) {
USBKeyboard_Initialize();
+
 
KEYBOARD_Init();
+
if (sym > 31 ) putchar(sym);
</source>
+
if (sym == 13) putchar('\n');
 +
 +
if ( sym == 0x1b) quitapp = true;
 +
}
 +
 
 +
 
 +
int main(int argc, char **argv) {
 +
// Initialise the video system
 +
VIDEO_Init();
 +
 +
// This function initialises the attached controllers
 +
WPAD_Init();
 +
 +
// Obtain the preferred video mode from the system
 +
// This will correspond to the settings in the Wii menu
 +
rmode = VIDEO_GetPreferredMode(NULL);
  
In your main loop :
+
// Allocate memory for the display in the uncached region
<source lang="cpp">
+
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
KEYBOARD_ScanKeyboards();
+
</source>
+
// Initialise the console, required for printf
 +
console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
 +
 +
// Set up the video registers with the chosen mode
 +
VIDEO_Configure(rmode);
 +
 +
// Tell the video hardware where our display memory is
 +
VIDEO_SetNextFramebuffer(xfb);
 +
 +
// Make the display visible
 +
VIDEO_SetBlack(FALSE);
  
To get an event :
+
// Flush the video register changes to the hardware
<source lang="cpp">
+
VIDEO_Flush();
KEYBOARD_getEvent(keyboardEvent *event)
 
</source>
 
  
At the end :
+
// Wait for Video setup to complete
<source lang="cpp">
+
VIDEO_WaitVSync();
KEYBOARD_Deinit();
+
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
USBKeyboard_Deinitialize();
 
USB_Deinitialize();
 
</source>
 
  
Useful enum or struct :
 
<source lang="cpp">
 
typedef enum
 
{
 
KEYBOARD_PRESSED = 0,
 
KEYBOARD_RELEASED,
 
KEYBOARD_DISCONNECTED,
 
KEYBOARD_CONNECTED
 
  
}keyboard_eventType;
+
// The console understands VT terminal escape codes
 +
// This positions the cursor on row 2, column 0
 +
// we can use variables for this with format codes too
 +
// e.g. printf ("\x1b[%d;%dH", row, column );
 +
printf("\x1b[2;0HHello World!\n");
 +
 +
if (KEYBOARD_Init(keyPress_cb) == 0) printf("keyboard initialised\n");
  
typedef struct _keyboard_keysym
+
do {
{
+
// Call WPAD_ScanPads each loop, this reads the latest controller states
u8 scancode;
+
WPAD_ScanPads();
KEYBOARD_KEY sym;
 
char ch;
 
KEYBOARD_MOD mod;
 
  
}keyboard_keysym;
+
// WPAD_ButtonsDown tells us which buttons were pressed in this loop
 +
// this is a "one shot" state which will not fire again until the button has been released
 +
u32 pressed = WPAD_ButtonsDown(0);
  
typedef struct _KeyboardEvent{
+
char key = getchar();
keyboard_eventType type;
 
keyboard_keysym keysym;
 
device dev;
 
  
}keyboardEvent;
+
// We return to the launcher application via exit
</source>
+
if ( pressed & WPAD_BUTTON_HOME ) quitapp=true;
  
=== Todo ===
+
// Wait for the next frame
 +
VIDEO_WaitVSync();
 +
} while(!quitapp);
  
-Use the interrupt pipe in stead of control pipe<br>
+
return 0;
-Make the localization for other keyboard like AZERTY<br>
+
}
 +
</source>

Latest revision as of 21:33, 15 October 2009

libwiikeyboard is included as part of libogc as an interface to an attached USB keyboard.

Usage

Include -lwiikeyboard in your Makefile.

Initialize the keyboard subsystem:

KEYBOARD_Init(NULL);

Process an event:

keyboard_event ke;
s32 res = KEYBOARD_GetEvent(&ke);
if (res && (ke.type == KEYBOARD_RELEASED || ke.type == KEYBOARD_PRESSED))
{
	// do something
}

Alternate usage - using stdin

#include <gccore.h>
#include <wiiuse/wpad.h>
#include <wiikeyboard/keyboard.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


static void *xfb = NULL;
static GXRModeObj *rmode = NULL;

bool quitapp=false;

void keyPress_cb( char sym) {

	if (sym > 31 ) putchar(sym);
	if (sym == 13) putchar('\n');
	
	if ( sym == 0x1b) quitapp = true;
}


int main(int argc, char **argv) {
	// Initialise the video system
	VIDEO_Init();
	
	// This function initialises the attached controllers
	WPAD_Init();
	
	// Obtain the preferred video mode from the system
	// This will correspond to the settings in the Wii menu
	rmode = VIDEO_GetPreferredMode(NULL);

	// Allocate memory for the display in the uncached region
	xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
	
	// Initialise the console, required for printf
	console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
	
	// Set up the video registers with the chosen mode
	VIDEO_Configure(rmode);
	
	// Tell the video hardware where our display memory is
	VIDEO_SetNextFramebuffer(xfb);
	
	// Make the display visible
	VIDEO_SetBlack(FALSE);

	// Flush the video register changes to the hardware
	VIDEO_Flush();

	// Wait for Video setup to complete
	VIDEO_WaitVSync();
	if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();


	// The console understands VT terminal escape codes
	// This positions the cursor on row 2, column 0
	// we can use variables for this with format codes too
	// e.g. printf ("\x1b[%d;%dH", row, column );
	printf("\x1b[2;0HHello World!\n");
	
	if (KEYBOARD_Init(keyPress_cb) == 0) printf("keyboard initialised\n");

	do {
		// Call WPAD_ScanPads each loop, this reads the latest controller states
		WPAD_ScanPads();

		// WPAD_ButtonsDown tells us which buttons were pressed in this loop
		// this is a "one shot" state which will not fire again until the button has been released
		u32 pressed = WPAD_ButtonsDown(0);

		char key = getchar();

		// We return to the launcher application via exit
		if ( pressed & WPAD_BUTTON_HOME ) quitapp=true;

		// Wait for the next frame
		VIDEO_WaitVSync();
	} while(!quitapp);

	return 0;
}