Files
room_glitch/core/simulation/simulated_hardware_backend.gd

103 lines
1.5 KiB
GDScript

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
)