Skip to content

Commit a4d2661

Browse files
authored
Support newly-added input event system call (#1)
This commit adds the support for the new event system in rv32emu. By invoking system call poll_event to accept input specific events, we can now move the character and control the menu with the keyboard, adjust the view angle with the mouse in relative mode and use the mouse to control weapon.
1 parent a49d675 commit a4d2661

File tree

5 files changed

+178
-42
lines changed

5 files changed

+178
-42
lines changed

include/quakembd.h

+11-6
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,19 @@
5353
#define bail(msg) { qembd_error(msg); goto bail; }
5454

5555
typedef struct {
56-
uint8_t code;
57-
uint8_t down;
56+
uint32_t keycode;
57+
uint8_t state;
5858
} key_event_t;
5959

6060
typedef struct {
61-
int x;
62-
int y;
63-
} mouse_position_t;
61+
int32_t xrel;
62+
int32_t yrel;
63+
} mouse_motion_t;
64+
65+
typedef struct {
66+
int32_t x;
67+
int32_t y;
68+
} mouse_movement_t;
6469

6570
int qembd_get_width();
6671
int qembd_get_height();
@@ -72,6 +77,6 @@ void qembd_udelay(uint32_t us);
7277
void *qembd_allocmain(size_t size);
7378
int qembd_main(int c, char **v);
7479
int qembd_dequeue_key_event(key_event_t *e);
75-
int qembd_get_current_position(mouse_position_t *position);
80+
int qembd_get_mouse_movement(mouse_movement_t *movement);
7681

7782
#endif /* __QUAKEMBD_H */

port/boards/rv32emu/display.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void qembd_vidinit()
4646
register int a7 asm("a7") = syscall_draw_frame;
4747

4848
asm volatile("scall"
49-
: "r+"(a0) : "r"(a1), "r"(a2), "r"(a7));
49+
: "+r"(a0) : "r"(a1), "r"(a2), "r"(a7));
5050
}
5151

5252
void qembd_fillrect(uint8_t *src, uint32_t *clut,
@@ -67,5 +67,5 @@ void qembd_refresh()
6767
register int a7 asm("a7") = syscall_draw_frame;
6868

6969
asm volatile("scall"
70-
: "r+"(a0) : "r"(a1), "r"(a2), "r"(a7));
70+
: "+r"(a0) : "r"(a1), "r"(a2), "r"(a7));
7171
}

port/boards/rv32emu/main.c

+153-5
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,40 @@
1616
*/
1717

1818
#include <quakembd.h>
19+
#include <quakedef.h>
20+
#include <stdlib.h>
1921
#include <sys/time.h>
2022
#include <time.h>
2123
#include <unistd.h>
22-
#include <stdlib.h>
24+
25+
#define MOUSE_BUTTON_LEFT 1
26+
#define MOUSE_BUTTON_MIDDLE 2
27+
#define MOUSE_BUTTON_RIGHT 3
28+
29+
enum {
30+
KEY_EVENT = 0,
31+
MOUSE_MOTION_EVENT = 1,
32+
MOUSE_BUTTON_EVENT = 2,
33+
};
34+
35+
typedef struct {
36+
uint8_t button;
37+
uint8_t state;
38+
} mouse_button_t;
39+
40+
typedef struct {
41+
uint32_t type;
42+
union {
43+
key_event_t key_event;
44+
union {
45+
mouse_motion_t motion;
46+
mouse_button_t button;
47+
} mouse;
48+
};
49+
} event_t;
50+
51+
static event_t event;
52+
static mouse_movement_t mouse_movement;
2353

2454
uint64_t qembd_get_us_time()
2555
{
@@ -52,14 +82,132 @@ void *qembd_allocmain(size_t size)
5282
return malloc(size);
5383
}
5484

85+
static int poll_event()
86+
{
87+
register int a0 asm("a0") = (uintptr_t) &event;
88+
register int a7 asm("a7") = 0xc0de;
89+
asm volatile("scall" : "+r"(a0) : "r"(a7));
90+
if (event.type == MOUSE_MOTION_EVENT) {
91+
mouse_movement.x += event.mouse.motion.xrel;
92+
mouse_movement.y += event.mouse.motion.yrel;
93+
}
94+
return a0;
95+
}
96+
5597
int qembd_dequeue_key_event(key_event_t *e)
5698
{
57-
/* Not Implemented */
99+
while (poll_event()) {
100+
if (event.type == KEY_EVENT) {
101+
*e = event.key_event;
102+
/* remap keyode */
103+
switch (e->keycode) {
104+
case 0x08:
105+
e->keycode = K_BACKSPACE;
106+
break;
107+
case 0x40000052:
108+
e->keycode = K_UPARROW;
109+
break;
110+
case 0x40000051:
111+
e->keycode = K_DOWNARROW;
112+
break;
113+
case 0x40000050:
114+
e->keycode = K_LEFTARROW;
115+
break;
116+
case 0x4000004F:
117+
e->keycode = K_RIGHTARROW;
118+
break;
119+
case 0x400000E2:
120+
e->keycode = K_ALT;
121+
break;
122+
case 0x400000E0:
123+
e->keycode = K_CTRL;
124+
break;
125+
case 0x400000E1:
126+
e->keycode = K_SHIFT;
127+
break;
128+
case 0x4000003A:
129+
e->keycode = K_F1;
130+
break;
131+
case 0x4000003B:
132+
e->keycode = K_F2;
133+
break;
134+
case 0x4000003C:
135+
e->keycode = K_F3;
136+
break;
137+
case 0x4000003D:
138+
e->keycode = K_F4;
139+
break;
140+
case 0x4000003E:
141+
e->keycode = K_F5;
142+
break;
143+
case 0x4000003F:
144+
e->keycode = K_F6;
145+
break;
146+
case 0x40000040:
147+
e->keycode = K_F7;
148+
break;
149+
case 0x40000041:
150+
e->keycode = K_F8;
151+
break;
152+
case 0x40000042:
153+
e->keycode = K_F9;
154+
break;
155+
case 0x40000043:
156+
e->keycode = K_F10;
157+
break;
158+
case 0x40000044:
159+
e->keycode = K_F11;
160+
break;
161+
case 0x40000045:
162+
e->keycode = K_F12;
163+
break;
164+
case 0x40000049:
165+
e->keycode = K_INS;
166+
break;
167+
case 0x7f:
168+
e->keycode = K_DEL;
169+
break;
170+
case 0x4000004E:
171+
e->keycode = K_PGDN;
172+
break;
173+
case 0x4000004B:
174+
e->keycode = K_PGUP;
175+
break;
176+
case 0x4000004A:
177+
e->keycode = K_HOME;
178+
break;
179+
case 0x4000004D:
180+
e->keycode = K_END;
181+
break;
182+
case 0x40000048:
183+
e->keycode = K_PAUSE;
184+
break;
185+
}
186+
return 0;
187+
}
188+
if (event.type == MOUSE_BUTTON_EVENT) {
189+
e->state = event.mouse.button.state;
190+
switch (event.mouse.button.button) {
191+
case MOUSE_BUTTON_LEFT:
192+
e->keycode = K_MOUSE1;
193+
break;
194+
case MOUSE_BUTTON_RIGHT:
195+
e->keycode = K_MOUSE2;
196+
break;
197+
case MOUSE_BUTTON_MIDDLE:
198+
e->keycode = K_MOUSE3;
199+
break;
200+
}
201+
return 0;
202+
}
203+
}
58204
return -1;
59205
}
60206

61-
int qembd_get_current_position(mouse_position_t *position)
207+
int qembd_get_mouse_movement(mouse_movement_t *movement)
62208
{
63-
/* Not Implemented */
64-
return -1;
209+
*movement = mouse_movement;
210+
mouse_movement.x = 0;
211+
mouse_movement.y = 0;
212+
return 0;
65213
}

port/in_port.c

+11-28
Original file line numberDiff line numberDiff line change
@@ -32,39 +32,22 @@ void IN_Commands(void)
3232

3333
void IN_Move(usercmd_t *cmd)
3434
{
35-
int mouse_x, mouse_y;
36-
mouse_position_t position;
35+
mouse_movement_t movement;
3736
int r;
3837

39-
r = qembd_get_current_position(&position);
38+
r = qembd_get_mouse_movement(&movement);
4039
if (r != 0)
4140
return;
4241

43-
mouse_x = position.x - (qembd_get_width() / 2);
44-
mouse_y = position.y - (qembd_get_height() / 2);
42+
movement.x *= sensitivity.value;
43+
movement.y *= sensitivity.value;
4544

46-
mouse_x *= sensitivity.value;
47-
mouse_y *= sensitivity.value;
48-
49-
if ((in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1)))
50-
cmd->sidemove += m_side.value * mouse_x;
51-
else
52-
cl.viewangles[YAW] -= m_yaw.value * mouse_x;
53-
54-
if (in_mlook.state & 1)
55-
V_StopPitchDrift();
56-
57-
if ((in_mlook.state & 1) && !(in_strafe.state & 1)) {
58-
cl.viewangles[PITCH] += m_pitch.value * mouse_y;
59-
if (cl.viewangles[PITCH] > 80)
60-
cl.viewangles[PITCH] = 80;
61-
if (cl.viewangles[PITCH] < -70)
62-
cl.viewangles[PITCH] = -70;
63-
} else {
64-
if ((in_strafe.state & 1) && noclip_anglehack)
65-
cmd->upmove -= m_forward.value * mouse_y;
66-
else
67-
cmd->forwardmove -= m_forward.value * mouse_y;
68-
}
45+
V_StopPitchDrift();
46+
cl.viewangles[YAW] -= m_yaw.value * movement.x;
47+
cl.viewangles[PITCH] += m_pitch.value * movement.y;
48+
if (cl.viewangles[PITCH] > 80)
49+
cl.viewangles[PITCH] = 80;
50+
if (cl.viewangles[PITCH] < -70)
51+
cl.viewangles[PITCH] = -70;
6952
}
7053

port/sys_port.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void Sys_SendKeyEvents(void)
102102
{
103103
key_event_t e;
104104
while (qembd_dequeue_key_event(&e) == 0)
105-
Key_Event(e.code, e.down == 1);
105+
Key_Event(e.keycode, e.state == 1);
106106
}
107107

108108
void Sys_HighFPPrecision(void)

0 commit comments

Comments
 (0)