Initial working commit
commit
a9e76f28c9
|
@ -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
|
|
@ -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();
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 144d557357314f25dd479e28ef1e16f157f0bb50
|
|
@ -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);
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
Subproject commit e1a0a5629802933534656af1c286d7fc4076ab2b
|
Loading…
Reference in New Issue