refactor led/clock/gate timers into single gate timer
parent
f52697412c
commit
9e0ece753d
|
|
@ -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);
|
||||
|
|
|
|||
Reference in New Issue