Przeglądaj źródła

Add eject button to older boards with no i2c. Fixed logic errors in button press.

Eric Helgeson 4 miesięcy temu
rodzic
commit
333b483b5a

+ 18 - 17
lib/BlueSCSI_platform_RP2MCU/BlueSCSI_platform.cpp

@@ -283,6 +283,8 @@ bool checkIs2023a() {
         // gpio_conf(BUTTON_SW1_PRE202309a,    GPIO_FUNC_SIO, true, false, false, false, false);
         // gpio_conf(BUTTON_SW1_PRE202309a,    GPIO_FUNC_SIO, false, false, false, false, false);
         // delay(10); /// Settle time
+        gpio_conf(BUTTON_SW1_PRE202309a,    GPIO_FUNC_SIO, true, false, false, false, false);
+        gpio_conf(BUTTON_SW2_PRE202309a,    GPIO_FUNC_SIO, true, false, false, false, false);
 
         // Reset REQ to the appropriate pin for older hardware
         SCSI_OUT_REQ = SCSI_OUT_REQ_PRE09A;
@@ -1115,32 +1117,31 @@ uint8_t platform_get_buttons()
     // if (!gpio_get(GPIO_I2C_SCL)) buttons |= 2;
 #endif // defined(ENABLE_AUDIO_OUTPUT_SPDIF)
 
-    // if (!is2023a) {
-    //     if (!gpio_get(BUTTON_SW1_PRE202309a)) buttons |= 1;
-    //     if (!gpio_get(BUTTON_SW2_PRE202309a)) buttons |= 2;
-    // }
-    // Simple debouncing logic: handle button releases after 100 ms delay.
-    static uint32_t debounce;
-    static uint8_t buttons_debounced = 0;
+    if (!is2023a) {
+        if (!gpio_get(BUTTON_SW1_PRE202309a)) buttons |= 1;
+        if (!gpio_get(BUTTON_SW2_PRE202309a)) buttons |= 2;
+    }
 
-    if (buttons != 0)
-    {
-        buttons_debounced = buttons;
-        debounce = millis();
+    static uint8_t debounced_state = 0;
+    static uint8_t last_state = 0;
+    static uint32_t last_debounce_time = 0;
+
+    if (buttons != last_state) {
+        last_debounce_time = millis();
     }
-    else if ((uint32_t)(millis() - debounce) > 100)
-    {
-        buttons_debounced = 0;
+
+    if ((millis() - last_debounce_time) > 50) { // 50ms debounce
+        debounced_state = buttons;
     }
 
-    return buttons_debounced;
+    last_state = buttons;
+    return debounced_state;
 }
 
 bool platform_has_phy_eject_button()
 {
-    return false;
     // 2023a and later boards have i2c buttons
-    // return !is2023a;
+    return !is2023a;
 }
 
 /************************************/

+ 6 - 4
src/BlueSCSI_disk.cpp

@@ -1238,7 +1238,7 @@ static void diskEjectAction(uint8_t buttonId)
                     || img.deviceType == S2S_CFG_SEQUENTIAL)
             {
                 found = true;
-                logmsg("Eject button ", (int)buttonId, " pressed, passing to SCSI device", (int)i);
+                logmsg("Eject button ", (int)buttonId, " pressed, passing to SCSI ID: ", (int)i);
                 doPerformEject(img);
             }
         }
@@ -1252,10 +1252,10 @@ static void diskEjectAction(uint8_t buttonId)
 
 uint8_t diskEjectButtonUpdate(bool immediate)
 {
-    // treat '1' to '0' transitions as eject actions
+    // treat '0' to '1' transitions as eject actions
     static uint8_t previous = 0x00;
     uint8_t bitmask = platform_get_buttons() & EJECT_BTN_MASK;
-    uint8_t ejectors = (previous ^ bitmask) & previous;
+    uint8_t ejectors = (previous ^ bitmask) & bitmask;
     previous = bitmask;
 
     // defer ejection until the bus is idle
@@ -1275,7 +1275,9 @@ uint8_t diskEjectButtonUpdate(bool immediate)
             uint8_t mask = 1;
             for (uint8_t i = 0; i < 8; i++)
             {
-                if (ejectors & mask) diskEjectAction(ejectors & mask);
+                if (ejectors & mask) {
+                    diskEjectAction(ejectors & mask);
+                }
                 mask = mask << 1;
             }
         }