class_name SimulatedHardwareBackend extends RefCounted signal pin_state_changed( cabinet_id: StringName, gpio_pin: int, active: bool, action_id: StringName, context: Dictionary ) signal trace_entry_created( entry: Dictionary ) var pin_states: Dictionary = {} func reset() -> void: pin_states.clear() func activate_action( cabinet_id: StringName, action: HardwareAction, context: Dictionary ) -> void: if action == null: return var gpio_active := action.active_high _set_pin_state( cabinet_id, action, gpio_active, true, context ) func deactivate_action( cabinet_id: StringName, action: HardwareAction, context: Dictionary ) -> void: if action == null: return var gpio_active := not action.active_high _set_pin_state( cabinet_id, action, gpio_active, false, context ) func _set_pin_state( cabinet_id: StringName, action: HardwareAction, electrical_state: bool, logical_active: bool, context: Dictionary ) -> void: var key := "%s::%d" % [ cabinet_id, action.gpio_pin ] pin_states[key] = electrical_state var entry := { "type": &"gpio", "cabinet_id": cabinet_id, "action_id": action.action_id, "gpio_pin": action.gpio_pin, "electrical_state": electrical_state, "logical_active": logical_active, "active_high": action.active_high, "context": context.duplicate(), } trace_entry_created.emit( entry ) pin_state_changed.emit( cabinet_id, action.gpio_pin, logical_active, action.action_id, context )