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