What it solves
Equipment actions need explainable permissives and interlocks instead of scattered booleans.
How it works
1Inputs→2qualification→3latch / bypass policy→4permission + diagnostics
Use it when
Gate a pump start on multiple permissives
Latch a fault until an explicit reset
Debounce an interlock input
Record which condition denied first
Quick Start
#include <loxperm/loxperm.h>
loxperm_chain_t chain;
loxperm_chain_init(&chain, defs, DEF_COUNT);
loxperm_set(&chain, 0, true, now_ms);
bool allowed=loxperm_is_permitted(&chain, now_ms);
/* Expected: allowed and deny mask reflect qualified inputs. */Engineering evidence
- Header-only and heap-free claims map to include/loxperm/loxperm.h
- Tests cover snapshot validation and configuration contracts
Known limits
- Not a safety-certified interlock system
- A shared chain requires external synchronization
- Default condition mask is 32 entries; optional wide mode is 64