103 lines
1.5 KiB
GDScript
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
|
|
)
|