commit f3053e02c829278dfc592752177f995eebcb976a
parent c1cc531558a4fbf331c6156b8457bc8bb09a7b33
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 13 Jan 2026 19:24:33 -0800
Add HC-SR04 stub
Diffstat:
2 files changed, 34 insertions(+), 13 deletions(-)
diff --git a/src/devices/hc-sr04.zig b/src/devices/hc-sr04.zig
@@ -0,0 +1,20 @@
+const gpio = @import("../gpio.zig");
+
+pub const Error = error{Timeout} | gpio.Error;
+
+pub const Device = struct {
+ echo_pin: u8,
+ trigger_pin: u8,
+
+ pub fn setup(echo_pin: u8, trigger_pin: u8) Error!Device {
+ if (echo_pin >= gpio.MAX_GPIO) return Error.PinOutOfRange;
+ if (trigger_pin >= gpio.MAX_GPIO) return Error.PinOutOfRange;
+
+ return .{ echo_pin, trigger_pin };
+ }
+
+ pub fn get_distance(d: *Device, timeout: bool) Error!Device {
+ _ = d;
+ _ = timeout;
+ }
+};
diff --git a/src/gpio.zig b/src/gpio.zig
@@ -8,6 +8,7 @@ const GPFSEL0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0000);
const GPSET0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x001C);
const GPCLR0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0028);
const GPLEV0: [*]volatile u32 = @ptrFromInt(BASE_ADDR + 0x0034);
+pub const MAX_GPIO: u8 = 53;
// Page 92, Table 6-2: GPIO Alternate function select register 0
// All function select registers reflect this bit layout
@@ -23,12 +24,12 @@ const FunctionSelect = enum(u3) {
alt_fn_5 = 0b010,
};
-const GpioError = error{
+pub const Error = error{
PinOutOfRange,
};
-fn fn_sel(pin: u8, sel: FunctionSelect) GpioError!void {
- if (pin > 53) return GpioError.PinOutOfRange;
+fn fn_sel(pin: u8, sel: FunctionSelect) Error!void {
+ if (pin > MAX_GPIO) return Error.PinOutOfRange;
const index = @divFloor(pin, 10);
const address: *volatile u32 = &GPFSEL0[index];
@@ -41,8 +42,8 @@ fn fn_sel(pin: u8, sel: FunctionSelect) GpioError!void {
address.* = state;
}
-fn addr_get(pin: u8, address: [*]volatile u32) GpioError!*volatile u32 {
- if (pin > 53) return GpioError.PinOutOfRange;
+fn addr_get(pin: u8, address: [*]volatile u32) Error!*volatile u32 {
+ if (pin > MAX_GPIO) return Error.PinOutOfRange;
return &address[@divFloor(pin, 32)];
}
@@ -57,32 +58,32 @@ fn addr_bitset(pin: u8, address: *volatile u32) void {
}
// Turn on
-fn output_set(pin: u8) GpioError!void {
+fn output_set(pin: u8) Error!void {
addr_bitset(pin, try addr_get(pin, GPSET0));
}
// Turn off
-fn output_clear(pin: u8) GpioError!void {
+fn output_clear(pin: u8) Error!void {
addr_bitset(pin, try addr_get(pin, GPCLR0));
}
-pub fn set_output(pin: u8) GpioError!void {
+pub fn set_output(pin: u8) Error!void {
try fn_sel(pin, .output);
}
-pub fn set_input(pin: u8) GpioError!void {
+pub fn set_input(pin: u8) Error!void {
try fn_sel(pin, .input);
}
-pub fn set_on(pin: u8) GpioError!void {
+pub fn set_on(pin: u8) Error!void {
try output_set(pin);
}
-pub fn set_off(pin: u8) GpioError!void {
+pub fn set_off(pin: u8) Error!void {
try output_clear(pin);
}
-pub fn read(pin: u8) GpioError!bool {
+pub fn read(pin: u8) Error!bool {
const address = try addr_get(pin, GPLEV0);
const offset: u5 = @truncate(pin % 32);
@@ -91,7 +92,7 @@ pub fn read(pin: u8) GpioError!bool {
return (address.* & mask) == mask;
}
-pub fn write(pin: u8, state: bool) GpioError!void {
+pub fn write(pin: u8, state: bool) Error!void {
if (state) {
try set_on(pin);
} else {