scan-engine 0.1.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.
- package/README.md +89 -0
- package/dist/index.d.ts +317 -0
- package/dist/index.js +1823 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Scanner.ts","../src/scanners/RowColumnScanner.ts","../src/scanners/LinearScanner.ts","../src/scanners/SnakeScanner.ts","../src/scanners/QuadrantScanner.ts","../src/scanners/GroupScanner.ts","../src/scanners/EliminationScanner.ts","../src/scanners/ContinuousScanner.ts","../src/PredictorManager.ts","../src/scanners/ProbabilityScanner.ts","../src/scanners/CauseEffectScanner.ts","../src/scanners/ColorCodeScanner.ts"],"sourcesContent":["import type { ScanCallbacks, ScanConfigProvider, ScanSurface, SwitchAction } from './types';\n\n// Critical Overscan states\nexport enum OverscanState {\n FAST = 'fast',\n SLOW_BACKWARD = 'slow_backward',\n}\n\nexport abstract class Scanner {\n protected surface: ScanSurface;\n protected config: ScanConfigProvider;\n protected callbacks: ScanCallbacks;\n protected isRunning: boolean = false;\n protected timer: number | null = null;\n protected stepCount: number = 0;\n protected overscanState: OverscanState = OverscanState.FAST;\n protected loopCount: number = 0;\n\n constructor(surface: ScanSurface, config: ScanConfigProvider, callbacks: ScanCallbacks = {}) {\n this.surface = surface;\n this.config = config;\n this.callbacks = callbacks;\n }\n\n public start() {\n this.isRunning = true;\n this.stepCount = 0;\n this.loopCount = 0;\n this.overscanState = OverscanState.FAST;\n this.reset();\n this.scheduleNextStep();\n }\n\n public stop() {\n this.isRunning = false;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n this.surface.setFocus([]);\n }\n\n public handleAction(action: SwitchAction): void {\n if (action === 'select') {\n this.handleSelectAction();\n } else if (action === 'step') {\n if (this.config.get().scanInputMode === 'manual') {\n this.step();\n this.stepCount++;\n this.callbacks.onScanStep?.();\n }\n } else if (action === 'reset') {\n this.loopCount = 0;\n this.reset();\n this.stepCount = 0;\n this.overscanState = OverscanState.FAST;\n if (this.config.get().scanInputMode === 'auto') {\n this.isRunning = true;\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n }\n }\n\n protected handleSelectAction() {\n const config = this.config.get();\n\n if (config.criticalOverscan.enabled) {\n if (this.overscanState === OverscanState.FAST) {\n this.overscanState = OverscanState.SLOW_BACKWARD;\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n return;\n } else if (this.overscanState === OverscanState.SLOW_BACKWARD) {\n this.overscanState = OverscanState.FAST;\n this.doSelection();\n return;\n }\n }\n\n this.doSelection();\n }\n\n protected abstract step(): void;\n protected abstract reset(): void;\n\n protected reportCycleCompleted() {\n this.loopCount++;\n const config = this.config.get();\n if (config.scanLoops > 0 && this.loopCount >= config.scanLoops) {\n this.stop();\n this.loopCount = 0;\n }\n }\n\n protected scheduleNextStep() {\n if (!this.isRunning) return;\n\n const config = this.config.get();\n if (config.scanInputMode === 'manual') {\n return;\n }\n\n let rate: number;\n if (config.criticalOverscan.enabled && this.overscanState === OverscanState.SLOW_BACKWARD) {\n rate = config.criticalOverscan.slowRate;\n } else {\n const isFirstItem = this.stepCount === 0;\n rate = isFirstItem && config.initialItemPause > 0\n ? config.initialItemPause\n : (config.criticalOverscan.enabled ? config.criticalOverscan.fastRate : config.scanRate);\n }\n\n if (this.timer) clearTimeout(this.timer);\n\n this.timer = window.setTimeout(() => {\n this.step();\n this.callbacks.onScanStep?.();\n this.stepCount++;\n this.scheduleNextStep();\n }, rate);\n }\n\n protected triggerSelection(index: number) {\n const item = this.surface.getItemData?.(index);\n if (item?.isEmpty) {\n this.stepCount = 0;\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n return;\n }\n\n this.surface.setSelected(index);\n this.callbacks.onSelect?.(index);\n }\n\n protected triggerRedraw() {\n this.callbacks.onRedraw?.();\n }\n\n public abstract getCost(itemIndex: number): number;\n\n protected abstract doSelection(): void;\n\n public mapContentToGrid<T>(content: T[], _rows: number, _cols: number): T[] {\n return content;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class RowColumnScanner extends Scanner {\n private level: 'rows' | 'cells' = 'rows';\n private currentRow: number = -1;\n private currentCol: number = -1;\n private totalRows: number = 0;\n private isColumnRow: boolean = false;\n private useBlockScanning: boolean = true;\n\n public start() {\n const config = this.config.get();\n this.isColumnRow = config.scanPattern === 'column-row';\n this.useBlockScanning = config.scanTechnique === 'block';\n this.recalcDimensions();\n super.start();\n }\n\n private recalcDimensions() {\n const totalItems = this.surface.getItemsCount();\n if (this.isColumnRow) {\n // In Column-Row, primary groups are columns.\n // But GridRenderer is always Row-Major layout.\n // So \"Rows\" in scanner logic might mean \"Columns\" visually?\n // Let's implement distinct logic for clarity.\n this.totalRows = this.surface.getColumns();\n } else {\n this.totalRows = Math.ceil(totalItems / this.surface.getColumns());\n }\n }\n\n protected reset() {\n // For point scanning, skip the row/column group level\n this.level = this.useBlockScanning ? 'rows' : 'cells';\n this.currentRow = -1;\n this.currentCol = -1;\n this.surface.setFocus([]);\n }\n\n protected step() {\n if (this.useBlockScanning && this.level === 'rows') {\n this.stepMajor();\n } else {\n this.stepMinor();\n }\n }\n\n private stepMajor() {\n this.currentRow++;\n if (this.currentRow >= this.totalRows) {\n this.currentRow = 0;\n }\n this.highlightMajor(this.currentRow);\n }\n\n private stepMinor() {\n // Determine bounds for minor step\n let maxMinor = 0;\n const totalItems = this.surface.getItemsCount();\n const cols = this.surface.getColumns();\n const rows = Math.ceil(totalItems / cols);\n\n if (this.useBlockScanning) {\n // Block scanning: scan within the selected row/column\n if (this.isColumnRow) {\n // Major is Column (this.currentRow is col index)\n // Minor is Row (this.currentCol is row index)\n // How many rows in this column?\n const colIdx = this.currentRow;\n const lastRowLength = totalItems % cols || cols;\n\n if (colIdx < lastRowLength) {\n maxMinor = rows;\n } else {\n maxMinor = rows - 1;\n }\n } else {\n // Major is Row\n // Minor is Column\n const rowStart = this.currentRow * cols;\n maxMinor = Math.min(cols, totalItems - rowStart);\n }\n\n this.currentCol++;\n if (this.currentCol >= maxMinor) {\n this.currentCol = 0;\n }\n } else {\n // Point scanning: scan through all items in row/column order\n this.currentCol++;\n if (this.currentCol >= totalItems) {\n this.currentCol = 0;\n }\n }\n\n // Calculate actual index\n let index = -1;\n if (this.useBlockScanning) {\n if (this.isColumnRow) {\n index = this.currentCol * cols + this.currentRow;\n } else {\n index = this.currentRow * cols + this.currentCol;\n }\n } else {\n // Point scanning: iterate in row-major or column-major order\n if (this.isColumnRow) {\n // Column-major order\n const row = Math.floor(this.currentCol / cols);\n const col = this.currentCol % cols;\n index = row * cols + col;\n } else {\n // Row-major order (simple linear)\n index = this.currentCol;\n }\n }\n\n if (index >= 0 && index < totalItems) {\n const cfg = this.config.get();\n this.surface.setFocus([index], {\n phase: this.useBlockScanning ? 'minor' : 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n }\n\n private highlightMajor(majorIndex: number) {\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n const indices = [];\n\n if (this.isColumnRow) {\n // Highlight Column\n // Grid is Row-Major. Col 0 is indices 0, 8, 16...\n const rows = Math.ceil(totalItems / cols);\n for (let r = 0; r < rows; r++) {\n const idx = r * cols + majorIndex;\n if (idx < totalItems) indices.push(idx);\n }\n } else {\n // Highlight Row\n const start = majorIndex * cols;\n const end = Math.min(start + cols, totalItems);\n for (let i = start; i < end; i++) indices.push(i);\n }\n\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'major',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'cancel') {\n if (this.useBlockScanning && this.level === 'cells') {\n this.level = 'rows';\n this.currentCol = -1;\n this.highlightMajor(this.currentRow);\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n } else {\n this.reset();\n }\n } else {\n // Let base class handle select, reset, step, etc.\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.useBlockScanning && this.level === 'rows') {\n if (this.currentRow >= 0) {\n this.level = 'cells';\n this.currentCol = -1;\n this.surface.setSelected(-1);\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n } else {\n // Select Item (either point scanning or second level of block scanning)\n let index = -1;\n const cols = this.surface.getColumns();\n\n if (this.useBlockScanning) {\n if (this.isColumnRow) {\n index = this.currentCol * cols + this.currentRow;\n } else {\n index = this.currentRow * cols + this.currentCol;\n }\n } else {\n // Point scanning\n if (this.isColumnRow) {\n const row = Math.floor(this.currentCol / cols);\n const col = this.currentCol % cols;\n index = row * cols + col;\n } else {\n index = this.currentCol;\n }\n }\n\n if (index >= 0) {\n this.triggerSelection(index);\n this.reset();\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n }\n }\n\n public getCost(itemIndex: number): number {\n const cols = this.surface.getColumns();\n const row = Math.floor(itemIndex / cols);\n const col = itemIndex % cols;\n\n if (this.useBlockScanning) {\n // Block scanning: cost = row/col + item within row/col\n if (this.isColumnRow) {\n return (col + 1) + (row + 1);\n }\n return (row + 1) + (col + 1);\n } else {\n // Point scanning: simple linear cost\n if (this.isColumnRow) {\n // Column-major order cost\n return col + 1 + row + 1;\n }\n return itemIndex + 1;\n }\n }\n\n public mapContentToGrid<T>(content: T[], rows: number, cols: number): T[] {\n // If Row-Column, default identity mapping is correct (A, B, C fills row).\n if (this.config.get().scanPattern !== 'column-row') {\n return content;\n }\n\n // If Column-Row, we want A, B, C to fill the first COLUMN.\n // Grid is Row-Major (0=0,0; 1=0,1).\n // We want Content[0] ('A') at Grid[0] (0,0).\n // Content[1] ('B') at Grid[cols] (1,0).\n\n const newContent = new Array(content.length);\n let contentIdx = 0;\n\n // Iterate columns, then rows\n for (let c = 0; c < cols; c++) {\n for (let r = 0; r < rows; r++) {\n if (contentIdx >= content.length) break;\n\n const gridIndex = r * cols + c;\n if (gridIndex < newContent.length) {\n newContent[gridIndex] = content[contentIdx++];\n }\n }\n }\n return newContent;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class LinearScanner extends Scanner {\n private currentIndex: number = -1;\n private totalItems: number = 0;\n private direction: number = 1; // 1 for forward, -1 for reverse\n\n public start() {\n // Need to know how many items are in the grid\n // For now we assume the renderer has items loaded.\n // In a real scenario, we might query the renderer or pass the items.\n // We can use a trick: try to get items until undefined.\n this.totalItems = this.countItems();\n this.direction = 1; // Reset direction on start\n super.start();\n }\n\n private countItems(): number {\n return this.surface.getItemsCount();\n }\n\n protected reset() {\n this.currentIndex = -1;\n this.direction = 1; // Reset direction\n this.loopCount = 0; // Reset loop count\n this.surface.setFocus([]);\n }\n\n protected step() {\n const config = this.config.get();\n // Critical overscan: slow backward phase ignores normal scan direction\n if (config.criticalOverscan.enabled && this.overscanState === 'slow_backward') {\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.totalItems - 1;\n this.reportCycleCompleted();\n }\n const cfg = this.config.get();\n this.surface.setFocus([this.currentIndex], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n return;\n }\n\n switch (config.scanDirection) {\n case 'circular':\n // Normal circular: 0,1,2,...,n-1,0,1,2,...\n this.currentIndex++;\n if (this.currentIndex >= this.totalItems) {\n this.currentIndex = 0;\n this.reportCycleCompleted(); // Report cycle completion\n }\n break;\n\n case 'reverse':\n // Reverse: n-1,n-2,...,0,n-1,n-2,...\n this.currentIndex--;\n if (this.currentIndex < 0) {\n this.currentIndex = this.totalItems - 1;\n this.reportCycleCompleted(); // Report cycle completion\n }\n break;\n\n case 'oscillating':\n // Oscillating: 0,1,2,...,n-1,n-2,...,1,0,1,2,...\n // Change direction if we're about to hit an endpoint\n if (this.currentIndex >= this.totalItems - 1 && this.direction === 1) {\n this.direction = -1; // Reached end, next step will go backward\n this.reportCycleCompleted(); // Report half-cycle (reached end)\n } else if (this.currentIndex <= 0 && this.direction === -1) {\n this.direction = 1; // Reached start, next step will go forward\n this.reportCycleCompleted(); // Report half-cycle (reached start)\n }\n this.currentIndex += this.direction;\n break;\n }\n\n const cfg = this.config.get();\n this.surface.setFocus([this.currentIndex], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'step') {\n // Manually step\n if (this.timer) clearTimeout(this.timer); // Pause auto-scan if stepping manually?\n this.step();\n this.callbacks.onScanStep?.();\n // Resume auto-scan? Or stay paused? Depends on mode.\n // For now, resume.\n this.scheduleNextStep();\n } else {\n // Let base class handle select, reset, and other actions\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.currentIndex >= 0) {\n if (this.currentIndex >= 0) {\n this.triggerSelection(this.currentIndex);\n // Restart scan from 0 or stay? Usually restart.\n this.reset();\n // Reset timer\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n }\n }\n\n public getCost(itemIndex: number): number {\n const config = this.config.get();\n\n switch (config.scanDirection) {\n case 'circular':\n return itemIndex + 1;\n\n case 'reverse':\n // In reverse mode, cost is (n - index)\n // Item n-1 costs 1, item 0 costs n\n return this.totalItems - itemIndex;\n\n case 'oscillating':\n // For oscillating, cost is the first time you encounter the item\n // which is always during the forward pass\n return itemIndex + 1;\n\n default:\n return itemIndex + 1;\n }\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class SnakeScanner extends Scanner {\n private currentRow: number = 0;\n private currentCol: number = 0;\n private direction: number = 1; // 1 = Right, -1 = Left\n private maxRow: number = 0;\n private maxCol: number = 0;\n\n public start() {\n // Determine grid dimensions\n this.updateDimensions();\n super.start();\n }\n\n private updateDimensions() {\n const total = this.surface.getItemsCount();\n this.maxCol = this.surface.getColumns();\n this.maxRow = Math.ceil(total / this.maxCol);\n }\n\n protected reset() {\n this.currentRow = 0;\n this.currentCol = 0;\n this.direction = 1;\n const cfg = this.config.get();\n this.surface.setFocus([0], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n protected step() {\n // Calculate next position based on snake pattern\n this.currentCol += this.direction;\n\n // Check boundaries\n if (this.currentCol >= this.maxCol) {\n this.currentCol = this.maxCol - 1;\n this.currentRow++;\n this.direction = -1;\n } else if (this.currentCol < 0) {\n this.currentCol = 0;\n this.currentRow++;\n this.direction = 1;\n }\n\n if (this.currentRow >= this.maxRow) {\n this.currentRow = 0;\n this.currentCol = 0;\n this.direction = 1;\n }\n\n // Convert row/col to index\n const index = this.currentRow * this.maxCol + this.currentCol;\n\n // Check if index is valid (last row might be incomplete)\n // If invalid, skip to start\n if (index >= this.surface.getItemsCount()) {\n this.reset();\n return;\n }\n\n const cfg = this.config.get();\n this.surface.setFocus([index], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action !== 'select') {\n super.handleAction(action);\n } else {\n // Let base class handle select with critical overscan logic\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n const index = this.currentRow * this.maxCol + this.currentCol;\n if (index >= 0) {\n this.triggerSelection(index);\n this.reset();\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n }\n\n public getCost(itemIndex: number): number {\n // TODO: Calculate snake distance\n return itemIndex; // approx\n }\n\n public mapContentToGrid<T>(content: T[], rows: number, cols: number): T[] {\n // Create a new array of same length\n const newContent = new Array(content.length);\n\n // Simulate the snake path\n let r = 0, c = 0, dir = 1;\n\n // We need to fill the grid such that the scanner path (0->1->2 -> 5->4->3)\n // encounters content[0], content[1], content[2], content[3]...\n\n // The grid is stored in Row-Major order (0,1,2, 3,4,5).\n // We want grid[path[i]] = content[i].\n\n for (let i = 0; i < content.length; i++) {\n // Calculate current grid index (row-major)\n const gridIndex = r * cols + c;\n\n if (gridIndex < newContent.length) {\n // Place current content item at this grid position\n newContent[gridIndex] = content[i];\n }\n\n // Advance snake\n c += dir;\n if (c >= cols) {\n c = cols - 1;\n r++;\n dir = -1;\n } else if (c < 0) {\n c = 0;\n r++;\n dir = 1;\n }\n if (r >= rows) break;\n }\n\n // Fill any holes (if content length != grid size, though normally we generate exact or have empties)\n // If content was shorter than grid, some slots are undefined.\n // Copy over any remaining if needed or leave undefined/empty.\n return newContent;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class QuadrantScanner extends Scanner {\n private level: 'quadrant' | 'row' | 'cell' = 'quadrant';\n private currentQuad: number = -1; // 0..3\n private currentRow: number = -1; // relative to quad\n private currentCol: number = -1; // relative to row\n\n // Quadrant bounds (calculated at start)\n private quads: { rowStart: number, rowEnd: number, colStart: number, colEnd: number }[] = [];\n\n public start() {\n this.calcQuadrants();\n super.start();\n }\n\n private calcQuadrants() {\n const totalItems = this.surface.getItemsCount();\n const cols = this.surface.getColumns();\n const totalRows = Math.ceil(totalItems / cols);\n\n const midRow = Math.ceil(totalRows / 2);\n const midCol = Math.ceil(cols / 2);\n\n this.quads = [\n { rowStart: 0, rowEnd: midRow, colStart: 0, colEnd: midCol }, // TL\n { rowStart: 0, rowEnd: midRow, colStart: midCol, colEnd: cols }, // TR\n { rowStart: midRow, rowEnd: totalRows, colStart: 0, colEnd: midCol }, // BL\n { rowStart: midRow, rowEnd: totalRows, colStart: midCol, colEnd: cols } // BR\n ];\n }\n\n protected reset() {\n this.level = 'quadrant';\n this.currentQuad = -1;\n this.currentRow = -1;\n this.currentCol = -1;\n this.surface.setFocus([]);\n }\n\n protected step() {\n if (this.level === 'quadrant') {\n this.stepQuadrant();\n } else if (this.level === 'row') {\n this.stepRow();\n } else {\n this.stepCell();\n }\n }\n\n private stepQuadrant() {\n this.currentQuad++;\n if (this.currentQuad >= 4) this.currentQuad = 0;\n this.highlightQuad(this.currentQuad);\n }\n\n private stepRow() {\n const q = this.quads[this.currentQuad];\n const rowsInQuad = q.rowEnd - q.rowStart;\n\n this.currentRow++;\n if (this.currentRow >= rowsInQuad) this.currentRow = 0;\n\n // Highlight Row within Quad\n const actualRow = q.rowStart + this.currentRow;\n this.highlightRowSegment(actualRow, q.colStart, q.colEnd);\n }\n\n private stepCell() {\n const q = this.quads[this.currentQuad];\n const colsInQuad = q.colEnd - q.colStart;\n\n this.currentCol++;\n if (this.currentCol >= colsInQuad) this.currentCol = 0;\n\n const actualRow = q.rowStart + this.currentRow;\n const actualCol = q.colStart + this.currentCol;\n const index = actualRow * this.surface.getColumns() + actualCol;\n\n if (index < this.surface.getItemsCount()) {\n const cfg = this.config.get();\n this.surface.setFocus([index], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n } else {\n // Skip empty\n this.stepCell(); // Recursive risk?\n }\n }\n\n private highlightQuad(qIndex: number) {\n const q = this.quads[qIndex];\n const indices: number[] = [];\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n\n for (let r = q.rowStart; r < q.rowEnd; r++) {\n for (let c = q.colStart; c < q.colEnd; c++) {\n const idx = r * cols + c;\n if (idx < totalItems) indices.push(idx);\n }\n }\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'major',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n private highlightRowSegment(row: number, colStart: number, colEnd: number) {\n const indices: number[] = [];\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n\n for (let c = colStart; c < colEnd; c++) {\n const idx = row * cols + c;\n if (idx < totalItems) indices.push(idx);\n }\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'minor',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'cancel') {\n if (this.level === 'cell') {\n this.level = 'row';\n this.currentCol = -1;\n this.restartTimer();\n } else if (this.level === 'row') {\n this.level = 'quadrant';\n this.currentRow = -1;\n this.restartTimer();\n } else {\n this.reset();\n }\n } else {\n // Let base class handle select, reset, step, etc.\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.level === 'quadrant') {\n if (this.currentQuad >= 0) {\n this.level = 'row';\n this.currentRow = -1;\n this.restartTimer();\n }\n } else if (this.level === 'row') {\n if (this.currentRow >= 0) {\n this.level = 'cell';\n this.currentCol = -1;\n this.restartTimer();\n }\n } else {\n // Select Item\n const q = this.quads[this.currentQuad];\n const idx = (q.rowStart + this.currentRow) * this.surface.getColumns() + (q.colStart + this.currentCol);\n if (idx >= 0) {\n this.triggerSelection(idx);\n this.reset();\n this.restartTimer();\n }\n }\n }\n\n private restartTimer() {\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n\n public getCost(itemIndex: number): number {\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n const totalRows = Math.ceil(totalItems / cols);\n const midRow = Math.ceil(totalRows / 2);\n const midCol = Math.ceil(cols / 2);\n\n const row = Math.floor(itemIndex / cols);\n const col = itemIndex % cols;\n\n let quadIndex = 0;\n if (row < midRow) {\n // Top\n if (col < midCol) quadIndex = 0; // TL\n else quadIndex = 1; // TR\n } else {\n // Bottom\n if (col < midCol) quadIndex = 2; // BL\n else quadIndex = 3; // BR\n }\n\n let rowInQuad = row;\n if (row >= midRow) rowInQuad = row - midRow;\n\n let colInQuad = col;\n if (col >= midCol) colInQuad = col - midCol;\n\n // Cost = Quad selection + Row selection + Cell selection\n return (quadIndex + 1) + (rowInQuad + 1) + (colInQuad + 1);\n }\n\n public mapContentToGrid<T>(content: T[], rows: number, cols: number): T[] {\n // Quadrant scanning typically works on a standard grid (A-Z).\n // However, if we want \"A\" to be the first item selected...\n // Quad 0 scans first. It contains (0,0) to (midRow, midCol).\n // If we use standard Row-Major layout, A is at (0,0), B at (0,1)...\n // Quad 0 will contain A, B, C, D...\n // So Quadrant scanning naturally \"follows\" the content if the content is placed top-left to bottom-right.\n //\n // Example 4x4 grid. Mid=2,2.\n // Quad 0: (0,0) (0,1) (1,0) (1,1). Indices: 0, 1, 4, 5.\n // If content is A..P.\n // A(0), B(1), E(4), F(5) are in Quad 0.\n // C(2), D(3), G(6), H(7) are in Quad 1.\n //\n // Scan order: Quad 0 -> Quad 1 -> Quad 2 -> Quad 3.\n // If user wants \"Alphabetical order to follow it\", they probably want:\n // Quad 0 contains A, B, C, D.\n // Quad 1 contains E, F, G, H.\n //\n // So we need to fill Quad 0 completely, then Quad 1...\n\n const newContent = new Array(content.length);\n let contentIdx = 0;\n\n const midRow = Math.ceil(rows / 2);\n const midCol = Math.ceil(cols / 2);\n\n const quads = [\n { rS: 0, rE: midRow, cS: 0, cE: midCol }, // TL\n { rS: 0, rE: midRow, cS: midCol, cE: cols }, // TR\n { rS: midRow, rE: rows, cS: 0, cE: midCol }, // BL\n { rS: midRow, rE: rows, cS: midCol, cE: cols } // BR\n ];\n\n for (const q of quads) {\n for (let r = q.rS; r < q.rE; r++) {\n for (let c = q.cS; c < q.cE; c++) {\n if (contentIdx >= content.length) break;\n\n // Fill row-major WITHIN the quadrant\n const gridIndex = r * cols + c;\n if (gridIndex < newContent.length) {\n newContent[gridIndex] = content[contentIdx++];\n }\n }\n }\n }\n\n return newContent;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class GroupScanner extends Scanner {\n private level: 'group' | 'row' | 'cell' = 'group';\n private currentGroup: number = -1;\n private currentRow: number = -1; // relative to group\n private currentCol: number = -1;\n\n private groups: { rowStart: number, rowEnd: number }[] = [];\n\n public start() {\n this.calcGroups();\n super.start();\n }\n\n private calcGroups() {\n const totalItems = this.surface.getItemsCount();\n const cols = this.surface.getColumns();\n const totalRows = Math.ceil(totalItems / cols);\n\n // Divide into 3 groups if possible\n const groupSize = Math.ceil(totalRows / 3);\n\n this.groups = [];\n for (let i = 0; i < totalRows; i += groupSize) {\n this.groups.push({\n rowStart: i,\n rowEnd: Math.min(i + groupSize, totalRows)\n });\n }\n }\n\n protected reset() {\n this.level = 'group';\n this.currentGroup = -1;\n this.currentRow = -1;\n this.currentCol = -1;\n this.surface.setFocus([]);\n }\n\n protected step() {\n if (this.level === 'group') this.stepGroup();\n else if (this.level === 'row') this.stepRow();\n else this.stepCell();\n }\n\n private stepGroup() {\n this.currentGroup++;\n if (this.currentGroup >= this.groups.length) this.currentGroup = 0;\n this.highlightGroup(this.currentGroup);\n }\n\n private stepRow() {\n const g = this.groups[this.currentGroup];\n const rowsInGroup = g.rowEnd - g.rowStart;\n this.currentRow++;\n if (this.currentRow >= rowsInGroup) this.currentRow = 0;\n\n const actualRow = g.rowStart + this.currentRow;\n this.highlightRow(actualRow);\n }\n\n private stepCell() {\n const cols = this.surface.getColumns();\n this.currentCol++;\n if (this.currentCol >= cols) this.currentCol = 0;\n\n const g = this.groups[this.currentGroup];\n const actualRow = g.rowStart + this.currentRow;\n const idx = actualRow * cols + this.currentCol;\n\n if (idx < this.surface.getItemsCount()) {\n const cfg = this.config.get();\n this.surface.setFocus([idx], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n } else {\n // Skip (careful with recursion/loops)\n if (this.currentCol < cols - 1) this.stepCell();\n }\n }\n\n private highlightGroup(gIndex: number) {\n const g = this.groups[gIndex];\n const indices: number[] = [];\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n\n for (let r = g.rowStart; r < g.rowEnd; r++) {\n for (let c = 0; c < cols; c++) {\n const idx = r * cols + c;\n if (idx < totalItems) indices.push(idx);\n }\n }\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'major',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n private highlightRow(row: number) {\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n const indices: number[] = [];\n for (let c = 0; c < cols; c++) {\n const idx = row * cols + c;\n if (idx < totalItems) indices.push(idx);\n }\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'minor',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'cancel') {\n if (this.level === 'cell') {\n this.level = 'row';\n this.currentCol = -1;\n this.restartTimer();\n } else if (this.level === 'row') {\n this.level = 'group';\n this.currentRow = -1;\n this.restartTimer();\n } else {\n this.reset();\n }\n } else {\n // Let base class handle select, reset, step, etc.\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.level === 'group') {\n if (this.currentGroup >= 0) {\n this.level = 'row';\n this.currentRow = -1;\n this.restartTimer();\n }\n } else if (this.level === 'row') {\n if (this.currentRow >= 0) {\n this.level = 'cell';\n this.currentCol = -1;\n this.restartTimer();\n }\n } else {\n const g = this.groups[this.currentGroup];\n const idx = (g.rowStart + this.currentRow) * this.surface.getColumns() + this.currentCol;\n if (idx >= 0) {\n this.triggerSelection(idx);\n this.reset();\n this.restartTimer();\n }\n }\n }\n\n private restartTimer() {\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n\n public getCost(itemIndex: number): number {\n const cols = this.surface.getColumns();\n const totalItems = this.surface.getItemsCount();\n const totalRows = Math.ceil(totalItems / cols);\n const groupSize = Math.ceil(totalRows / 3);\n\n const row = Math.floor(itemIndex / cols);\n const col = itemIndex % cols;\n\n const groupIndex = Math.floor(row / groupSize);\n const rowIndexInGroup = row % groupSize;\n\n return (groupIndex + 1) + (rowIndexInGroup + 1) + (col + 1);\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\n// Color mapping for switches\nconst SWITCH_COLORS: Record<string, string> = {\n 'switch-1': '#2196F3', // Blue\n 'switch-2': '#F44336', // Red\n 'switch-3': '#4CAF50', // Green\n 'switch-4': '#FFEB3B', // Yellow\n 'switch-5': '#9C27B0', // Purple\n 'switch-6': '#FF9800', // Orange\n 'switch-7': '#00BCD4', // Cyan\n 'switch-8': '#E91E63' // Magenta\n};\n\nexport class EliminationScanner extends Scanner {\n private rangeStart: number = 0;\n private rangeEnd: number = 0; // Exclusive\n private currentBlock: number = 0; // Which block is currently highlighted\n private numSwitches: number = 4; // Default to 4-switch (quadrant)\n private partitionHistory: Array<{start: number; end: number}> = [];\n\n public start() {\n const config = this.config.get();\n this.numSwitches = config.eliminationSwitchCount || 4;\n this.rangeStart = 0;\n this.rangeEnd = this.surface.getItemsCount();\n this.partitionHistory = [];\n super.start();\n }\n\n protected reset() {\n this.rangeStart = 0;\n this.rangeEnd = this.surface.getItemsCount();\n this.currentBlock = 0;\n this.partitionHistory = [];\n this.clearHighlights();\n }\n\n private clearHighlights() {\n this.surface.setFocus([]);\n if (this.surface.clearItemStyles) {\n this.surface.clearItemStyles();\n }\n }\n\n protected step() {\n // Cycle through blocks\n this.currentBlock = (this.currentBlock + 1) % this.numSwitches;\n this.highlightCurrentBlock();\n }\n\n private highlightCurrentBlock() {\n this.clearHighlights();\n\n const partitions = this.calculatePartitions(this.rangeStart, this.rangeEnd, this.numSwitches);\n const partition = partitions[this.currentBlock];\n\n if (!partition) return;\n\n // Highlight cells with color and border\n for (let i = partition.start; i < partition.end; i++) {\n const switchAction = this.getSwitchAction(this.currentBlock);\n const color = SWITCH_COLORS[switchAction];\n\n this.surface.setItemStyle?.(i, {\n backgroundColor: color,\n opacity: 0.4,\n borderColor: color,\n borderWidth: 2,\n boxShadow: `inset 0 0 0 3px ${color}`\n });\n }\n }\n\n private calculatePartitions(start: number, end: number, n: number): Array<{start: number; end: number}> {\n const partitions: Array<{start: number; end: number}> = [];\n const total = end - start;\n const baseSize = Math.floor(total / n);\n const remainder = total % n;\n\n let currentStart = start;\n for (let i = 0; i < n; i++) {\n // Add 1 to the first 'remainder' partitions to distribute extras\n const size = baseSize + (i < remainder ? 1 : 0);\n partitions.push({ start: currentStart, end: currentStart + size });\n currentStart += size;\n }\n\n return partitions;\n }\n\n private getSwitchAction(blockIndex: number): SwitchAction {\n const switchMap: Record<number, SwitchAction> = {\n 0: 'switch-1',\n 1: 'switch-2',\n 2: 'switch-3',\n 3: 'switch-4',\n 4: 'switch-5',\n 5: 'switch-6',\n 6: 'switch-7',\n 7: 'switch-8'\n };\n return switchMap[blockIndex] || 'switch-1';\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'select') {\n // Handle select action for critical overscan support\n this.doSelection();\n return;\n }\n\n // Check if it's a switch action (switch-1 through switch-8)\n // Check if it's a switch action (switch-1 through switch-8)\n if (action.toString().startsWith('switch-')) {\n const switchNum = parseInt(action.toString().split('-')[1]) - 1;\n\n if (switchNum >= this.numSwitches) {\n // Ignore switches beyond our count\n return;\n }\n\n const rangeSize = this.rangeEnd - this.rangeStart;\n\n if (rangeSize <= 1) {\n // Already at single item - select it\n if (this.rangeStart >= 0) {\n this.triggerSelection(this.rangeStart);\n this.reset();\n this.restartTimer();\n }\n return;\n }\n\n // Check if this is the correct block for current round\n if (switchNum === this.currentBlock) {\n // Select this block and drill down\n const partitions = this.calculatePartitions(this.rangeStart, this.rangeEnd, this.numSwitches);\n const selectedBlock = partitions[switchNum];\n\n if (selectedBlock) {\n // Save history for potential undo\n this.partitionHistory.push({ start: this.rangeStart, end: this.rangeEnd });\n\n // Narrow to selected block\n this.rangeStart = selectedBlock.start;\n this.rangeEnd = selectedBlock.end;\n\n // Reset to first block for new range\n this.currentBlock = 0;\n\n // If only one item left, highlight it immediately\n if (this.rangeEnd - this.rangeStart === 1) {\n this.clearHighlights();\n const color = SWITCH_COLORS['switch-1'];\n this.surface.setItemStyle?.(this.rangeStart, {\n backgroundColor: color,\n opacity: 0.6,\n boxShadow: `inset 0 0 0 4px ${color}, 0 0 10px ${color}`,\n borderColor: color,\n borderWidth: 2\n });\n }\n }\n\n this.restartTimer();\n }\n return;\n }\n\n // Handle other actions\n if (action === 'cancel' || action === 'reset') {\n // Go back up one level if possible, otherwise reset\n if (this.partitionHistory.length > 0) {\n const previous = this.partitionHistory.pop()!;\n this.rangeStart = previous.start;\n this.rangeEnd = previous.end;\n this.currentBlock = 0;\n } else {\n this.reset();\n }\n this.restartTimer();\n }\n }\n\n protected doSelection() {\n // Elimination scanner uses switch-N actions, not standard select\n // This is provided for critical overscan compatibility\n // If we're down to a single item, select it\n const rangeSize = this.rangeEnd - this.rangeStart;\n if (rangeSize <= 1) {\n if (this.rangeStart >= 0) {\n this.triggerSelection(this.rangeStart);\n this.reset();\n this.restartTimer();\n }\n }\n }\n\n private restartTimer() {\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n\n public getCost(itemIndex: number): number {\n const n = this.numSwitches;\n let start = 0;\n let end = this.surface.getItemsCount();\n let cost = 0;\n\n // Simulate n-way elimination\n while (end - start > 1) {\n const partitions = this.calculatePartitions(start, end, n);\n\n // Find which partition contains the item\n let foundPartition = 0;\n for (let i = 0; i < partitions.length; i++) {\n if (itemIndex >= partitions[i].start && itemIndex < partitions[i].end) {\n foundPartition = i;\n break;\n }\n }\n\n // Need to cycle through all partitions to reach the right one\n cost += (foundPartition + 1);\n\n start = partitions[foundPartition].start;\n end = partitions[foundPartition].end;\n }\n\n return cost;\n }\n\n // Override to disable step scheduling - elimination waits for specific switch input\n protected scheduleNextStep() {\n if (!this.isRunning) return;\n\n // Don't auto-schedule steps in manual mode\n if (this.config.get().scanInputMode === 'manual') {\n return;\n }\n\n if (this.timer) clearTimeout(this.timer);\n\n const rate = this.config.get().scanRate;\n this.timer = window.setTimeout(() => {\n this.step();\n this.scheduleNextStep();\n }, rate);\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { ContinuousUpdate, SwitchAction } from '../types';\n\nexport class ContinuousScanner extends Scanner {\n // States differ by technique:\n // Crosshair: 'x-scan' → 'y-scan' → 'processing' (waits for switch)\n // Gliding: 'x-scanning' → 'x-capturing' → 'y-scanning' → 'y-capturing' → 'processing' (continuous movement)\n // Eight-Direction: 'direction-scan' → 'moving' → 'processing' (compass direction selection)\n private state: 'x-scan' | 'y-scan' | 'x-scanning' | 'x-capturing' | 'y-scanning' | 'y-capturing' | 'direction-scan' | 'moving' | 'processing' = 'x-scan';\n\n private xPos: number = 0; // percentage 0-100\n private yPos: number = 0; // percentage 0-100\n\n private technique: 'gliding' | 'crosshair' | 'eight-direction' = 'crosshair';\n private numCols: number = 0;\n private numRows: number = 0;\n\n // For gliding cursor\n private bufferWidth: number = 15; // % of screen width for buffer zone\n private direction: 1 | -1 = 1; // 1 = right/down, -1 = left/up\n private pauseTimer: number | null = null; // For pause before reversing\n private bufferLeft: number = 0; // Left edge of buffer zone (%)\n private bufferRight: number = 0; // Right edge of buffer zone (%)\n private bufferTop: number = 0; // Top edge of buffer zone (%)\n private bufferBottom: number = 0; // Bottom edge of buffer zone (%)\n private fineXPos: number = 0; // Fine line position within buffer zone (%)\n private fineYPos: number = 0; // Fine line position within buffer zone (%)\n private lockedXPosition: number = 0; // Actual X position when locked (%)\n\n // Eight-direction mode\n private currentDirection: number = 0; // 0-7 for 8 directions (N, NE, E, SE, S, SW, W, NW)\n private compassAngle: number = 0; // Continuous angle 0-359 for fluid rotation\n private compassMode: 'continuous' | 'fixed-8' = 'continuous'; // Fluid vs discrete\n private directionStepCounter: number = 0; // Counter for slowing direction cycling\n private directionStepsPerChange: number = 10; // How many steps before changing direction (fixed-8 mode)\n private directions = [\n { name: 'N', angle: 0, dx: 0, dy: -1 }, // North\n { name: 'NE', angle: 45, dx: 1, dy: -1 }, // Northeast\n { name: 'E', angle: 90, dx: 1, dy: 0 }, // East\n { name: 'SE', angle: 135, dx: 1, dy: 1 }, // Southeast\n { name: 'S', angle: 180, dx: 0, dy: 1 }, // South\n { name: 'SW', angle: 225, dx: -1, dy: 1 }, // Southwest\n { name: 'W', angle: 270, dx: -1, dy: 0 }, // West\n { name: 'NW', angle: 315, dx: -1, dy: -1 } // Northwest\n ];\n\n public start() {\n try {\n const config = this.config.get();\n this.technique = config.continuousTechnique || 'crosshair';\n\n // Calculate grid dimensions\n const totalItems = this.surface.getItemsCount();\n this.numCols = this.surface.getColumns();\n this.numRows = Math.ceil(totalItems / this.numCols);\n\n console.log('[ContinuousScanner] Starting:', {\n technique: this.technique,\n numCols: this.numCols,\n numRows: this.numRows,\n totalItems\n });\n\n // Set initial state based on technique\n if (this.technique === 'gliding') {\n this.state = 'x-scanning';\n this.xPos = 0;\n this.yPos = 0;\n } else if (this.technique === 'eight-direction') {\n this.state = 'direction-scan';\n this.xPos = 50; // Start in center for eight-direction mode\n this.yPos = 50;\n this.compassMode = config.compassMode || 'continuous';\n this.compassAngle = 0;\n } else {\n this.state = 'x-scan';\n this.xPos = 0;\n this.yPos = 0;\n }\n\n console.log('[ContinuousScanner] Initial state:', this.state);\n\n this.emitUpdate();\n super.start();\n } catch (error) {\n console.error('[ContinuousScanner] ERROR in start():', error);\n throw error;\n }\n }\n\n public stop() {\n super.stop();\n if (this.pauseTimer) {\n window.clearTimeout(this.pauseTimer);\n this.pauseTimer = null;\n }\n }\n\n protected reset() {\n if (this.technique === 'gliding') {\n this.state = 'x-scanning';\n this.xPos = 0;\n this.yPos = 0;\n } else if (this.technique === 'eight-direction') {\n this.state = 'direction-scan';\n this.xPos = 50; // Start in center for eight-direction mode\n this.yPos = 50;\n } else {\n this.state = 'x-scan';\n this.xPos = 0;\n this.yPos = 0;\n }\n\n this.direction = 1;\n this.fineXPos = 0;\n this.fineYPos = 0;\n this.bufferLeft = 0;\n this.bufferRight = this.bufferWidth;\n this.bufferTop = 0;\n this.bufferBottom = this.bufferWidth;\n this.lockedXPosition = 0;\n this.currentDirection = 0;\n this.compassAngle = 0;\n this.directionStepCounter = 0;\n this.surface.setFocus([]);\n\n this.emitUpdate();\n }\n\n protected step() {\n if (this.technique === 'eight-direction') {\n if (this.state === 'direction-scan') {\n if (this.compassMode === 'continuous') {\n // Fluid clock-like rotation\n this.compassAngle = (this.compassAngle + 2) % 360; // 2 degrees per step\n } else {\n // Fixed 8 directions\n this.directionStepCounter++;\n if (this.directionStepCounter >= this.directionStepsPerChange) {\n this.currentDirection = (this.currentDirection + 1) % 8;\n this.directionStepCounter = 0;\n }\n this.compassAngle = this.directions[this.currentDirection].angle;\n }\n } else if (this.state === 'moving') {\n // Move in the selected direction\n const dir = this.compassMode === 'continuous'\n ? this.getDirectionFromAngle(this.compassAngle)\n : this.directions[this.currentDirection];\n\n const speed = 0.5; // Movement speed\n\n this.xPos += dir.dx * speed;\n this.yPos += dir.dy * speed;\n\n // Keep within bounds\n this.xPos = Math.max(0, Math.min(100, this.xPos));\n this.yPos = Math.max(0, Math.min(100, this.yPos));\n }\n } else if (this.technique === 'gliding') {\n if (this.state === 'x-scanning') {\n // Stage 1: Move X buffer zone across full screen (faster)\n this.xPos += 0.8 * this.direction;\n\n // Bounce off edges with pause\n if (this.xPos >= 100) {\n this.xPos = 100;\n if (!this.pauseTimer) {\n this.pauseTimer = window.setTimeout(() => {\n this.direction = -1;\n this.pauseTimer = null;\n }, 100);\n return;\n }\n } else if (this.xPos <= 0) {\n this.xPos = 0;\n if (!this.pauseTimer) {\n this.pauseTimer = window.setTimeout(() => {\n this.direction = 1;\n this.pauseTimer = null;\n }, 100);\n return;\n }\n }\n\n // Update buffer zone position\n this.bufferLeft = Math.max(0, this.xPos - this.bufferWidth / 2);\n this.bufferRight = Math.min(100, this.xPos + this.bufferWidth / 2);\n } else if (this.state === 'x-capturing') {\n // Stage 2: Fine X line scans within buffer zone (bounces back and forth)\n this.fineXPos += 0.3 * this.direction;\n\n // Bounce within buffer zone (0-100% relative to buffer)\n if (this.fineXPos >= 100) {\n this.fineXPos = 100;\n this.direction = -1;\n } else if (this.fineXPos <= 0) {\n this.fineXPos = 0;\n this.direction = 1;\n }\n } else if (this.state === 'y-scanning') {\n // Stage 3: Move Y buffer zone down the screen (faster)\n this.yPos += 0.8 * this.direction;\n\n // Bounce off edges with pause\n if (this.yPos >= 100) {\n this.yPos = 100;\n if (!this.pauseTimer) {\n this.pauseTimer = window.setTimeout(() => {\n this.direction = -1;\n this.pauseTimer = null;\n }, 100);\n return;\n }\n } else if (this.yPos <= 0) {\n this.yPos = 0;\n if (!this.pauseTimer) {\n this.pauseTimer = window.setTimeout(() => {\n this.direction = 1;\n this.pauseTimer = null;\n }, 100);\n return;\n }\n }\n\n // Update buffer zone position\n this.bufferTop = Math.max(0, this.yPos - this.bufferWidth / 2);\n this.bufferBottom = Math.min(100, this.yPos + this.bufferWidth / 2);\n } else if (this.state === 'y-capturing') {\n // Stage 4: Fine Y line scans within buffer zone (bounces back and forth)\n this.fineYPos += 0.3 * this.direction;\n\n // Bounce within buffer zone (0-100% relative to buffer)\n if (this.fineYPos >= 100) {\n this.fineYPos = 100;\n this.direction = -1;\n } else if (this.fineYPos <= 0) {\n this.fineYPos = 0;\n this.direction = 1;\n }\n }\n } else {\n // Crosshair: Continuous scanning that wraps around\n if (this.state === 'x-scan') {\n this.xPos += 0.5; // Smooth continuous movement\n if (this.xPos > 100) this.xPos = 0; // Wrap back to left\n } else if (this.state === 'y-scan') {\n this.yPos += 0.5; // Smooth continuous movement\n if (this.yPos > 100) this.yPos = 0; // Wrap back to top\n }\n }\n\n // Log every 50th step to avoid spam\n if (Math.floor(this.xPos * 2) % 50 === 0) {\n console.log('[ContinuousScanner] Step:', {\n state: this.state,\n xPos: this.xPos,\n yPos: this.yPos,\n fineXPos: this.fineXPos,\n fineYPos: this.fineYPos,\n bufferLeft: this.bufferLeft,\n bufferRight: this.bufferRight,\n technique: this.technique,\n direction: this.direction,\n currentDirection: this.currentDirection\n });\n }\n\n this.emitUpdate();\n }\n\n private getDirectionFromAngle(angle: number): { dx: number; dy: number; name: string } {\n // Convert angle to direction vector\n const radians = (angle * Math.PI) / 180;\n const dx = Math.cos(radians);\n const dy = Math.sin(radians);\n\n // Find closest cardinal direction for naming\n const normalizedAngle = (angle + 22.5) % 360; // Offset by 22.5 degrees for proper rounding\n const directionIndex = Math.floor(normalizedAngle / 45);\n const names = ['E', 'SE', 'S', 'SW', 'W', 'NW', 'N', 'NE'];\n const name = names[directionIndex] || 'N';\n\n return { dx, dy, name };\n }\n\n // Override scheduleNextStep for different refresh rates\n protected scheduleNextStep() {\n if (!this.isRunning) return;\n\n // Don't auto-schedule steps in manual mode\n if (this.config.get().scanInputMode === 'manual') {\n return;\n }\n\n if (this.timer) clearTimeout(this.timer);\n\n // Use faster refresh rate for smoother animation\n const delay = 20; // 20ms = 50fps for smooth movement\n\n this.timer = window.setTimeout(() => {\n this.step();\n this.scheduleNextStep();\n }, delay);\n }\n\n public handleAction(action: SwitchAction) {\n console.log('[ContinuousScanner] handleAction:', {\n action,\n state: this.state,\n technique: this.technique\n });\n\n if (action === 'cancel') {\n console.log('[ContinuousScanner] Cancel - resetting');\n this.reset();\n } else {\n // Let base class handle select, reset, step, etc.\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.technique === 'eight-direction') {\n // Eight-direction: direction selection → movement → selection\n if (this.state === 'direction-scan') {\n // First select: start moving in selected direction\n const dirInfo = this.getDirectionFromAngle(this.compassAngle);\n console.log('[ContinuousScanner] Transition: direction-scan -> moving, direction:', dirInfo.name, 'angle:', this.compassAngle);\n this.state = 'moving';\n } else if (this.state === 'moving') {\n // Second select: stop and select item at current position\n console.log('[ContinuousScanner] Transition: moving -> processing');\n this.state = 'processing';\n this.selectFocusedItem();\n }\n } else if (this.technique === 'gliding') {\n // Gliding cursor: four-stage selection (X coarse, X fine, Y coarse, Y fine)\n if (this.state === 'x-scanning') {\n // First select: lock X buffer zone, start fine X scanning\n console.log('[ContinuousScanner] Transition: x-scanning -> x-capturing');\n this.state = 'x-capturing';\n this.fineXPos = 0;\n this.direction = 1;\n } else if (this.state === 'x-capturing') {\n // Second select: lock X position, start Y buffer zone scanning\n console.log('[ContinuousScanner] Transition: x-capturing -> y-scanning');\n this.state = 'y-scanning';\n // Store the actual locked X position\n this.lockedXPosition = this.bufferLeft + (this.fineXPos / 100) * (this.bufferRight - this.bufferLeft);\n this.yPos = 0;\n this.fineYPos = 0;\n this.direction = 1;\n } else if (this.state === 'y-scanning') {\n // Third select: lock Y buffer zone, start fine Y scanning\n console.log('[ContinuousScanner] Transition: y-scanning -> y-capturing');\n this.state = 'y-capturing';\n this.fineYPos = 0;\n this.direction = 1;\n } else if (this.state === 'y-capturing') {\n // Fourth select: pick the item at the intersection\n console.log('[ContinuousScanner] Transition: y-capturing -> processing');\n this.state = 'processing';\n this.selectFocusedItem();\n }\n } else {\n // Crosshair: stepping movement\n if (this.state === 'x-scan') {\n console.log('[ContinuousScanner] Transition: x-scan -> y-scan');\n this.state = 'y-scan';\n this.yPos = 0;\n } else if (this.state === 'y-scan') {\n console.log('[ContinuousScanner] Transition: y-scan -> processing');\n this.state = 'processing';\n this.selectAtPoint();\n }\n }\n }\n\n private selectFocusedItem() {\n if (this.technique === 'eight-direction') {\n this.selectAtPercent(this.xPos, this.yPos);\n return;\n }\n\n const actualYPos = this.bufferTop + (this.fineYPos / 100) * (this.bufferBottom - this.bufferTop);\n this.selectAtPercent(this.lockedXPosition, actualYPos);\n }\n\n private selectAtPoint() {\n this.selectAtPercent(this.xPos, this.yPos);\n }\n\n private selectAtPercent(xPercent: number, yPercent: number) {\n let index: number | null = null;\n if (this.surface.resolveIndexAtPoint) {\n index = this.surface.resolveIndexAtPoint(xPercent, yPercent);\n } else {\n index = this.estimateIndexAtPercent(xPercent, yPercent);\n }\n\n if (index !== null && index >= 0) {\n this.triggerSelection(index);\n }\n this.reset();\n }\n\n private estimateIndexAtPercent(xPercent: number, yPercent: number): number | null {\n const totalItems = this.surface.getItemsCount();\n if (!totalItems) return null;\n const cols = Math.max(1, this.surface.getColumns());\n const rows = Math.max(1, Math.ceil(totalItems / cols));\n const col = Math.min(cols - 1, Math.max(0, Math.floor((xPercent / 100) * cols)));\n const row = Math.min(rows - 1, Math.max(0, Math.floor((yPercent / 100) * rows)));\n const index = row * cols + col;\n if (index >= totalItems) return totalItems - 1;\n return index;\n }\n\n private emitUpdate() {\n const dirInfo = this.getDirectionFromAngle(this.compassAngle);\n const update: ContinuousUpdate = {\n technique: this.technique,\n state: this.state,\n xPos: this.xPos,\n yPos: this.yPos,\n bufferLeft: this.bufferLeft,\n bufferRight: this.bufferRight,\n bufferTop: this.bufferTop,\n bufferBottom: this.bufferBottom,\n fineXPos: this.fineXPos,\n fineYPos: this.fineYPos,\n lockedXPosition: this.lockedXPosition,\n compassAngle: this.compassAngle,\n currentDirection: this.currentDirection,\n directionName: dirInfo.name,\n directionDx: dirInfo.dx,\n directionDy: dirInfo.dy\n };\n this.callbacks.onContinuousUpdate?.(update);\n }\n\n public getCost(itemIndex: number): number {\n const cols = this.surface.getColumns();\n const row = Math.floor(itemIndex / cols);\n const col = itemIndex % cols;\n\n if (this.technique === 'eight-direction') {\n // Eight-direction: Wait for direction to align, then move to item, then select\n // Approximate: wait for correct direction (avg 4 steps) + distance + 1 click\n const itemCenterX = ((col + 0.5) / cols) * 100;\n const itemCenterY = ((row + 0.5) / Math.ceil(this.surface.getItemsCount() / cols)) * 100;\n const distance = Math.sqrt(Math.pow(itemCenterX, 2) + Math.pow(itemCenterY, 2)); // Distance from start\n return 4 + Math.round(distance / 0.5) + 1; // Direction wait + movement + click\n } else if (this.technique === 'gliding') {\n // Gliding: Wait for cursor to reach item, then select\n // Cost = time to reach item + 1 click\n const itemCenter = ((col + 0.5) / cols) * 100;\n return Math.round(itemCenter / 0.5) + 1; // Steps to reach item + 1 click\n } else {\n // Crosshair: time to scan X to item, then Y to item\n const xPosition = ((col + 0.5) / cols) * 100;\n const yPosition = ((row + 0.5) / Math.ceil(this.surface.getItemsCount() / cols)) * 100;\n const xSteps = Math.round(xPosition / 0.5); // Steps to reach X position\n const ySteps = Math.round(yPosition / 0.5); // Steps to reach Y position\n return xSteps + ySteps + 2; // X scan + Y scan + 2 clicks\n }\n }\n}\n","// @ts-ignore\nimport { createPredictor } from '@willwade/ppmpredictor';\n\nexport interface Prediction {\n text: string;\n probability: number;\n}\n\nexport class PredictorManager {\n private predictor: any;\n\n constructor() {\n this.predictor = createPredictor({\n adaptive: true,\n maxOrder: 5\n });\n // Train with some basics\n this.predictor.train('The quick brown fox jumps over the lazy dog. Hello world. How are you?');\n }\n\n public addToContext(char: string) {\n this.predictor.addToContext(char);\n }\n\n public resetContext() {\n this.predictor.resetContext();\n }\n\n public predictNext(): Prediction[] {\n const preds = this.predictor.predictNextCharacter();\n // Normalize or just return\n return preds;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\nimport { PredictorManager } from '../PredictorManager';\n\nexport class ProbabilityScanner extends Scanner {\n private predictor: PredictorManager = new PredictorManager();\n private scanOrder: number[] = [];\n private currentIndex: number = -1;\n\n public start() {\n this.updateProbabilities();\n super.start();\n }\n\n protected reset() {\n this.currentIndex = -1;\n this.surface.setFocus([]);\n }\n\n protected step() {\n this.currentIndex++;\n if (this.currentIndex >= this.scanOrder.length) {\n this.currentIndex = 0;\n }\n\n const actualIndex = this.scanOrder[this.currentIndex];\n const cfg = this.config.get();\n this.surface.setFocus([actualIndex], {\n phase: 'item',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n\n public handleAction(action: SwitchAction) {\n if (action === 'cancel') {\n this.reset();\n } else {\n // Let base class handle select, reset, step, etc.\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n if (this.currentIndex >= 0) {\n const actualIndex = this.scanOrder[this.currentIndex];\n if (actualIndex >= 0) {\n this.triggerSelection(actualIndex);\n\n // Update predictor\n const data = this.surface.getItemData?.(actualIndex);\n if (data?.label) {\n this.predictor.addToContext(data.label.toLowerCase());\n }\n\n // Recalculate probabilities and order\n this.updateProbabilities();\n\n // Request visualization update (for heatmap/numbers)\n this.triggerRedraw();\n\n this.reset();\n if (this.timer) clearTimeout(this.timer);\n this.scheduleNextStep();\n }\n }\n }\n\n private updateProbabilities() {\n const preds = this.predictor.predictNext();\n // preds is [{text: 'a', probability: 0.5}, ...]\n\n // Map grid items to probabilities\n const itemsCount = this.surface.getItemsCount();\n const itemProbs: { index: number, prob: number }[] = [];\n\n for (let i = 0; i < itemsCount; i++) {\n let prob = 0.0001; // Base probability\n const data = this.surface.getItemData?.(i);\n if (data?.label) {\n const label = data.label.toLowerCase();\n const p = preds.find((p: any) => p.text.toLowerCase() === label);\n if (p) prob = p.probability;\n }\n itemProbs.push({ index: i, prob });\n }\n\n // Sort by prob desc\n itemProbs.sort((a, b) => b.prob - a.prob);\n\n this.scanOrder = itemProbs.map(ip => ip.index);\n }\n\n public getCost(itemIndex: number): number {\n const orderIndex = this.scanOrder.indexOf(itemIndex);\n if (orderIndex === -1) return 999;\n return orderIndex + 1;\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\nexport class CauseEffectScanner extends Scanner {\n public start() {\n this.isRunning = true;\n this.reset();\n\n // In Cause & Effect, we typically focus everything or the single item immediately.\n // We do NOT schedule a step timer.\n const count = this.surface.getItemsCount();\n if (count > 0) {\n // Focus all items to indicate they are \"active\" / ready\n const indices = Array.from({ length: count }, (_, i) => i);\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'major',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n }\n\n public handleAction(action: SwitchAction): void {\n if (action === 'select' && this.isRunning) {\n // Let base class handle select with critical overscan logic\n super.handleAction(action);\n }\n }\n\n protected doSelection() {\n // For Cause & Effect, ANY switch action typically triggers the effect.\n // We trigger selection on all items (or the first one if singular).\n\n const count = this.surface.getItemsCount();\n if (count > 0) {\n // Just select the first one as the \"event\" source, or all?\n // Usually visual feedback on the item is desired.\n // We'll select index 0 by default for simplicity, or we can iterate.\n // If there's only 1 item, index 0 is correct.\n\n this.triggerSelection(0);\n }\n }\n\n protected step(): void {\n // No scanning step in Cause & Effect\n }\n\n protected reset(): void {\n // Reset focus?\n const count = this.surface.getItemsCount();\n if (count > 0) {\n const indices = Array.from({ length: count }, (_, i) => i);\n const cfg = this.config.get();\n this.surface.setFocus(indices, {\n phase: 'major',\n scanRate: cfg.scanRate,\n scanPattern: cfg.scanPattern,\n scanTechnique: cfg.scanTechnique,\n scanDirection: cfg.scanDirection,\n });\n }\n }\n\n public getCost(_itemIndex: number): number {\n return 1; // Constant cost\n }\n}\n","import { Scanner } from '../Scanner';\nimport type { SwitchAction } from '../types';\n\ntype ColorCodeColor = 'red' | 'blue';\n\nexport class ColorCodeScanner extends Scanner {\n private probabilities: number[] = [];\n private colors: ColorCodeColor[] = [];\n\n public start() {\n this.isRunning = true;\n this.initializeBelief();\n this.assignColors();\n this.applyColors();\n }\n\n public stop() {\n this.isRunning = false;\n this.surface.setFocus([]);\n }\n\n public handleAction(action: SwitchAction): void {\n if (!this.isRunning) return;\n\n let clicked: ColorCodeColor | null = null;\n if (action === 'switch-1' || action === 'select') {\n clicked = 'blue';\n } else if (action === 'switch-2' || action === 'step') {\n clicked = 'red';\n } else if (action === 'reset') {\n this.initializeBelief();\n this.assignColors();\n this.applyColors();\n return;\n } else {\n return;\n }\n\n this.updateBelief(clicked);\n this.assignColors();\n this.applyColors();\n }\n\n protected step(): void {\n // No timed stepping in ColorCode\n }\n\n protected reset(): void {\n this.initializeBelief();\n this.assignColors();\n this.applyColors();\n }\n\n public getCost(_itemIndex: number): number {\n return 1;\n }\n\n protected doSelection(): void {\n // Selection is handled when the belief passes the threshold\n }\n\n private initializeBelief() {\n const count = this.surface.getItemsCount();\n const value = count > 0 ? 1 / count : 0;\n this.probabilities = new Array(count).fill(value);\n }\n\n private assignColors() {\n const indices = this.probabilities\n .map((p, i) => ({ p, i }))\n .sort((a, b) => b.p - a.p);\n\n let redSum = 0;\n let blueSum = 0;\n this.colors = new Array(this.probabilities.length).fill('blue');\n\n for (const entry of indices) {\n if (redSum <= blueSum) {\n this.colors[entry.i] = 'red';\n redSum += entry.p;\n } else {\n this.colors[entry.i] = 'blue';\n blueSum += entry.p;\n }\n }\n }\n\n private applyColors() {\n const redColor = '#f9c6c6';\n const blueColor = '#cfe3ff';\n for (let i = 0; i < this.colors.length; i++) {\n this.surface.setItemStyle?.(i, {\n backgroundColor: this.colors[i] === 'red' ? redColor : blueColor,\n textColor: '#1e1e1e'\n });\n }\n }\n\n private updateBelief(clicked: ColorCodeColor) {\n const { errorRate, selectThreshold } = this.config.get().colorCode;\n const correctProb = 1 - errorRate;\n let sum = 0;\n\n for (let i = 0; i < this.probabilities.length; i++) {\n const isMatch = this.colors[i] === clicked;\n const likelihood = isMatch ? correctProb : errorRate;\n this.probabilities[i] *= likelihood;\n sum += this.probabilities[i];\n }\n\n if (sum > 0) {\n for (let i = 0; i < this.probabilities.length; i++) {\n this.probabilities[i] /= sum;\n }\n }\n\n let maxIndex = 0;\n for (let i = 1; i < this.probabilities.length; i++) {\n if (this.probabilities[i] > this.probabilities[maxIndex]) {\n maxIndex = i;\n }\n }\n\n if (this.probabilities[maxIndex] >= selectThreshold) {\n this.triggerSelection(maxIndex);\n this.initializeBelief();\n }\n }\n}\n"],"mappings":"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","names":["OverscanState","cfg","p"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "scan-engine",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Headless scan engine for switch scanning interfaces",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": ["dist", "README.md"],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsup src/index.ts --format esm --dts",
|
|
17
|
+
"test": "vitest --config vitest.config.ts"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"tsup": "^8.0.2",
|
|
21
|
+
"vitest": "^4.0.18"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@willwade/ppmpredictor": "^0.0.12"
|
|
25
|
+
}
|
|
26
|
+
}
|