mirror of
https://github.com/CharaChorder/DeviceManager.git
synced 2026-01-20 17:03:42 +00:00
feat: experimental support for compounds
This commit is contained in:
@@ -104,6 +104,26 @@ actions:
|
||||
<<: *tertiary_keymap
|
||||
id: "KM_3_R"
|
||||
variant: right
|
||||
558:
|
||||
id: HOLD_COMPOUND
|
||||
title: Activate Chord Library
|
||||
icon: layers
|
||||
description: |
|
||||
When used in a chord includes that chord as a base
|
||||
compound chord for all subsequent chords.
|
||||
This is effectively a library switch.
|
||||
Since library activations can be nested, you
|
||||
usually add a "Reset Chord Library" before this action.
|
||||
559:
|
||||
id: RELEASE_COMPOUND
|
||||
title: Reset Chord Library
|
||||
icon: layers_clear
|
||||
description: |
|
||||
Releases the active compound state, returning
|
||||
to the default library.
|
||||
While "Activate Chord Library" can only be used
|
||||
as an output of a chord, this action can be assigned
|
||||
to switches directly.
|
||||
576:
|
||||
id: ACTION_DELAY_1000
|
||||
icon: clock_loader_90
|
||||
|
||||
@@ -55,3 +55,19 @@ export function deserializeActions(native: bigint): number[] {
|
||||
|
||||
return actions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hashes a chord input the same way as CCOS
|
||||
*/
|
||||
export function hashChord(actions: number[]) {
|
||||
const chord = new Uint8Array(16);
|
||||
const view = new DataView(chord.buffer);
|
||||
const serialized = serializeActions(actions);
|
||||
view.setBigUint64(0, serialized & 0xffff_ffff_ffff_ffffn, true);
|
||||
view.setBigUint64(8, serialized >> 64n, true);
|
||||
let hash = 2166136261;
|
||||
for (let i = 0; i < 16; i++) {
|
||||
hash = Math.imul(hash ^ view.getUint8(i), 16777619);
|
||||
}
|
||||
return hash & 0x3fff_ffff;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { persistentWritable } from "$lib/storage";
|
||||
import { derived } from "svelte/store";
|
||||
import type { Chord } from "$lib/serial/chord";
|
||||
import { hashChord, type Chord } from "$lib/serial/chord";
|
||||
import {
|
||||
deviceChords,
|
||||
deviceLayout,
|
||||
@@ -158,3 +158,9 @@ export const chords = derived([overlay, deviceChords], ([overlay, chords]) => {
|
||||
a.localeCompare(b),
|
||||
);
|
||||
});
|
||||
|
||||
export const chordHashes = derived(
|
||||
chords,
|
||||
(chords) =>
|
||||
new Map(chords.map((chord) => [hashChord(chord.actions), chord] as const)),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user