From ab2ea0b811adec3883475279cfb0d963174e5d2c Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Sat, 14 Mar 2026 00:14:31 -0400 Subject: [PATCH] fix(hal): re-initialize dispenser after errors After a dispense error, the F56/Puloon drivers call close() which sets initialized=false. The next dispense would fail on a closed serial port. Now checks dispenser.initialized before each dispense and re-inits if needed, matching the lazy re-init pattern from brain.js (line 4072). Closes #29 Co-Authored-By: Claude Opus 4.6 --- apps/machine/electron/hal-service.ts | 12 ++++++++++-- apps/machine/src/services/hal.ts | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/apps/machine/electron/hal-service.ts b/apps/machine/electron/hal-service.ts index e5b2df8..f13bfdc 100644 --- a/apps/machine/electron/hal-service.ts +++ b/apps/machine/electron/hal-service.ts @@ -70,10 +70,11 @@ export async function initializeHal(config: HalConfig): Promise { }) // Initialize dispenser - await dispenser.init({ + const dispenserInitData = { fiatCode: valConfig.fiatCode, cassettes: dispConfig.cassettes, - }) + } + await dispenser.init(dispenserInitData) console.log('[HAL] Dispenser initialized') // Start validator @@ -148,6 +149,13 @@ export async function initializeHal(config: HalConfig): Promise { dispenseCash: async (amounts): Promise => { console.log('[HAL] Dispensing:', amounts) + // Re-initialize dispenser if it was closed after a previous error + if (!dispenser.initialized) { + console.log('[HAL] Dispenser not initialized, re-initializing...') + await dispenser.init(dispenserInitData) + console.log('[HAL] Dispenser re-initialized') + } + const notes: number[] = new Array(cassetteDenominations.length).fill(0) for (const { denomination, count } of amounts) { const idx = cassetteDenominations.indexOf(denomination) diff --git a/apps/machine/src/services/hal.ts b/apps/machine/src/services/hal.ts index b9041d3..d89339b 100644 --- a/apps/machine/src/services/hal.ts +++ b/apps/machine/src/services/hal.ts @@ -93,10 +93,11 @@ export async function initializeHalServices(config: HalConfig): Promise { console.log('[HAL] Dispensing:', amounts) + // Re-initialize dispenser if it was closed after a previous error + if (!dispenser.initialized) { + console.log('[HAL] Dispenser not initialized, re-initializing...') + await dispenser.init(dispenserInitData) + console.log('[HAL] Dispenser re-initialized') + } + // Translate { denomination, count }[] to number[] by cassette position const notes: number[] = new Array(cassetteDenominations.length).fill(0) for (const { denomination, count } of amounts) {