79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
#include <hardware/irq.h>
|
|
#include <pico/time.h>
|
|
#include <sys/types.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
|
|
#include "hardware/gpio.h"
|
|
#include "hardware/pwm.h"
|
|
#include "hardware/adc.h"
|
|
#include "mux.h"
|
|
#include "pico/multicore.h"
|
|
#include "pico/stdlib.h"
|
|
|
|
#include "buttons.h"
|
|
#include "const.h"
|
|
#include "macro.h"
|
|
#include "state.h"
|
|
#include "pwm.h"
|
|
|
|
state_t state;
|
|
|
|
void init_all() {
|
|
stdio_init_all();
|
|
puts("Starting PIN initialization");
|
|
const uint8_t out_gpio[] = {MUX_S0,MUX_S1,MUX_S2, STATUS_LED};
|
|
const uint8_t in_gpio[] = {VCO_BUTTON,QUANT_BUTTON,AMEN_BUTTON};
|
|
const uint8_t adc_gpio[] = {MUX0,MUX1};
|
|
|
|
for (uint8_t i=0; i < ARRAY_LENGTH(out_gpio); i++) {
|
|
gpio_init(out_gpio[i]);
|
|
gpio_set_dir(out_gpio[i], true);
|
|
}
|
|
|
|
for (uint8_t i=0; i < ARRAY_LENGTH(in_gpio); i++) {
|
|
gpio_init(in_gpio[i]);
|
|
gpio_set_dir(in_gpio[i], false);
|
|
}
|
|
adc_init();
|
|
for (uint8_t i=0; i < ARRAY_LENGTH(adc_gpio); i++) {
|
|
adc_gpio_init(adc_gpio[i]);
|
|
adc_select_input(i);
|
|
}
|
|
|
|
// PWM bullshit
|
|
gpio_set_function(AUDIO_OUT, GPIO_FUNC_PWM);
|
|
|
|
uint slice = pwm_gpio_to_slice_num(AUDIO_OUT);
|
|
pwm_config cfg = pwm_get_default_config();
|
|
pwm_config_set_wrap(&cfg, 3400);
|
|
pwm_init(slice, &cfg, true);
|
|
|
|
pwm_clear_irq(slice);
|
|
pwm_set_irq_enabled(slice, true);
|
|
irq_set_exclusive_handler(PWM_IRQ_WRAP, pwm_isr);
|
|
irq_set_enabled(PWM_IRQ_WRAP, true);
|
|
}
|
|
|
|
__attribute__((noreturn))
|
|
void core1_main(void) {
|
|
while (1) {
|
|
update_buttons();
|
|
update_inputs();
|
|
printf("vco_mode: %d, quant_enabled: %d amen_enabled: %d\n", state.vco_mode,state.quant_enabled,state.amen_enabled);
|
|
printf("clock_bpm: %f\n",state.clock_bpm);
|
|
sleep_ms(1);
|
|
}
|
|
}
|
|
|
|
__attribute__((noreturn))
|
|
int main() {
|
|
init_all();
|
|
|
|
multicore_launch_core1(core1_main);
|
|
|
|
while (1) {}
|
|
}
|
|
|