add getInput/Output

This commit is contained in:
Jeeves 2025-04-29 13:05:20 -06:00
parent 6e79d57296
commit 1e1033a118

View file

@ -324,6 +324,14 @@ pub const Component = struct {
};
}
pub fn getInput(self: *Component, idx: usize) ?*Signal {
return self.inputs.items[idx].signal;
}
pub fn getOutput(self: *Component, idx: usize) *Signal {
return &self.outputs.items[idx].signal;
}
fn connect(self: *Component, allocator: std.mem.Allocator, self_idx: usize, to: *Component, to_idx: usize) !void {
const input = &to.inputs.items[to_idx];
input.signal = &self.outputs.items[self_idx].signal;
@ -424,7 +432,7 @@ pub const Battery = struct {
pub fn update(component: *Component) AllocatorError!void {
const self: *Battery = @fieldParentPtr("component", component);
const output = &component.outputs.items[0].signal;
const output = component.getOutput(0);
output.digital = @intFromFloat(std.math.sign(self.value));
output.analog = self.value;
}
@ -450,8 +458,8 @@ pub const Not = struct {
pub fn update(component: *Component) AllocatorError!void {
const self: *Not = @fieldParentPtr("component", component);
const output = &component.outputs.items[0].signal;
const input = if (component.inputs.items[0].signal) |s| s else &Signal{};
const output = component.getOutput(0);
const input = if (component.getInput(0)) |s| s else &Signal{};
if (self.invert_output) {
output.digital = 1 - @as(i2, @intCast(@abs(input.digital)));
output.analog = 1.0 - @abs(input.analog);
@ -486,8 +494,8 @@ pub const And = struct {
// TODO check implementation
pub fn update(component: *Component) AllocatorError!void {
const self: *And = @fieldParentPtr("component", component);
const output = &component.outputs.items[0].signal;
const input0 = if (component.inputs.items[0].signal) |s| s else &Signal{};
const output = component.getOutput(0);
const input0 = if (component.getInput(0)) |s| s else &Signal{};
if (self.arithmetic_mode) {
output.digital = input0.digital;
output.analog = input0.analog;
@ -554,8 +562,8 @@ pub const Or = struct {
// TODO check implementation
pub fn update(component: *Component) AllocatorError!void {
const self: *Or = @fieldParentPtr("component", component);
const output = &component.outputs.items[0].signal;
const input0 = if (component.inputs.items[0].signal) |s| s else &Signal{};
const output = component.getOutput(0);
const input0 = if (component.getInput(0)) |s| s else &Signal{};
if (self.arithmetic_mode) {
output.digital = input0.digital;
output.analog = input0.analog;
@ -591,12 +599,12 @@ test "max" {
or1.component.inputs.items[1].signal = &b;
try or1.component.update();
try std.testing.expectEqual(1.0, or1.component.outputs.items[0].signal.analog);
try std.testing.expectEqual(1.0, or1.component.getOutput(0).analog);
a.analog = -0.5;
b.analog = -0.2;
try or1.component.update();
try std.testing.expectEqual(-0.5, or1.component.outputs.items[0].signal.analog);
try std.testing.expectEqual(-0.5, or1.component.getOutput(0).analog);
}
const AllocatorError = std.mem.Allocator.Error;