Skip to content

Commit

Permalink
feat: suspend active pc
Browse files Browse the repository at this point in the history
  • Loading branch information
jalmeroth committed Nov 23, 2024
1 parent 609c83f commit c85e25c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 29 deletions.
1 change: 1 addition & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
- `RIGHT ALT + RIGHT SHIFT + S` suspends both PCs
- `RIGHT ALT + RIGHT SHIFT + D` enables debug mode\*
- `RIGHT ALT + RIGHT SHIFT + R` request to reboot active board
- `RIGHT ALT + RIGHT SHIFT + Q` suspends active PC

\*the output will be shown on the `UART1 TX` pin.

Expand Down
73 changes: 46 additions & 27 deletions src/actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ void request_reboot() {
}
}

void suspend_pc(void) {
uart_send_value(SUSPEND_PC_MSG, 1);
send_suspend_pc_report(NULL, NULL);
}

void screensaver_task(device_t *state) {
const unsigned int mouse_move_delay = 1000000;
uint64_t inactivity_period = time_us_64() - state->last_activity;
Expand Down Expand Up @@ -109,38 +104,62 @@ void send_lock_screen_report(uart_packet_t *packet, device_t *state) {
(uint8_t *)&release_keys);
}

void send_suspend_pc_report(uart_packet_t *packet, device_t *state) {
(void)packet;
(void)state;
void suspend_active_pc(void) {
if (global_state.active_output == BOARD_ROLE) {
send_suspend_pc_report(NULL, NULL);
} else {
uart_send_value(SUSPEND_PC_MSG, 1);
}
}

void suspend_all_pcs(void) {
uart_send_value(SUSPEND_PC_MSG, 1);
send_suspend_pc_report(NULL, NULL);
}

void _suspend_linux(void) {
keyboard_report_t suspend_report = {0};
uint8_t off, pos;

suspend_report.modifier = KEYBOARD_MODIFIER_LEFTGUI |
KEYBOARD_MODIFIER_LEFTCTRL |
KEYBOARD_MODIFIER_LEFTSHIFT;
off = get_byte_offset(HID_KEY_Q);
pos = get_pos_in_byte(HID_KEY_Q);
suspend_report.keycode[off] = 1 << pos;
send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, sizeof(keyboard_report_t),
(uint8_t *)&suspend_report);
}

void _suspend_macos(void) {
keyboard_report_t suspend_report = {0};

// send modifiers only
suspend_report.modifier =
KEYBOARD_MODIFIER_LEFTALT | KEYBOARD_MODIFIER_LEFTGUI;
send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, sizeof(keyboard_report_t),
(uint8_t *)&suspend_report);
// wait a bit
sleep_ms(10);
// send eject key
consumer_report_t eject_report = {0};
eject_report.apple = 1 << 3; // Usage (Eject)
send_tud_report(ITF_NUM_HID_MS, 3, sizeof(consumer_report_t),
(uint8_t *)&eject_report);
}

void send_suspend_pc_report(uart_packet_t *packet, device_t *state) {
(void)packet;
(void)state;

switch (global_state.device_config[BOARD_ROLE].os) {
case LINUX:
suspend_report.modifier = KEYBOARD_MODIFIER_LEFTGUI |
KEYBOARD_MODIFIER_LEFTCTRL |
KEYBOARD_MODIFIER_LEFTSHIFT;
off = get_byte_offset(HID_KEY_Q);
pos = get_pos_in_byte(HID_KEY_Q);
suspend_report.keycode[off] = 1 << pos;
_suspend_linux();
break;
case MACOS:
suspend_report.modifier =
KEYBOARD_MODIFIER_LEFTALT | KEYBOARD_MODIFIER_LEFTGUI;
_suspend_macos();
break;
}

send_tud_report(ITF_NUM_HID_KB, REPORT_ID_KEYBOARD, sizeof(keyboard_report_t),
(uint8_t *)&suspend_report);

if (global_state.device_config[BOARD_ROLE].os == MACOS) {
sleep_ms(10);
consumer_report_t eject_report = {0};
eject_report.apple = 1 << 3; // Usage (Eject)
send_tud_report(ITF_NUM_HID_MS, 3, sizeof(consumer_report_t),
(uint8_t *)&eject_report);
}
set_tud_connected(false);
}

Expand Down
7 changes: 6 additions & 1 deletion src/hotkeys.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,16 @@ hotkey_combo_t hotkeys[] = {
.key_count = 1,
.pass_to_os = false,
.action_handler = &lock_screen},
{.modifier = KEYBOARD_MODIFIER_RIGHTALT | KEYBOARD_MODIFIER_RIGHTSHIFT,
.keys = {HID_KEY_Q},
.key_count = 1,
.pass_to_os = false,
.action_handler = &suspend_active_pc},
{.modifier = KEYBOARD_MODIFIER_RIGHTALT | KEYBOARD_MODIFIER_RIGHTSHIFT,
.keys = {HID_KEY_S},
.key_count = 1,
.pass_to_os = false,
.action_handler = &suspend_pc},
.action_handler = &suspend_all_pcs},
{.modifier = KEYBOARD_MODIFIER_RIGHTALT | KEYBOARD_MODIFIER_RIGHTSHIFT,
.keys = {HID_KEY_D},
.key_count = 1,
Expand Down
5 changes: 4 additions & 1 deletion src/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,10 @@ void screensaver_task(device_t *state);
void send_lock_screen_report(uart_packet_t *packet, device_t *state);
void send_suspend_pc_report(uart_packet_t *packet, device_t *state);
void set_onboard_led(device_t *state);
void suspend_pc(void);
void suspend_active_pc(void);
void suspend_all_pcs(void);
void _suspend_linux(void);
void _suspend_macos(void);
void switch_output_a(device_t *state);
void toggle_output(void);
// handlers.c
Expand Down

0 comments on commit c85e25c

Please sign in to comment.