aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-18 16:09:10 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-18 16:09:10 -0500
commitd86f31a5f428a3937b56d34e026a88ed737eb7bf (patch)
treee86d34a36e92cd14b7b8c54a9cfe31f21786f451
parent3fbc39f482df596c832cf4ffcf3956a20e71cb38 (diff)
downloadkappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.zip
kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.gz
kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.bz2
kappa-d86f31a5f428a3937b56d34e026a88ed737eb7bf.tar.xz
support modifier keys
-rw-r--r--apps/plugin.c8
-rw-r--r--apps/plugin.h1
-rw-r--r--apps/xracer/graphics.c2
-rw-r--r--apps/xracer/graphics.h1
-rw-r--r--apps/xracer/main.c51
-rw-r--r--apps/xracer/xracer.h2
-rw-r--r--drivers/include/ps2kbd.h15
-rw-r--r--drivers/ps2kbd.c35
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);