Adding the makefile options ADB_MOUSE_ENABLE and ADB_MOUSE_ACCMAX. Might have gone overboard with comments, and tried but failed at not adding more than necessary outside the converter/adb_usb/ folder.exp
COMMAND_ENABLE = yes # Commands for debug and configuration | COMMAND_ENABLE = yes # Commands for debug and configuration | ||||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend | #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend | ||||
#NKRO_ENABLE = yes # USB Nkey Rollover | #NKRO_ENABLE = yes # USB Nkey Rollover | ||||
ADB_MOUSE_ENABLE = yes | |||||
# ADB Mice need acceleration for todays much bigger screens. | |||||
OPT_DEFS += -DADB_MOUSE_MAXACC=8 | |||||
# Optimize size but this may cause error "relocation truncated to fit" | # Optimize size but this may cause error "relocation truncated to fit" |
COMMAND_ENABLE = yes # Commands for debug and configuration | COMMAND_ENABLE = yes # Commands for debug and configuration | ||||
#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend | #SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend | ||||
#NKRO_ENABLE = yes # USB Nkey Rollover(+500) | #NKRO_ENABLE = yes # USB Nkey Rollover(+500) | ||||
ADB_MOUSE_ENABLE = yes | |||||
# ADB Mice need acceleration for todays much bigger screens. | |||||
OPT_DEFS += -DADB_MOUSE_MAXACC=8 | |||||
# Search Path | # Search Path |
#include "debug.h" | #include "debug.h" | ||||
#include "adb.h" | #include "adb.h" | ||||
#include "matrix.h" | #include "matrix.h" | ||||
#include "report.h" | |||||
#include "host.h" | |||||
#if (MATRIX_COLS > 16) | #if (MATRIX_COLS > 16) | ||||
static bool is_modified = false; | static bool is_modified = false; | ||||
static report_mouse_t mouse_report = {}; | |||||
// matrix state buffer(1:on, 0:off) | // matrix state buffer(1:on, 0:off) | ||||
#if (MATRIX_COLS <= 8) | #if (MATRIX_COLS <= 8) | ||||
return; | return; | ||||
} | } | ||||
#ifdef ADB_MOUSE_ENABLE | |||||
#ifdef MAX | |||||
#undef MAX | |||||
#endif | |||||
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) | |||||
void adb_mouse_task(void) | |||||
{ | |||||
uint16_t codes; | |||||
int16_t x, y; | |||||
static int8_t mouseacc; | |||||
_delay_ms(12); // delay for preventing overload of poor ADB keyboard controller | |||||
codes = adb_host_mouse_recv(); | |||||
// If nothing received reset mouse acceleration, and quit. | |||||
if (!codes) { | |||||
mouseacc = 1; | |||||
return; | |||||
}; | |||||
// Bit sixteen is button. | |||||
if (~codes & (1 << 15)) | |||||
mouse_report.buttons |= MOUSE_BTN1; | |||||
if (codes & (1 << 15)) | |||||
mouse_report.buttons &= ~MOUSE_BTN1; | |||||
// lower seven bits are movement, as signed int_7. | |||||
// low byte is X-axis, high byte is Y. | |||||
y = (codes>>8 & 0x3F); | |||||
x = (codes>>0 & 0x3F); | |||||
// bit seven and fifteen is negative | |||||
// usb does not use int_8, but int_7 (measuring distance) with sign-bit. | |||||
if (codes & (1 << 6)) | |||||
x = (x-0x40); | |||||
if (codes & (1 << 14)) | |||||
y = (y-0x40); | |||||
// Accelerate mouse. (They weren't meant to be used on screens larger than 320x200). | |||||
x *= mouseacc; | |||||
y *= mouseacc; | |||||
// Cap our two bytes per axis to one byte. | |||||
// Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)... | |||||
// I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127) | |||||
mouse_report.x = -MAX(-MAX(x, -127), -127); | |||||
mouse_report.y = -MAX(-MAX(y, -127), -127); | |||||
if (debug_mouse) { | |||||
print("adb_host_mouse_recv: "); print_bin16(codes); print("\n"); | |||||
print("adb_mouse raw: ["); | |||||
phex(mouseacc); print(" "); | |||||
phex(mouse_report.buttons); print("|"); | |||||
print_decs(mouse_report.x); print(" "); | |||||
print_decs(mouse_report.y); print("]\n"); | |||||
} | |||||
// Send result by usb. | |||||
host_mouse_send(&mouse_report); | |||||
// increase acceleration of mouse | |||||
mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 ); | |||||
return; | |||||
} | |||||
#endif | |||||
uint8_t matrix_scan(void) | uint8_t matrix_scan(void) | ||||
{ | { | ||||
/* extra_key is volatile and more convoluted than necessary because gcc refused | /* extra_key is volatile and more convoluted than necessary because gcc refused |
#ifdef SERIAL_MOUSE_ENABLE | #ifdef SERIAL_MOUSE_ENABLE | ||||
#include "serial_mouse.h" | #include "serial_mouse.h" | ||||
#endif | #endif | ||||
#ifdef ADB_MOUSE_ENABLE | |||||
#include "adb.h" | |||||
#endif | |||||
#ifdef MATRIX_HAS_GHOST | #ifdef MATRIX_HAS_GHOST | ||||
#ifdef SERIAL_MOUSE_ENABLE | #ifdef SERIAL_MOUSE_ENABLE | ||||
serial_mouse_init(); | serial_mouse_init(); | ||||
#endif | #endif | ||||
#ifdef ADB_MOUSE_ENABLE | |||||
adb_mouse_init(); | |||||
#endif | |||||
#ifdef BOOTMAGIC_ENABLE | #ifdef BOOTMAGIC_ENABLE | ||||
serial_mouse_task(); | serial_mouse_task(); | ||||
#endif | #endif | ||||
#ifdef ADB_MOUSE_ENABLE | |||||
adb_mouse_task(); | |||||
#endif | |||||
// update LED | // update LED | ||||
if (led_status != host_keyboard_leds()) { | if (led_status != host_keyboard_leds()) { | ||||
led_status = host_keyboard_leds(); | led_status = host_keyboard_leds(); |
SRC += $(PROTOCOL_DIR)/serial_uart.c | SRC += $(PROTOCOL_DIR)/serial_uart.c | ||||
endif | endif | ||||
ifdef ADB_MOUSE_ENABLE | |||||
OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE | |||||
endif | |||||
# Search Path | # Search Path | ||||
VPATH += $(TMK_DIR)/protocol | VPATH += $(TMK_DIR)/protocol |
static inline void send_byte(uint8_t data); | static inline void send_byte(uint8_t data); | ||||
static inline uint16_t wait_data_lo(uint16_t us); | static inline uint16_t wait_data_lo(uint16_t us); | ||||
static inline uint16_t wait_data_hi(uint16_t us); | static inline uint16_t wait_data_hi(uint16_t us); | ||||
static inline uint16_t adb_host_dev_recv(uint8_t device); | |||||
void adb_host_init(void) | void adb_host_init(void) | ||||
// | // | ||||
// [from Apple IIgs Hardware Reference Second Edition] | // [from Apple IIgs Hardware Reference Second Edition] | ||||
enum { | |||||
ADDR_KEYB = 0x20, | |||||
ADDR_MOUSE = 0x30 | |||||
}; | |||||
uint16_t adb_host_kbd_recv(void) | uint16_t adb_host_kbd_recv(void) | ||||
{ | |||||
return adb_host_dev_recv(ADDR_KEYB); | |||||
} | |||||
#ifdef ADB_MOUSE_ENABLE | |||||
void adb_mouse_init(void) { | |||||
return; | |||||
} | |||||
uint16_t adb_host_mouse_recv(void) | |||||
{ | |||||
return adb_host_dev_recv(ADDR_MOUSE); | |||||
} | |||||
#endif | |||||
static inline uint16_t adb_host_dev_recv(uint8_t device) | |||||
{ | { | ||||
uint16_t data = 0; | uint16_t data = 0; | ||||
cli(); | cli(); | ||||
attention(); | attention(); | ||||
send_byte(0x2C); // Addr:Keyboard(0010), Cmd:Talk(11), Register0(00) | |||||
send_byte(device|0x0C); // Addr:Keyboard(0010)/Mouse(0011), Cmd:Talk(11), Register0(00) | |||||
place_bit0(); // Stopbit(0) | place_bit0(); // Stopbit(0) | ||||
if (!wait_data_hi(500)) { // Service Request(310us Adjustable Keyboard): just ignored | if (!wait_data_hi(500)) { // Service Request(310us Adjustable Keyboard): just ignored | ||||
sei(); | sei(); |
void adb_host_init(void); | void adb_host_init(void); | ||||
bool adb_host_psw(void); | bool adb_host_psw(void); | ||||
uint16_t adb_host_kbd_recv(void); | uint16_t adb_host_kbd_recv(void); | ||||
uint16_t adb_host_mouse_recv(void); | |||||
void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l); | void adb_host_listen(uint8_t cmd, uint8_t data_h, uint8_t data_l); | ||||
void adb_host_kbd_led(uint8_t led); | void adb_host_kbd_led(uint8_t led); | ||||
void adb_mouse_task(void); | |||||
void adb_mouse_init(void); | |||||
#endif | #endif |
SRC += $(PJRC_DIR)/usb_mouse.c | SRC += $(PJRC_DIR)/usb_mouse.c | ||||
endif | endif | ||||
ifdef ADB_MOUSE_ENABLE | |||||
SRC += $(PJRC_DIR)/usb_mouse.c | |||||
endif | |||||
ifdef PS2_MOUSE_ENABLE | ifdef PS2_MOUSE_ENABLE | ||||
SRC += $(PJRC_DIR)/usb_mouse.c | SRC += $(PJRC_DIR)/usb_mouse.c | ||||
endif | endif |