@kelnishi/satmouse-client 0.16.1 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -596,8 +596,9 @@ var DEFAULT_CONFIG = {
596
596
  dominant: false,
597
597
  lockPosition: false,
598
598
  lockRotation: false,
599
- devices: {
600
- "cnx-*": {
599
+ devices: {},
600
+ deviceClasses: {
601
+ spacemouse: {
601
602
  routes: [
602
603
  { source: "tx", target: "tx" },
603
604
  { source: "ty", target: "ty", flip: true },
@@ -606,17 +607,6 @@ var DEFAULT_CONFIG = {
606
607
  { source: "ry", target: "ry", flip: true },
607
608
  { source: "rz", target: "rz", flip: true }
608
609
  ]
609
- },
610
- // PlayStation: L2 (ty) → TY, R2 (ry) → TY flipped (push-pull)
611
- "hid-54c-*": {
612
- routes: [
613
- { source: "tx", target: "tx" },
614
- { source: "tz", target: "tz" },
615
- { source: "rz", target: "rz" },
616
- { source: "rx", target: "rx" },
617
- { source: "ty", target: "ty" },
618
- { source: "ry", target: "ty", flip: true }
619
- ]
620
610
  }
621
611
  }
622
612
  };
@@ -626,16 +616,22 @@ function mergeConfig(base, partial) {
626
616
  ...partial,
627
617
  routes: partial.routes ?? [...base.routes],
628
618
  buttonRoutes: partial.buttonRoutes ?? [...base.buttonRoutes],
629
- devices: { ...base.devices }
619
+ devices: { ...base.devices },
620
+ deviceClasses: { ...base.deviceClasses }
630
621
  };
631
622
  if (partial.devices) {
632
623
  for (const [key, devCfg] of Object.entries(partial.devices)) {
633
624
  merged.devices[key] = { ...merged.devices[key], ...devCfg };
634
625
  }
635
626
  }
627
+ if (partial.deviceClasses) {
628
+ for (const [key, classCfg] of Object.entries(partial.deviceClasses)) {
629
+ if (classCfg) merged.deviceClasses[key] = { ...merged.deviceClasses[key], ...classCfg };
630
+ }
631
+ }
636
632
  return merged;
637
633
  }
638
- function resolveDeviceConfig(config, deviceId) {
634
+ function resolveDeviceConfig(config, deviceId, deviceClass) {
639
635
  let deviceOverride;
640
636
  if (config.devices[deviceId]) {
641
637
  deviceOverride = config.devices[deviceId];
@@ -647,6 +643,9 @@ function resolveDeviceConfig(config, deviceId) {
647
643
  }
648
644
  }
649
645
  }
646
+ if (!deviceOverride && deviceClass && config.deviceClasses[deviceClass]) {
647
+ deviceOverride = config.deviceClasses[deviceClass];
648
+ }
650
649
  if (!deviceOverride) return config;
651
650
  return {
652
651
  ...config,
@@ -762,7 +761,8 @@ var InputManager = class extends TypedEmitter {
762
761
  }));
763
762
  }
764
763
  getDeviceConfig(deviceId) {
765
- const resolved = resolveDeviceConfig(this._config, deviceId);
764
+ const device = this.knownDevices.get(deviceId);
765
+ const resolved = resolveDeviceConfig(this._config, deviceId, device?.deviceClass);
766
766
  return {
767
767
  routes: resolved.routes,
768
768
  buttonRoutes: resolved.buttonRoutes,
@@ -866,7 +866,8 @@ var InputManager = class extends TypedEmitter {
866
866
  }
867
867
  /** Per-device: deadZone → dominant → routes (flip + scale + remap in one pass) */
868
868
  processPerDevice(raw, deviceId) {
869
- const cfg = resolveDeviceConfig(this._config, deviceId);
869
+ const device = this.knownDevices.get(deviceId);
870
+ const cfg = resolveDeviceConfig(this._config, deviceId, device?.deviceClass);
870
871
  let data = raw;
871
872
  if (cfg.deadZone > 0) {
872
873
  const dz = (v) => Math.abs(v) < cfg.deadZone ? 0 : v;
@@ -892,12 +893,12 @@ var InputManager = class extends TypedEmitter {
892
893
  else r[max.k] = data.rotation[max.k];
893
894
  data = { ...data, translation: t, rotation: r };
894
895
  }
895
- const device = this.knownDevices.get(deviceId);
896
896
  const deviceRoutes = this.resolveRoutes(deviceId, device);
897
897
  data = applyRoutes(data, deviceRoutes, cfg.translateScale, cfg.rotateScale, cfg.wScale);
898
898
  return data;
899
899
  }
900
- /** Get the effective routes for a device: device config override > device axes metadata > global default */
900
+ /** Get the effective routes for a device:
901
+ * device ID override > pattern match > deviceClass > device axes metadata > global default */
901
902
  resolveRoutes(deviceId, device) {
902
903
  const devCfg = this._config.devices[deviceId];
903
904
  if (devCfg?.routes && Array.isArray(devCfg.routes)) return devCfg.routes;
@@ -906,6 +907,10 @@ var InputManager = class extends TypedEmitter {
906
907
  if (cfg.routes && Array.isArray(cfg.routes)) return cfg.routes;
907
908
  }
908
909
  }
910
+ if (device?.deviceClass) {
911
+ const classCfg = this._config.deviceClasses[device.deviceClass];
912
+ if (classCfg?.routes && Array.isArray(classCfg.routes)) return classCfg.routes;
913
+ }
909
914
  if (device?.axes) return buildRoutes(device.axes);
910
915
  return DEFAULT_ROUTES;
911
916
  }