const std = @import("std");
const pico = @import("microzig").hal;

const WRAP = 4095 / 2; // ADC result is u12
const SLEEP_MS = 1000;

const pin_config = pico.pins.GlobalConfiguration{
    .GPIO16 = .{ .name = "led_blue", .function = .PWM0_A },
    .GPIO17 = .{ .name = "led_green", .function = .PWM0_B },
    .GPIO18 = .{ .name = "led_red", .function = .PWM1_A },
    .GPIO26 = .{ .name = "pot_blue", .function = .ADC0 },
    .GPIO27 = .{ .name = "pot_green", .function = .ADC1 },
    .GPIO28 = .{ .name = "pot_red", .function = .ADC2 },
};

const pins = pin_config.pins();

pub fn main() void {
    pin_config.apply();

    pins.led_blue.slice().set_wrap(WRAP);
    pins.led_blue.slice().enable();
    pins.led_green.slice().set_wrap(WRAP);
    pins.led_green.slice().enable();
    pins.led_red.slice().set_wrap(WRAP);
    pins.led_red.slice().enable();

    while (true) {
        const blue = pico.adc.convert_one_shot_blocking(pins.pot_blue) catch unreachable;
        const green = pico.adc.convert_one_shot_blocking(pins.pot_green) catch unreachable;
        const red = pico.adc.convert_one_shot_blocking(pins.pot_red) catch unreachable;

        pins.led_blue.set_level(blue);
        pins.led_green.set_level(green);
        pins.led_red.set_level(red);

        pico.time.sleep_ms(SLEEP_MS);
    }
}