diff --git a/drivers/src/input/rotary_encoder.zig b/drivers/src/input/rotary_encoder.zig index 291e00843..249df2f79 100644 --- a/drivers/src/input/rotary_encoder.zig +++ b/drivers/src/input/rotary_encoder.zig @@ -45,6 +45,13 @@ pub fn RotaryEncoder(comptime options: Options) type { defer enc.last_a = a; defer enc.last_b = b; + // Detect invalid transitions: both bits changed simultaneously + const a_changed = a.value() ^ enc.last_a.value(); + const b_changed = b.value() ^ enc.last_b.value(); + if (a_changed != 0 and b_changed != 0) { + return .@"error"; + } + const enable = a.value() ^ b.value() ^ enc.last_a.value() ^ enc.last_b.value(); const direction = a.value() ^ enc.last_b.value(); @@ -136,4 +143,12 @@ test RotaryEncoder { try std.testing.expectEqual(.decrement, try encoder.poll()); try std.testing.expectEqual(.idle, try encoder.poll()); } + + // Test invalid state: both A and B change simultaneously + // Current state is (high, high) from the previous test loop + // Force both bits to change at once + a.state = .low; + b.state = .low; + try std.testing.expectEqual(.@"error", try encoder.poll()); + try std.testing.expectEqual(.idle, try encoder.poll()); } diff --git a/drivers/src/root.zig b/drivers/src/root.zig index c01086a08..75a375724 100644 --- a/drivers/src/root.zig +++ b/drivers/src/root.zig @@ -233,6 +233,7 @@ test { _ = sensor.TLV493D; _ = sensor.TMP117; _ = sensor.AHT30; + _ = sensor.AS5600; _ = @import("stepper/common.zig"); _ = stepper.A4988; diff --git a/drivers/src/sensor/AS5600.zig b/drivers/src/sensor/AS5600.zig index 01ea984d0..524db7487 100644 --- a/drivers/src/sensor/AS5600.zig +++ b/drivers/src/sensor/AS5600.zig @@ -108,7 +108,7 @@ pub const AS5600 = struct { } pub fn read_zero_position(self: *const Self) !u16 { - const zpos = self.read2_raw(register.ZPOS); + const zpos = try self.read2_raw(register.ZPOS); return zpos & 0xFFF; } @@ -120,7 +120,7 @@ pub const AS5600 = struct { } pub fn read_max_position(self: *const Self) !u16 { - const mpos = self.read2_raw(register.MPOS); + const mpos = try self.read2_raw(register.MPOS); return mpos & 0xFFF; } @@ -132,7 +132,7 @@ pub const AS5600 = struct { } pub fn read_max_angle(self: *const Self) !u16 { - const mang = self.read2_raw(register.MANG); + const mang = try self.read2_raw(register.MANG); return mang & 0xFFF; } @@ -144,7 +144,7 @@ pub const AS5600 = struct { } pub fn read_configuration(self: *const Self) !u16 { - const configuration = self.read2_raw(register.CONF); + const configuration = try self.read2_raw(register.CONF); return @bitCast(configuration); } diff --git a/drivers/src/sensor/MPU_6050.zig b/drivers/src/sensor/MPU_6050.zig index 802587bb9..9aa5bd2c8 100644 --- a/drivers/src/sensor/MPU_6050.zig +++ b/drivers/src/sensor/MPU_6050.zig @@ -83,8 +83,15 @@ pub const MPU_6050 = struct { self.accel_range = .@"2G"; self.gyro_range = .@"250d"; - - while ((try self.read_reg(.pwr_mgmt_1, regs.PWR_MGMT_1)).DEVICE_RESET) {} + // wait for device to wake up + var timeout: usize = 1000; + while ((try self.read_reg(.pwr_mgmt_1, regs.PWR_MGMT_1)).DEVICE_RESET) { + timeout -= 1; + if (timeout == 0) { + return Error.Timeout; + } + self.clock.sleep_ms(1); + } try self.modify_reg(.user_ctrl, regs.USER_CTRL, .{ .SIG_COND_RESET = true,