فهرست منبع

make wake less kitchen-sinky

Jariullah Safi 4 ماه پیش
والد
کامیت
0236d19020
5فایلهای تغییر یافته به همراه11 افزوده شده و 49 حذف شده
  1. 7 8
      ARCHITECTURE.md
  2. 0 5
      OpenPuck/controllers.h
  3. 4 33
      OpenPuck/puck_hid.cpp
  4. 0 1
      OpenPuck/puck_hid.h
  5. 0 2
      OpenPuck/rf_link.cpp

+ 7 - 8
ARCHITECTURE.md

@@ -211,14 +211,13 @@ Waking the host is an **explicit gesture, never a side effect of input**. While
 personality sends *nothing* (no `0x45` forwards, no lizard mouse/keyboard, no periodic `0x79`/`0x7B` status) —
 a suspended-bus `sendReport` can itself translate into a host wake, which made the PC wake on any trackpad
 graze and nearly impossible to keep asleep. The only wake triggers are a **Steam-button short press** or a
-**controller connect**, detected in `rf_link.cpp` (guarded by `USBDevice.suspended()`). Each fires two things:
-
-1. `USBDevice.remoteWakeup()` — the device-level USB resume signal; and
-2. `g_active->wakeEvent()` — the controller queues a **wake nudge**: once the bus has resumed, the puck
-   personality sends a deliberate space-bar press+release (keyboard report `0x41`) and a mouse click
-   press+release (report `0x40`) on its own interface (`wakeNudgeTask` in `puck_hid.cpp`). The nudge exists
-   because some hosts ignore a bare resume signal unless real keyboard/mouse input follows it; it can't be
-   sent *during* suspend (reports can't cross a suspended bus), so it's delivered immediately after resume.
+**controller connect**, detected in `rf_link.cpp` (guarded by `USBDevice.suspended()`), which call
+`USBDevice.remoteWakeup()` — the device-level USB resume signal.
+
+(An earlier build also injected a post-resume "nudge" — a synthetic space-bar + mouse click on the puck's own
+HID reports — on the theory that some hosts ignore a bare resume. It was removed: once the wake-mouse interface
+gave the device a wait-wake-armed `mouhid` function the resume alone is honored, and the synthetic input had
+side effects on the host, e.g. landing on the desktop/taskbar after wake and launching apps.)
 
 The board LED is a wake debugger (`status_led.cpp`): dark in all steady states (including while armed), and a
 500 ms flash at the moment a `remoteWakeup()` is actually sent. Flash + host stays asleep = the resume was sent

+ 0 - 5
OpenPuck/controllers.h

@@ -10,10 +10,6 @@
 //                    modes (Xbox, puck/lizard) build + send their host report here. STREAM-style modes ignore
 //                    it and instead emit at a fixed cadence from task(); they read the decoded g_in directly.
 //   task()        -- called every loop(): streaming emit, handshake/subcommand draining, mode-specific upkeep.
-//   wakeEvent()   -- called from rf_link.cpp when a deliberate wake gesture fires while the host is suspended
-//                    (Steam-button short press, or controller connect). The device-level resume signal
-//                    (USBDevice.remoteWakeup) has already been sent; a controller can additionally queue a
-//                    host-visible input nudge to deliver once the bus resumes (see puck_hid.cpp).
 //   isPuck()      -- true for Steam/Lizard (keep the boot CDC composite; different USB lifecycle in setup()).
 //
 // To add a new controller: implement IController in a new mode_*.cpp, give it a singleton, and wire it into
@@ -27,7 +23,6 @@ public:
   virtual void begin() = 0;
   virtual void onReport45(const uint8_t* rep, bool fresh, uint8_t bodyTlen) { (void)rep; (void)fresh; (void)bodyTlen; }
   virtual void task() {}
-  virtual void wakeEvent() {}
   virtual bool isPuck() const { return false; }
 };
 

+ 4 - 33
OpenPuck/puck_hid.cpp

@@ -173,11 +173,10 @@ void SteamPuckController::begin(){
 // Forward the controller's report 0x45 to Steam, or drive lizard kb/mouse when Steam is closed. This is a
 // PURELY USB-SIDE decision -- it changes nothing about the RF poll or the host->controller relay.
 void SteamPuckController::onReport45(const uint8_t* rep, bool fresh, uint8_t bodyTlen){
-  // Host asleep -> forward NOTHING automatically. While suspended, every sendReport attempt (lizard mouse from
-  // a trackpad graze, 0x45 forwards) can translate into a host wake -- which made the PC wake on any controller
-  // movement and nearly impossible to keep asleep. Waking is an explicit gesture only: rf_link fires
-  // wakeEvent() (Steam-button short press / controller connect), and task() delivers a deliberate space+click
-  // nudge after the bus resumes.
+  // Host asleep -> forward NOTHING. While suspended, every sendReport attempt (a lizard-mouse report from a
+  // trackpad graze, a 0x45 forward) can translate into a host wake -- which made the PC wake on any controller
+  // movement and nearly impossible to keep asleep. Waking is an explicit gesture only (Steam-button short press
+  // / controller connect), handled in rf_link.cpp via the device-level USB resume signal.
   if (USBDevice.suspended()) return;
   if (g_connSlot < 0 || g_connSlot >= NSLOT) return;
   if (lizardActive()){
@@ -192,38 +191,10 @@ void SteamPuckController::onReport45(const uint8_t* rep, bool fresh, uint8_t bod
   }
 }
 
-// ---- wake nudge: a deliberate space-bar press + mouse click on the puck's OWN kb/mouse reports (0x41/0x40),
-// delivered right after the bus resumes. The resume signal alone is ignored by some hosts unless real input
-// from a keyboard/mouse-class device follows; this provides it. Queued by wakeEvent() (called from rf_link on
-// a Steam-button short press or a controller connect while suspended); stepped here at ~15ms per phase.
-static uint8_t       g_nudgeStep = 0;      // 0=idle, 1=space down, 2=space up, 3=click down, 4=click up
-static unsigned long g_nudgeMs = 0;
-void SteamPuckController::wakeEvent(){
-  g_nudgeStep = 1; g_nudgeMs = millis();
-}
-static void wakeNudgeTask(){
-  if(!g_nudgeStep) return;
-  if(millis()-g_nudgeMs > 5000){ g_nudgeStep=0; return; }            // bus never resumed -> drop the nudge
-  if(USBDevice.suspended()) return;                                   // wait for resume; reports can't cross a suspended bus
-  if(g_connSlot<0 || g_connSlot>=NSLOT || !hid[g_connSlot].ready()) return;
-  static unsigned long stepMs=0;
-  if(millis()-stepMs < 15) return;                                    // pace the press/release edges
-  stepMs=millis();
-  switch(g_nudgeStep){
-    case 1: { uint8_t k[8]={0,0,HID_KEY_SPACE,0,0,0,0,0}; hid[g_connSlot].sendReport(0x41,k,8); break; }
-    case 2: { uint8_t k[8]={0,0,0,0,0,0,0,0};             hid[g_connSlot].sendReport(0x41,k,8); break; }
-    case 3: case 4: {
-      hid_mouse_report_t m; m.buttons=(g_nudgeStep==3)?1:0; m.x=0; m.y=0; m.wheel=0; m.pan=0;
-      hid[g_connSlot].sendReport(0x40,&m,sizeof m); break; }
-  }
-  g_nudgeStep = (g_nudgeStep>=4) ? 0 : (uint8_t)(g_nudgeStep+1);
-}
-
 // USB connection presentation (like the real dongle): report 0x79 = connection state (01=disc, 02=conn),
 // edge-triggered, + periodic 0x7B status. Live-captured: this is what Steam reads to mark the controller
 // connected. Without it Steam shows disconnected even though 0x45 input is streaming.
 void SteamPuckController::task(){
-  wakeNudgeTask();
   if (USBDevice.suspended()) return;   // no periodic 0x79/0x7B while the host sleeps -- those sends can wake it too
   static bool usbConn=false; static unsigned long last79=0, last7B=0;
   bool conn = (g_connSlot>=0 && millis()-g_connReplyMs < 300);

+ 0 - 1
OpenPuck/puck_hid.h

@@ -22,7 +22,6 @@ public:
   void begin() override;
   void onReport45(const uint8_t* rep, bool fresh, uint8_t bodyTlen) override;
   void task() override;
-  void wakeEvent() override;   // queue the space+click wake nudge (delivered by task() once the bus resumes)
   bool isPuck() const override { return true; }
 };
 extern SteamPuckController g_steamPuck;

+ 0 - 2
OpenPuck/rf_link.cpp

@@ -156,7 +156,6 @@ uint8_t rfConnTx(uint8_t ch, uint8_t s1, const uint8_t* payload, uint8_t plen){
                 if(steamNow && !steamWasDown) steamDownMs=millis();                                                            // rising edge: record press time
                 if(!steamNow && steamWasDown && millis()-steamDownMs<1000u && USBDevice.suspended()){                          // falling edge within 1 s -> short press -> wake
                   USBDevice.remoteWakeup(); ledWakePulse();
-                  if(g_active) g_active->wakeEvent();   // queue the post-resume input nudge (space+click on puck modes)
                 }
                 steamWasDown=steamNow;
               }
@@ -255,7 +254,6 @@ void rfLinkTask(){
     bool nowRfConn=(g_connSlot>=0 && millis()-g_connReplyMs<300);
     if(nowRfConn && !wasRfConn && USBDevice.suspended()){
       USBDevice.remoteWakeup(); ledWakePulse();
-      if(g_active) g_active->wakeEvent();   // queue the post-resume input nudge (space+click on puck modes)
     }
     wasRfConn=nowRfConn;
   }