summaryrefslogtreecommitdiff
path: root/hid/pico/src/ph_ps2.c
diff options
context:
space:
mode:
Diffstat (limited to 'hid/pico/src/ph_ps2.c')
-rw-r--r--hid/pico/src/ph_ps2.c70
1 files changed, 63 insertions, 7 deletions
diff --git a/hid/pico/src/ph_ps2.c b/hid/pico/src/ph_ps2.c
index a814103c..6dab2eb6 100644
--- a/hid/pico/src/ph_ps2.c
+++ b/hid/pico/src/ph_ps2.c
@@ -37,6 +37,12 @@ u8 ph_g_ps2_kbd_leds = 0;
bool ph_g_ps2_kbd_online = 0;
bool ph_g_ps2_mouse_online = 0;
+u8 ph_ps2_kbd_modifiers = 0;
+u8 ph_ps2_mouse_buttons = 0;
+
+void tuh_kb_set_leds(u8 leds) {
+ ph_g_ps2_kbd_leds = leds;
+}
void ph_ps2_init(void) {
if (PH_O_HAS_PS2) {
@@ -51,13 +57,13 @@ void ph_ps2_init(void) {
}
if (PH_O_IS_KBD_PS2) {
- ph_ps2_kbd_init(_KBD_DATA_PIN);
+ kb_init(_KBD_DATA_PIN);
} else {
INIT_STUB(_KBD_DATA_PIN);
}
if (PH_O_IS_MOUSE_PS2) {
- ph_ps2_mouse_init(_MOUSE_DATA_PIN);
+ ms_init(_MOUSE_DATA_PIN);
} else {
INIT_STUB(_MOUSE_DATA_PIN);
}
@@ -67,16 +73,66 @@ void ph_ps2_init(void) {
void ph_ps2_task(void) {
if (PH_O_IS_KBD_PS2) {
- ph_ps2_kbd_task();
+ ph_g_ps2_kbd_online = kb_task();
+ }
+
+ if (PH_O_IS_MOUSE_PS2) {
+ ph_g_ps2_mouse_online = ms_task();
+ }
+}
+
+void ph_ps2_kbd_send_key(u8 key, bool state) {
+ if (PH_O_IS_KBD_PS2) {
+ if (key >= 0xe0 && key <= 0xe7) {
+ if (state) {
+ ph_ps2_kbd_modifiers = ph_ps2_kbd_modifiers | (1 << (key - 0xe0));
+ } else {
+ ph_ps2_kbd_modifiers = ph_ps2_kbd_modifiers & ~(1 << (key - 0xe0));
+ }
+ }
+
+ kb_send_key(key, state, ph_ps2_kbd_modifiers);
+ }
+}
+
+void ph_ps2_mouse_send_button(u8 button, bool state) {
+ if (PH_O_IS_MOUSE_PS2) {
+ button--;
+
+ if (state) {
+ ph_ps2_mouse_buttons = ph_ps2_mouse_buttons | (1 << button);
+ } else {
+ ph_ps2_mouse_buttons = ph_ps2_mouse_buttons & ~(1 << button);
+ }
+
+ ms_send_packet(ph_ps2_mouse_buttons, 0, 0, 0, 0);
}
+}
+
+void ph_ps2_mouse_send_rel(s8 x, s8 y) {
+ if (PH_O_IS_MOUSE_PS2) {
+ ms_send_packet(ph_ps2_mouse_buttons, x, y, 0, 0);
+ }
+}
+void ph_ps2_mouse_send_wheel(s8 h, s8 v) {
if (PH_O_IS_MOUSE_PS2) {
- ph_ps2_mouse_task();
+ ms_send_packet(ph_ps2_mouse_buttons, 0, 0, h, v);
}
}
void ph_ps2_send_clear(void) {
- // TODO: PS2: Release all pressed buttons and keys.
- // If PH_O_IS_KBD_PS2, release all PS/2 buttons
- // also if PH_O_IS_MOUSE_PS2 is true, release all mouse buttons
+ if (PH_O_IS_KBD_PS2) {
+ for(u8 key = 0xe0; key <= 0xe7; key++) {
+ kb_send_key(key, false, 0);
+ }
+
+ for(u8 key = 4; key <= 116; key++) {
+ kb_send_key(key, false, 0);
+ }
+ }
+
+ if (PH_O_IS_MOUSE_PS2) {
+ ms_send_packet(0, 0, 0, 0, 0);
+ }
}