diff --git a/modules/propresenter-timers/ltc-listener.js b/modules/propresenter-timers/ltc-listener.js index 2274aaa..147bd6c 100644 --- a/modules/propresenter-timers/ltc-listener.js +++ b/modules/propresenter-timers/ltc-listener.js @@ -162,7 +162,14 @@ function createLtcListener({ device, channel, moduleDir, log, onUpdate }) { }); child.on('error', (err) => { + // A spawn that fails (EACCES on a helper that lost its execute bit, + // ENOENT) emits 'error' with no 'exit' to follow. Leaving `child` set + // would let the eval loop report "No signal" over a dead child forever + // and nothing would ever retry — what parked LTC on AB on 2026-10-04. + // Null it and retry on the slow timer, the way spl-listener does. report({ error: TOOL_MISSING, detail: `LTC capture failed to start: ${err.message}` }); + child = null; + scheduleRestart(BAD_CONFIG_RETRY_MS); }); child.on('exit', (code) => { diff --git a/modules/propresenter-timers/module.json b/modules/propresenter-timers/module.json index f85f541..ad2a415 100644 --- a/modules/propresenter-timers/module.json +++ b/modules/propresenter-timers/module.json @@ -1,7 +1,7 @@ { "id": "propresenter-timers", "name": "Timers", - "version": "1.7.0", + "version": "1.7.1", "proddash": ">=1.4.0", "description": "Timers, Clocks, and LTC From configured Modules", "provides": [