- if (code == MS_WH_UP) mouse_vwheel += 1;
- if (code == MS_WH_DOWN) mouse_vwheel -= 1;
- if (code == MS_WH_LEFT) mouse_hwheel -= 1;
- if (code == MS_WH_RIGHT) mouse_hwheel += 1;
- } else if (IS_FN(code)) {
- fn_bits |= FN_BIT(code);
- } else {
- // normal keys
- if (key_index < 6)
- keyboard_keys[key_index] = code;
- key_index++;
+ if (code == MS_WH_U) mouse_vwheel += 1;
+ if (code == MS_WH_D) mouse_vwheel -= 1;
+ if (code == MS_WH_L) mouse_hwheel -= 1;
+ if (code == MS_WH_R) mouse_hwheel += 1;
+ }
+
+ // audio control & system control
+ else if (code == KB_MUTE) {
+ usb_extra_audio_send(AUDIO_MUTE);
+ usb_extra_audio_send(0);
+ _delay_ms(500);
+ } else if (code == KB_VOLU) {
+ usb_extra_audio_send(AUDIO_VOL_UP);
+ usb_extra_audio_send(0);
+ _delay_ms(100);
+ } else if (code == KB_VOLD) {
+ usb_extra_audio_send(AUDIO_VOL_DOWN);
+ usb_extra_audio_send(0);
+ _delay_ms(100);
+ } else if (code == KB_PWR) {
+ if (suspend && remote_wakeup) {
+ usb_remote_wakeup();
+ } else {
+ usb_extra_system_send(SYSTEM_POWER_DOWN);
+ }
+ _delay_ms(1000);
+ }
+
+ // normal keys
+ else {
+ // TODO: fix ugly code
+ int8_t i = 0;
+ int8_t empty = -1;
+ for (; i < KEYBOARD_REPORT_MAX; i++) {
+ if (usb_keyboard_keys_prev[i] == code) {
+ usb_keyboard_keys[i] = code;
+ break;
+ } else if (empty == -1 && usb_keyboard_keys_prev[i] == 0 && usb_keyboard_keys[i] == 0) {
+ empty = i;
+ }
+ }
+ if (i == KEYBOARD_REPORT_MAX) {
+ if (empty != -1) {
+ usb_keyboard_keys[empty] = code;
+ }
+ }