diff --git a/README.md b/README.md index 261ef78..a8ffcd4 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,9 @@ product ID or have a K87 layout, so the keyboard is ignored without this plugin. Copy `Womier_K87_EVision.js` to `%USERPROFILE%\Documents\WhirlwindFX\Plugins\` and restart SignalRGB. +The device settings have a "Key test" option (column or row sweep) to check the LED map, +and "Low frame-rate mode" in case the keyboard drops frames at full speed. + ## Protocol - HID interface 1, usage page `0xFF1C`, usage `0x92` (collection 4), 64-byte output reports. diff --git a/Womier_K87_EVision.js b/Womier_K87_EVision.js index fbdf8a2..b608cbb 100644 --- a/Womier_K87_EVision.js +++ b/Womier_K87_EVision.js @@ -16,13 +16,15 @@ shutdownColor:readonly LightingMode:readonly forcedColor:readonly lowFPS:readonly +keyTest:readonly */ export function ControllableParameters() { return [ {property:"shutdownColor", group:"lighting", label:"Shutdown Color", description: "This color is applied to the device when the System, or SignalRGB is shutting down", min:"0", max:"360", type:"color", default:"#000000"}, {property:"LightingMode", group:"lighting", label:"Lighting Mode", description: "Determines where the device's RGB comes from. Canvas will pull from the active Effect, while Forced will override it to a specific color", type:"combobox", values:["Canvas", "Forced"], default:"Canvas"}, {property:"forcedColor", group:"lighting", label:"Forced Color", description: "The color used when 'Forced' Lighting Mode is enabled", min:"0", max:"360", type:"color", default:"#009bde"}, - {property:"lowFPS", group:"lighting", label:"Low frame-rate mode", description: "Sends smaller packets with longer pauses, can improve stability", type:"boolean", default:false}, + {property:"lowFPS", group:"lighting", label:"Low frame-rate mode", description: "Sends smaller packets with pauses in between, can improve stability", type:"boolean", default:false}, + {property:"keyTest", group:"lighting", label:"Key test", description: "Sweeps a white line across the keys to check the LED map", type:"combobox", values:["Off", "Column sweep", "Row sweep"], default:"Off"}, ]; } @@ -75,6 +77,8 @@ export function Shutdown(SystemSuspending) { function sendColors(overrideColor) { const RGBData = new Array(LED_SLOTS * 3).fill(0); + const [width, height] = Size(); + const step = Math.floor(Date.now() / 500); for (let iIdx = 0; iIdx < vLeds.length; iIdx++) { const [iPxX, iPxY] = vLedPositions[iIdx]; @@ -82,6 +86,10 @@ function sendColors(overrideColor) { if (overrideColor) { color = hexToRgb(overrideColor); + } else if (keyTest === "Column sweep") { + color = iPxX === step % width ? [255, 255, 255] : [0, 0, 0]; + } else if (keyTest === "Row sweep") { + color = iPxY === step % height ? [255, 255, 255] : [0, 0, 0]; } else if (LightingMode === "Forced") { color = hexToRgb(forcedColor); } else { @@ -98,7 +106,6 @@ function sendColors(overrideColor) { function writeRGBPackage(RGBData) { const bytesToSend = lowFPS ? 48 : 56; - const pauseDuration = lowFPS ? 3 : 1; for (let offset = 0; offset < RGBData.length; offset += bytesToSend) { const data = RGBData.slice(offset, offset + bytesToSend); @@ -116,7 +123,9 @@ function writeRGBPackage(RGBData) { packet[2] = (sum >> 8) & 0xFF; device.write(packet, 64); - device.pause(pauseDuration); + + // device.pause() rounds up to the Windows timer tick (up to ~15 ms), so only pause when asked + if (lowFPS) { device.pause(3); } } }