added support for MacAlly Joystick (thanks tashtari@68kmla !)

This commit is contained in:
demik 2024-06-25 16:52:00 +02:00
parent 53b675040e
commit 9e2e5847fc
3 changed files with 50 additions and 2 deletions

View File

@ -1,3 +1,6 @@
## v1.4.8
- added support for MacAlly Joystick
## v1.4.7
- new feature: half click on right BT click (similar to some ADB devices)
- workarounds for v1.4.6 green led regression

View File

@ -50,12 +50,13 @@ extern QueueHandle_t q_qx, q_qy;
/* static defines */
static void adb_handle_button(bool action);
static void adb_rmt_reset(void);
static void adb_rmt_reset(void);
static bool adb_rx_isone(rmt_item32_t cell);
static bool adb_rx_isstop(rmt_item32_t cell);
static bool adb_rx_iszero(rmt_item32_t cell);
static uint16_t IRAM_ATTR adb_rx_mouse();
static void adb_rx_setup(void);
static void adb_scan_macaj(void);
static void adb_tx_as(void);
static void adb_tx_one(void);
static void adb_tx_setup(void);
@ -181,12 +182,17 @@ void adb_probe(void) {
/* Accept all known handlers */
if (((register3 & ADB_H_ALL) == ADB_H_C100) || ((register3 & ADB_H_ALL) == ADB_H_C200) ||
((register3 & ADB_H_ALL) == ADB_H_MTRC) || ((register3 & ADB_H_ALL) == ADB_H_KSGT)) {
((register3 & ADB_H_ALL) == ADB_H_MTRC) || ((register3 & ADB_H_ALL) == ADB_H_KSGT) ||
((register3 & ADB_H_ALL) == ADB_H_MACJ)) {
ESP_LOGI(TAG, "… detected mouse at $3");
break;
}
/* try to find other misc devices */
if (!register3)
adb_scan_macaj();
vTaskDelay(500 / portTICK_PERIOD_MS);
}
@ -206,6 +212,9 @@ void adb_probe(void) {
case ADB_H_C200:
ESP_LOGD(TAG, "Mouse running at 200cpi");
break;
case ADB_H_MACJ:
ESP_LOGD(TAG, "MacAlly Joystick running at default cpi");
break;
case ADB_H_MTRC:
ESP_LOGD(TAG, "MacTRAC running at default cpi");
break;
@ -239,6 +248,38 @@ static void adb_rmt_reset() {
adb_tx_reset();
}
/*
* MacAlly Joystick uses address $5 instead of the classic $3
* First check that it's in mouse mode emulation then switch it to $3
* We should then be able to use the base code path
*
* https://github.com/lampmerchant/tashnotes/blob/main/macintosh/adb/protocols/macally_joystick.md
*/
static void adb_scan_macaj() {
uint16_t register1;
/* the joystick will not move if we don't don't talk to register 3 first */
vTaskDelay(7 / portTICK_PERIOD_MS);
adb_tx_cmd(ADB_MACAJ|ADB_TALK|ADB_REG3);
adb_rx_mouse();
vTaskDelay(7 / portTICK_PERIOD_MS);
adb_tx_cmd(ADB_MACAJ|ADB_TALK|ADB_REG1);
register1 = adb_rx_mouse();
if (register1 == 0xAAAA) {
ESP_LOGD(TAG, "MacAlly Joystick in joystick mode detected, switching modes");
adb_tx_listen(ADB_MACAJ|ADB_LISTEN|ADB_REG1, 0xAAAA);
vTaskDelay(7 / portTICK_PERIOD_MS);
adb_tx_cmd(ADB_MACAJ|ADB_TALK|ADB_REG1);
register1 = adb_rx_mouse();
}
if (register1 == 0x5555) {
ESP_LOGD(TAG, "MacAlly Joystick in mouse mode detected, moving it to $3");
adb_tx_listen(ADB_MACAJ|ADB_LISTEN|ADB_REG3, (ADB_MOUSE<<4)|ADB_H_MOVE);
}
}
void adb_task_host(void *pvParameters) {
/* Classic Apple Mouse Protocol is 16 bits long */
uint16_t data;

View File

@ -57,10 +57,13 @@ void adb_tx_reset(void);
#define ADB_LISTEN 0x8
#define ADB_FLUSH 0x1
#define ADB_REG0 0x0
#define ADB_REG1 0x1
#define ADB_REG2 0x2
#define ADB_REG3 0x3
/* Device addresses */
#define ADB_MOUSE (3<<4) // main device
#define ADB_MACAJ (5<<4) // lost MacAlly Joystick
#define ADB_KML1 (8<<4) // disabled Kensington device
#define ADB_TMP (9<<4) // temporary device
@ -72,6 +75,7 @@ void adb_tx_reset(void);
#define ADB_H_ERR 0x00 // Handler 0 (Self init error)
#define ADB_H_C100 0x01 // Handler 1 (Classic @ 100cpi)
#define ADB_H_C200 0x02 // Handler 2 (Classic @ 200cpi)
#define ADB_H_MACJ 0x03 // Handler for MacAlly Joystick
#define ADB_H_MTRC 0x2f // Handler for MacTRAC 2.0
#define ADB_H_KSGT 0x32 // Handler for Kensington devices
#define ADB_H_MOVE 0xfe // Move to another address