diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-18 16:09:10 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-18 16:09:10 -0500 |
| commit | d86f31a5f428a3937b56d34e026a88ed737eb7bf (patch) | |
| tree | e86d34a36e92cd14b7b8c54a9cfe31f21786f451 | |
| parent | 3fbc39f482df596c832cf4ffcf3956a20e71cb38 (diff) | |
| download | kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.zip kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.gz kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.bz2 kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.xz | |
support modifier keys
| -rw-r--r-- | apps/plugin.c | 8 | ||||
| -rw-r--r-- | apps/plugin.h | 1 | ||||
| -rw-r--r-- | apps/xracer/graphics.c | 2 | ||||
| -rw-r--r-- | apps/xracer/graphics.h | 1 | ||||
| -rw-r--r-- | apps/xracer/main.c | 51 | ||||
| -rw-r--r-- | apps/xracer/xracer.h | 2 | ||||
| -rw-r--r-- | drivers/include/ps2kbd.h | 15 | ||||
| -rw-r--r-- | drivers/ps2kbd.c | 35 |
8 files changed, 102 insertions, 13 deletions
diff --git a/apps/plugin.c b/apps/plugin.c index fcb659d..cdca4c5 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -28,6 +28,11 @@ static int button_get(void) return ps2kbd_button_get(); } +static int modifier_get(void) +{ + return ps2kbd_modifier_get(); +} + static const struct plugin_api kappa_api = { &plugin_clear, &plugin_hline, @@ -47,7 +52,8 @@ static const struct plugin_api kappa_api = { &gfx_fillcircle, &gfx_update, &gfx_putsxy, - &button_get + &button_get, + &modifier_get, }; void plugin_load(enum plugin_status (*plugin)(const struct plugin_api*)) diff --git a/apps/plugin.h b/apps/plugin.h index 849dda9..e9c790c 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -51,6 +51,7 @@ struct plugin_api { void (*lcd_putsxy)(int x, int y, const char*); int (*button_get)(void); + int (*modifier_get)(void); }; /* defined by the plugin */ diff --git a/apps/xracer/graphics.c b/apps/xracer/graphics.c index d523343..9b67663 100644 --- a/apps/xracer/graphics.c +++ b/apps/xracer/graphics.c @@ -228,7 +228,7 @@ void render(struct camera_t *camera, struct road_segment *road, unsigned int roa /* interpolate so as to prevent jumpy camera movement on hills */ camera->pos.y = INTERPOLATE(base->p1_y, base->p2_y, base_percent) + camera_height; - for(int i = 0; i < DRAW_DIST; ++i) + for(int i = 0; i < camera->draw_dist; ++i) { struct road_segment *seg = &road[(base->idx + i) % road_length]; diff --git a/apps/xracer/graphics.h b/apps/xracer/graphics.h index aeecf0b..486db67 100644 --- a/apps/xracer/graphics.h +++ b/apps/xracer/graphics.h @@ -33,6 +33,7 @@ struct point_3d { struct camera_t { struct point_3d pos; int depth; + int draw_dist; }; struct point_2d { diff --git a/apps/xracer/main.c b/apps/xracer/main.c index 5c88c4f..29b2a7e 100644 --- a/apps/xracer/main.c +++ b/apps/xracer/main.c @@ -87,6 +87,8 @@ enum plugin_status do_flythrough(void) /* y is automatically calculated */ camera.pos.z = 0; + camera.draw_dist = DRAW_DIST; + //generate_test_road(); //road_length = load_map(road, MAX_ROAD_LENGTH, loop_map, ARRAYLEN(loop_map)); @@ -104,25 +106,64 @@ enum plugin_status do_flythrough(void) while(1) { int button = rb->button_get(); + int mod = rb->modifier_get(); switch(button) { case BUTTON_UP: - camera_height += MANUAL_SPEED; + switch(mod) + { + case MODIFIER_NONE: + camera_height += MANUAL_SPEED; + break; + case MODIFIER_CTRL: + camera.depth += 1; + break; + case MODIFIER_ALT: + camera.pos.z += MANUAL_SPEED; + break; + } break; case BUTTON_DOWN: - camera_height -= MANUAL_SPEED; + switch(mod) + { + case MODIFIER_NONE: + camera_height -= MANUAL_SPEED; + break; + case MODIFIER_CTRL: + camera.depth -= 1; + break; + case MODIFIER_ALT: + camera.pos.z -= MANUAL_SPEED; + break; + } break; case BUTTON_LEFT: - camera.pos.x -= MANUAL_SPEED; + switch(mod) + { + case MODIFIER_NONE: + camera.pos.x -= MANUAL_SPEED; + break; + case MODIFIER_CTRL: + camera.draw_dist -= 8; + break; + } break; case BUTTON_RIGHT: - camera.pos.x += MANUAL_SPEED; + switch(mod) + { + case MODIFIER_NONE: + camera.pos.x += MANUAL_SPEED; + break; + case MODIFIER_CTRL: + camera.draw_dist += 8; + break; + } break; } camera.pos.z += 512; /* loop the track right before going off the "end" */ - camera.pos.z %= (road_length - DRAW_DIST) * SEGMENT_LENGTH; + camera.pos.z %= (road_length - camera.draw_dist) * SEGMENT_LENGTH; render(&camera, road, road_length, camera_height); diff --git a/apps/xracer/xracer.h b/apps/xracer/xracer.h index 804bf39..28b02f4 100644 --- a/apps/xracer/xracer.h +++ b/apps/xracer/xracer.h @@ -39,7 +39,7 @@ /* road parameters */ #define ROAD_WIDTH (LCD_WIDTH/2) /* actually half the road width for easier math */ -#define MAX_ROAD_LENGTH 4096 +#define MAX_ROAD_LENGTH 16384 #define SEGMENT_LENGTH (LCD_WIDTH * 12) /* road generator parameters */ diff --git a/drivers/include/ps2kbd.h b/drivers/include/ps2kbd.h index 477882f..dcde1d8 100644 --- a/drivers/include/ps2kbd.h +++ b/drivers/include/ps2kbd.h @@ -6,14 +6,21 @@ #define PS2_NUM_LOCK (1 << 1) #define PS2_CAPS_LOCK (1 << 2) -#define BUTTON_UP (1 << 0) -#define BUTTON_LEFT (1 << 1) -#define BUTTON_DOWN (1 << 2) -#define BUTTON_RIGHT (1 << 3) +#define BUTTON_UP (1 << 0) +#define BUTTON_LEFT (1 << 1) +#define BUTTON_DOWN (1 << 2) +#define BUTTON_RIGHT (1 << 3) + +#define MODIFIER_NONE 0 +#define MODIFIER_SHIFT (1 << 0) +#define MODIFIER_CTRL (1 << 1) +#define MODIFIER_ALT (1 << 2) /* returns which arrow keys are down */ uint8_t ps2kbd_button_get(void); +uint8_t ps2kbd_modifier_get(void); + void ps2kbd_set_leds(uint8_t status); void ps2kbd_init(void); diff --git a/drivers/ps2kbd.c b/drivers/ps2kbd.c index 5aa9d2a..30fe762 100644 --- a/drivers/ps2kbd.c +++ b/drivers/ps2kbd.c @@ -41,13 +41,46 @@ uint8_t ps2kbd_button_get(void) return ret; } +static uint8_t ps2_ctrl; +static uint8_t ps2_shift; +static uint8_t ps2_alt; + +uint8_t ps2kbd_modifier_get(void) +{ + uint8_t ret = 0; + if(ps2_ctrl) + ret |= MODIFIER_CTRL; + if(ps2_shift) + ret |= MODIFIER_SHIFT; + if(ps2_alt) + ret |= MODIFIER_ALT; + return ret; +} + static void key_handler(struct regs_t *regs) { (void) regs; uint8_t scancode = inb(0x60); switch(scancode) { - /* ... the only one we care about! */ + case 0x2A: + ps2_shift = 1; + break; + case 0xAA: + ps2_shift = 0; + break; + case 0x1D: + ps2_ctrl = 1; + break; + case 0x9D: + ps2_ctrl = 0; + break; + case 0x38: + ps2_alt = 1; + break; + case 0xB8: + ps2_alt = 0; + break; case 0xE0: { uint8_t spec = inb(0x60); |