Thu, 30 Dec 2010 00:37:03 +0000
add keyboard event handler; need to do register r/w next.
src/keyboard.c | file | annotate | diff | revisions | |
src/keyboard.h | file | annotate | diff | revisions |
1.1 --- a/src/keyboard.c Wed Dec 29 09:06:17 2010 +0000 1.2 +++ b/src/keyboard.c Thu Dec 30 00:37:03 2010 +0000 1.3 @@ -1,4 +1,5 @@ 1.4 #include "SDL.h" 1.5 +#include "keyboard.h" 1.6 1.7 /** 1.8 * Key map -- a mapping from SDLK_xxx constants to scancodes and vice versa. 1.9 @@ -73,7 +74,9 @@ 1.10 { SDLK_SEMICOLON, 0, 0x3b }, // ; [Semicolon] 1.11 // Keycode 3C not used 1.12 { SDLK_EQUALS, 0, 0x3d }, // = [Equals] 1.13 -// Keycodes 3E, 3F, 40 not used 1.14 +// Keycode 3E not used 1.15 +// Keycode 3F = BOGUS (Bad Keycode) 1.16 +// Keycode 40 = All Up 1.17 // { SDLK_, 1, 0x41 }, // CMD 1.18 // { SDLK_, 1, 0x42 }, // CLOSE/OPEN 1.19 { SDLK_KP7, 0, 0x43 }, // PRINT 1.20 @@ -87,8 +90,8 @@ 1.21 { SDLK_KP5, 0, 0x4a }, // Home [Keypad 5] 1.22 { SDLK_END, 0, 0x4b }, // End 1.23 { SDLK_KP6, 0, 0x4b }, // End [Keypad 6] 1.24 - { SDLK_LCTRL, 0, 0x4c }, // Left Ctrl? \___ not sure which is left and which is right... 1.25 - { SDLK_RCTRL, 0, 0x4d }, // Right Ctrl? / 1.26 + { SDLK_LCTRL, 0, 0x4c }, // Left Ctrl 1.27 + { SDLK_RCTRL, 0, 0x4d }, // Right Ctrl 1.28 // Keycodes 4E thru 5A not used 1.29 { SDLK_LEFTBRACKET, 0, 0x5b }, // [ 1.30 { SDLK_BACKSLASH, 0, 0x5c }, // \ (backslash) 1.31 @@ -122,23 +125,79 @@ 1.32 { SDLK_y, 0, 0x79 }, // Y 1.33 { SDLK_z, 0, 0x7a }, // Z 1.34 // Keycodes 7B, 7C, 7D not used 1.35 - { SDLK_NUMLOCK, 0, 0x7e } // Numlock 1.36 + { SDLK_NUMLOCK, 0, 0x7e } // Numlock 1.37 // { SDLK_, 1, 0x7f }, // Dlete 1.38 }; 1.39 1.40 /** 1.41 - * List of key states 1.42 + * List of special key codes 1.43 + */ 1.44 +enum { 1.45 + KEY_ALL_UP = 0x40, ///< All keys up 1.46 + KEY_LIST_END = 0x80, ///< End of key code list 1.47 + KEY_BEGIN_MOUSE = 0xCF, ///< Mouse data follows 1.48 + KEY_BEGIN_KEYBOARD = 0xDF, ///< Keyboard data follows 1.49 +}; 1.50 + 1.51 +/** 1.52 + * List of keyboard commands 1.53 */ 1.54 -int keystate[0x80]; 1.55 +enum { 1.56 + KEY_CMD_RESET = 0x92, ///< Reset keyboard 1.57 + KEY_CMD_CAPSLED_OFF = 0xB1, ///< Caps Lock LED off--CHECK! 1.58 + KEY_CMD_CAPSLED_ON = 0xB0, ///< Caps Lock LED on --CHECK! 1.59 + KEY_CMD_NUMLED_OFF = 0xA1, ///< Num Lock LED off --CHECK! 1.60 + KEY_CMD_NUMLED_ON = 0xA0, ///< Num Lock LED on --CHECK! 1.61 + KEY_CMD_MOUSE_ENABLE = 0xD0, ///< Enable mouse 1.62 + KEY_CMD_MOUSE_DISABLE = 0xD1 ///< Disable mouse 1.63 +}; 1.64 1.65 -void keyboard_init(void) 1.66 +void keyboard_init(KEYBOARD_STATE *state) 1.67 { 1.68 // Set all key states to "not pressed" 1.69 - for (int i=0; i<(sizeof(keystate)/sizeof(keystate[0])); i++) { 1.70 - keystate[i] = 0; 1.71 + for (int i=0; i<(sizeof(state->keystate)/sizeof(state->keystate[0])); i++) { 1.72 + state->keystate[i] = 0; 1.73 } 1.74 } 1.75 1.76 -void keyboard_event(SDL_Event *ev) 1.77 +void keyboard_event(KEYBOARD_STATE *state, SDL_Event *ev) 1.78 { 1.79 + int ks; 1.80 + 1.81 + // Figure out the event type 1.82 + if (ev->type == SDL_KEYDOWN) { 1.83 + // Key down event 1.84 + ks = 1; 1.85 + } else if (ev->type == SDL_KEYUP) { 1.86 + // Key up event 1.87 + ks = 0; 1.88 + } else { 1.89 + // Not a keyboard event 1.90 + return; 1.91 + } 1.92 + 1.93 + // Loop over the keyinfo, try and find a match for this key 1.94 + // TODO: handle Extended Keymap 1.95 + for (int i=0; i<(sizeof(keymap)/sizeof(keymap[0])); i++) { 1.96 + if (ev->key.keysym.sym == keymap[i].key) { 1.97 + // Key code match. Is this an Extended Map key? 1.98 + if (keymap[i].extended) { 1.99 + // Key is on the Extended map. Need ALT set when pressing the key. 1.100 + if (ev->key.keysym.mod & KMOD_ALT) { 1.101 + // ALT is down, key matches. 1.102 + state->keystate[keymap[i].scancode] = ks; 1.103 + break; 1.104 + } 1.105 + } else { 1.106 + // Key is on the Standard map. ALT must NOT be set when pressing the key. 1.107 + if (!(ev->key.keysym.mod & KMOD_ALT)) { 1.108 + // ALT is up, key matches 1.109 + state->keystate[keymap[i].scancode] = ks; 1.110 + break; 1.111 + } 1.112 + } 1.113 + } 1.114 + } 1.115 } 1.116 + 1.117 +// TODO: register read and write
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/src/keyboard.h Thu Dec 30 00:37:03 2010 +0000 2.3 @@ -0,0 +1,33 @@ 2.4 +#ifndef _KEYBOARD_H 2.5 +#define _KEYBOARD_H 2.6 + 2.7 +#define KEYBOARD_BUFFER_SIZE 0x100 2.8 + 2.9 +/** 2.10 + * Keyboard controller state 2.11 + */ 2.12 +typedef struct { 2.13 + unsigned char keybuf[KEYBOARD_BUFFER_SIZE]; ///< Keyboard data buffer 2.14 + size_t readptr; ///< Keyboard buffer read pointer 2.15 + size_t writeptr; ///< Keyboard buffer write pointer 2.16 + size_t buflen; ///< Keyboard buffer fill level (buffer length) 2.17 + int keystate[0x80]; ///< List of key up/down states 2.18 +} KEYBOARD_STATE; 2.19 + 2.20 +/** 2.21 + * Initialise the keyboard. 2.22 + * 2.23 + * Initialises a keyboard state block in preparation for keyboard events. 2.24 + * 2.25 + * @param state Keyboard state block 2.26 + */ 2.27 +void keyboard_init(KEYBOARD_STATE *state); 2.28 + 2.29 +/** 2.30 + * Issue a keyboard event. 2.31 + * 2.32 + * Call this function when SDL issues a keyboard event in the event loop. 2.33 + */ 2.34 +void keyboard_event(KEYBOARD_STATE *state, SDL_Event *ev); 2.35 + 2.36 +#endif