commit a9e76f28c95d09c3278a9b2426c8551e56257fb5 Author: Joey Hines Date: Fri Nov 25 21:41:35 2022 -0700 Initial working commit diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f4fc827 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "rp2040"] + path = rp2040 + url = git@github.com:ZigEmbeddedGroup/rp2040.git +[submodule "uf2"] + path = uf2 + url = git@github.com:ZigEmbeddedGroup/uf2.git diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..dc51eed --- /dev/null +++ b/build.zig @@ -0,0 +1,23 @@ +const std = @import("std"); +const Builder = std.build.Builder; +const Step = std.build.Step; +const LibExeObjStep = std.build.LibExeObjStep; + +const builtin = @import("builtin"); +const uf2 = @import("uf2/src/main.zig"); +const rp2040 = @import("rp2040/build.zig"); + +pub fn build(b: *Builder) !void { + const mode = b.standardReleaseOptions(); + var exe = rp2040.addPiPicoExecutable(b, "merry_chrysler", "src/main.zig", .{}); + + exe.setBuildMode(mode); + + const uf2_step = uf2.Uf2Step.create(exe.inner, .{ + .family_id = .RP2040, + }); + + uf2_step.install(); + + exe.install(); +} diff --git a/rp2040 b/rp2040 new file mode 160000 index 0000000..144d557 --- /dev/null +++ b/rp2040 @@ -0,0 +1 @@ +Subproject commit 144d557357314f25dd479e28ef1e16f157f0bb50 diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..a61d056 --- /dev/null +++ b/src/main.zig @@ -0,0 +1,122 @@ +const std = @import("std"); +const microzig = @import("microzig"); +const rp2040 = microzig.hal; +const gpio = rp2040.gpio; +const clocks = rp2040.clocks; +const time = rp2040.time; +const regs = microzig.chip.registers; +const multicore = rp2040.multicore; +const pwm = rp2040.pwm; + +const pin_config = rp2040.pins.GlobalConfiguration{ + .GPIO0 = .{ .name = "channel0", .function = .PWM0_A }, + .GPIO1 = .{ .name = "channel1", .function = .PWM0_B }, + .GPIO2 = .{ .name = "channel2", .function = .PWM1_A }, + .GPIO3 = .{ .name = "channel3", .function = .PWM1_B }, + .GPIO25 = .{ .name = "channelInt", .function = .PWM4_B }, +}; + +const Channels = enum { Channel0, Channel1, Channel2, Channel3, ChannelInt }; + +const Animations = enum { Candle, Pulse }; + +const ChannelConfig = struct { + channel: Channels, + animation: Animations, + step: u16, + last_value: u16, + + rand_src: std.rand.DefaultPrng, + + pub fn init(channel: Channels, animation: Animations) ChannelConfig { + return ChannelConfig{ .channel = channel, .animation = animation, .step = 0, .rand_src = std.rand.DefaultPrng.init(0), .last_value = 0 }; + } + + fn nextLevelPulse(self: *ChannelConfig) u16 { + if (self.step < 127) { + return self.step; + } else { + return 255 - self.step; + } + } + + fn nextLevelCandle(self: *ChannelConfig) u16 { + const Levels = enum(u16) { VeryDim = 255 / 8, Dim = 255 / 4, Half = 255 / 2, Bright = 255 * 3 / 4, FullBright = 255 }; + + if ((self.step % 10) == 0) { + return @enumToInt(self.rand_src.random().enumValue(Levels)); + } else { + return self.last_value; + } + } + + pub fn nextLevel(self: *ChannelConfig) u16 { + self.step = ((self.step + 1) % 255); + + var value = switch (self.animation) { + Animations.Pulse => self.nextLevelPulse(), + Animations.Candle => self.nextLevelCandle(), + }; + + self.last_value = value; + + return value; + } +}; + +pub fn cfgChannel(pin: anytype) !void { + pin.slice().setWrap(256); + pin.setLevel(0); + pin.slice().enable(); +} + +pub fn main() !void { + const pins = pin_config.apply(); + + try cfgChannel(pins.channel0); + try cfgChannel(pins.channel1); + try cfgChannel(pins.channel2); + try cfgChannel(pins.channel3); + try cfgChannel(pins.channelInt); + + var cfg = [_]ChannelConfig{ + ChannelConfig.init(Channels.ChannelInt, Animations.Candle), + ChannelConfig.init(Channels.Channel0, Animations.Candle), + ChannelConfig.init(Channels.Channel1, Animations.Pulse), + }; + + while (true) { + for (cfg) |*channel| { + var level = channel.nextLevel(); + + switch (channel.channel) { + Channels.ChannelInt => { + pins.channelInt.setLevel(level); + }, + Channels.Channel0 => { + pins.channel0.setLevel(level); + }, + Channels.Channel1 => { + pins.channel1.setLevel(level); + }, + Channels.Channel2 => { + pins.channel2.setLevel(level); + }, + Channels.Channel3 => { + pins.channel3.setLevel(level); + }, + } + } + time.sleepMs(10); + } +} + +test "Test Candle Animations" { + var channel = ChannelConfig.init(Channels.ChannelInt, Animations.Candle); + + const val1 = channel.nextLevel(); + channel.step = 9; + const val2 = channel.nextLevel(); + + try std.testing.expect(val1 != val2); +} diff --git a/uf2 b/uf2 new file mode 160000 index 0000000..e1a0a56 --- /dev/null +++ b/uf2 @@ -0,0 +1 @@ +Subproject commit e1a0a5629802933534656af1c286d7fc4076ab2b