diff --git a/src/lib/supported-mice.ts b/src/lib/supported-mice.ts index 8685ee5..f2d264e 100644 --- a/src/lib/supported-mice.ts +++ b/src/lib/supported-mice.ts @@ -143,6 +143,10 @@ export const SUPPORTED_BRANDS: SupportedBrand[] = [ brand: "Fantech", models: [{ model: "WG14P Yari Pro Wireless 8K Gaming Mouse" }], }, + { + brand: "Lingbao", + models: [{ model: "M5 Pro (2.4G / wired)" }], + }, { brand: "G-Wolves", models: [{ model: "HTX Ultra (wired)" }, { model: "HTX Ultra (wireless)" }], diff --git a/src/native-hid/brands.ts b/src/native-hid/brands.ts index c47a21c..0e73343 100644 --- a/src/native-hid/brands.ts +++ b/src/native-hid/brands.ts @@ -22,6 +22,7 @@ import { AttackSharkHidClient } from "@openmouse/protocol/drivers/attackshark/hi import { EggOp1HidClient } from "@openmouse/protocol/drivers/endgame/egg-op1-hid"; import { EggWeHidClient } from "@openmouse/protocol/drivers/endgame/egg-we-hid"; import { FantechHidClient } from "@openmouse/protocol/drivers/fantech/hid"; +import { LingbaoHidClient } from "@openmouse/protocol/drivers/lingbao/hid"; import { FinalmouseHidClient } from "@openmouse/protocol/drivers/finalmouse/hid"; import { GWolvesHidClient } from "@openmouse/protocol/drivers/gwolves/hid"; import { KeychronHidClient } from "@openmouse/protocol/drivers/keychron/hid"; @@ -150,7 +151,14 @@ export const BRAND_DRIVERS: BrandEntry[] = [ { brand: "ATK", vendorIds: [0x373b], candidates: [client("AtkHidClient", AtkHidClient)] }, { brand: "Attack Shark", vendorIds: [0x1d57, 0x25a7, 0x373e], candidates: [client("AttackSharkHidClient", AttackSharkHidClient)] }, { brand: "Keychron", vendorIds: [0x3434], candidates: [client("KeychronHidClient", KeychronHidClient)] }, - { brand: "Fantech", vendorIds: [0x3151], candidates: [client("FantechHidClient", FantechHidClient)] }, + // 0x3151 is the MicLink/mlzn ODM vendor id, shared by Lingbao and Fantech. + // Lingbao goes first: its M5 Pro needs a 2.4G relay handshake and a checksum + // FantechHidClient does not implement, and probeInterface() falls through to + // Fantech when LingbaoHidClient.readStatus() rejects. + { brand: "Lingbao", vendorIds: [0x3151], candidates: [ + client("LingbaoHidClient", LingbaoHidClient), + client("FantechHidClient", FantechHidClient), + ] }, { brand: "Wooting", vendorIds: [0x31e3], candidates: [client("WootingHidClient", WootingHidClient)] }, { brand: "WALLHACK", vendorIds: [0x3879, 0x1caa], candidates: [ client("WallhackMouseHidClient", WallhackMouseHidClient), diff --git a/src/pages/OverviewPage.tsx b/src/pages/OverviewPage.tsx index d5970c8..f5aaeb0 100644 --- a/src/pages/OverviewPage.tsx +++ b/src/pages/OverviewPage.tsx @@ -67,6 +67,11 @@ const BRAND_FEATURES: Record = { icon: Gauge, label: "DPI" }, { icon: Zap, label: "Polling Rate" }, ], + Lingbao: [ + { icon: Gauge, label: "DPI" }, + { icon: Zap, label: "Polling Rate" }, + { icon: Battery, label: "Battery" }, + ], Keychron: [ { icon: Gauge, label: "DPI" }, { icon: Zap, label: "Polling Rate" },