From 9e0ece753d8cf30b7a62a4d0838d5601aee57d55 Mon Sep 17 00:00:00 2001 From: rkcf Date: Sat, 28 Jan 2023 11:47:10 -0600 Subject: [PATCH] refactor led/clock/gate timers into single gate timer --- main/esp32-sequencer.c | 137 ++++++++++------------------------------- 1 file changed, 34 insertions(+), 103 deletions(-) diff --git a/main/esp32-sequencer.c b/main/esp32-sequencer.c index 2a77061..1b90ff1 100644 --- a/main/esp32-sequencer.c +++ b/main/esp32-sequencer.c @@ -23,29 +23,25 @@ #define GPIO_MUTATE_BTN (9) // Mutate Button In #define GPIO_TAP_TEMPO_BTN (10) // Tap Tempo Button In -gptimer_handle_t tap_tempo_timer = NULL; - static QueueHandle_t control_event_queue = NULL; /* Outputs */ #define GPIO_CLK_OUT (7) // Clock Out #define GPIO_GATE_OUT (8) // Gate CV Out -gptimer_handle_t clk_cv_timer = NULL; -gptimer_handle_t gate_cv_timer = NULL; - /* LED GPIO Pins */ #define LEDC_CLK_OUT (5) #define LEDC_GATE_OUT (6) -gptimer_handle_t clk_blink_timer = NULL; -gptimer_handle_t gate_blink_timer = NULL; +/* Timers */ +gptimer_handle_t tap_tempo_timer = NULL; +gptimer_handle_t gate_timer = NULL; static const uint32_t DEFAULT_BPM = 120; -static const uint8_t SEQ_MAX_LEN = 8; -uint8_t sequence[SEQ_MAX_LEN] = {0}; -uint8_t seq_len = SEQ_MAX_LEN; +#define SEQ_MAX_LEN 8 +static uint8_t sequence[SEQ_MAX_LEN] = {0}; +static uint8_t seq_len = SEQ_MAX_LEN; static const char *TAG = "sequencer"; @@ -121,14 +117,14 @@ static void controls_init(void) { ESP_ERROR_CHECK(gptimer_enable(tap_tempo_timer)); } -static void clk_cv_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { - gptimer_stop(clk_cv_timer); - gpio_set_level(GPIO_CLK_OUT, 0); -} - -static void gate_cv_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { - gptimer_stop(gate_cv_timer); +static void gate_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { + gptimer_stop(gate_timer); gpio_set_level(GPIO_GATE_OUT, 0); + gpio_set_level(GPIO_CLK_OUT, 0); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1)); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); } static void gpio_init(void) { @@ -141,45 +137,26 @@ static void gpio_init(void) { gpio_reset_pin(GPIO_GATE_OUT); gpio_set_direction(GPIO_GATE_OUT, GPIO_MODE_OUTPUT); - // Setup CV output timer + // Setup gate timer gptimer_config_t cv_out_timer_config = { .clk_src = GPTIMER_CLK_SRC_DEFAULT, .direction = GPTIMER_COUNT_UP, .resolution_hz = 1 * 1000 * 1000 // 1MHz; 1 tick = 1 µs }; - ESP_ERROR_CHECK(gptimer_new_timer(&cv_out_timer_config, &clk_cv_timer)); - ESP_ERROR_CHECK(gptimer_new_timer(&cv_out_timer_config, &gate_cv_timer)); + ESP_ERROR_CHECK(gptimer_new_timer(&cv_out_timer_config, &gate_timer)); - // Configure timer alarm + // Configure gate timer alarm gptimer_alarm_config_t cv_off_alarm_config = { - .alarm_count = 10 * 1000, // 10ms @ 1MHz + .alarm_count = 20 * 1000, // 20ms @ 1MHz .reload_count = 0, .flags.auto_reload_on_alarm = true }; - ESP_ERROR_CHECK(gptimer_set_alarm_action(clk_cv_timer, &cv_off_alarm_config)); - ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_cv_timer, &cv_off_alarm_config)); + ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_timer, &cv_off_alarm_config)); - //register clk callback - gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_cv_off_alarm_cb}; - ESP_ERROR_CHECK(gptimer_register_event_callbacks(clk_cv_timer, &clk_cbs, NULL)); - ESP_ERROR_CHECK(gptimer_enable(clk_cv_timer)); - - // register gate callback - gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_cv_off_alarm_cb}; - ESP_ERROR_CHECK(gptimer_register_event_callbacks(gate_cv_timer, &gate_cbs, NULL)); - ESP_ERROR_CHECK(gptimer_enable(gate_cv_timer)); -} - -static void gate_led_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { - gptimer_stop(gate_blink_timer); - ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 0)); - ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1)); -} - -static void clk_led_off_alarm_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) { - gptimer_stop(clk_blink_timer); - ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 0)); - ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); + //register gate timer callback + gptimer_event_callbacks_t clk_cbs = {.on_alarm = gate_off_alarm_cb}; + ESP_ERROR_CHECK(gptimer_register_event_callbacks(gate_timer, &clk_cbs, NULL)); + ESP_ERROR_CHECK(gptimer_enable(gate_timer)); } static void ledc_init(void) { @@ -216,60 +193,17 @@ static void ledc_init(void) { .hpoint = 0 }; ESP_ERROR_CHECK(ledc_channel_config(&ledc_gate_channel)); - - // Setup LED blink timer - gptimer_config_t led_blink_timer_config = { - .clk_src = GPTIMER_CLK_SRC_DEFAULT, - .direction = GPTIMER_COUNT_UP, - .resolution_hz = 1 * 1000 * 1000 // 1MHz; 1 tick = 1 µs - }; - ESP_ERROR_CHECK(gptimer_new_timer(&led_blink_timer_config, &clk_blink_timer)); - ESP_ERROR_CHECK(gptimer_new_timer(&led_blink_timer_config, &gate_blink_timer)); - - // Configure timer alarm - gptimer_alarm_config_t led_off_alarm_config = { - .alarm_count = 50 * 1000, // 50ms @ 1MHz - .reload_count = 0, - .flags.auto_reload_on_alarm = true - }; - ESP_ERROR_CHECK(gptimer_set_alarm_action(clk_blink_timer, &led_off_alarm_config)); - ESP_ERROR_CHECK(gptimer_set_alarm_action(gate_blink_timer, &led_off_alarm_config)); - - //register clk callback - gptimer_event_callbacks_t clk_cbs = {.on_alarm = clk_led_off_alarm_cb}; - ESP_ERROR_CHECK(gptimer_register_event_callbacks(clk_blink_timer, &clk_cbs, NULL)); - ESP_ERROR_CHECK(gptimer_enable(clk_blink_timer)); - - // register gate callback - gptimer_event_callbacks_t gate_cbs = {.on_alarm = gate_led_off_alarm_cb}; - ESP_ERROR_CHECK(gptimer_register_event_callbacks(gate_blink_timer, &gate_cbs, NULL)); - ESP_ERROR_CHECK(gptimer_enable(gate_blink_timer)); } -static void blink_led(ledc_channel_t channel) { - ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, channel, 4095)); - ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, channel)); - switch (channel) { - case (LEDC_CHANNEL_0): - ESP_ERROR_CHECK(gptimer_start(clk_blink_timer)); - break; - case (LEDC_CHANNEL_1): - ESP_ERROR_CHECK(gptimer_start(gate_blink_timer)); - break; - default: - break; - } -} - -static void pulse_cv(uint8_t gpio_num) { - gpio_set_level(gpio_num, 1); - switch (gpio_num) { - case (GPIO_CLK_OUT): - ESP_ERROR_CHECK(gptimer_start(clk_cv_timer)); - break; - case (GPIO_GATE_OUT): - ESP_ERROR_CHECK(gptimer_start(gate_cv_timer)); - break; +static void pulse_cv(bool triggered) { + ESP_ERROR_CHECK(gptimer_start(gate_timer)); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, 4095)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0)); + gpio_set_level(GPIO_CLK_OUT, 1); + if (triggered) { + gpio_set_level(GPIO_GATE_OUT, 1); + ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1, 4095)); + ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_1)); } } @@ -290,14 +224,11 @@ void app_main(void) { /* Main Loop */ while (1) { for (uint8_t step = 0; step < seq_len; step++) { - - blink_led(LEDC_CHANNEL_0); // blink clock led - pulse_cv(GPIO_CLK_OUT); - // if step has been set for sequence if (sequence[step] == 1) { - pulse_cv(GPIO_GATE_OUT); - blink_led(LEDC_CHANNEL_1); // blink gate triggered led + pulse_cv(true); + } else { + pulse_cv(false); } printf("%i", sequence[step]); vTaskDelay(bpm_to_ms(DEFAULT_BPM)/ portTICK_PERIOD_MS);