From 56961dc05238cef9ce85a79f0423ff651163999f Mon Sep 17 00:00:00 2001 From: Bradley <324717332+bpavlina@users.noreply.github.com> Date: Wed, 9 Sep 2026 00:34:49 -0400 Subject: [PATCH 1/2] feat(device): wire up the Lamzu Atlantis driver Companion to mouse-protocol's Lamzu Atlantis generation (0x3554). The client opens its notification channel before the first read, so it joins NEEDS_OPEN. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01RWUM7JqBNz5bjMfs3ZVQKn --- src/device/controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/device/controller.ts b/src/device/controller.ts index a1770077..5c7c510a 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -58,6 +58,7 @@ import { } from "@openmouse/protocol/drivers/endgame/egg-we-control"; import { AtkBitmouseHidClient } from "@openmouse/protocol/drivers/atk/bitmouse-hid"; import { AtkHidClient } from "@openmouse/protocol/drivers/atk/hid"; +import { LamzuAtlantisHidClient } from "@openmouse/protocol/drivers/lamzu-atlantis/hid"; import { LamzuHidClient } from "@openmouse/protocol/drivers/lamzu/hid"; import { LogitechHidppClient, @@ -199,7 +200,7 @@ function activeAs(...classes: ClientClass[]): T | null { const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, AtkHidClient, AtkBitmouseHidClient, NinjutsoHidClient] as const; const RAZER_CLASSES = [RazerHidClient, RazerViperMiniHidClient, RazerViperHidClient, RazerCobraHidClient] as const; -const NEEDS_OPEN = [TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, KeychronM6HidClient, ModdoHidClient, ZaunkoenigHidClient, CorsairHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MicrosoftHidClient] as const; +const NEEDS_OPEN = [LamzuAtlantisHidClient, TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, KeychronM6HidClient, ModdoHidClient, ZaunkoenigHidClient, CorsairHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MicrosoftHidClient] as const; const PULSAR_CLASSES = [PulsarHidClient, PulsarProHidClient, PulsarXs1HidClient] as const; const logitechClient = (): LogitechHidppClient | null => activeAs(LogitechHidppClient); From dfcb11ffbb7370b03fa783ea52a4c43dd6e2474a Mon Sep 17 00:00:00 2001 From: Bradley <324717332+bpavlina@users.noreply.github.com> Date: Wed, 9 Sep 2026 00:48:57 -0400 Subject: [PATCH 2/2] fix(device): route the Lamzu Atlantis through the DM settings group MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, the debounce and auto-sleep cards render for the Atlantis and silently do nothing — applyPulsarValue gates on the client groups, and NEEDS_OPEN alone does not join one. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01RWUM7JqBNz5bjMfs3ZVQKn --- src/device/controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/device/controller.ts b/src/device/controller.ts index 5c7c510a..4dac6c1b 100644 --- a/src/device/controller.ts +++ b/src/device/controller.ts @@ -198,7 +198,7 @@ function activeAs(...classes: ClientClass[]): T | null { return null; } -const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, AtkHidClient, AtkBitmouseHidClient, NinjutsoHidClient] as const; +const DM_CLASSES = [WLMouseHidClient, LamzuHidClient, LamzuAtlantisHidClient, AtkHidClient, AtkBitmouseHidClient, NinjutsoHidClient] as const; const RAZER_CLASSES = [RazerHidClient, RazerViperMiniHidClient, RazerViperHidClient, RazerCobraHidClient] as const; const NEEDS_OPEN = [LamzuAtlantisHidClient, TeevolutionHidClient, VgnF2HidClient, KeychronNapeHidClient, KeychronM6HidClient, ModdoHidClient, ZaunkoenigHidClient, CorsairHidClient, FantechHidClient, WallhackMouseHidClient, WallhackKeyboardHidClient, GloriousHidClient, GloriousClassicHidClient, MchoseHidClient, MchoseDockHidClient, MicrosoftHidClient] as const; const PULSAR_CLASSES = [PulsarHidClient, PulsarProHidClient, PulsarXs1HidClient] as const; @@ -207,8 +207,8 @@ const logitechClient = (): LogitechHidppClient | null => activeAs(LogitechHidppC const eggClient = (): EggOp1HidClient | null => activeAs(EggOp1HidClient); const eggWeClient = (): EggWeHidClient | null => active !== null && isEggWeClient(active) ? active : null; -const dmClient = (): WLMouseHidClient | LamzuHidClient | AtkHidClient | AtkBitmouseHidClient | NinjutsoHidClient | null => - activeAs(...DM_CLASSES); +const dmClient = (): WLMouseHidClient | LamzuHidClient | LamzuAtlantisHidClient | AtkHidClient | AtkBitmouseHidClient | NinjutsoHidClient | null => + activeAs(...DM_CLASSES); const razerClient = (): RazerHidClient | RazerViperMiniHidClient | RazerViperHidClient | RazerCobraHidClient | null => activeAs(...RAZER_CLASSES); const viperClient = (): RazerViperV4ProHidClient | null => activeAs(RazerViperV4ProHidClient);